diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..42242799 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: TimZ99 +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: ["https://www.paypal.me/TimZandbergen99", "https://bunq.me/t"] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..3b079baa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,31 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG] " +labels: 'Type: bug' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Version (please complete the following information):** + - Version [e.g. 3.3.5] + - PHP [e.g. 7.3] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..eee253b6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[Feature Request]" +labels: 'Type: Feature' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 00000000..d1b6afb8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,19 @@ +--- +name: Question +about: Ask your questions +title: "[Question] " +labels: 'Type: Question' +assignees: '' + +--- + +- [ ] Looked at the documentation first + +**Describe the question** + +**Version (please complete the following information):** + - Version [e.g. 3.3.5] + - PHP [e.g. 7.3] + +**Additional context** +Add any other context about the problem here. diff --git a/.gitignore b/.gitignore index 9cc5218c..e1c85147 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,6 @@ /puphpet/files/dot/ssh/ *.bak __MACOSX/ +.DS_Store +.buildpath +.settings/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bd10a7d9..df3b2e05 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,11 @@ Not yet released ---------------- \- +v3.5.0 (released May 1, 2020) +----------------------------- + +* See https://github.com/phpservermon/phpservermon/compare/v3.4.5...v3.5.0 + v3.4.5 (released September 30, 2019) ------------------------------------ diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 diff --git a/README.rst b/README.rst old mode 100755 new mode 100644 index d0a633ee..5c453239 --- a/README.rst +++ b/README.rst @@ -5,7 +5,7 @@ PHP Server Monitor :alt: Join the chat at https://gitter.im/erickrf/nlpnet :target: https://gitter.im/phpservermon/phpservermon -Version 3.4.5 +Version 3.5.0 PHP Server Monitor is a script that checks whether your websites and servers are up and running. It comes with a web based user interface where you can manage your services and websites, @@ -16,7 +16,7 @@ Features: --------- * Monitor services and websites (see below). -* Email, SMS, Pushover, Telegram notifications. +* Email, SMS, Pushover, Telegram and Jabber notifications. * View history graphs of uptime and latency. * User authentication with 2 levels (administrator and regular user). * Logs of connection errors, outgoing emails and text messages. @@ -39,7 +39,7 @@ There are two different ways to monitor a server: In both cases the script will return a "status offline", and will start sending out notifications. Each server has its own settings regarding notification. -You can choose for email, text message (SMS), Pushover.net and Telegram notifications. +You can choose for email, text message (SMS), Pushover.net, Telegram and Jabber notifications. The following SMS gateways are currently available: * Clickatell - @@ -77,7 +77,7 @@ Requirements * Web server * MySQL database -* For PHP5: 5.5.9+ +* For PHP5: 5.6.0+ * For PHP7: 7.0.8+ * PHP cURL package * PHP PDO mysql driver diff --git a/composer.json b/composer.json old mode 100755 new mode 100644 index 4764a1e5..88c4658d --- a/composer.json +++ b/composer.json @@ -12,11 +12,12 @@ "symfony/config": "~3.4", "symfony/dependency-injection": "~3.4", "symfony/event-dispatcher": "~3.4", - "symfony/http-foundation": "~3.4", + "symfony/http-foundation": ">=3.4.35 ~3.4", "symfony/filesystem": "~3.4", "php-pushover/php-pushover": "dev-master", "paragonie/random_compat": "^2.0", - "twig/twig": "~1.35" + "twig/twig": "~1.35", + "jaxl/jaxl": "^3.1" }, "autoload": { "files": [ @@ -27,4 +28,4 @@ "psm\\": "src/psm/" } } -} \ No newline at end of file +} diff --git a/composer.lock b/composer.lock index 7fb14329..1ffbcc76 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,81 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "308dce74ade38b2bb81a328232102134", + "content-hash": "f78e950e2dfef7debe88d7b64e2b4aec", "packages": [ + { + "name": "jaxl/jaxl", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/jaxl/JAXL.git", + "reference": "27aa43c4600b05809779428843d8d51db6ce6e0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jaxl/JAXL/zipball/27aa43c4600b05809779428843d8d51db6ce6e0d", + "reference": "27aa43c4600b05809779428843d8d51db6ce6e0d", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-hash": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-openssl": "*", + "ext-pcre": "*", + "ext-sockets": "*", + "php": ">=5.2.4" + }, + "require-dev": { + "phpunit/phpunit": "^3.7.0", + "squizlabs/php_codesniffer": "*" + }, + "suggest": { + "ext-pcntl": "Interrupt JAXL with signals" + }, + "bin": [ + "jaxlctl" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/JAXL" + ], + "exclude-from-classmap": [ + "/tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Abhinavsingh", + "homepage": "https://abhinavsingh.com/" + } + ], + "description": "Jaxl - Async, Non-Blocking, Event based Networking Library in PHP.", + "homepage": "http://jaxl.readthedocs.org/en/latest/index.html", + "keywords": [ + "abhinavsingh", + "asynchronous", + "event loop", + "http", + "jabber", + "jaxl", + "non blocking", + "php", + "xmpp" + ], + "time": "2016-09-13T01:59:35+00:00" + }, { "name": "paragonie/random_compat", "version": "v2.0.18", @@ -61,12 +134,12 @@ "source": { "type": "git", "url": "https://github.com/cschalenborgh/php-pushover.git", - "reference": "620df1c6cf53061286ecde80e96bb402f2713c22" + "reference": "b2d060efacf48e4c6821427691b19db0315ccedd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cschalenborgh/php-pushover/zipball/620df1c6cf53061286ecde80e96bb402f2713c22", - "reference": "620df1c6cf53061286ecde80e96bb402f2713c22", + "url": "https://api.github.com/repos/cschalenborgh/php-pushover/zipball/b2d060efacf48e4c6821427691b19db0315ccedd", + "reference": "b2d060efacf48e4c6821427691b19db0315ccedd", "shasum": "" }, "type": "library", @@ -83,20 +156,20 @@ } ], "description": "PHP class for the Pushover.net project", - "time": "2017-08-29T22:04:56+00:00" + "time": "2019-09-26T19:38:11+00:00" }, { "name": "phpmailer/phpmailer", - "version": "v6.0.7", + "version": "v6.1.3", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "0c41a36d4508d470e376498c1c0c527aa36a2d59" + "reference": "a25ae38e03de4ee4031725498a600012364787c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/0c41a36d4508d470e376498c1c0c527aa36a2d59", - "reference": "0c41a36d4508d470e376498c1c0c527aa36a2d59", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a25ae38e03de4ee4031725498a600012364787c7", + "reference": "a25ae38e03de4ee4031725498a600012364787c7", "shasum": "" }, "require": { @@ -105,13 +178,9 @@ "php": ">=5.5.0" }, "require-dev": { - "doctrine/annotations": "1.2.*", + "doctrine/annotations": "^1.2", "friendsofphp/php-cs-fixer": "^2.2", - "phpdocumentor/phpdocumentor": "2.*", - "phpunit/phpunit": "^4.8 || ^5.7", - "zendframework/zend-eventmanager": "3.0.*", - "zendframework/zend-i18n": "2.7.3", - "zendframework/zend-serializer": "2.7.*" + "phpunit/phpunit": "^4.8 || ^5.7" }, "suggest": { "ext-mbstring": "Needed to send email in multibyte encoding charset", @@ -129,17 +198,17 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-2.1" + "LGPL-2.1-only" ], "authors": [ - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, { "name": "Marcus Bointon", "email": "phpmailer@synchromedia.co.uk" }, + { + "name": "Jim Jagielski", + "email": "jimjag@gmail.com" + }, { "name": "Andy Prevost", "email": "codeworxtech@users.sourceforge.net" @@ -149,7 +218,7 @@ } ], "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "time": "2019-02-01T15:04:28+00:00" + "time": "2019-11-21T09:37:46+00:00" }, { "name": "psr/container", @@ -202,16 +271,16 @@ }, { "name": "symfony/config", - "version": "v3.4.27", + "version": "v3.4.36", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "177a276c01575253c95cefe0866e3d1b57637fe0" + "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/177a276c01575253c95cefe0866e3d1b57637fe0", - "reference": "177a276c01575253c95cefe0866e3d1b57637fe0", + "url": "https://api.github.com/repos/symfony/config/zipball/a599a867d0e4a07c342b5f1e656b3915a540ddbe", + "reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe", "shasum": "" }, "require": { @@ -262,20 +331,20 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2019-02-23T15:06:07+00:00" + "time": "2019-12-01T10:45:41+00:00" }, { "name": "symfony/dependency-injection", - "version": "v3.4.27", + "version": "v3.4.36", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "be0feb3fa202aedfd8d1956f2dafd563fb13acbf" + "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/be0feb3fa202aedfd8d1956f2dafd563fb13acbf", - "reference": "be0feb3fa202aedfd8d1956f2dafd563fb13acbf", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0d201916bfb3af939fec3c0c8815ea16c60ac1a2", + "reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2", "shasum": "" }, "require": { @@ -333,20 +402,20 @@ ], "description": "Symfony DependencyInjection Component", "homepage": "https://symfony.com", - "time": "2019-04-20T15:32:49+00:00" + "time": "2019-12-01T08:33:36+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.27", + "version": "v3.4.36", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "a088aafcefb4eef2520a290ed82e4374092a6dff" + "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/a088aafcefb4eef2520a290ed82e4374092a6dff", - "reference": "a088aafcefb4eef2520a290ed82e4374092a6dff", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f9031c22ec127d4a2450760f81a8677fe8a10177", + "reference": "f9031c22ec127d4a2450760f81a8677fe8a10177", "shasum": "" }, "require": { @@ -396,20 +465,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-04-02T08:51:52+00:00" + "time": "2019-10-24T15:33:53+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.27", + "version": "v3.4.36", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "acf99758b1df8e9295e6b85aa69f294565c9fedb" + "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/acf99758b1df8e9295e6b85aa69f294565c9fedb", - "reference": "acf99758b1df8e9295e6b85aa69f294565c9fedb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/00cdad0936d06fab136944bc2342b762b1c3a4a2", + "reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2", "shasum": "" }, "require": { @@ -446,20 +515,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-02-04T21:34:32+00:00" + "time": "2019-11-25T16:36:22+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.27", + "version": "v3.4.36", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "fa02215233be8de1c2b44617088192f9e8db3512" + "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/fa02215233be8de1c2b44617088192f9e8db3512", - "reference": "fa02215233be8de1c2b44617088192f9e8db3512", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d2d0cfe8e319d9df44c4cca570710fcf221d4593", + "reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593", "shasum": "" }, "require": { @@ -500,20 +569,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-05-01T08:04:33+00:00" + "time": "2019-11-28T12:52:59+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.11.0", + "version": "v1.13.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "82ebae02209c21113908c229e9883c419720738a" + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", - "reference": "82ebae02209c21113908c229e9883c419720738a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", + "reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", "shasum": "" }, "require": { @@ -525,7 +594,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -541,13 +610,13 @@ "MIT" ], "authors": [ - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - }, { "name": "Gert de Pagter", "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], "description": "Symfony polyfill for ctype functions", @@ -558,20 +627,20 @@ "polyfill", "portable" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.11.0", + "version": "v1.13.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", - "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", + "reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", "shasum": "" }, "require": { @@ -583,7 +652,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -617,20 +686,20 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-11-27T14:18:11+00:00" }, { "name": "symfony/polyfill-php70", - "version": "v1.11.0", + "version": "v1.13.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "bc4858fb611bda58719124ca079baff854149c89" + "reference": "af23c7bb26a73b850840823662dda371484926c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89", - "reference": "bc4858fb611bda58719124ca079baff854149c89", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", + "reference": "af23c7bb26a73b850840823662dda371484926c4", "shasum": "" }, "require": { @@ -640,7 +709,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11-dev" + "dev-master": "1.13-dev" } }, "autoload": { @@ -676,35 +745,35 @@ "portable", "shim" ], - "time": "2019-02-06T07:57:58+00:00" + "time": "2019-11-27T13:56:44+00:00" }, { "name": "twig/twig", - "version": "v1.41.0", + "version": "v1.42.4", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "575cd5028362da591facde1ef5d7b94553c375c9" + "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/575cd5028362da591facde1ef5d7b94553c375c9", - "reference": "575cd5028362da591facde1ef5d7b94553c375c9", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/e587180584c3d2d6cb864a0454e777bb6dcb6152", + "reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152", "shasum": "" }, "require": { - "php": ">=5.4.0", + "php": ">=5.5.0", "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "psr/container": "^1.0", - "symfony/debug": "^2.7", - "symfony/phpunit-bridge": "^3.4.19|^4.1.8" + "symfony/debug": "^3.4|^4.2", + "symfony/phpunit-bridge": "^4.4@dev|^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.41-dev" + "dev-master": "1.42-dev" } }, "autoload": { @@ -726,15 +795,15 @@ "homepage": "http://fabien.potencier.org", "role": "Lead Developer" }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - }, { "name": "Twig Team", "homepage": "https://twig.symfony.com/contributors", "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" } ], "description": "Twig, the flexible, fast, and secure template language for PHP", @@ -742,7 +811,7 @@ "keywords": [ "templating" ], - "time": "2019-05-14T11:59:08+00:00" + "time": "2019-11-11T16:49:32+00:00" } ], "packages-dev": [], diff --git a/config.php.sample b/config.php.sample old mode 100755 new mode 100644 index 31d490d7..bf902aaa --- a/config.php.sample +++ b/config.php.sample @@ -5,4 +5,5 @@ define('PSM_DB_PASS', 'db_pass'); define('PSM_DB_NAME', 'db_name'); define('PSM_DB_HOST', 'localhost'); define('PSM_DB_PORT', '3306'); //3306 is the default port for MySQL. If no specfic port is used, leave it empty. -define('PSM_BASE_URL', ''); \ No newline at end of file +define('PSM_BASE_URL', ''); +define('PSM_WEBCRON_KEY', ''); diff --git a/cron/status.cron.php b/cron/status.cron.php index a42e4e04..0151d202 100644 --- a/cron/status.cron.php +++ b/cron/status.cron.php @@ -1,4 +1,5 @@ 403 Forbidden

Forbidden

IP address not allowed. See the documentation for more info.

'); - } - echo "OK"; -} + // define won't accept array before php 7.0.0 + // check if data is serialized (not needed when using php 7.0.0 and higher) + $data = @unserialize(PSM_CRON_ALLOW); + $allow = $data === false ? PSM_CRON_ALLOW : $data; -$cron_timeout = PSM_CRON_TIMEOUT; + if (!in_array($_SERVER['REMOTE_ADDR'], $allow) && !in_array($_SERVER["HTTP_X_FORWARDED_FOR"], $allow) + && ! (array_key_exists ("webcron_key", $_GET) && + $_GET["webcron_key"]==PSM_WEBCRON_KEY && (PSM_WEBCRON_KEY != "")) + ) { + header('HTTP/1.0 403 Forbidden'); + die(' + + 403 Forbidden + +

Forbidden

IP address not allowed. See the + documentation + for more info.

+ + '); + } + echo "OK"; + } + + $cron_timeout = PSM_CRON_TIMEOUT; // parse a couple of arguments -if (!empty($_SERVER['argv'])) { - foreach ($_SERVER['argv'] as $argv) { - $argi = explode('=', ltrim($argv, '--')); - if (count($argi) !== 2) { - continue; - } - switch ($argi[0]) { - case 'uri': - if (!defined('PSM_BASE_URL')) { - define('PSM_BASE_URL', $argi[1]); - } - break; - case 'timeout': - $cron_timeout = intval($argi[1]); - break; - } - } -} + if (!empty($_SERVER['argv'])) { + foreach ($_SERVER['argv'] as $argv) { + $argi = explode('=', ltrim($argv, '--')); + if (count($argi) !== 2) { + continue; + } + switch ($argi[0]) { + case 'uri': + if (!defined('PSM_BASE_URL')) { + define('PSM_BASE_URL', $argi[1]); + } + break; + case 'timeout': + $cron_timeout = intval($argi[1]); + break; + } + } + } // prevent cron from running twice at the same time // however if the cron has been running for X mins, we'll assume it died and run anyway // if you want to change PSM_CRON_TIMEOUT, have a look in src/includes/psmconfig.inc.php. // or you can provide the --timeout=x argument -$time = time(); -if ( - psm_get_conf('cron_running') == 1 - && $cron_timeout > 0 - && ($time - psm_get_conf('cron_running_time') < $cron_timeout) -) { - die('Cron is already running. Exiting.'); -} -if (!defined('PSM_DEBUG') || !PSM_DEBUG) { - psm_update_conf('cron_running', 1); -} -psm_update_conf('cron_running_time', $time); -$autorun = $router->getService('util.server.updatemanager'); -$autorun->run(true); + $status = null; + if (PHP_SAPI === 'cli') { + $shortOptions = 's:'; // status -psm_update_conf('cron_running', 0); + $longOptions = [ + 'status:' + ]; + + $options = getopt($shortOptions, $longOptions); + + $possibleValues = [ + 'on' => 'on', + '1' => 'on', + 'up' => 'on', + 'off' => 'off', + '0' => 'off', + 'down' => 'off' + ]; + + if ( + true === array_key_exists('status', $options) && + true === array_key_exists(strtolower($options['status']), $possibleValues) + ) { + $status = $possibleValues[$options['status']]; + } elseif ( + true === array_key_exists('s', $options) && + true === array_key_exists(strtolower($options['s']), $possibleValues) + ) { + $status = $possibleValues[$options['s']]; + } + } + + if ($status === 'off') { + $confPrefix = 'cron_off_'; + } else { + $confPrefix = 'cron_'; + } + + $time = time(); + if ( + psm_get_conf($confPrefix . 'running') == 1 + && $cron_timeout > 0 + && ($time - psm_get_conf($confPrefix . 'running_time') < $cron_timeout) + ) { + die('Cron is already running. Exiting.'); + } + if (!defined('PSM_DEBUG') || !PSM_DEBUG) { + psm_update_conf($confPrefix . 'running', 1); + } + psm_update_conf($confPrefix . 'running_time', $time); + + /** @var Router $router */ + /** @var UpdateManager $autorun */ + $autorun = $router->getService('util.server.updatemanager'); + + if ($status !== 'off') { + $autorun->run(true, $status); + } else { + set_time_limit(60); + if (false === defined('CRON_DOWN_INTERVAL')) { + define('CRON_DOWN_INTERVAL', 5); // every 5 second call update + } + $start = time(); + $i = 0; + while ($i < 59) { + $autorun->run(true, $status); + if ($i < (59 - CRON_DOWN_INTERVAL)) { + time_sleep_until($start + $i + CRON_DOWN_INTERVAL); + } + $i += CRON_DOWN_INTERVAL; + } + } + + psm_update_conf($confPrefix . 'running', 0); +} diff --git a/docs/conf.py b/docs/conf.py index 266839e9..20f6ef0c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -51,9 +51,9 @@ copyright = u'2008-2017, Pepijn Over' # built documents. # # The short X.Y version. -version = '3.4.5' +version = '3.5.0' # The full version, including alpha/beta/rc tags. -release = version +release = '3.5.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/credits.rst b/docs/credits.rst index f88c2ae9..6786fb1d 100644 --- a/docs/credits.rst +++ b/docs/credits.rst @@ -94,6 +94,10 @@ The following people have contributed to the translation of PHP Server Monitor: * Plamen Vasilev - https://github.com/PVasileff +* Catalan + + * caos30 - https://github.com/caos30 + * Chinese * manhere - https://github.com/manhere @@ -168,11 +172,10 @@ The following people have contributed to the translation of PHP Server Monitor: * Turkish * Haydar Kulekci - https://github.com/hkulekci - -* Catalan - - * caos30 - https://github.com/caos30 +* Ukrainian + + * Oleksa Vyshnivsky - https://github.com/oleksavyshnivsky Vendors +++++++ @@ -188,4 +191,4 @@ The following libraries are being used by PHP Server Monitor: * PHP Mailer - https://github.com/PHPMailer/PHPMailer * PHP-Pushover - https://github.com/kryap/php-pushover * Symfony - https://symfony.com -* Random_compat - https://github.com/paragonie/random_compat \ No newline at end of file +* Random_compat - https://github.com/paragonie/random_compat diff --git a/docs/faq.rst b/docs/faq.rst index 78e240ac..19a0db2b 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -66,6 +66,13 @@ Archiving means that per day only one record is stored with averages. This still The retention period tells the monitor how long to keep records in the archive table. +How to disable caching? +------------------------ + +Caching can be stopt by using a unique url. Place `%cachebuster%` in the url, +this will be replaced with the value of time(). +Example: https://example.com?%cachebuster% will run as https://example.com?571768757. + Configuration +++++++++++++ @@ -112,14 +119,16 @@ You need to be an administrator for this part. 1. Go to @botfather (https://t.me/BotFather) and type /start . 2. Type /newbot and give your bot an unique name. 3. Save the API token. +4. Login to PhpServerMonitor dashboard > config > Telegram > put your api token into Telegram API Token's column. How do I sent Telegram notifications to a person? ------------------------------------------------- 1. Go to @cid_bot (https://t.me/cid_bot) and start. 2. Save your chat id. -3. Press the activation button. -4. Go to your chat with the bot and press start of type /start. +3. Login to PhpServerMonitor dashboard then open user profile page, then put your chat id into Telegram chat id's column. +4. Press save then activate Telegram notifications button. +5. Go to your chat with the bot and press start of type /start. How do I sent Telegram notifications to a group? ------------------------------------------------ @@ -142,3 +151,16 @@ What is the username of my bot? 1. Go to profile on the monitor. 2. Press activate. 3. A button will appear, this will direct you to your Telegram bot. + +How do I setup Jabber notifications from Google account? +-------------------------------------------------------- +A few steps are required to get Jabber notifications working for Google account. +You need to be an administrator for this part. + +1. Go into you Google Account Security settings (https://myaccount.google.com/security). +2. Check that you have two factor auth enabled. If not, activate it. +3. Add new app password - copy it. +4. Login to PhpServerMonitor dashboard > config > Jabber and use password from step 3 with your Google account in PhpServerMonitor jabber settings. +5. As host use `talk.google.com`. +6. As username use your whole Google account (for example `example@google.com`). +7. As port use `5223` (really, not typo error ...). diff --git a/docs/install.rst b/docs/install.rst index 93898e36..66165614 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -92,6 +92,16 @@ Please note that some distros have user-specific crontabs (e.g. Debian). If that */15 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php +If you want to check in different intervals online and offline servers you can use attribute `-s` (or `--status`) with value `on` or `off`. +So for example you want to check your servers which are online every 10 minutes and offline every 5 seconds. So configure two cron jobs:: + + */10 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php -s on + */1 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php -s off + +By default `off` servers are checked every 5 seconds. If you want to change it add into your config file this constant with required value in seconds:: + + define('CRON_DOWN_INTERVAL', 1); // every 1 second call update + The update script has been designed to prevent itself from running multiple times. It has a maximum timeout of 10 minutes. After that the script is assumed dead and the cronjob will run again. If you want to change the 10 minutes timeout, find the constant "PSM_CRON_TIMEOUT" in src/includes/psmconfig.inc.php. @@ -136,6 +146,13 @@ In config.php add following line:: After that, you can hit the url http(s)://"yourmonitor.com"/cron/status.cron.php over the web from your allowed IP. +Alternatively, define a secret key to allow the update over the web: + +In config.php add following line:: + + define('PSM_WEBCRON_KEY', 'YOURKEY'); + +After that, you can hit the url http(s)://"yourmonitor.com"/cron/status.cron.php?webcron_key=YOURKEY . Troubleshooting +++++++++++++++ @@ -144,3 +161,4 @@ If you have problems setting up or accessing your monitor and do not know why, e To enable debug mode, add the following line to your config.php file:: define('PSM_DEBUG', true); + diff --git a/docs/intro.rst b/docs/intro.rst index 40c66a4e..1ed2e397 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -15,7 +15,7 @@ Features ++++++++ * Monitor services and websites (see below). -* Email, SMS, Pushover and Telegram notifications. +* Email, SMS, Pushover, Telegram and Jabber notifications. * View history graphs of uptime and latency. * User authentication with 2 levels (administrator and regular user). * Logs of connection errors, outgoing emails and text messages. @@ -44,7 +44,7 @@ There are two different ways to monitor a server: Notifications ------------- Each server has its own settings regarding notification. -You can choose for email, text message (SMS), Pushover.net and Telegram notifications. +You can choose for email, text message (SMS), Pushover.net, Telegram and Jabber notifications. The following SMS gateways are currently available: * Clickatell - diff --git a/docs/requirements.rst b/docs/requirements.rst index 636dde40..0a0f9838 100644 --- a/docs/requirements.rst +++ b/docs/requirements.rst @@ -5,7 +5,7 @@ Requirements * Web server * MySQL database -* For PHP5: 5.5.9+ +* For PHP5: 5.6.0+ * For PHP7: 7.0.8+ * PHP cURL package * PHP PDO mysql driver diff --git a/index.php b/index.php index 668e21f1..797fa81d 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,5 @@ getService('user')->doLogout(); - // logged out, redirect to login - header('Location: '.psm_build_url()); - die(); + $router->getService('user')->doLogout(); + // logged out, redirect to login + header('Location: ' . psm_build_url()); + die(); } $mod = psm_GET('mod', PSM_MODULE_DEFAULT); try { - $router->run($mod); + $router->run($mod); } catch (\InvalidArgumentException $e) { - // invalid module, try the default one - // it that somehow also doesnt exist, we have a bit of an issue - // and we really have no reason catch it - $router->run(PSM_MODULE_DEFAULT); -} \ No newline at end of file + // invalid module, try the default one + // it that somehow also doesnt exist, we have a bit of an issue + // and we really have no reason catch it + $router->run(PSM_MODULE_DEFAULT); +} diff --git a/install.php b/install.php index f5434bd2..ba6f925f 100644 --- a/install.php +++ b/install.php @@ -1,4 +1,5 @@ run('install'); + $router->run('install'); +} diff --git a/logs/.gitignore b/logs/.gitignore new file mode 100644 index 00000000..d6b7ef32 --- /dev/null +++ b/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/manifest.json b/manifest.json old mode 100755 new mode 100644 diff --git a/phpservermon.png b/phpservermon.png old mode 100755 new mode 100644 diff --git a/service-worker.js b/service-worker.js old mode 100755 new mode 100644 index 3d0a4edb..e0758905 --- a/service-worker.js +++ b/service-worker.js @@ -1,7 +1,7 @@ var dataCacheName = 'PSM-v1'; var cacheName = 'PSM-PWA-final-1'; var filesToCache = [ - '/', + '', 'index.php', 'src/templates/default/static/js/history.js', 'src/templates/default/static/js/scripts.js', diff --git a/src/bootstrap.php b/src/bootstrap.php index 6f374c6f..9037beef 100644 --- a/src/bootstrap.php +++ b/src/bootstrap.php @@ -1,4 +1,5 @@ getService('db'); + + // sanity check! + if (!defined('PSM_INSTALL') || !PSM_INSTALL) { + if ($db->getDbHost() === null) { + // no config file has been loaded, redirect the user to the install + header('Location: install.php'); + die(); + } + // config file has been loaded, check if we have a connection + if (!$db->status()) { + trigger_error("Unable to establish database connection...", E_USER_ERROR); + } + // attempt to load configuration from database + if (!psm_load_conf()) { + // unable to load from config table + header('Location: install.php'); + die(); + } + // config load OK, make sure database version is up to date + $installer = new \psm\Util\Install\Installer($db); + if ($installer->isUpgradeRequired()) { + trigger_error( + "Your database is for an older version and requires an upgrade, + please click here to update your database to the latest version.", + E_USER_ERROR + ); + } + } + + $lang = psm_get_conf('language', 'en_US'); + psm_load_lang($lang); } - -// find config file -$path_conf = PSM_PATH_SRC.'../config.php'; -if (file_exists($path_conf)) { - include_once $path_conf; -} -// check for a debug var -if (!defined('PSM_DEBUG')) { - define('PSM_DEBUG', false); -} - -// Debug enabled: report everything -// Debug disabled: report error only if created manually -ini_set('display_errors', 1); -PSM_DEBUG ? error_reporting(E_ALL) : error_reporting(E_USER_ERROR); - -// check for a cron allowed ip array -if (!defined('PSM_CRON_ALLOW')) { - //serialize for php version lower than 7.0.0 - define('PSM_CRON_ALLOW', serialize(array())); -} - -$vendor_autoload = PSM_PATH_SRC.'..'.DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php'; -if (!file_exists($vendor_autoload)) { - trigger_error("No dependencies found in vendor dir. Did you install the dependencies? Please run \"php composer.phar install\".", E_USER_ERROR); -} -require_once $vendor_autoload; - -$router = new psm\Router(); -// this may seem insignificant, but right now lots of functions depend on the following global var definition: -$db = $router->getService('db'); - -// sanity check! -if (!defined('PSM_INSTALL') || !PSM_INSTALL) { - if ($db->getDbHost() === null) { - // no config file has been loaded, redirect the user to the install - header('Location: install.php'); - trigger_error("Could not load config file. Redirect to install failed, click here.", E_USER_ERROR); - } - // config file has been loaded, check if we have a connection - if (!$db->status()) { - trigger_error("Unable to establish database connection...", E_USER_ERROR); - } - // attempt to load configuration from database - if (!psm_load_conf()) { - // unable to load from config table - header('Location: install.php'); - trigger_error("Could not load config table. Redirect to install failed, click here.", E_USER_ERROR); - } - // config load OK, make sure database version is up to date - $installer = new \psm\Util\Install\Installer($db); - if ($installer->isUpgradeRequired()) { - trigger_error("Your database is for an older version and requires an upgrade, please click here to update your database to the latest version.", E_USER_ERROR); - } -} - -$lang = psm_get_conf('language', 'en_US'); -psm_load_lang($lang); \ No newline at end of file diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index aa4cb4f0..8fb1c449 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -1,4 +1,5 @@ status()) { - return false; - } - if (!$db->ifTableExists(PSM_DB_PREFIX.'config')) { - return false; - } - $config_db = $db->select(PSM_DB_PREFIX.'config', null, array('key', 'value')); + if (!defined('PSM_DB_PREFIX') || !$db->status()) { + return false; + } + if (!$db->ifTableExists(PSM_DB_PREFIX . 'config')) { + return false; + } + $config_db = $db->select(PSM_DB_PREFIX . 'config', null, array('key', 'value')); - if (is_array($config_db) && !empty($config_db)) { - foreach ($config_db as $setting) { - $GLOBALS['sm_config'][$setting['key']] = $setting['value']; - } - return true; - } else { - return false; - } -} + if (is_array($config_db) && !empty($config_db)) { + foreach ($config_db as $setting) { + $GLOBALS['sm_config'][$setting['key']] = $setting['value']; + } + return true; + } else { + return false; + } + } /** * Update a config setting. @@ -198,29 +212,30 @@ function psm_load_conf() { * @param string $key * @param string $value */ -function psm_update_conf($key, $value) { - global $db; + function psm_update_conf($key, $value) + { + global $db; - // check if key exists - $exists = psm_get_conf($key, false); - if ($exists === false) { - // add new config record - $db->save( - PSM_DB_PREFIX.'config', - array( - 'key' => $key, - 'value' => $value, - ) - ); - } else { - $db->save( - PSM_DB_PREFIX.'config', - array('value' => $value), - array('key' => $key) - ); - } - $GLOBALS['sm_config'][$key] = $value; -} + // check if key exists + $exists = psm_get_conf($key, false); + if ($exists === false) { + // add new config record + $db->save( + PSM_DB_PREFIX . 'config', + array( + 'key' => $key, + 'value' => $value, + ) + ); + } else { + $db->save( + PSM_DB_PREFIX . 'config', + array('value' => $value), + array('key' => $key) + ); + } + $GLOBALS['sm_config'][$key] = $value; + } ############################################### # @@ -238,18 +253,19 @@ function psm_update_conf($key, $value) { * * @return int log_id */ -function psm_add_log($server_id, $type, $message) { - global $db; + function psm_add_log($server_id, $type, $message) + { + global $db; - return $db->save( - PSM_DB_PREFIX.'log', - array( - 'server_id' => $server_id, - 'type' => $type, - 'message' => $message, - ) - ); -} + return $db->save( + PSM_DB_PREFIX . 'log', + array( + 'server_id' => $server_id, + 'type' => $type, + 'message' => $message, + ) + ); + } /** * This function just adds a user to the log_users table. @@ -257,17 +273,18 @@ function psm_add_log($server_id, $type, $message) { * @param $log_id * @param $user_id */ -function psm_add_log_user($log_id, $user_id) { - global $db; + function psm_add_log_user($log_id, $user_id) + { + global $db; - $db->save( - PSM_DB_PREFIX.'log_users', - array( - 'log_id' => $log_id, - 'user_id' => $user_id, - ) - ); -} + $db->save( + PSM_DB_PREFIX . 'log_users', + array( + 'log_id' => $log_id, + 'user_id' => $user_id, + ) + ); + } /** * This function adds the result of a check to the uptime table for logging purposes. @@ -276,19 +293,20 @@ function psm_add_log_user($log_id, $user_id) { * @param int $status * @param string $latency */ -function psm_log_uptime($server_id, $status, $latency) { - global $db; + function psm_log_uptime($server_id, $status, $latency) + { + global $db; - $db->save( - PSM_DB_PREFIX.'servers_uptime', - array( - 'server_id' => $server_id, - 'date' => date('Y-m-d H:i:s'), - 'status' => $status, - 'latency' => $latency, - ) - ); -} + $db->save( + PSM_DB_PREFIX . 'servers_uptime', + array( + 'server_id' => $server_id, + 'date' => date('Y-m-d H:i:s'), + 'status' => $status, + 'latency' => $latency, + ) + ); + } /** * Converts an interval into a string @@ -296,49 +314,70 @@ function psm_log_uptime($server_id, $status, $latency) { * @param DateInterval $interval * @return string */ - function psm_format_interval(DateInterval $interval) { - $result = ""; + function psm_format_interval(DateInterval $interval) + { + $result = ""; - if ($interval->y) { $result .= $interval->format("%y ").(($interval->y == 1) ? psm_get_lang('system', 'year') : psm_get_lang('system', 'years'))." "; } - if ($interval->m) { $result .= $interval->format("%m ").(($interval->m == 1) ? psm_get_lang('system', 'month') : psm_get_lang('system', 'months'))." "; } - if ($interval->d) { $result .= $interval->format("%d ").(($interval->d == 1) ? psm_get_lang('system', 'day') : psm_get_lang('system', 'days'))." "; } - if ($interval->h) { $result .= $interval->format("%h ").(($interval->h == 1) ? psm_get_lang('system', 'hour') : psm_get_lang('system', 'hours'))." "; } - if ($interval->i) { $result .= $interval->format("%i ").(($interval->i == 1) ? psm_get_lang('system', 'minute') : psm_get_lang('system', 'minutes'))." "; } - if ($interval->s) { $result .= $interval->format("%s ").(($interval->s == 1) ? psm_get_lang('system', 'second') : psm_get_lang('system', 'seconds'))." "; } + if ($interval->y) { + $result .= $interval->format("%y ") . (($interval->y == 1) ? + psm_get_lang('system', 'year') : psm_get_lang('system', 'years')) . " "; + } + if ($interval->m) { + $result .= $interval->format("%m ") . (($interval->m == 1) ? + psm_get_lang('system', 'month') : psm_get_lang('system', 'months')) . " "; + } + if ($interval->d) { + $result .= $interval->format("%d ") . (($interval->d == 1) ? + psm_get_lang('system', 'day') : psm_get_lang('system', 'days')) . " "; + } + if ($interval->h) { + $result .= $interval->format("%h ") . (($interval->h == 1) ? + psm_get_lang('system', 'hour') : psm_get_lang('system', 'hours')) . " "; + } + if ($interval->i) { + $result .= $interval->format("%i ") . (($interval->i == 1) ? + psm_get_lang('system', 'minute') : psm_get_lang('system', 'minutes')) . " "; + } + if ($interval->s) { + $result .= $interval->format("%s ") . (($interval->s == 1) ? + psm_get_lang('system', 'second') : psm_get_lang('system', 'seconds')) . " "; + } - return $result; -} + return $result; + } /** * Parses a string from the language file with the correct variables replaced in the message * * @param boolean|null $status * @param string $type is either 'sms', 'email', 'pushover_title', 'pushover_message' or 'telegram_message' - * @param array $vars server information about the server which may be placed in a message: %KEY% will be replaced by your value + * @param array $vars server information about the server which may be placed in a message: + * %KEY% will be replaced by your value * @param boolean $combi parse other message if notifications need to be send combined * @return string parsed message */ -function psm_parse_msg($status, $type, $vars, $combi = false) { - if(is_bool($status)) { - $status = ($status === true) ? 'on_' : 'off_'; + function psm_parse_msg($status, $type, $vars, $combi = false) + { + if (is_bool($status)) { + $status = ($status === true) ? 'on_' : 'off_'; + } + + $combi = ($combi === true) ? 'combi_' : ''; + + $message = psm_get_lang('notifications', $combi . $status . $type); + + if (!$message) { + return $message; + } + $vars['date'] = date('Y-m-d H:i:s'); + + foreach ($vars as $k => $v) { + $message = str_replace('%' . strtoupper($k) . '%', $v, $message); + } + + return $message; } - $combi = ($combi === true) ? 'combi_' : ''; - - $message = psm_get_lang('notifications', $combi.$status.$type); - - if (!$message) { - return $message; - } - $vars['date'] = date('Y-m-d H:i:s'); - - foreach ($vars as $k => $v) { - $message = str_replace('%'.strtoupper($k).'%', $v, $message); - } - - return $message; -} - /** * Shortcut to curl_init(), curl_exec and curl_close() * @@ -351,64 +390,87 @@ function psm_parse_msg($status, $type, $vars, $combi = false) { * @param string|bool $website_password Password website * @param string|null $request_method Request method like GET, POST etc. * @param string|null $post_field POST data - * @return string cURL result + * @return array cURL result */ -function psm_curl_get($href, $header = false, $body = true, $timeout = null, $add_agent = true, $website_username = false, $website_password = false, $request_method = null, $post_field = null) { - $timeout = $timeout == null ? PSM_CURL_TIMEOUT : intval($timeout); + function psm_curl_get( + $href, + $header = false, + $body = true, + $timeout = null, + $add_agent = true, + $website_username = false, + $website_password = false, + $request_method = null, + $post_field = null + ) { + ($timeout === null || $timeout > 0) ? PSM_CURL_TIMEOUT : intval($timeout); - $ch = curl_init(); - if(defined('PSM_DEBUG') && PSM_DEBUG === true && psm_is_cli()) { - curl_setopt($ch, CURLOPT_VERBOSE, true); - } - curl_setopt($ch, CURLOPT_HEADER, $header); - curl_setopt($ch, CURLOPT_NOBODY, (!$body)); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); - curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); - curl_setopt($ch, CURLOPT_ENCODING, ''); - - if (!empty($request_method)) { - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_method); - } + $ch = curl_init(); + if (defined('PSM_DEBUG') && PSM_DEBUG === true && psm_is_cli()) { + curl_setopt($ch, CURLOPT_VERBOSE, true); + } + curl_setopt($ch, CURLOPT_HEADER, $header); + curl_setopt($ch, CURLOPT_NOBODY, (!$body)); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_setopt($ch, CURLOPT_ENCODING, ''); + curl_setopt($ch, CURLOPT_CERTINFO, 1); + + if (!empty($request_method)) { + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request_method); + } - if (!empty($post_field)) { - curl_setopt($ch, CURLOPT_POSTFIELDS, $post_field); - } + if (!empty($post_field)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, $post_field); + } - if ($website_username !== false && $website_password !== false && !empty($website_username) && !empty($website_password)) { - curl_setopt($ch, CURLOPT_USERPWD, $website_username.":".$website_password); - } + if ( + $website_username !== false && + $website_password !== false && + !empty($website_username) && + !empty($website_password) + ) { + curl_setopt($ch, CURLOPT_USERPWD, $website_username . ":" . $website_password); + } - curl_setopt($ch, CURLOPT_URL, $href); + $href = preg_replace('/(.*)(%cachebuster%)/', '$0' . time(), $href); - $proxy_url = psm_get_conf('proxy_url', ''); - if (psm_get_conf('proxy', '0') === '1') { - curl_setopt($ch, CURLOPT_PROXY, $proxy_url); - $proxy_user = psm_get_conf('proxy_user', ''); - $proxy_password = psm_get_conf('proxy_password', ''); - if (!empty($proxy_user) && !empty($proxy_password)) { - curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user.':'.$proxy_password); - } - } + curl_setopt($ch, CURLOPT_URL, $href); - if ($add_agent) { - curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; phpservermon/'.PSM_VERSION.'; +https://github.com/phpservermon/phpservermon)'); - } + $proxy_url = psm_get_conf('proxy_url', ''); + if (psm_get_conf('proxy', '0') === '1') { + curl_setopt($ch, CURLOPT_PROXY, $proxy_url); + $proxy_user = psm_get_conf('proxy_user', ''); + $proxy_password = psm_get_conf('proxy_password', ''); + if (!empty($proxy_user) && !empty($proxy_password)) { + curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy_user . ':' . $proxy_password); + } + } - $result = curl_exec($ch); - curl_close($ch); - - if(defined('PSM_DEBUG') && PSM_DEBUG === true && psm_is_cli()) { - echo PHP_EOL.'==============cURL Result for: '.$href.'==========================================='.PHP_EOL; - print_r($result); - echo PHP_EOL.'==============END cURL Resul for: '.$href.'==========================================='.PHP_EOL; - } + if ($add_agent) { + curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; phpservermon/' . + PSM_VERSION . '; +https://github.com/phpservermon/phpservermon)'); + } - return $result; -} + $result['exec'] = curl_exec($ch); + $result['info'] = curl_getinfo($ch); + + curl_close($ch); + + if (defined('PSM_DEBUG') && PSM_DEBUG === true && psm_is_cli()) { + echo PHP_EOL . + '==============cURL Result for: ' . $href . '===========================================' . PHP_EOL; + print_r($result); + echo PHP_EOL . + '==============END cURL Resul for: ' . $href . '===========================================' . PHP_EOL; + } + + return $result; + } /** * Get a "nice" timespan message @@ -417,45 +479,61 @@ function psm_curl_get($href, $header = false, $body = true, $timeout = null, $ad * @param string $time * @return string */ -function psm_timespan($time) { - if (empty($time) || $time == '0000-00-00 00:00:00') { - return psm_get_lang('system', 'never'); - } - if ($time !== intval($time)) { $time = strtotime($time); } - if ($time < strtotime(date('Y-m-d 00:00:00')) - 60 * 60 * 24 * 3) { - $format = psm_get_lang('system', (date('Y') !== date('Y', $time)) ? 'long_day_format' : 'short_day_format'); - // Check for Windows to find and replace the %e - // modifier correctly - if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { - $format = preg_replace('#(?= 60 * 60 * 24) { - $format = psm_get_lang('system', (date('l', time() - 60 * 60 * 24) == date('l', $time)) ? 'yesterday_format' : 'other_day_format'); - return strftime($format, $time); - } - if ($d >= 60 * 60 * 2) { return sprintf(psm_get_lang('system', 'hours_ago'), intval($d / (60 * 60))); } - if ($d >= 60 * 60) { return psm_get_lang('system', 'an_hour_ago'); } - if ($d >= 60 * 2) { return sprintf(psm_get_lang('system', 'minutes_ago'), intval($d / 60)); } - if ($d >= 60) { return psm_get_lang('system', 'a_minute_ago'); } - if ($d >= 2) { return sprintf(psm_get_lang('system', 'seconds_ago'), intval($d)); } + function psm_timespan($time) + { + if (empty($time) || $time == '0000-00-00 00:00:00') { + return psm_get_lang('system', 'never'); + } + if ($time !== intval($time)) { + $time = strtotime($time); + } + if ($time < strtotime(date('Y-m-d 00:00:00')) - 60 * 60 * 24 * 3) { + $format = psm_get_lang('system', (date('Y') !== date('Y', $time)) ? + 'long_day_format' : 'short_day_format'); + // Check for Windows to find and replace the %e + // modifier correctly + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + $format = preg_replace('#(?= 60 * 60 * 24) { + $format = psm_get_lang('system', (date('l', time() - 60 * 60 * 24) == date('l', $time)) ? + 'yesterday_format' : 'other_day_format'); + return strftime($format, $time); + } + if ($d >= 60 * 60 * 2) { + return sprintf(psm_get_lang('system', 'hours_ago'), intval($d / (60 * 60))); + } + if ($d >= 60 * 60) { + return psm_get_lang('system', 'an_hour_ago'); + } + if ($d >= 60 * 2) { + return sprintf(psm_get_lang('system', 'minutes_ago'), intval($d / 60)); + } + if ($d >= 60) { + return psm_get_lang('system', 'a_minute_ago'); + } + if ($d >= 2) { + return sprintf(psm_get_lang('system', 'seconds_ago'), intval($d)); + } - return psm_get_lang('system', 'a_second_ago'); -} + return psm_get_lang('system', 'a_second_ago'); + } /** * Get a localised date from MySQL date format * @param string $time * @return string */ -function psm_date($time) { - if (empty($time) || $time == '0000-00-00 00:00:00') { - return psm_get_lang('system', 'never'); - } - return strftime('%x %X', strtotime($time)); -} + function psm_date($time) + { + if (empty($time) || $time == '0000-00-00 00:00:00') { + return psm_get_lang('system', 'never'); + } + return strftime('%x %X', strtotime($time)); + } /** * Check if an update is available for PHP Server Monitor. @@ -463,36 +541,46 @@ function psm_date($time) { * Will only check for new version if user turned updates on in config. * @return boolean */ -function psm_update_available() { - if (!psm_get_conf('show_update')) { - // user does not want updates, fair enough. - return false; - } + function psm_update_available() + { + if (!psm_get_conf('show_update')) { + // user does not want updates, fair enough. + return false; + } - $last_update = psm_get_conf('last_update_check'); + $last_update = psm_get_conf('last_update_check'); - if ((time() - PSM_UPDATE_INTERVAL) > $last_update) { - // been more than a week since update, lets go - // update last check date - psm_update_conf('last_update_check', time()); - $latest = psm_curl_get(PSM_UPDATE_URL); - // extract latest version from Github. - preg_match('/"tag_name":"[v](([\d][.][\d][.][\d])(-?\w*))"/', $latest, $latest); - // add latest version to database - if ($latest[2] !== false && strlen($latest[2]) < 15) { - psm_update_conf('version_update_check', $latest[2]); - } - } else { - $latest[2] = psm_get_conf('version_update_check'); - } + if ((time() - PSM_UPDATE_INTERVAL) > $last_update) { + // been more than a week since update, lets go + // update last check date + psm_update_conf('last_update_check', time()); + $latest = psm_curl_get(PSM_UPDATE_URL); + if ($latest['info'] === false || (int)$latest['info']['http_code'] >= 300) { + // error + return false; + } + // extract latest version from Github. + $githubInfo = json_decode($latest['exec']); + if (property_exists($githubInfo, 'tag_name') === false) { + // version not found + return false; + } + $tagName = $githubInfo->tag_name; + $latestVersion = str_replace('v', '', $tagName); + // check from old version ... maybe has reason but I don't think so ... + if (empty($latestVersion) === true || strlen($latestVersion) >= 15) { + // weird version + return false; + } + // add latest version to database + psm_update_conf('version_update_check', $latestVersion); + } else { + $latestVersion = psm_get_conf('version_update_check'); + } - if ($latest[2] !== false) { - $current = psm_get_conf('version'); - return version_compare($latest[2], $current, '>'); - } else { - return false; - } -} + $current = psm_get_conf('version'); + return version_compare($latestVersion, $current, '>'); + } /** * Prepare a new phpmailer instance. @@ -502,144 +590,205 @@ function psm_update_available() { * @param string $from_email * @return \PHPMailer\PHPMailer\PHPMailer */ -function psm_build_mail($from_name = null, $from_email = null) { - $phpmailer = new \PHPMailer\PHPMailer\PHPMailer(); - $phpmailer->Encoding = "base64"; - $phpmailer->CharSet = 'UTF-8'; - $phpmailer->SMTPDebug = 0; + function psm_build_mail($from_name = null, $from_email = null) + { + $phpmailer = new \PHPMailer\PHPMailer\PHPMailer(); + $phpmailer->Encoding = "base64"; + $phpmailer->CharSet = 'UTF-8'; + $phpmailer->SMTPDebug = 0; - if (psm_get_conf('email_smtp') == '1') { - $phpmailer->IsSMTP(); - $phpmailer->Host = psm_get_conf('email_smtp_host'); - $phpmailer->Port = (int) psm_get_conf('email_smtp_port'); - $phpmailer->SMTPSecure = psm_get_conf('email_smtp_security'); + if (psm_get_conf('email_smtp') == '1') { + $phpmailer->IsSMTP(); + $phpmailer->Host = psm_get_conf('email_smtp_host'); + $phpmailer->Port = (int) psm_get_conf('email_smtp_port'); + $phpmailer->SMTPSecure = psm_get_conf('email_smtp_security'); - $smtp_user = psm_get_conf('email_smtp_username'); - $smtp_pass = psm_get_conf('email_smtp_password'); + $smtp_user = psm_get_conf('email_smtp_username'); + $smtp_pass = psm_password_decrypt( + psm_get_conf('password_encrypt_key'), + psm_get_conf('email_smtp_password') + ); - if ($smtp_user != '' && $smtp_pass != '') { - $phpmailer->SMTPAuth = true; - $phpmailer->Username = $smtp_user; - $phpmailer->Password = $smtp_pass; - } - } else { - $phpmailer->IsMail(); - } - if ($from_name == null) { - $from_name = psm_get_conf('email_from_name'); - } - if ($from_email == null) { - $from_email = psm_get_conf('email_from_email'); - } - $phpmailer->SetFrom($from_email, $from_name); + if ($smtp_user != '' && $smtp_pass != '') { + $phpmailer->SMTPAuth = true; + $phpmailer->Username = $smtp_user; + $phpmailer->Password = $smtp_pass; + } + } else { + $phpmailer->IsMail(); + } + if ($from_name == null) { + $from_name = psm_get_conf('email_from_name'); + } + if ($from_email == null) { + $from_email = psm_get_conf('email_from_email'); + } + $phpmailer->SetFrom($from_email, $from_name); - return $phpmailer; -} + return $phpmailer; + } /** * Prepare a new Pushover util. * * @return \Pushover */ -function psm_build_pushover() { - $pushover = new \Pushover(); - $pushover->setToken(psm_get_conf('pushover_api_token')); + function psm_build_pushover() + { + $pushover = new \Pushover(); + $pushover->setToken(psm_get_conf('pushover_api_token')); - return $pushover; -} + return $pushover; + } /** * * @return \Telegram */ -function psm_build_telegram() { - $telegram = new \Telegram(); - $telegram->setToken(psm_get_conf('telegram_api_token')); + function psm_build_telegram() + { + $telegram = new \Telegram(); + $telegram->setToken(psm_get_conf('telegram_api_token')); - return $telegram; -} + return $telegram; + } + + /** + * Send message via XMPP. + * + * @param string $host + * @param string $username + * @param string $password + * @param array $receivers + * @param string $message + * @param int|null $port + * @param string|null $domain + */ + function psm_jabber_send_message($host, $username, $password, $receivers, $message, $port = null, $domain = null) + { + $options = [ + 'jid' => $username, // incl. gmail.com + 'pass' => $password, + 'domain' => $domain, // gmail.com or null + 'host' => $host, // talk.google.com + 'port' => $port, // talk.google.com needs to have 5223 ... 5222 - CN problem - gmail.com vs talk.google.com + 'log_path' => __DIR__ . '/../../logs/jaxl.log', // own log + + // force tls + 'force_tls' => PSM_JABBER_FORCE_TLS, + // (required) perform X-OAUTH2 + 'auth_type' => PSM_JABBER_AUTH_TYPE, //'X-OAUTH2', // auth failure with this option :( so just PLAIN ... + + 'log_level' => PSM_JABBER_DEBUG_LEVEL + ]; + + try { + $client = new JAXL($options); + + // Add Callbacks + $client->add_cb('on_auth_success', function () use ($client, $receivers, $message) { + JAXLLogger::info('got on_auth_success cb'); + foreach ($receivers as $receiver) { + $client->send_chat_msg($receiver, $message); + } + $client->send_end_stream(); + }); + $client->add_cb('on_auth_failure', function ($reason) use ($client) { + $client->send_end_stream(); + JAXLLogger::info('got on_auth_failure cb with reason: ' . $reason); + }); + $client->add_cb('on_disconnect', function () use ($client) { + JAXLLogger::info('got on_disconnect cb'); + }); + + $client->start(); + } catch (Exception $ex) { + JAXLLogger::error('Exception: ' . $ex->getMessage()); + } + } /** * Prepare a new SMS util. * * @return \psm\Txtmsg\TxtmsgInterface */ -function psm_build_sms() { - $sms = null; + function psm_build_sms() + { + $sms = null; - // open the right class - // not making this any more dynamic, because perhaps some gateways need custom settings - switch (strtolower(psm_get_conf('sms_gateway'))) { - case 'mosms': - $sms = new \psm\Txtmsg\Mosms(); - break; - case 'smsit': - $sms = new \psm\Txtmsg\Smsit(); - break; - case 'inetworx': - $sms = new \psm\Txtmsg\Inetworx(); - break; - case 'messagebird': - $sms = new \psm\Txtmsg\Messagebird(); - break; - case 'spryng': - $sms = new \psm\Txtmsg\Spryng(); - break; - case 'clickatell': - $sms = new \psm\Txtmsg\Clickatell(); - break; - case 'textmarketer': - $sms = new \psm\Txtmsg\Textmarketer(); - break; - case 'smsglobal': - $sms = new \psm\Txtmsg\Smsglobal(); - break; - case 'freevoipdeal': - $sms = new \psm\Txtmsg\FreeVoipDeal(); - break; - case 'nexmo': - $sms = new \psm\Txtmsg\Nexmo(); - break; - case 'freemobilesms': - $sms = new \psm\Txtmsg\FreeMobileSMS(); - break; - case 'clicksend': - $sms = new \psm\Txtmsg\ClickSend(); - break; - case 'octopush': - $sms = new \psm\Txtmsg\Octopush(); - break; - case 'smsgw': - $sms = new \psm\Txtmsg\Smsgw(); - break; - case 'twilio': - $sms = new \psm\Txtmsg\Twilio(); - break; - case 'cmbulksms': - $sms = new \psm\Txtmsg\CMBulkSMS(); - break; - case 'gatewayapi': - $sms = new \psm\Txtmsg\GatewayAPI(); - break; - case 'callr': - $sms = new \psm\Txtmsg\Callr(); - break; - case 'plivo': - $sms = new \psm\Txtmsg\Plivo(); - break; - case 'solutionsinfini': - $sms = new \psm\Txtmsg\SolutionsInfini(); - break; - } + // open the right class + // not making this any more dynamic, because perhaps some gateways need custom settings + switch (strtolower(psm_get_conf('sms_gateway'))) { + case 'mosms': + $sms = new \psm\Txtmsg\Mosms(); + break; + case 'smsit': + $sms = new \psm\Txtmsg\Smsit(); + break; + case 'inetworx': + $sms = new \psm\Txtmsg\Inetworx(); + break; + case 'messagebird': + $sms = new \psm\Txtmsg\Messagebird(); + break; + case 'spryng': + $sms = new \psm\Txtmsg\Spryng(); + break; + case 'clickatell': + $sms = new \psm\Txtmsg\Clickatell(); + break; + case 'textmarketer': + $sms = new \psm\Txtmsg\Textmarketer(); + break; + case 'smsglobal': + $sms = new \psm\Txtmsg\Smsglobal(); + break; + case 'freevoipdeal': + $sms = new \psm\Txtmsg\FreeVoipDeal(); + break; + case 'nexmo': + $sms = new \psm\Txtmsg\Nexmo(); + break; + case 'freemobilesms': + $sms = new \psm\Txtmsg\FreeMobileSMS(); + break; + case 'clicksend': + $sms = new \psm\Txtmsg\ClickSend(); + break; + case 'octopush': + $sms = new \psm\Txtmsg\Octopush(); + break; + case 'smsgw': + $sms = new \psm\Txtmsg\Smsgw(); + break; + case 'twilio': + $sms = new \psm\Txtmsg\Twilio(); + break; + case 'cmbulksms': + $sms = new \psm\Txtmsg\CMBulkSMS(); + break; + case 'gatewayapi': + $sms = new \psm\Txtmsg\GatewayAPI(); + break; + case 'callr': + $sms = new \psm\Txtmsg\Callr(); + break; + case 'plivo': + $sms = new \psm\Txtmsg\Plivo(); + break; + case 'solutionsinfini': + $sms = new \psm\Txtmsg\SolutionsInfini(); + break; + } - // copy login information from the config file - if ($sms) { - $sms->setLogin(psm_get_conf('sms_gateway_username'), psm_get_conf('sms_gateway_password')); - $sms->setOriginator(psm_get_conf('sms_from')); - } + // copy login information from the config file + if ($sms) { + $sms->setLogin(psm_get_conf('sms_gateway_username'), psm_get_conf('sms_gateway_password')); + $sms->setOriginator(psm_get_conf('sms_from')); + } - return $sms; -} + return $sms; + } /** * Generate a new link to the current monitor @@ -648,36 +797,38 @@ function psm_build_sms() { * @param boolean $htmlentities use entities in url? * @return string */ -function psm_build_url($params = array(), $urlencode = true, $htmlentities = true) { - if (defined('PSM_BASE_URL') && PSM_BASE_URL !== null) { - $url = PSM_BASE_URL; - } else { - $url = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST']; - // on Windows, dirname() adds both back- and forward slashes (http://php.net/dirname). - // for urls, we only want the forward slashes. - $url .= dirname($_SERVER['SCRIPT_NAME']); - $url = str_replace('\\', '', $url); - } - $url = rtrim($url, '/').'/'; + function psm_build_url($params = array(), $urlencode = true, $htmlentities = true) + { + if (defined('PSM_BASE_URL') && PSM_BASE_URL !== null) { + $url = PSM_BASE_URL; + } else { + $url = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || + $_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST']; + // on Windows, dirname() adds both back- and forward slashes (http://php.net/dirname). + // for urls, we only want the forward slashes. + $url .= dirname($_SERVER['SCRIPT_NAME']); + $url = str_replace('\\', '', $url); + } + $url = rtrim($url, '/') . '/'; - if ($params != null) { - $url .= '?'; - if (is_array($params)) { - $delim = ($htmlentities) ? '&' : '&'; + if ($params != null) { + $url .= '?'; + if (is_array($params)) { + $delim = ($htmlentities) ? '&' : '&'; - foreach ($params as $k => $v) { - if ($urlencode) { - $v = urlencode($v); - } - $url .= $delim.$k.'='.$v; - } - } else { - $url .= $params; - } - } + foreach ($params as $k => $v) { + if ($urlencode) { + $v = urlencode($v); + } + $url .= $delim . $k . '=' . $v; + } + } else { + $url .= $params; + } + } - return $url; -} + return $url; + } /** * Try existence of a GET var, if not return the alternative @@ -685,13 +836,14 @@ function psm_build_url($params = array(), $urlencode = true, $htmlentities = tru * @param string $alt * @return mixed */ -function psm_GET($key, $alt = null) { - if (isset($_GET[$key])) { - return $_GET[$key]; - } else { - return $alt; - } -} + function psm_GET($key, $alt = null) + { + if (isset($_GET[$key])) { + return $_GET[$key]; + } else { + return $alt; + } + } /** * Try existence of a POST var, if not return the alternative @@ -699,13 +851,14 @@ function psm_GET($key, $alt = null) { * @param string|array|bool $alt * @return mixed */ -function psm_POST($key, $alt = null) { - if (isset($_POST[$key])) { - return $_POST[$key]; - } else { - return $alt; - } -} + function psm_POST($key, $alt = null) + { + if (isset($_POST[$key])) { + return $_POST[$key]; + } else { + return $alt; + } + } /** * Check if we are in CLI mode @@ -713,9 +866,10 @@ function psm_POST($key, $alt = null) { * Note, php_sapi cannot be used because cgi-fcgi returns both for web and cli. * @return boolean */ -function psm_is_cli() { - return (!isset($_SERVER['SERVER_SOFTWARE']) || php_sapi_name() == 'cli'); -} + function psm_is_cli() + { + return (!isset($_SERVER['SERVER_SOFTWARE']) || php_sapi_name() == 'cli'); + } ############################################### # @@ -728,24 +882,26 @@ function psm_is_cli() { * * @param mixed $arr */ -function pre($arr = null) { - echo "
";
-	if ($arr === null) {
-		debug_print_backtrace();
-	}
-	print_r($arr);
-	echo "
"; -} + function pre($arr = null) + { + echo "
";
+        if ($arr === null) {
+            debug_print_backtrace();
+        }
+        print_r($arr);
+        echo "
"; + } /** * Send headers to the browser to avoid caching */ -function psm_no_cache() { - header("Expires: Mon, 20 Dec 1998 01:00:00 GMT"); - header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); - header("Cache-Control: no-cache, must-revalidate"); - header("Pragma: no-cache"); -} + function psm_no_cache() + { + header("Expires: Mon, 20 Dec 1998 01:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-cache, must-revalidate"); + header("Pragma: no-cache"); + } /** * Encrypts the password for storage in the database @@ -755,36 +911,33 @@ function psm_no_cache() { * @return string * @author Pavel Laupe Dvorak */ -// TODO change to working function -function psm_password_encrypt($key, $password) -{ - if (empty($password)) { - return ''; - } + function psm_password_encrypt($key, $password) + { + if (empty($password)) { + return ''; + } - if (empty($key)) { - throw new \InvalidArgumentException('invalid_encryption_key'); - } + if (empty($key)) { + throw new \InvalidArgumentException('invalid_encryption_key'); + } - // TODO rewrite - $iv = mcrypt_create_iv( - mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), - MCRYPT_DEV_URANDOM - ); + // using open ssl + $cipher = "AES-256-CBC"; + $ivlen = openssl_cipher_iv_length($cipher); + $iv = openssl_random_pseudo_bytes($ivlen); + $encrypted = base64_encode( + $iv . + openssl_encrypt( + $password, + $cipher, + hash('sha256', $key, true), + OPENSSL_RAW_DATA, // OPENSSL_ZERO_PADDING OPENSSL_RAW_DATA + $iv + ) + ); - $encrypted = base64_encode( - $iv. - mcrypt_encrypt( - MCRYPT_RIJNDAEL_128, - hash('sha256', $key, true), - $password, - MCRYPT_MODE_CBC, - $iv - ) - ); - - return $encrypted; -} + return $encrypted; + } /** * Decrypts password stored in the database for future use @@ -794,32 +947,31 @@ function psm_password_encrypt($key, $password) * @return string * @author Pavel Laupe Dvorak */ -function psm_password_decrypt($key, $encryptedString) -{ - if (empty($encryptedString)) { - return ''; - } + function psm_password_decrypt($key, $encryptedString) + { + if (empty($encryptedString)) { + return ''; + } - if (empty($key)) { - throw new \InvalidArgumentException('invalid_encryption_key'); - } + if (empty($key)) { + throw new \InvalidArgumentException('invalid_encryption_key'); + } - $data = base64_decode($encryptedString); - $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); - - $decrypted = rtrim( - mcrypt_decrypt( - MCRYPT_RIJNDAEL_128, - hash('sha256', $key, true), - substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), - MCRYPT_MODE_CBC, - $iv - ), - "\0" - ); - - return $decrypted; -} + // using open ssl + $data = base64_decode($encryptedString); + $cipher = "AES-256-CBC"; + $ivlen = openssl_cipher_iv_length($cipher); + $iv = substr($data, 0, $ivlen); + $decrypted = openssl_decrypt( + substr($data, $ivlen), + $cipher, + hash('sha256', $key, true), + OPENSSL_RAW_DATA, + $iv + ); + + return $decrypted; + } /** * Send notification to Telegram @@ -827,50 +979,57 @@ function psm_password_decrypt($key, $encryptedString) * @return string * @author Tim Zandbergen */ -class telegram -{ - private $_token; - private $_user; - private $_message; - private $_url; + class Telegram + { + private $token; + private $user; + private $message; + private $url; - public function setToken($token) { - $this->_token = (string) $token; - } - public function setUser($user) { - $this->_user = (string) $user; - } - public function setMessage($message) { - $message = str_replace("
    ","",$message); - $message = str_replace("
","\n",$message); - $message = str_replace("
  • ","- ",$message); - $message = str_replace("
  • ","\n",$message); - $message = str_replace("
    ","\n",$message); - $message = str_replace("
    ","\n",$message); - $this->_message = (string) $message; - } - public function sendurl() { - $con = curl_init($this->_url); - curl_setopt($con, CURLOPT_RETURNTRANSFER, true); - curl_setopt($con, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($con, CURLOPT_TIMEOUT, 60); - $response = curl_exec($con); - $response = json_decode($response, true); - return $response; - } - public function send() { - if (!Empty($this->_token) && !Empty($this->_user) && !Empty($this->_message)) { - $this->_url = 'https://api.telegram.org/bot'.urlencode($this->_token). - '/sendMessage?chat_id='.urlencode($this->_user).'&text='. - urlencode($this->_message).'&parse_mode=HTML'; - } - return $this->sendurl(); - } - // Get the bots username - public function getBotUsername() { - if (!Empty($this->_token)) { - $this->_url = 'https://api.telegram.org/bot'.urlencode($this->_token).'/getMe'; - } - return $this->sendurl(); - } + public function setToken($token) + { + $this->token = (string) $token; + } + public function setUser($user) + { + $this->user = (string) $user; + } + public function setMessage($message) + { + $message = str_replace("
      ", "", $message); + $message = str_replace("
    ", "\n", $message); + $message = str_replace("
  • ", "- ", $message); + $message = str_replace("
  • ", "\n", $message); + $message = str_replace("
    ", "\n", $message); + $message = str_replace("
    ", "\n", $message); + $this->message = (string) $message; + } + public function sendurl() + { + $con = curl_init($this->url); + curl_setopt($con, CURLOPT_RETURNTRANSFER, true); + curl_setopt($con, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($con, CURLOPT_TIMEOUT, 60); + $response = curl_exec($con); + $response = json_decode($response, true); + return $response; + } + public function send() + { + if (!empty($this->token) && !empty($this->user) && !empty($this->message)) { + $this->url = 'https://api.telegram.org/bot' . urlencode($this->token) . + '/sendMessage?chat_id=' . urlencode($this->user) . '&text=' . + urlencode($this->message) . '&parse_mode=HTML&disable_web_page_preview=True'; + } + return $this->sendurl(); + } + // Get the bots username + public function getBotUsername() + { + if (!empty($this->token)) { + $this->url = 'https://api.telegram.org/bot' . urlencode($this->token) . '/getMe'; + } + return $this->sendurl(); + } + } } diff --git a/src/includes/password_compatibility_library.inc.php b/src/includes/password_compatibility_library.inc.php index 641e7550..1f083c7d 100644 --- a/src/includes/password_compatibility_library.inc.php +++ b/src/includes/password_compatibility_library.inc.php @@ -1,4 +1,5 @@ 31) { + trigger_error( + sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), + E_USER_WARNING + ); + return null; + } + } + // The length of salt to generate + $raw_salt_len = 16; + // The length required in the final serialization + $required_salt_len = 22; + $hash_format = sprintf("$2y$%02d$", $cost); + break; + default: + trigger_error( + sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), + E_USER_WARNING + ); + return null; + } + if (isset($options['salt'])) { + switch (gettype($options['salt'])) { + case 'NULL': + case 'boolean': + case 'integer': + case 'double': + case 'string': + $salt = (string) $options['salt']; + break; + case 'object': + if (method_exists($options['salt'], '__tostring')) { + $salt = (string) $options['salt']; + break; + } + // no break + case 'array': + case 'resource': + default: + trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); + return null; + } + if (strlen($salt) < $required_salt_len) { + trigger_error( + sprintf( + "password_hash(): Provided salt is too short: %d expecting %d", + strlen($salt), + $required_salt_len + ), + E_USER_WARNING + ); + return null; + } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { + $salt = str_replace('+', '.', base64_encode($salt)); + } + } else { + $buffer = ''; + $buffer_valid = false; + if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { + $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); + if ($buffer) { + $buffer_valid = true; + } + } + if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { + $buffer = openssl_random_pseudo_bytes($raw_salt_len); + if ($buffer) { + $buffer_valid = true; + } + } + if (!$buffer_valid && is_readable('/dev/urandom')) { + $f = fopen('/dev/urandom', 'r'); + $read = strlen($buffer); + while ($read < $raw_salt_len) { + $buffer .= fread($f, $raw_salt_len - $read); + $read = strlen($buffer); + } + fclose($f); + if ($read >= $raw_salt_len) { + $buffer_valid = true; + } + } + if (!$buffer_valid || strlen($buffer) < $raw_salt_len) { + $bl = strlen($buffer); + for ($i = 0; $i < $raw_salt_len; $i++) { + if ($i < $bl) { + $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); + } else { + $buffer .= chr(mt_rand(0, 255)); + } + } + } + $salt = str_replace('+', '.', base64_encode($buffer)); + } + $salt = substr($salt, 0, $required_salt_len); - /** - * Hash the password using the specified algorithm - * - * @param string $password The password to hash - * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) - * @param array $options The options for the algorithm to use - * - * @return string|false The hashed password, or false on error. - */ - function password_hash($password, $algo, array $options = array()) { - if (!function_exists('crypt')) { - trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); - return null; - } - if (!is_string($password)) { - trigger_error("password_hash(): Password must be a string", E_USER_WARNING); - return null; - } - if (!is_int($algo)) { - trigger_error("password_hash() expects parameter 2 to be long, ".gettype($algo)." given", E_USER_WARNING); - return null; - } - switch ($algo) { - case PASSWORD_BCRYPT: - // Note that this is a C constant, but not exposed to PHP, so we don't define it here. - $cost = 10; - if (isset($options['cost'])) { - $cost = $options['cost']; - if ($cost < 4 || $cost > 31) { - trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); - return null; - } - } - // The length of salt to generate - $raw_salt_len = 16; - // The length required in the final serialization - $required_salt_len = 22; - $hash_format = sprintf("$2y$%02d$", $cost); - break; - default: - trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); - return null; - } - if (isset($options['salt'])) { - switch (gettype($options['salt'])) { - case 'NULL': - case 'boolean': - case 'integer': - case 'double': - case 'string': - $salt = (string) $options['salt']; - break; - case 'object': - if (method_exists($options['salt'], '__tostring')) { - $salt = (string) $options['salt']; - break; - } - case 'array': - case 'resource': - default: - trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); - return null; - } - if (strlen($salt) < $required_salt_len) { - trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", strlen($salt), $required_salt_len), E_USER_WARNING); - return null; - } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { - $salt = str_replace('+', '.', base64_encode($salt)); - } - } else { - $buffer = ''; - $buffer_valid = false; - if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { - $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); - if ($buffer) { - $buffer_valid = true; - } - } - if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { - $buffer = openssl_random_pseudo_bytes($raw_salt_len); - if ($buffer) { - $buffer_valid = true; - } - } - if (!$buffer_valid && is_readable('/dev/urandom')) { - $f = fopen('/dev/urandom', 'r'); - $read = strlen($buffer); - while ($read < $raw_salt_len) { - $buffer .= fread($f, $raw_salt_len - $read); - $read = strlen($buffer); - } - fclose($f); - if ($read >= $raw_salt_len) { - $buffer_valid = true; - } - } - if (!$buffer_valid || strlen($buffer) < $raw_salt_len) { - $bl = strlen($buffer); - for ($i = 0; $i < $raw_salt_len; $i++) { - if ($i < $bl) { - $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); - } else { - $buffer .= chr(mt_rand(0, 255)); - } - } - } - $salt = str_replace('+', '.', base64_encode($buffer)); - } - $salt = substr($salt, 0, $required_salt_len); + $hash = $hash_format . $salt; - $hash = $hash_format.$salt; + $ret = crypt($password, $hash); - $ret = crypt($password, $hash); + if (!is_string($ret) || strlen($ret) <= 13) { + return false; + } - if (!is_string($ret) || strlen($ret) <= 13) { - return false; - } + return $ret; + } - return $ret; - } + /** + * Get information about the password hash. Returns an array of the information + * that was used to generate the password hash. + * + * array( + * 'algo' => 1, + * 'algoName' => 'bcrypt', + * 'options' => array( + * 'cost' => 10, + * ), + * ) + * + * @param string $hash The password hash to extract info from + * + * @return array The array of information about the hash. + */ + function password_get_info($hash) + { + $return = array( + 'algo' => 0, + 'algoName' => 'unknown', + 'options' => array(), + ); + if (substr($hash, 0, 4) == '$2y$' && strlen($hash) == 60) { + $return['algo'] = PASSWORD_BCRYPT; + $return['algoName'] = 'bcrypt'; + list($cost) = sscanf($hash, "$2y$%d$"); + $return['options']['cost'] = $cost; + } + return $return; + } - /** - * Get information about the password hash. Returns an array of the information - * that was used to generate the password hash. - * - * array( - * 'algo' => 1, - * 'algoName' => 'bcrypt', - * 'options' => array( - * 'cost' => 10, - * ), - * ) - * - * @param string $hash The password hash to extract info from - * - * @return array The array of information about the hash. - */ - function password_get_info($hash) { - $return = array( - 'algo' => 0, - 'algoName' => 'unknown', - 'options' => array(), - ); - if (substr($hash, 0, 4) == '$2y$' && strlen($hash) == 60) { - $return['algo'] = PASSWORD_BCRYPT; - $return['algoName'] = 'bcrypt'; - list($cost) = sscanf($hash, "$2y$%d$"); - $return['options']['cost'] = $cost; - } - return $return; - } + /** + * Determine if the password hash needs to be rehashed according to the options provided + * + * If the answer is true, after validating the password using password_verify, rehash it. + * + * @param string $hash The hash to test + * @param int $algo The algorithm used for new password hashes + * @param array $options The options array passed to password_hash + * + * @return boolean True if the password needs to be rehashed. + */ + function password_needs_rehash($hash, $algo, array $options = array()) + { + $info = password_get_info($hash); + if ($info['algo'] != $algo) { + return true; + } + switch ($algo) { + case PASSWORD_BCRYPT: + $cost = isset($options['cost']) ? $options['cost'] : 10; + if ($cost != $info['options']['cost']) { + return true; + } + break; + } + return false; + } - /** - * Determine if the password hash needs to be rehashed according to the options provided - * - * If the answer is true, after validating the password using password_verify, rehash it. - * - * @param string $hash The hash to test - * @param int $algo The algorithm used for new password hashes - * @param array $options The options array passed to password_hash - * - * @return boolean True if the password needs to be rehashed. - */ - function password_needs_rehash($hash, $algo, array $options = array()) { - $info = password_get_info($hash); - if ($info['algo'] != $algo) { - return true; - } - switch ($algo) { - case PASSWORD_BCRYPT: - $cost = isset($options['cost']) ? $options['cost'] : 10; - if ($cost != $info['options']['cost']) { - return true; - } - break; - } - return false; - } + /** + * Verify a password against a hash using a timing attack resistant approach + * + * @param string $password The password to verify + * @param string $hash The hash to verify against + * + * @return boolean If the password matches the hash + */ + function password_verify($password, $hash) + { + if (!function_exists('crypt')) { + trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); + return false; + } + $ret = crypt($password, $hash); + if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) { + return false; + } - /** - * Verify a password against a hash using a timing attack resistant approach - * - * @param string $password The password to verify - * @param string $hash The hash to verify against - * - * @return boolean If the password matches the hash - */ - function password_verify($password, $hash) { - if (!function_exists('crypt')) { - trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); - return false; - } - $ret = crypt($password, $hash); - if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) { - return false; - } + $status = 0; + for ($i = 0; $i < strlen($ret); $i++) { + $status |= (ord($ret[$i]) ^ ord($hash[$i])); + } - $status = 0; - for ($i = 0; $i < strlen($ret); $i++) { - $status |= (ord($ret[$i]) ^ ord($hash[$i])); - } - - return $status === 0; - } + return $status === 0; + } } diff --git a/src/includes/psmconfig.inc.php b/src/includes/psmconfig.inc.php index 3b2830d0..2491f172 100644 --- a/src/includes/psmconfig.inc.php +++ b/src/includes/psmconfig.inc.php @@ -1,4 +1,5 @@ 'Български - Bulgarian', - 'locale' => array('bg_BG.UTF-8', 'bg_BG', 'bulgarian'), - 'locale_tag' => 'bg', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Мониторинг', - 'install' => 'Инсталация', - 'action' => 'Действие', - 'save' => 'Запиши', - 'edit' => 'Редактирай', - 'delete' => 'Изтрий', - 'date' => 'Дата', - 'message' => 'Съобщение', - 'yes' => 'Да', - 'no' => 'Не', - 'insert' => 'Добавяне', - 'add_new' => 'Добави нов', - 'update_available' => 'Налична е нова версия: ({version}). Може да я свалите от тук.', - 'back_to_top' => 'Нагоре', - 'go_back' => 'Назад', - 'ok' => 'Ок', - 'cancel' => 'Отказ', - // date/time са във формат според параметъра strftime PHP функцията http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Вчера в %k:%M', - 'other_day_format' => '%A в %k:%M', - 'never' => 'Никога', - 'hours_ago' => 'преди %d часа', - 'an_hour_ago' => 'преди час', - 'minutes_ago' => 'преди %d минути', - 'a_minute_ago' => 'преди минута', - 'seconds_ago' => 'преди %d секунди', - 'a_second_ago' => 'преди секунда', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Настройки', - 'server' => 'Сървъри', - 'server_log' => 'Логове', - 'server_status' => 'Статус', - 'server_update' => 'Обнови данните', - 'user' => 'Потребители', - 'help' => 'Помощ', - ), - 'users' => array( - 'user' => 'Потребител', - 'name' => 'Име', - 'user_name' => 'Потребител', - 'password' => 'Парола', - 'password_repeat' => 'Повторете паролата', - 'password_leave_blank' => 'Оставете празно, за да не бъде променена паролата', - 'level' => 'Ниво на достъп', - 'level_10' => 'Администратор', - 'level_20' => 'Потребител', - 'level_description' => 'Администраторите имат пълен достъп: могат да управляват сървърите, потребителите и да редактират глобалните настройки.
    Потребителите могат само да виждат статуса на сървърите и да обнояват информацията за даден сървър, за който им е разрешен достъп.', - 'mobile' => 'Мобилен телефон', - 'email' => 'Имейл', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover е услуга, която улеснява получаването на известия в реално време. Посетете техния сайт за повече информация.', - 'pushover_key' => 'Pushover Ключ', - 'pushover_device' => 'Pushover Устройство', - 'pushover_device_description' => 'Име на устройство, което да получава съобщение. Оставете празно, за изпращане до всички устройства.', - 'delete_title' => 'Изтриване на потребител', - 'delete_message' => 'Сигурни ли сте, че искате да изтриете потребител \'%1\'?', - 'deleted' => 'Потребителят е изтрит успешно.', - 'updated' => 'Информацията за потребителя е обновена.', - 'inserted' => 'Потребителят е добавен.', - 'profile' => 'Профил', - 'profile_updated' => 'Профилът е обновен успешно', - 'error_user_name_bad_length' => 'Потребителското име трябва да съдържа между 2 и 64 символа', - 'error_user_name_invalid' => 'Може да съдържа само латински букви (a-z, A-Z), цифри (0-9), точка (.) и долна черта (_).', - 'error_user_name_exists' => 'Вече съществува акаунт с това потребителско име.', - 'error_user_email_bad_length' => 'Имейл адреса трябва да съдържа между 5 и 255 символа.', - 'error_user_email_invalid' => 'Въведения имейл адрес е грешен.', - 'error_user_level_invalid' => 'Избраното ниво на достъп е грешно.', - 'error_user_no_match' => 'Потребителят не може да бъде намерен.', - 'error_user_password_invalid' => 'Въведената парола е грешка.', - 'error_user_password_no_match' => 'Въведените пароли не съвпадат.', - ), - 'log' => array( - 'title' => 'Записи в лога', - 'type' => 'Тип', - 'status' => 'Статус', - 'email' => 'Имейл', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Няма налични логове', - 'clear' => 'Изчистване на дневника', - 'delete_title' => 'Изтриване на дневника', - 'delete_message' => 'Наистина ли искате да изтриете всички дневници?', - ), - 'servers' => array( - 'server' => 'Сървър', - 'status' => 'Статус', - 'label' => 'Име', - 'domain' => 'Хост', - 'timeout' => 'Изчакване', - 'timeout_description' => 'Брой секунди, който да изчака отговор от сървъра', - 'port' => 'Порт', - 'type' => 'Тип', - 'type_website' => 'Сайт', - 'type_service' => 'Услуга', - 'pattern' => 'Търсене на стринг/образец', - 'pattern_description' => 'Ако този текст не е намерен в интернет страницата (когато имате добавен сайт), той ще бъде маркиран като Офлайн. Регулярните изрази са разрешени.', - 'last_check' => 'Последна проверка', - 'last_online' => 'Последно на линия', - 'last_offline' => 'Last offline', - 'monitoring' => 'Мониторинг', - 'no_monitoring' => 'Не се наблюдава', - 'email' => 'Имейл', - 'send_email' => 'Имейл', - 'sms' => 'SMS', - 'send_sms' => 'SMS', - 'pushover' => 'Pushover', - 'users' => 'Потребители', - 'delete_title' => 'Изтриване на сървър', - 'delete_message' => 'Сигурни ли сте, че искате да изтриете сървър \'%1\'?', - 'deleted' => 'Сървъра е изтрит успешно.', - 'updated' => 'Информацията за сървъра е обновена.', - 'inserted' => 'Сървърът е добавен успешно.', - 'latency' => 'Латенция', - 'latency_max' => 'Латенция (максимална)', - 'latency_min' => 'Латенция (минимална)', - 'latency_avg' => 'Латенция (средна)', - 'uptime' => 'Ъптайм', - 'year' => 'Година', - 'month' => 'Месец', - 'week' => 'Седмица', - 'day' => 'Ден', - 'hour' => 'Час', - 'warning_threshold' => 'Предупредителен праг', - 'warning_threshold_description' => 'Брой неуспешни проверки, преди сървъра или сайта да бъдат маркирани като Офлайн.', - 'chart_last_week' => 'Последната седмица', - 'chart_history' => 'История', - // Charts формат на датата според jqPlot http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d.%m.%Y', - 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S', - 'chart_short_date_format' => '%d.%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS известията са изключени.', - 'warning_notifications_disabled_email' => 'Имейл известията са изключени.', - 'warning_notifications_disabled_pushover' => 'Pushover известията са изключени.', - 'error_server_no_match' => 'Сървърът не е намерен.', - 'error_server_label_bad_length' => 'Името трябва да е между 1 и 255 символа.', - 'error_server_ip_bad_length' => 'Хоста/IP адреса трябва да е между 1 и 255 символа.', - 'error_server_ip_bad_service' => 'IP адреса е невалиден.', - 'error_server_ip_bad_website' => 'Сайта е невалиден.', - 'error_server_type_invalid' => 'Избраният тип сървър е невалиден.', - 'error_server_warning_threshold_invalid' => 'Броя неуспешни проверки, преди сървъра или сайта да бъдат маркирани като Офлайн трябва да е цифра по-голяма от 0.', - ), - 'config' => array( - 'general' => 'Основни настройки', - 'language' => 'Език', - 'show_update' => 'Да проверява ли за нова версия всяка седмица', - 'email_status' => 'Да се изпращат ли имейли', - 'email_from_email' => 'Имейл, от който да се изпращат съобщенията', - 'email_from_name' => 'Име на изпращача', - 'email_smtp' => 'Активиране на SMTP', - 'email_smtp_host' => 'SMTP сървър', - 'email_smtp_port' => 'SMTP порт', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP потребителско име', - 'email_smtp_password' => 'SMTP парола', - 'email_smtp_noauth' => 'Оставете празно за "без аутентикация"', - 'sms_status' => 'Да се изпращат ли SMS-и', - 'sms_gateway' => 'Портал за изпращане на SMS-и', - 'sms_gateway_username' => 'Потребител', - 'sms_gateway_password' => 'Парола', - 'sms_from' => 'Номер на изпращача', - 'pushover_status' => 'Позволява изпращането на Pushover съобщения', - 'pushover_description' => 'Pushover е услуга, която улеснява получаването на известия в реално време. Посетете техния сайт за повече информация.', - 'pushover_clone_app' => 'Кликнете тук за да създаване на вашият Pushover App', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Преди да използвате Pushover, трябва да регистрирате свой App в техния сайт и въведете вашия App API Token тук.', - 'alert_type' => 'Изберете кога желаете да получавате известия', - 'alert_type_description' => 'Промяна на сатуса:
    '. - 'Ще получавате известие когато има промяна със връзката на даден някой от описаните сървър или сайт. От Онлайн -> Офлайн и от Офлайн -> Онлайн.
    '. - '
    Офлайн
    '. - 'Ще получите известие когато връзката до сървъра е изгубена за *ПЪРВИ ПЪТ*. Например, '. - 'вашия cron скрипт проверява всеки 15 минути и връзката до сървъра е изгубена в 1 часа през нощта и не работи до 6 часа сутринта '. - 'Вие ще получите едно известие в 1 часа за това
    '. - '
    Винаги:
    '. - 'Ще получавате известие при всяка проверка на Вашия крон скрипт дори когато връзката до даден сървър или сайт е била прекъсната в продължение на часове.', - 'alert_type_status' => 'Промяна на статуса', - 'alert_type_offline' => 'Офлайн', - 'alert_type_always' => 'Винаги', - 'log_status' => 'Статус на логовете', - 'log_status_description' => 'Ако е отметнато, системата ще записва всяка промяна.', - 'log_email' => 'Да се пази ли лог на изпратените имейли от системата', - 'log_sms' => 'Да се пази ли лог на изпратените SMS съобщения от системата', - 'log_pushover' => 'Log pushover messages sent by the script', - 'updated' => 'Настройките са обновени успешно.', - 'tab_email' => 'Имейл', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Имейл настройки', - 'settings_sms' => 'SMS настройки', - 'settings_pushover' => 'Pushover настройки', - 'settings_notification' => 'Настройки на известията', - 'settings_log' => 'Настройки на логовете', - 'auto_refresh' => 'Автоматично опресняване', - 'auto_refresh_description' => - 'Автоматично опресняване на страницата.
    '. - ''. - 'Времето е в секунди, ако е 0 страницата няма да се обновява.'. - '', - 'seconds' => 'секунди', - 'test' => 'Тест', - 'test_email' => 'Ще бъде изпратенo тестово съобщение до имейл адреса, който сте задали в профила си.', - 'test_sms' => 'Ще бъде изпратен тестово SMS съобщение до телефонния номер, който сте задали в профила си.', - 'test_pushover' => 'Pushover известоята ще бъдат изпратени до потребителски ключ/устройство посочено във вашият профил.', - 'send' => 'Изпрати', - 'test_subject' => 'Тестово съобщение', - 'test_message' => 'Тестово съобщение изпртено от PHP Сървър мониторинг', - 'email_sent' => 'Тестовия имейл е изпратен успешно.', - 'email_error' => 'Възникна грешка при изпращането на тесовия имейл', - 'sms_sent' => 'Тестовото SMS съобщение е изпратеното успешно.', - 'sms_error' => 'Възникна грешка при изпращането на тестовия SMS. %s', - 'sms_error_nomobile' => 'Неуспешно изпращане на тестов SMS: не е намерен валиден телефонен номер във вашия профил.', - 'pushover_sent' => 'Pushover тестово известие', - 'pushover_error' => 'Възникна грешка при изпращане на тестово Pushover известие: %s', - 'pushover_error_noapp' => 'Unable to send test notification: не е зададен валиден Pushover App API token в настройките.', - 'pushover_error_nokey' => 'Unable to send test notification: не е зададен валиден Pushover ключ във вашия профил.', - 'log_retention_period' => 'Период на съхранение на логовете', - 'log_retention_period_description' => 'Какъв брой дни да се пазят логовете от известията и архиви за ъптайм на сървърите. Въведете 0 ако желаете логовете да не се трият.', - 'log_retention_days' => 'дни', - ), - // За нов ред в имейл съобщението, моля използвайте тага
    - 'notifications' => array( - 'off_sms' => 'Сървър \'%LABEL%\' е Офлайн: ip=%IP%, port=%PORT%. Greshka=%ERROR%', - 'off_email_subject' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', - 'off_email_body' => "Неуспешно свързване:

    Сървър: %LABEL%
    IP адрес: %IP%
    Порт: %PORT%
    Грешка: %ERROR%
    Днес: %DATE%", - 'off_pushover_title' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', - 'off_pushover_message' => "Неуспешно свързване:

    Сървър: %LABEL%
    IP адрес: %IP%
    Порт: %PORT%
    Грешка: %ERROR%
    Днес: %DATE%", - 'on_sms' => 'Сървър \'%LABEL%\' е Онлайн: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', - 'on_email_body' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:

    Сървър: %LABEL%
    IP адрес: %IP%
    Порт: %PORT%
    Днес: %DATE%", - 'on_pushover_title' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', - 'on_pushover_message' => "Връзката до '%LABEL%' беше ВЪЗСТАНОВЕНА, it was down for %LAST_OFFLINE_DURATION%:

    Сървър: %LABEL%
    IP адрес: %IP%
    Порт: %PORT%
    Днес: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => 'Добре дошъл, %user_name%', - 'title_sign_in' => 'Моля, влезте с профила си', - 'title_forgot' => 'Забравили сте паролата си?', - 'title_reset' => 'Възстановяване на паролата', - 'submit' => 'Вход', - 'remember_me' => 'Искам да остана логнат', - 'login' => 'Вход', - 'logout' => 'Изход', - 'username' => 'Потребител', - 'password' => 'Парола', - 'password_repeat' => 'Повторете паролата', - 'password_forgot' => 'Забравили сте паролата си?', - 'password_reset' => 'Възстановяване на паролата', - 'password_reset_email_subject' => 'Възстановяване на парола за PHP Сървър Мониторинг', - 'password_reset_email_body' => 'За да възстановите паролата си е нужно да кликнете на линка по-долу. Валидността на линка е един час.

    %link%', - 'error_user_incorrect' => 'Потребителят не може да бъде намерен.', - 'error_login_incorrect' => 'Информацията е грешна.', - 'error_login_passwords_nomatch' => 'Паролите не съвпадат.', - 'error_reset_invalid_link' => 'Линкът за възстановяване на паролата не е валиден.', - 'success_password_forgot' => 'Изпратен е имейл с информация за възстановяване на паролата.', - 'success_password_reset' => 'Вашата парола е променена успешно. Моля, влезте в системата.', - ), - 'error' => array( - '401_unauthorized' => 'Неоторизиран достъп', - '401_unauthorized_description' => 'Нямате нужното ниво на достъп за да прегледате тази страница.', - ), + 'name' => 'Български - Bulgarian', + 'locale' => array( + '0' => 'bg_BG.UTF-8', + '1' => 'bg_BG', + '2' => 'bulgarian', + ), + 'locale_tag' => 'bg', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Мониторинг', + 'install' => 'Инсталация', + 'action' => 'Действие', + 'save' => 'Запиши', + 'edit' => 'Редактирай', + 'delete' => 'Изтрий', + 'date' => 'Дата', + 'message' => 'Съобщение', + 'yes' => 'Да', + 'no' => 'Не', + 'insert' => 'Добавяне', + 'add_new' => 'Добави нов', + 'update_available' => 'Налична е нова версия: ({version}). Може да я свалите + от тук.', + 'back_to_top' => 'Нагоре', + 'go_back' => 'Назад', + 'ok' => 'Ок', + 'cancel' => 'Отказ', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Вчера в %k:%M', + 'other_day_format' => '%A в %k:%M', + 'never' => 'Никога', + 'hours_ago' => 'преди %d часа', + 'an_hour_ago' => 'преди час', + 'minutes_ago' => 'преди %d минути', + 'a_minute_ago' => 'преди минута', + 'seconds_ago' => 'преди %d секунди', + 'a_second_ago' => 'преди секунда', + ), + 'menu' => array( + 'config' => 'Настройки', + 'server' => 'Сървъри', + 'server_log' => 'Логове', + 'server_status' => 'Статус', + 'server_update' => 'Обнови данните', + 'user' => 'Потребители', + 'help' => 'Помощ', + ), + 'users' => array( + 'user' => 'Потребител', + 'name' => 'Име', + 'user_name' => 'Потребител', + 'password' => 'Парола', + 'password_repeat' => 'Повторете паролата', + 'password_leave_blank' => 'Оставете празно, за да не бъде променена + паролата', + 'level' => 'Ниво на достъп', + 'level_10' => 'Администратор', + 'level_20' => 'Потребител', + 'level_description' => 'Администраторите имат пълен достъп: могат + да управляват сървърите, потребителите и да + редактират глобалните + настройки.
    Потребителите могат само да + виждат статуса на сървърите и да обнояват + информацията за даден сървър, за който им е + разрешен достъп.', + 'mobile' => 'Мобилен телефон', + 'email' => 'Имейл', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover е услуга, която улеснява получаването на + известия в реално време. Посетете техния сайт за + повече информация.', + 'pushover_key' => 'Pushover Ключ', + 'pushover_device' => 'Pushover Устройство', + 'pushover_device_description' => 'Име на устройство, което да получава + съобщение. Оставете празно, за изпращане + до всички устройства.', + 'delete_title' => 'Изтриване на потребител', + 'delete_message' => 'Сигурни ли сте, че искате да изтриете потребител + \'%1\'?', + 'deleted' => 'Потребителят е изтрит успешно.', + 'updated' => 'Информацията за потребителя е обновена.', + 'inserted' => 'Потребителят е добавен.', + 'profile' => 'Профил', + 'profile_updated' => 'Профилът е обновен успешно', + 'error_user_name_bad_length' => 'Потребителското име трябва да съдържа + между 2 и 64 символа', + 'error_user_name_invalid' => 'Може да съдържа само латински букви (a-z, A-Z), + цифри (0-9), точка (.) и долна черта (_).', + 'error_user_name_exists' => 'Вече съществува акаунт с това потребителско + име.', + 'error_user_email_bad_length' => 'Имейл адреса трябва да съдържа между 5 и 255 + символа.', + 'error_user_email_invalid' => 'Въведения имейл адрес е грешен.', + 'error_user_level_invalid' => 'Избраното ниво на достъп е грешно.', + 'error_user_no_match' => 'Потребителят не може да бъде намерен.', + 'error_user_password_invalid' => 'Въведената парола е грешка.', + 'error_user_password_no_match' => 'Въведените пароли не съвпадат.', + ), + 'log' => array( + 'title' => 'Записи в лога', + 'type' => 'Тип', + 'status' => 'Статус', + 'email' => 'Имейл', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Няма налични логове', + 'clear' => 'Изчистване на дневника', + 'delete_title' => 'Изтриване на дневника', + 'delete_message' => 'Наистина ли искате да изтриете всички + дневници?', + ), + 'servers' => array( + 'server' => 'Сървър', + 'status' => 'Статус', + 'label' => 'Име', + 'domain' => 'Хост', + 'timeout' => 'Изчакване', + 'timeout_description' => 'Брой секунди, който да изчака отговор от + сървъра', + 'port' => 'Порт', + 'type' => 'Тип', + 'type_website' => 'Сайт', + 'type_service' => 'Услуга', + 'pattern' => 'Търсене на стринг/образец', + 'pattern_description' => 'Ако този текст не е намерен в интернет + страницата (когато имате добавен сайт), той ще + бъде маркиран като Офлайн. Регулярните изрази + са разрешени.', + 'last_check' => 'Последна проверка', + 'last_online' => 'Последно на линия', + 'last_offline' => 'Last offline', + 'monitoring' => 'Мониторинг', + 'no_monitoring' => 'Не се наблюдава', + 'email' => 'Имейл', + 'send_email' => 'Имейл', + 'sms' => 'SMS', + 'send_sms' => 'SMS', + 'pushover' => 'Pushover', + 'users' => 'Потребители', + 'delete_title' => 'Изтриване на сървър', + 'delete_message' => 'Сигурни ли сте, че искате да изтриете сървър \'%1\'?', + 'deleted' => 'Сървъра е изтрит успешно.', + 'updated' => 'Информацията за сървъра е обновена.', + 'inserted' => 'Сървърът е добавен успешно.', + 'latency' => 'Латенция', + 'latency_max' => 'Латенция (максимална)', + 'latency_min' => 'Латенция (минимална)', + 'latency_avg' => 'Латенция (средна)', + 'uptime' => 'Ъптайм', + 'year' => 'Година', + 'month' => 'Месец', + 'week' => 'Седмица', + 'day' => 'Ден', + 'hour' => 'Час', + 'warning_threshold' => 'Предупредителен праг', + 'warning_threshold_description' => 'Брой неуспешни проверки, преди сървъра + или сайта да бъдат маркирани като + Офлайн.', + 'chart_last_week' => 'Последната седмица', + 'chart_history' => 'История', + 'chart_day_format' => '%d.%m.%Y', + 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S', + 'chart_short_date_format' => '%d.%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS известията са изключени.', + 'warning_notifications_disabled_email' => 'Имейл известията са изключени.', + 'warning_notifications_disabled_pushover' => 'Pushover известията са изключени.', + 'error_server_no_match' => 'Сървърът не е намерен.', + 'error_server_label_bad_length' => 'Името трябва да е между 1 и 255 символа.', + 'error_server_ip_bad_length' => 'Хоста/IP адреса трябва да е между 1 и 255 + символа.', + 'error_server_ip_bad_service' => 'IP адреса е невалиден.', + 'error_server_ip_bad_website' => 'Сайта е невалиден.', + 'error_server_type_invalid' => 'Избраният тип сървър е невалиден.', + 'error_server_warning_threshold_invalid' => 'Броя неуспешни проверки, преди + сървъра или сайта да бъдат + маркирани като Офлайн трябва да е + цифра по-голяма от 0.', + ), + 'config' => array( + 'general' => 'Основни настройки', + 'language' => 'Език', + 'show_update' => 'Да проверява ли за нова версия всяка седмица', + 'email_status' => 'Да се изпращат ли имейли', + 'email_from_email' => 'Имейл, от който да се изпращат съобщенията', + 'email_from_name' => 'Име на изпращача', + 'email_smtp' => 'Активиране на SMTP', + 'email_smtp_host' => 'SMTP сървър', + 'email_smtp_port' => 'SMTP порт', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP потребителско име', + 'email_smtp_password' => 'SMTP парола', + 'email_smtp_noauth' => 'Оставете празно за "без аутентикация"', + 'sms_status' => 'Да се изпращат ли SMS-и', + 'sms_gateway' => 'Портал за изпращане на SMS-и', + 'sms_gateway_username' => 'Потребител', + 'sms_gateway_password' => 'Парола', + 'sms_from' => 'Номер на изпращача', + 'pushover_status' => 'Позволява изпращането на Pushover съобщения', + 'pushover_description' => 'Pushover е услуга, която улеснява получаването на + известия в реално време. Посетете техния сайт за + повече информация.', + 'pushover_clone_app' => 'Кликнете тук за да създаване на вашият Pushover App', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Преди да използвате Pushover, трябва да регистрирате + свой App в техния сайт и въведете вашия + App API Token тук.', + 'alert_type' => 'Изберете кога желаете да получавате известия', + 'alert_type_description' => 'Промяна на сатуса:
    Ще получавате + известие когато има промяна със връзката на + даден някой от описаните сървър или сайт. От + Онлайн -> Офлайн и от Офлайн -> + Онлайн.

    Офлайн
    Ще получите + известие когато връзката до сървъра е + изгубена за *ПЪРВИ ПЪТ*. Например, вашия cron + скрипт проверява всеки 15 минути и връзката + до сървъра е изгубена в 1 часа през нощта и не + работи до 6 часа сутринта Вие ще получите + едно известие в 1 часа за + това

    Винаги:
    Ще получавате + известие при всяка проверка на Вашия крон + скрипт дори когато връзката до даден сървър + или сайт е била прекъсната в продължение на + часове.', + 'alert_type_status' => 'Промяна на статуса', + 'alert_type_offline' => 'Офлайн', + 'alert_type_always' => 'Винаги', + 'log_status' => 'Статус на логовете', + 'log_status_description' => 'Ако е отметнато, системата ще записва всяка + промяна.', + 'log_email' => 'Да се пази ли лог на изпратените имейли от + системата', + 'log_sms' => 'Да се пази ли лог на изпратените SMS съобщения от + системата', + 'log_pushover' => 'Log pushover messages sent by the script', + 'updated' => 'Настройките са обновени успешно.', + 'tab_email' => 'Имейл', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Имейл настройки', + 'settings_sms' => 'SMS настройки', + 'settings_pushover' => 'Pushover настройки', + 'settings_notification' => 'Настройки на известията', + 'settings_log' => 'Настройки на логовете', + 'auto_refresh' => 'Автоматично опресняване', + 'auto_refresh_description' => 'Автоматично опресняване на + страницата.
    Времето е в + секунди, ако е 0 страницата няма да се + обновява.', + 'seconds' => 'секунди', + 'test' => 'Тест', + 'test_email' => 'Ще бъде изпратенo тестово съобщение до имейл + адреса, който сте задали в профила си.', + 'test_sms' => 'Ще бъде изпратен тестово SMS съобщение до телефонния + номер, който сте задали в профила си.', + 'test_pushover' => 'Pushover известоята ще бъдат изпратени до + потребителски ключ/устройство посочено във + вашият профил.', + 'send' => 'Изпрати', + 'test_subject' => 'Тестово съобщение', + 'test_message' => 'Тестово съобщение изпртено от PHP Сървър + мониторинг', + 'email_sent' => 'Тестовия имейл е изпратен успешно.', + 'email_error' => 'Възникна грешка при изпращането на тесовия имейл', + 'sms_sent' => 'Тестовото SMS съобщение е изпратеното успешно.', + 'sms_error' => 'Възникна грешка при изпращането на тестовия SMS. %s', + 'sms_error_nomobile' => 'Неуспешно изпращане на тестов SMS: не е намерен + валиден телефонен номер във вашия профил.', + 'pushover_sent' => 'Pushover тестово известие', + 'pushover_error' => 'Възникна грешка при изпращане на тестово Pushover + известие: %s', + 'pushover_error_noapp' => 'Unable to send test notification: не е зададен валиден Pushover + App API token в настройките.', + 'pushover_error_nokey' => 'Unable to send test notification: не е зададен валиден Pushover + ключ във вашия профил.', + 'log_retention_period' => 'Период на съхранение на логовете', + 'log_retention_period_description' => 'Какъв брой дни да се пазят логовете от + известията и архиви за ъптайм на + сървърите. Въведете 0 ако желаете + логовете да не се трият.', + 'log_retention_days' => 'дни', + ), + 'notifications' => array( + 'off_sms' => 'Сървър \'%LABEL%\' е Офлайн: ip=%IP%, port=%PORT%. Greshka=%ERROR%', + 'off_email_subject' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', + 'off_email_body' => 'Неуспешно свързване:

    Сървър: %LABEL%
    IP адрес: + %IP%
    Порт: %PORT%
    Грешка: %ERROR%
    Днес: %DATE%', + 'off_pushover_title' => 'Връзката до \'%LABEL%\' е ИЗГУБЕНА', + 'off_pushover_message' => 'Неуспешно свързване:

    Сървър: %LABEL%
    IP + адрес: %IP%
    Порт: %PORT%
    Грешка: %ERROR%
    Днес: %DATE%', + 'on_sms' => 'Сървър \'%LABEL%\' е Онлайн: ip=%IP%, port=%PORT%, it was down for + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', + 'on_email_body' => 'Връзката до \'%LABEL%\' беше ВЪЗСТАНОВЕНА, it was down for + %LAST_OFFLINE_DURATION%:

    Сървър: %LABEL%
    IP адрес: %IP%
    Порт: + %PORT%
    Днес: %DATE%', + 'on_pushover_title' => 'Връзката до \'%LABEL%\' е ВЪЗСТАНОВЕНА', + 'on_pushover_message' => 'Връзката до \'%LABEL%\' беше ВЪЗСТАНОВЕНА, it was down for + %LAST_OFFLINE_DURATION%:

    Сървър: %LABEL%
    IP адрес: + %IP%
    Порт: %PORT%
    Днес: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Добре дошъл, %user_name%', + 'title_sign_in' => 'Моля, влезте с профила си', + 'title_forgot' => 'Забравили сте паролата си?', + 'title_reset' => 'Възстановяване на паролата', + 'submit' => 'Вход', + 'remember_me' => 'Искам да остана логнат', + 'login' => 'Вход', + 'logout' => 'Изход', + 'username' => 'Потребител', + 'password' => 'Парола', + 'password_repeat' => 'Повторете паролата', + 'password_forgot' => 'Забравили сте паролата си?', + 'password_reset' => 'Възстановяване на паролата', + 'password_reset_email_subject' => 'Възстановяване на парола за PHP Сървър + Мониторинг', + 'password_reset_email_body' => 'За да възстановите паролата си е нужно да + кликнете на линка по-долу. Валидността на + линка е един час.

    %link%', + 'error_user_incorrect' => 'Потребителят не може да бъде намерен.', + 'error_login_incorrect' => 'Информацията е грешна.', + 'error_login_passwords_nomatch' => 'Паролите не съвпадат.', + 'error_reset_invalid_link' => 'Линкът за възстановяване на паролата не е + валиден.', + 'success_password_forgot' => 'Изпратен е имейл с информация за + възстановяване на паролата.', + 'success_password_reset' => 'Вашата парола е променена успешно. Моля, + влезте в системата.', + ), + 'error' => array( + '401_unauthorized' => 'Неоторизиран достъп', + '401_unauthorized_description' => 'Нямате нужното ниво на достъп за да + прегледате тази страница.', + ), ); diff --git a/src/lang/ca_ES.lang.php b/src/lang/ca_ES.lang.php index 645ee078..4be6eb74 100644 --- a/src/lang/ca_ES.lang.php +++ b/src/lang/ca_ES.lang.php @@ -1,4 +1,5 @@ 'Català - Catalan', - 'locale' => array( - '0' => 'ca_ES.UTF-8', - '1' => 'ca_ES', - '2' => 'catalan', - '3' => 'catalan-es', - ), - 'locale_tag' => 'ca', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Instal·lar', - 'action' => 'Acció', - 'save' => 'Desar', - 'edit' => 'Editar', - 'delete' => 'Esborrar', - 'date' => 'Data', - 'message' => 'Missatge', - 'yes' => 'Sí', - 'no' => 'No', - 'insert' => 'Inserir', - 'add_new' => 'Afegir nou', - 'update_available' => 'Hi ha disponible una nova versió ({version}) a https://github.com/phpservermon.', - 'back_to_top' => 'Tornar a dalt', - 'go_back' => 'Enrere', - 'ok' => 'OK', - 'bad' => 'dolent', - 'cancel' => 'Cancel·lar', - 'none' => 'Cap', - 'activate' => 'Activar', - 'advanced' => 'Avançat', - 'short_day_format' => '%e %B', - 'long_day_format' => '%e %B %Y', - 'yesterday_format' => 'Ahir a les %k:%M', - 'other_day_format' => '%A a les %k:%M', - 'never' => 'Mai', - 'hours_ago' => 'fa %d hores', - 'an_hour_ago' => 'fa una hora', - 'minutes_ago' => 'fa %d minuts', - 'a_minute_ago' => 'fa un minut', - 'seconds_ago' => 'fa %d segons', - 'a_second_ago' => 'fa un segon', - 'year' => 'any', - 'years' => 'anys', - 'month' => 'mes', - 'months' => 'mesos', - 'day' => 'dia', - 'days' => 'dies', - 'hour' => 'hora', - 'hours' => 'hores', - 'minute' => 'minut', - 'minutes' => 'minuts', - 'second' => 'segon', - 'seconds' => 'segons', - 'online' => 'en línia', - 'offline' => 'fora de línia', - ), - 'menu' => array( - 'config' => 'Configuració', - 'server' => 'Servidors', - 'server_log' => 'Log', - 'server_status' => 'Estat', - 'server_update' => 'FER PING ARA', - 'user' => 'Usuaris', - 'help' => 'Ajuda', - ), - 'users' => array( - 'user' => 'Usuari', - 'name' => 'Nom', - 'user_name' => 'Nom d\'usuari', - 'password' => 'Contrasenya', - 'password_repeat' => 'Repetir contrasenya', - 'password_leave_blank' => 'Deixar en blanc si no es vol canviar', - 'level' => 'Nivell', - 'level_10' => 'Administrador', - 'level_20' => 'Usuari', - 'level_description' => 'Els administradors tenen accés complet: poden administrar servidors, usuaris i editar la configuració general.
    Els usuaris només poden engegar actualitzacions dels servidors que els han estat assignats.', - 'mobile' => 'Mòbil', - 'email' => 'Correu', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover és un servei que fa fàcil obtenir notificacions en temps real. Veieu la seva web per a més informació.', - 'pushover_key' => 'Clau Pushover', - 'pushover_device' => 'Dispositiu Pushover', - 'pushover_device_description' => 'Nom del dispositiu al qual enviar els missatges. Deixau en blanc per enviar a tots els dispositius.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram és una app de missatgeria que facilita el rebre notificacions en temps real. Consulteu la documentació per a més informació i per saber com instal·lar-ho.', - 'telegram_chat_id' => 'Codi ID del xat a Telegram', - 'telegram_chat_id_description' => 'Els missatges seran enviats al xat de Telegram amb aquest ID.', - 'telegram_get_chat_id' => 'Premeu aquí per a obtenir el codi ID del vostre xat', - 'activate_telegram' => 'Activar notificacions de Telegram', - 'activate_telegram_description' => 'Permetre a Telegram enviar notificacions al xat amb aquest ID. Sense aquest permís, Telegram rebutjarà qualsevol missatge enviat des d\'aquesta aplicació.', - 'telegram_bot_username_found' => 'S\'ha trobat el bot!

    S\'obrirà un xat amb el bot. És necessari que premeu el botó START o escriviu el comandament /start com a missatge pel bot.', - 'telegram_bot_username_error_token' => '401 - No autoritzat. Assegureu-vos que el token de la API és vàlid.', - 'telegram_bot_error' => 'Ha succeït un error mentre s\'intentava activar les notificacions amb Telegram: %s', - 'delete_title' => 'Esborrar usuari', - 'delete_message' => 'Aquesta és una acció irreversible, n\'esteu segurs de voler esborrar l\'usuari \'%1\'?', - 'deleted' => 'Usuari esborrat.', - 'updated' => 'Usuari actualitzat.', - 'inserted' => 'Usuari afegit.', - 'profile' => 'Perfil', - 'profile_updated' => 'El vostre perfil ha estat actualitzat.', - 'error_user_name_bad_length' => 'El nom d\'usuari ha de tenir entre 2 i 64 caràcters.', - 'error_user_name_invalid' => 'El nom d\'usuari només pot tenir caràcters alfanumèrics (a-z, A-Z), digits (0-9) i guions baixos (_).', - 'error_user_name_exists' => 'Aquest nom d\'usuari ja existeix. Esculliu un altre.', - 'error_user_email_bad_length' => 'L\'adreça de correu ha de tenir entre 5 i 255 caràcters.', - 'error_user_email_invalid' => 'L\'adreça de correu no és correcta.', - 'error_user_level_invalid' => 'Aquest nivell d\'usuari no és vàlid.', - 'error_user_no_match' => 'No s\'ha trobat aquest usuari a la base de dades.', - 'error_user_password_invalid' => 'Aquesta contrasenya no és vàlida.', - 'error_user_password_no_match' => 'LEs contrasenyes no coincideixen.', - ), - 'log' => array( - 'title' => 'Entrades del LOG', - 'type' => 'Tipus', - 'status' => 'Estat', - 'email' => 'Correu', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'No generar LOGs', - 'clear' => 'Netejar LOG', - 'delete_title' => 'Esborrar LOG', - 'delete_message' => 'Voleu esborrar tots els LOGs?', - ), - 'servers' => array( - 'server' => 'Servidor', - 'status' => 'Estat', - 'label' => 'Etiqueta', - 'domain' => 'Domini/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Nombre de segons que cal esperar a que el servidor respongui.', - 'authentication_settings' => 'Opcions d\'autenticació (opcional)', - 'website_username' => 'Nom d\'usuari', - 'website_username_description' => 'Nom d\'usuari per accedir al portal web (només està soportada l\'autenticació d\'Apache).', - 'website_password' => 'Contrasenya', - 'website_password_description' => 'Contrasenya per accedir al portal web. La contrasenya es desa encriptada a la base de dades.', - 'fieldset_monitoring' => 'Monitorització', - 'fieldset_permissions' => 'Permisos', - 'port' => 'Port', - 'custom_port' => 'Port personalitzat', - 'popular_ports' => 'Ports populars', - 'request_method' => 'Mètode de crida', - 'custom_request_method' => 'Mètode de crida personalitzat', - 'popular_request_methods' => 'Mètodes de crida habituals', - 'post_field' => 'Camp POST', - 'post_field_description' => 'Els camps de dades que seran enviats emprant el mètode de crida de dalt. Exemple: param1=val1&param2=val2&...', - 'please_select' => 'Seleccioneu', - 'type' => 'Tipus', - 'type_website' => 'Website', - 'type_service' => 'Servei', - 'type_ping' => 'Ping', - 'pattern' => 'cercar cadena/patrò', - 'pattern_description' => 'Si aquest patró no es troba al lloc web, el servidor es marcarà fora de línia. Es permeten expressions regulars.', - 'pattern_online' => 'El patró indica que el website és', - 'pattern_online_description' => 'En línia: si aquest patró es pot trobar en la resposta del servidor, el servidor serà marcat com en línia. Fóra de línia: si aquest patró no es pot trobar en la resposta del servidor, aquest serà marcat fóra de línia.', - 'redirect_check' => 'El redireccionament cap a un altre domini és', - 'redirect_check_description' => 'El redireccionament cap a un altre domini habitualment és un mal senyal.', - 'allow_http_status' => 'Permetre codi d\'estat HTTP', - 'allow_http_status_description' => 'Marcar el website com en línia. Els codis d\'estat HTTP inferiors a 400 són marcats com en línia per defecte. Empreu el símbol | per separar més d\'un estat. Exemple: 401|403.', - 'header' => 'Capçalera', - 'header_name_description' => 'Nom de la capçalera (sensible a majúscules)', - 'header_value_description' => 'Valor de la capçalera. Es permeten expressions regulars.', - 'last_check' => 'Darrera comprovació', - 'last_online' => 'Darrer cop en línia', - 'last_offline' => 'Darrer cop fóra de línia', - 'last_output' => 'Darrera sortida positiva', - 'last_error' => 'Darrer error', - 'last_error_output' => 'Darrera sortida amb error', - 'monitoring' => 'Monitorització', - 'no_monitoring' => 'Sense monitorització', - 'email' => 'Correu', - 'send_email' => 'Enviar correu', - 'sms' => 'SMS', - 'send_sms' => 'Enviar SMS', - 'pushover' => 'Pushover', - 'send_pushover' => 'Enviar notificació per Pushover', - 'telegram' => 'Telegram', - 'send_telegram' => 'Enviar notificació per Telegram', - 'users' => 'Usuaris', - 'delete_title' => 'Esborrar servidor', - 'delete_message' => 'Esteu segurs de que voleu esborrar el servidor \'%1\'?', - 'deleted' => 'Servidor esborrat.', - 'updated' => 'Servidor actualitzat.', - 'inserted' => 'Servidor afegit.', - 'latency' => 'Latència', - 'latency_max' => 'Latència (màxima)', - 'latency_min' => 'Latència (mínima)', - 'latency_avg' => 'Latència (mitjana)', - 'uptime' => 'Temps actiu', - 'year' => 'Any', - 'month' => 'Mes', - 'week' => 'Setmana', - 'day' => 'Dia', - 'hour' => 'Hora', - 'warning_threshold' => 'Llindar \'advertència', - 'warning_threshold_description' => 'Nombre de comprovacions fallides necessàries abans de considerar el servidor fóra de línia.', - 'chart_last_week' => 'Darrera setmana', - 'chart_history' => 'Historial', - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Les notificacions per SMS estan deshabilitades.', - 'warning_notifications_disabled_email' => 'Les notificacions per correu estan deshabilitades.', - 'warning_notifications_disabled_pushover' => 'Les notificacions per Pushover estan deshabilitades.', - 'warning_notifications_disabled_telegram' => 'Les notificacions per Telegram estan deshabilitades.', - 'error_server_no_match' => 'No s\'ha trobat el servidor.', - 'error_server_label_bad_length' => 'L\'etiqueta ha de tenir entre 1 i 255 caràcters.', - 'error_server_ip_bad_length' => 'El nom de domini o IP ha de tenir entre 1 i 255 caràcters.', - 'error_server_ip_bad_service' => 'L\'adreça IP no és vàlida', - 'error_server_ip_bad_website' => 'L\'adreça URL del lloc web no és vàlida.', - 'error_server_type_invalid' => 'El tipus de servidor escollit no és vàlid.', - 'error_server_warning_threshold_invalid' => 'El llindar d\'advertència ha de ser un valor sencer positiu.', - ), - 'config' => array( - 'general' => 'General', - 'language' => 'Idioma', - 'show_update' => 'Comprovar actualitzacions?', - 'password_encrypt_key' => 'La clau per xifrar contrasenyes', - 'password_encrypt_key_note' => 'Aquesta és la clau emprada per xifrar les contrasenyes que són emmagatzemades als servidors per accedir als llocs web. Si la clau canviés la contrasenya guardada no seria vàlida!', - 'proxy' => 'Habilitar proxy', - 'proxy_url' => 'URL del proxy', - 'proxy_user' => 'Usuari del proxy', - 'proxy_password' => 'Contrasenya del proxy', - 'email_status' => 'Permetre l\'enviament de correus', - 'email_from_email' => 'Adreça del remitent', - 'email_from_name' => 'Nom del remitent', - 'email_smtp' => 'Habilitar SMTP', - 'email_smtp_host' => 'Servidor SMTP', - 'email_smtp_port' => 'Port SMTP', - 'email_smtp_security' => 'Seguretat SMTP', - 'email_smtp_security_none' => 'Cap', - 'email_smtp_username' => 'Usuari SMTP', - 'email_smtp_password' => 'Contrasenya SMTP', - 'email_smtp_noauth' => 'Deixar en blanc si no cal autenticació', - 'sms_status' => 'Permetre l\'enviament de missatges de text', - 'sms_gateway' => 'Servei \'Gateway\' per l\'enviament de SMS', - 'sms_gateway_username' => 'Usuari del Gateway', - 'sms_gateway_password' => 'Contrasenya del Gateway', - 'sms_from' => 'Numero de telèfon de qui envia', - 'pushover_status' => 'Permetre l\'enviament de missatges per Pushover', - 'pushover_description' => 'Pushover és un servei que facilita la recepció de notificacions en temps real. Veieu la serv web per a més informació.', - 'pushover_clone_app' => 'premeu aquí per a crear la vostra app Pushover', - 'pushover_api_token' => 'Token de la API de la App Pushover', - 'pushover_api_token_description' => 'Abans de poder emprar Pushover necessiteu registrar una app al seu portal web i introduïr aquí el Token de la API.', - 'telegram_status' => 'Permetre l\'enviament de missatges per Telegram', - 'telegram_description' => 'Telegram és una app de xat (mòbil i PC) que facilita la recepció de notificacions en temps real. Veieu la documentació per saber més i saber com activar-ho.', - 'telegram_api_token' => 'Token de l\'API de Telegram', - 'telegram_api_token_description' => 'Abans de poder emprar Telegram necessiteu obtenir un token de l\'API. Consulteu la documentació per saber més.', - 'alert_type' => 'Seleccioneu quan voleu ser notificats.', - 'alert_type_description' => 'Canvi d\'estat: Rebreu una notificació quan un servidor tingui un canvi d\'estat. És a dir, passi d\'estar en línia a fora de línia o viceversa.

    Fora de línia: Rebreu una notificació només *EL PRIMER COP* que un servidor passa a estar fora de línia. Per exemple, la vostra aplicació s\'executa cada 15 minuts i el servidor esdevé fora de línia a la una de la matinada i es queda així fins les sis. llavors rebríeu només una notificació. No se us aviasarà quan torni a ser en línia.

    Sempre: Rebreu una notificació *CADA COP* que l\'aplicació detecti que el servidor és fora de línia, fins que torni a estar en línia.', - 'alert_type_status' => 'Canvi \'estat', - 'alert_type_offline' => 'Fora de línia', - 'alert_type_always' => 'Sempre', - 'combine_notifications' => 'Combinar notificacions', - 'combine_notifications_description' => 'Redueix el nombre de notificacions en combinar-les en una de sola. (Això no afecta a les notificacions per SMS.)', - 'alert_proxy' => 'Encara que s\'habiliti, el proxy no és emprat mai per als serveis', - 'alert_proxy_url' => 'Format: Servidor:Port', - 'log_status' => 'LOG d\'estat', - 'log_status_description' => 'Si el LOG d\'estat es configura a SÍ, l\'aplicació enregistrarà aquells events que disparin les notificacions.', - 'log_email' => 'Enregistrar els correus enviats per l\'aplicació', - 'log_sms' => 'Enregistrar els SMS enviats per l\'aplicació', - 'log_pushover' => 'Enregistrar els missatges enviats a Pushover per l\'aplicació', - 'log_telegram' => 'Enregistrar els missatges enviats a Telegram per l\'aplicació', - 'updated' => 'S\'ha actualitzat la configuració', - 'tab_email' => 'Correu', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Preferències de correu', - 'settings_sms' => 'Preferències de SMS', - 'settings_pushover' => 'Preferències de Pushover', - 'settings_telegram' => 'Preferències de Telegram', - 'settings_notification' => 'Preferències de notificacions', - 'settings_log' => 'Preferències de LOG', - 'settings_proxy' => 'Preferències de Proxy', - 'auto_refresh' => 'Auto-recàrrega', - 'auto_refresh_description' => 'Recarregar automàticament la plana Servidors.
    Temps en segons, si poseu ZERO la plana no s\'auto-recarregarà.', - 'seconds' => 'segons', - 'test' => 'Provar', - 'test_email' => 'S\'enviarà un correu a l\'adreça que teniu al vostre perfil d\'usuari.', - 'test_sms' => 'S\'enviarà un SMS al telèfon que teniu al vostre perfil d\'usuari.', - 'test_pushover' => 'S\'enviarà una notificació per Pushover a la clau d\'usuari/dispositiu que teniu al vostre perfil d\'usuari.', - 'test_telegram' => 'S\'enviarà una notificació per Telegram al xat amb l\'ID que teniu al vostre perfil d\'usuari.', - 'send' => 'Enviar', - 'test_subject' => 'Provar', - 'test_message' => 'Missatge de prova', - 'email_sent' => 'Correu enviat', - 'email_error' => 'Hi ha hagut un error provant d\'enviar el correu', - 'sms_sent' => 'Sms enviat', - 'sms_error' => 'Hi ha hagut un error provant d\'enviar el SMS', - 'sms_error_nomobile' => 'No ha estat posible enviar el SMS de prova: no s\'ha trobat un telèfon vàlid al vostre perfil d\'usuari.', - 'pushover_sent' => 'Notificació enviada per Pushover', - 'pushover_error' => 'Ha succeït un error provant d\'enviar la notificació Pushover: %s', - 'pushover_error_noapp' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap token d\'API d\'una App Pushover a la configuració general.', - 'pushover_error_nokey' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap clau Pushover al vostre perfil d\'usuari.', - 'telegram_sent' => 'Notificació enviada per Telegram', - 'telegram_error' => 'Ha succeït un error provant d\'enviar la notificació per Telegram: %s', - 'telegram_error_notoken' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap token d\'API de Telegram a la configuració general.', - 'telegram_error_noid' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap codi ID de xat al vostre perfil d\'usuari.', - 'log_retention_period' => 'Període de retenció al LOG', - 'log_retention_period_description' => 'Nombre de dies a conservar al LOG les notificacions i informació sobre l\'activitat dels servidors. Poseu 0 per evitar que el LOG es buidi mai.', - 'log_retention_days' => 'dies', - ), - 'notifications' => array( - 'off_sms' => 'El servidor \'%LABEL%\' NO RESPON: IP=%IP%, Port=%PORT%. Error=%ERROR%', - 'off_email_subject' => 'IMPORTANT: El servidor \'%LABEL%\' NO RESPON', - 'off_email_body' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', - 'off_pushover_title' => 'El servidor \'%LABEL%\' NO RESPON', - 'off_pushover_message' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', - 'off_telegram_message' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', - 'on_sms' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR: ip=%IP%, port=%PORT%, temps caigut=%LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: el servidor \'%LABEL%\' TORNA A FUNCIONAR', - 'on_email_body' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: %LAST_OFFLINE_DURATION%', - 'on_pushover_title' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR', - 'on_pushover_message' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: %LAST_OFFLINE_DURATION%', - 'on_telegram_message' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: %LAST_OFFLINE_DURATION%', - 'combi_off_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: %ERROR%
    • Data: %DATE%
    ', - 'combi_off_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: %ERROR%
    • Data: %DATE%
    ', - 'combi_off_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Error: %ERROR%
    - Data: %DATE%

    ', - 'combi_on_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Data: %DATE%
    • Temps fóra de línia: %LAST_OFFLINE_DURATION%
    ', - 'combi_on_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Data: %DATE%
    • Temps fóra de línia: %LAST_OFFLINE_DURATION%
    ', - 'combi_on_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Data: %DATE%
    - Temps fóra de línia: %LAST_OFFLINE_DURATION%

    ', - 'combi_email_subject' => 'IMPORTANT: els servidors \'%UP%\' TORNEN A FUNCIONAR, els servidors \'%DOWN%\' NO RESPONEN', - 'combi_pushover_subject' => 'Els servidors \'%UP%\' TORNEN A FUNCIONAR, els servidors \'%DOWN%\' NO RESPONEN', - 'combi_email_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors TORNEN A FUNCIONAR:
    %UP_SERVERS%', - 'combi_pushover_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors TORNEN A FUNCIONAR:
    %UP_SERVERS%', - 'combi_telegram_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors TORNEN A FUNCIONAR:
    %UP_SERVERS%', - ), - 'login' => array( - 'welcome_usermenu' => 'Benvingut(a), %user_name%', - 'title_sign_in' => 'Credencials d\'accés', - 'title_forgot' => 'Heu oblidat la contrasenya?', - 'title_reset' => 'Restablir la contrasenya', - 'submit' => 'Enviar', - 'remember_me' => 'Recorda\'m', - 'login' => 'Accedir', - 'logout' => 'Tancar sessió', - 'username' => 'Usuari', - 'password' => 'Contrasenya', - 'password_repeat' => 'Repetir contrasenya', - 'password_forgot' => 'Heu oblidat la contrasenya?', - 'password_reset' => 'Restablir la contrasenya', - 'password_reset_email_subject' => 'Restablir la vostra contrasenya per accedir a PHP Server Monitor', - 'password_reset_email_body' => 'Empreu el següent enllaç per restablir la vostra contrasenya. Tingueu en compte que expira en 1 hora.

    %link%', - 'error_user_incorrect' => 'No s\'ha trobat l\'usuari especificat.', - 'error_login_incorrect' => 'Aquestes credencials no són vàlides.', - 'error_login_passwords_nomatch' => 'Les dues contrasenyes no coincideixen.', - 'error_reset_invalid_link' => 'L\'enllaç per restablir la contrasenya no és vàlid.', - 'success_password_forgot' => 'Se us ha enviat un correu amb informació per restablir la vostra contrasenya.', - 'success_password_reset' => 'La vostra contrasenya s\'ha restablert amb èxit. Ja podeu entrar.', - ), - 'error' => array( - '401_unauthorized' => 'No-autoritzat', - '401_unauthorized_description' => 'No teniu els privilegis per veure aquesta plana o potser la vostra sessió ha expirat.', - ), + 'name' => 'Català - Catalan', + 'locale' => array( + '0' => 'ca_ES.UTF-8', + '1' => 'ca_ES', + '2' => 'catalan', + '3' => 'catalan-es', + ), + 'locale_tag' => 'ca', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Instal·lar', + 'action' => 'Acció', + 'save' => 'Desar', + 'edit' => 'Editar', + 'delete' => 'Esborrar', + 'date' => 'Data', + 'message' => 'Missatge', + 'yes' => 'Sí', + 'no' => 'No', + 'insert' => 'Inserir', + 'add_new' => 'Afegir nou', + 'update_available' => 'Hi ha disponible una nova versió ({version}) a https://github.com/phpservermon.', + 'back_to_top' => 'Tornar a dalt', + 'go_back' => 'Enrere', + 'ok' => 'OK', + 'bad' => 'dolent', + 'cancel' => 'Cancel·lar', + 'none' => 'Cap', + 'activate' => 'Activar', + 'short_day_format' => '%e %B', + 'long_day_format' => '%e %B %Y', + 'yesterday_format' => 'Ahir a les %k:%M', + 'other_day_format' => '%A a les %k:%M', + 'never' => 'Mai', + 'hours_ago' => 'fa %d hores', + 'an_hour_ago' => 'fa una hora', + 'minutes_ago' => 'fa %d minuts', + 'a_minute_ago' => 'fa un minut', + 'seconds_ago' => 'fa %d segons', + 'a_second_ago' => 'fa un segon', + 'year' => 'any', + 'years' => 'anys', + 'month' => 'mes', + 'months' => 'mesos', + 'day' => 'dia', + 'days' => 'dies', + 'hour' => 'hora', + 'hours' => 'hores', + 'minute' => 'minut', + 'minutes' => 'minuts', + 'second' => 'segon', + 'seconds' => 'segons', + ), + 'menu' => array( + 'config' => 'Configuració', + 'server' => 'Servidors', + 'server_log' => 'Log', + 'server_status' => 'Estat', + 'server_update' => 'FER PING ARA', + 'user' => 'Usuaris', + 'help' => 'Ajuda', + ), + 'users' => array( + 'user' => 'Usuari', + 'name' => 'Nom', + 'user_name' => 'Nom d\'usuari', + 'password' => 'Contrasenya', + 'password_repeat' => 'Repetir contrasenya', + 'password_leave_blank' => 'Deixar en blanc si no es vol canviar', + 'level' => 'Nivell', + 'level_10' => 'Administrador', + 'level_20' => 'Usuari', + 'level_description' => 'Els administradors tenen accés complet: poden administrar servidors, usuaris i + editar la configuració general.
    Els usuaris només poden engegar + actualitzacions dels servidors que els han estat assignats.', + 'mobile' => 'Mòbil', + 'email' => 'Correu', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover és un servei que fa fàcil obtenir notificacions en temps real. Veieu la seva web per a més + informació.', + 'pushover_key' => 'Clau Pushover', + 'pushover_device' => 'Dispositiu Pushover', + 'pushover_device_description' => 'Nom del dispositiu al qual enviar els missatges. Deixau en blanc per enviar + a tots els dispositius.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram és una app de + missatgeria que facilita el rebre notificacions en temps real. Consulteu la documentació per a + més informació i per saber com instal·lar-ho.', + 'telegram_chat_id' => 'Codi ID del xat a Telegram', + 'telegram_chat_id_description' => 'Els missatges seran enviats al xat de Telegram amb aquest ID.', + 'telegram_get_chat_id' => 'Premeu aquí per a obtenir el codi ID del vostre xat', + 'activate_telegram' => 'Activar notificacions de Telegram', + 'activate_telegram_description' => 'Permetre a Telegram enviar notificacions al xat amb aquest ID. Sense + aquest permís, Telegram rebutjarà qualsevol missatge enviat des + d\'aquesta aplicació.', + 'telegram_bot_username_found' => 'S\'ha trobat el bot!

    S\'obrirà un xat amb el bot. És + necessari que premeu el botó START o escriviu el comandament /start com a + missatge pel bot.', + 'telegram_bot_username_error_token' => '401 - No autoritzat. Assegureu-vos que el token de la API és vàlid.', + 'telegram_bot_error' => 'Ha succeït un error mentre s\'intentava activar les notificacions amb Telegram: %s', + 'delete_title' => 'Esborrar usuari', + 'delete_message' => 'Aquesta és una acció irreversible, n\'esteu segurs de voler esborrar l\'usuari \'%1\'?', + 'deleted' => 'Usuari esborrat.', + 'updated' => 'Usuari actualitzat.', + 'inserted' => 'Usuari afegit.', + 'profile' => 'Perfil', + 'profile_updated' => 'El vostre perfil ha estat actualitzat.', + 'error_user_name_bad_length' => 'El nom d\'usuari ha de tenir entre 2 i 64 caràcters.', + 'error_user_name_invalid' => 'El nom d\'usuari només pot tenir caràcters alfanumèrics (a-z, A-Z), digits + (0-9) i guions baixos (_).', + 'error_user_name_exists' => 'Aquest nom d\'usuari ja existeix. Esculliu un altre.', + 'error_user_email_bad_length' => 'L\'adreça de correu ha de tenir entre 5 i 255 caràcters.', + 'error_user_email_invalid' => 'L\'adreça de correu no és correcta.', + 'error_user_level_invalid' => 'Aquest nivell d\'usuari no és vàlid.', + 'error_user_no_match' => 'No s\'ha trobat aquest usuari a la base de dades.', + 'error_user_password_invalid' => 'Aquesta contrasenya no és vàlida.', + 'error_user_password_no_match' => 'LEs contrasenyes no coincideixen.', + ), + 'log' => array( + 'title' => 'Entrades del LOG', + 'type' => 'Tipus', + 'status' => 'Estat', + 'email' => 'Correu', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'No generar LOGs', + 'clear' => 'Netejar LOG', + 'delete_title' => 'Esborrar LOG', + 'delete_message' => 'Voleu esborrar tots els LOGs?', + ), + 'servers' => array( + 'server' => 'Servidor', + 'status' => 'Estat', + 'label' => 'Etiqueta', + 'domain' => 'Domini/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Nombre de segons que cal esperar a que el servidor respongui.', + 'authentication_settings' => 'Opcions d\'autenticació (opcional)', + 'website_username' => 'Nom d\'usuari', + 'website_username_description' => 'Nom d\'usuari per accedir al portal web (només està soportada + l\'autenticació d\'Apache).', + 'website_password' => 'Contrasenya', + 'website_password_description' => 'Contrasenya per accedir al portal web. La contrasenya es desa encriptada a + la base de dades.', + 'fieldset_monitoring' => 'Monitorització', + 'fieldset_permissions' => 'Permisos', + 'port' => 'Port', + 'custom_port' => 'Port personalitzat', + 'popular_ports' => 'Ports populars', + 'request_method' => 'Mètode de crida', + 'custom_request_method' => 'Mètode de crida personalitzat', + 'popular_request_methods' => 'Mètodes de crida habituals', + 'post_field' => 'Camp POST', + 'post_field_description' => 'Els camps de dades que seran enviats emprant el mètode de crida de dalt. + Exemple: param1=val1&param2=val2&...', + 'please_select' => 'Seleccioneu', + 'type' => 'Tipus', + 'type_website' => 'Website', + 'type_service' => 'Servei', + 'type_ping' => 'Ping', + 'pattern' => 'cercar cadena/patrò', + 'pattern_description' => 'Si aquest patró no es troba al lloc web, el servidor es marcarà fora de línia. Es + permeten expressions regulars.', + 'pattern_online' => 'El patró indica que el website és', + 'pattern_online_description' => 'En línia: si aquest patró es pot trobar en la resposta del servidor, el + servidor serà marcat com en línia. Fóra de línia: si aquest patró no es + pot trobar en la resposta del servidor, aquest serà marcat fóra de línia.', + 'redirect_check' => 'El redireccionament cap a un altre domini és', + 'redirect_check_description' => 'El redireccionament cap a un altre domini habitualment és un mal senyal.', + 'allow_http_status' => 'Permetre codi d\'estat HTTP', + 'allow_http_status_description' => 'Marcar el website com en línia. Els codis d\'estat HTTP inferiors a 400 + són marcats com en línia per defecte. Empreu el símbol | per separar + més d\'un estat. Exemple: 401|403.', + 'header_name_description' => 'Nom de la capçalera (sensible a majúscules)', + 'header_value_description' => 'Valor de la capçalera. Es permeten expressions regulars.', + 'last_check' => 'Darrera comprovació', + 'last_online' => 'Darrer cop en línia', + 'last_offline' => 'Darrer cop fóra de línia', + 'last_output' => 'Darrera sortida positiva', + 'last_error' => 'Darrer error', + 'last_error_output' => 'Darrera sortida amb error', + 'monitoring' => 'Monitorització', + 'no_monitoring' => 'Sense monitorització', + 'email' => 'Correu', + 'send_email' => 'Enviar correu', + 'sms' => 'SMS', + 'send_sms' => 'Enviar SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Enviar notificació per Pushover', + 'telegram' => 'Telegram', + 'send_telegram' => 'Enviar notificació per Telegram', + 'users' => 'Usuaris', + 'delete_title' => 'Esborrar servidor', + 'delete_message' => 'Esteu segurs de que voleu esborrar el servidor \'%1\'?', + 'deleted' => 'Servidor esborrat.', + 'updated' => 'Servidor actualitzat.', + 'inserted' => 'Servidor afegit.', + 'latency' => 'Latència', + 'latency_max' => 'Latència (màxima)', + 'latency_min' => 'Latència (mínima)', + 'latency_avg' => 'Latència (mitjana)', + 'uptime' => 'Temps actiu', + 'year' => 'Any', + 'month' => 'Mes', + 'week' => 'Setmana', + 'day' => 'Dia', + 'hour' => 'Hora', + 'warning_threshold' => 'Llindar \'advertència', + 'warning_threshold_description' => 'Nombre de comprovacions fallides necessàries abans de considerar el + servidor fóra de línia.', + 'chart_last_week' => 'Darrera setmana', + 'chart_history' => 'Historial', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Les notificacions per SMS estan deshabilitades.', + 'warning_notifications_disabled_email' => 'Les notificacions per correu estan deshabilitades.', + 'warning_notifications_disabled_pushover' => 'Les notificacions per Pushover estan deshabilitades.', + 'warning_notifications_disabled_telegram' => 'Les notificacions per Telegram estan deshabilitades.', + 'error_server_no_match' => 'No s\'ha trobat el servidor.', + 'error_server_label_bad_length' => 'L\'etiqueta ha de tenir entre 1 i 255 caràcters.', + 'error_server_ip_bad_length' => 'El nom de domini o IP ha de tenir entre 1 i 255 caràcters.', + 'error_server_ip_bad_service' => 'L\'adreça IP no és vàlida', + 'error_server_ip_bad_website' => 'L\'adreça URL del lloc web no és vàlida.', + 'error_server_type_invalid' => 'El tipus de servidor escollit no és vàlid.', + 'error_server_warning_threshold_invalid' => 'El llindar d\'advertència ha de ser un valor sencer positiu.', + ), + 'config' => array( + 'general' => 'General', + 'language' => 'Idioma', + 'show_update' => 'Comprovar actualitzacions?', + 'password_encrypt_key' => 'La clau per xifrar contrasenyes', + 'password_encrypt_key_note' => 'Aquesta és la clau emprada per xifrar les contrasenyes que són + emmagatzemades als servidors per accedir als llocs web. Si la clau canviés la + contrasenya guardada no seria vàlida!', + 'proxy' => 'Habilitar proxy', + 'proxy_url' => 'URL del proxy', + 'proxy_user' => 'Usuari del proxy', + 'proxy_password' => 'Contrasenya del proxy', + 'email_status' => 'Permetre l\'enviament de correus', + 'email_from_email' => 'Adreça del remitent', + 'email_from_name' => 'Nom del remitent', + 'email_smtp' => 'Habilitar SMTP', + 'email_smtp_host' => 'Servidor SMTP', + 'email_smtp_port' => 'Port SMTP', + 'email_smtp_security' => 'Seguretat SMTP', + 'email_smtp_security_none' => 'Cap', + 'email_smtp_username' => 'Usuari SMTP', + 'email_smtp_password' => 'Contrasenya SMTP', + 'email_smtp_noauth' => 'Deixar en blanc si no cal autenticació', + 'sms_status' => 'Permetre l\'enviament de missatges de text', + 'sms_gateway' => 'Servei \'Gateway\' per l\'enviament de SMS', + 'sms_gateway_username' => 'Usuari del Gateway', + 'sms_gateway_password' => 'Contrasenya del Gateway', + 'sms_from' => 'Numero de telèfon de qui envia', + 'pushover_status' => 'Permetre l\'enviament de missatges per Pushover', + 'pushover_description' => 'Pushover és un servei que facilita la recepció de notificacions en temps real. + Veieu la serv web per a més informació.', + 'pushover_clone_app' => 'premeu aquí per a crear la vostra app Pushover', + 'pushover_api_token' => 'Token de la API de la App Pushover', + 'pushover_api_token_description' => 'Abans de poder emprar Pushover necessiteu registrar una app al seu portal web i introduïr + aquí el Token de la API.', + 'telegram_status' => 'Permetre l\'enviament de missatges per Telegram', + 'telegram_description' => 'Telegram és una app de xat + (mòbil i PC) que facilita la recepció de notificacions en temps real. Veieu la documentació per + saber més i saber com activar-ho.', + 'telegram_api_token' => 'Token de l\'API de Telegram', + 'telegram_api_token_description' => 'Abans de poder emprar Telegram necessiteu obtenir un token de l\'API. + Consulteu la documentació per saber més.', + 'alert_type' => 'Seleccioneu quan voleu ser notificats.', + 'alert_type_description' => 'Canvi d\'estat: Rebreu una notificació quan un servidor tingui un canvi + d\'estat. És a dir, passi d\'estar en línia a fora de línia o viceversa.

    Fora de línia: Rebreu una notificació només *EL PRIMER COP* que + un servidor passa a estar fora de línia. Per exemple, la vostra aplicació + s\'executa cada 15 minuts i el servidor esdevé fora de línia a la una de la + matinada i es queda així fins les sis. llavors rebríeu només una notificació. + No se us aviasarà quan torni a ser en línia.

    Sempre: Rebreu una + notificació *CADA COP* que l\'aplicació detecti que el servidor és fora de + línia, fins que torni a estar en línia.', + 'alert_type_status' => 'Canvi \'estat', + 'alert_type_offline' => 'Fora de línia', + 'alert_type_always' => 'Sempre', + 'combine_notifications' => 'Combinar notificacions', + 'combine_notifications_description' => 'Redueix el nombre de notificacions en combinar-les en una de sola. + (Això no afecta a les notificacions per SMS.)', + 'alert_proxy' => 'Encara que s\'habiliti, el proxy no és emprat mai per als serveis', + 'alert_proxy_url' => 'Format: Servidor:Port', + 'log_status' => 'LOG d\'estat', + 'log_status_description' => 'Si el LOG d\'estat es configura a SÍ, l\'aplicació enregistrarà aquells events + que disparin les notificacions.', + 'log_email' => 'Enregistrar els correus enviats per l\'aplicació', + 'log_sms' => 'Enregistrar els SMS enviats per l\'aplicació', + 'log_pushover' => 'Enregistrar els missatges enviats a Pushover per l\'aplicació', + 'log_telegram' => 'Enregistrar els missatges enviats a Telegram per l\'aplicació', + 'updated' => 'S\'ha actualitzat la configuració', + 'tab_email' => 'Correu', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Preferències de correu', + 'settings_sms' => 'Preferències de SMS', + 'settings_pushover' => 'Preferències de Pushover', + 'settings_telegram' => 'Preferències de Telegram', + 'settings_notification' => 'Preferències de notificacions', + 'settings_log' => 'Preferències de LOG', + 'settings_proxy' => 'Preferències de Proxy', + 'auto_refresh' => 'Auto-recàrrega', + 'auto_refresh_description' => 'Recarregar automàticament la plana Servidors.
    Temps en + segons, si poseu ZERO la plana no s\'auto-recarregarà.', + 'seconds' => 'segons', + 'test' => 'Provar', + 'test_email' => 'S\'enviarà un correu a l\'adreça que teniu al vostre perfil d\'usuari.', + 'test_sms' => 'S\'enviarà un SMS al telèfon que teniu al vostre perfil d\'usuari.', + 'test_pushover' => 'S\'enviarà una notificació per Pushover a la clau d\'usuari/dispositiu que teniu al + vostre perfil d\'usuari.', + 'test_telegram' => 'S\'enviarà una notificació per Telegram al xat amb l\'ID que teniu al vostre perfil + d\'usuari.', + 'send' => 'Enviar', + 'test_subject' => 'Provar', + 'test_message' => 'Missatge de prova', + 'email_sent' => 'Correu enviat', + 'email_error' => 'Hi ha hagut un error provant d\'enviar el correu', + 'sms_sent' => 'Sms enviat', + 'sms_error' => 'Hi ha hagut un error provant d\'enviar el SMS', + 'sms_error_nomobile' => 'No ha estat posible enviar el SMS de prova: no s\'ha trobat un telèfon vàlid al + vostre perfil d\'usuari.', + 'pushover_sent' => 'Notificació enviada per Pushover', + 'pushover_error' => 'Ha succeït un error provant d\'enviar la notificació Pushover: %s', + 'pushover_error_noapp' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap token + d\'API d\'una App Pushover a la configuració general.', + 'pushover_error_nokey' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap clau + Pushover al vostre perfil d\'usuari.', + 'telegram_sent' => 'Notificació enviada per Telegram', + 'telegram_error' => 'Ha succeït un error provant d\'enviar la notificació per Telegram: %s', + 'telegram_error_notoken' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap token + d\'API de Telegram a la configuració general.', + 'telegram_error_noid' => 'No ha estat posible enviar la notificació de prova: no s\'ha trobat cap codi ID de + xat al vostre perfil d\'usuari.', + 'log_retention_period' => 'Període de retenció al LOG', + 'log_retention_period_description' => 'Nombre de dies a conservar al LOG les notificacions i informació sobre + l\'activitat dels servidors. Poseu 0 per evitar que el LOG es buidi + mai.', + 'log_retention_days' => 'dies', + ), + 'notifications' => array( + 'off_sms' => 'El servidor \'%LABEL%\' NO RESPON: IP=%IP%, Port=%PORT%. Error=%ERROR%', + 'off_email_subject' => 'IMPORTANT: El servidor \'%LABEL%\' NO RESPON', + 'off_email_body' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', + 'off_pushover_title' => 'El servidor \'%LABEL%\' NO RESPON', + 'off_pushover_message' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', + 'off_telegram_message' => 'Ha fallat la connexió amb aquest servidor:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Data: %DATE%', + 'on_sms' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR: ip=%IP%, port=%PORT%, temps + caigut=%LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANT: el servidor \'%LABEL%\' TORNA A FUNCIONAR', + 'on_email_body' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: %LAST_OFFLINE_DURATION%', + 'on_pushover_title' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR', + 'on_pushover_message' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: + %LAST_OFFLINE_DURATION%', + 'on_telegram_message' => 'El servidor \'%LABEL%\' TORNA A FUNCIONAR:

    Servidor: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Data: %DATE%
    Temps fóra de línia: + %LAST_OFFLINE_DURATION%', + 'combi_off_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: + %ERROR%
    • Data: %DATE%
    ', + 'combi_off_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: + %PORT%
    • Error: %ERROR%
    • Data: %DATE%
    ', + 'combi_off_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Error: + %ERROR%
    - Data: %DATE%

    ', + 'combi_on_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Data: + %DATE%
    • Temps fóra de línia: %LAST_OFFLINE_DURATION%
    ', + 'combi_on_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Data: + %DATE%
    • Temps fóra de línia: %LAST_OFFLINE_DURATION%
    ', + 'combi_on_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Data: %DATE%
    - + Temps fóra de línia: %LAST_OFFLINE_DURATION%

    ', + 'combi_email_subject' => 'IMPORTANT: els servidors \'%UP%\' TORNEN A FUNCIONAR, els servidors \'%DOWN%\' NO + RESPONEN', + 'combi_pushover_subject' => 'Els servidors \'%UP%\' TORNEN A FUNCIONAR, els servidors \'%DOWN%\' NO RESPONEN', + 'combi_email_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors + TORNEN A FUNCIONAR:
    %UP_SERVERS%', + 'combi_pushover_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors + TORNEN A FUNCIONAR:
    %UP_SERVERS%', + 'combi_telegram_message' => 'Aquests servidors NO RESPONEN:
    %DOWN_SERVERS%
    Aquests servidors + TORNEN A FUNCIONAR:
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => 'Benvingut(a), %user_name%', + 'title_sign_in' => 'Credencials d\'accés', + 'title_forgot' => 'Heu oblidat la contrasenya?', + 'title_reset' => 'Restablir la contrasenya', + 'submit' => 'Enviar', + 'remember_me' => 'Recorda\'m', + 'login' => 'Accedir', + 'logout' => 'Tancar sessió', + 'username' => 'Usuari', + 'password' => 'Contrasenya', + 'password_repeat' => 'Repetir contrasenya', + 'password_forgot' => 'Heu oblidat la contrasenya?', + 'password_reset' => 'Restablir la contrasenya', + 'password_reset_email_subject' => 'Restablir la vostra contrasenya per accedir a PHP Server Monitor', + 'password_reset_email_body' => 'Empreu el següent enllaç per restablir la vostra contrasenya. Tingueu en + compte que expira en 1 hora.

    %link%', + 'error_user_incorrect' => 'No s\'ha trobat l\'usuari especificat.', + 'error_login_incorrect' => 'Aquestes credencials no són vàlides.', + 'error_login_passwords_nomatch' => 'Les dues contrasenyes no coincideixen.', + 'error_reset_invalid_link' => 'L\'enllaç per restablir la contrasenya no és vàlid.', + 'success_password_forgot' => 'Se us ha enviat un correu amb informació per restablir la vostra contrasenya.', + 'success_password_reset' => 'La vostra contrasenya s\'ha restablert amb èxit. Ja podeu entrar.', + ), + 'error' => array( + '401_unauthorized' => 'No-autoritzat', + '401_unauthorized_description' => 'No teniu els privilegis per veure aquesta plana o potser la vostra sessió + ha expirat.', + ), ); diff --git a/src/lang/cs_CZ.lang.php b/src/lang/cs_CZ.lang.php index 881c1942..e4360f5a 100644 --- a/src/lang/cs_CZ.lang.php +++ b/src/lang/cs_CZ.lang.php @@ -1,4 +1,5 @@ 'Česky - Czech', - 'locale' => array('cs_CZ.UTF-8', 'cs_CZ', 'czech', 'czech'), - 'locale_tag' => 'cs', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Instalace', - 'action' => 'Akce', - 'save' => 'Uložit', - 'edit' => 'Upravit', - 'delete' => 'Smazat', - 'date' => 'Datum', - 'message' => 'Zpráva', - 'yes' => 'Ano', - 'no' => 'Ne', - 'insert' => 'Vložit', - 'add_new' => 'Přidat', - 'update_available' => 'Nová verze - ({version}) je dostupná na http://www.phpservermonitor.org.', - 'back_to_top' => 'Zpět na začátek', - 'go_back' => 'Zpět', - 'ok' => 'OK', - 'cancel' => 'Zrušit', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Včera v %k:%M', - 'other_day_format' => '%A v %k:%M', - 'never' => 'Nikdy', - 'hours_ago' => 'před %d hodinami', - 'an_hour_ago' => 'cca před hodinou', - 'minutes_ago' => 'před %d minutami', - 'a_minute_ago' => 'cca před minutou', - 'seconds_ago' => 'před %d vteřinami', - 'a_second_ago' => 'před chvílí', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Konfigurace', - 'server' => 'Servery', - 'server_log' => 'Log', - 'server_status' => 'Status', - 'server_update' => 'Aktualizace', - 'user' => 'Uživatelé', - 'help' => 'Nápověda', - ), - 'users' => array( - 'user' => 'Uživatel', - 'name' => 'Jméno', - 'user_name' => 'Uživatelské jméno', - 'password' => 'Heslo', - 'password_repeat' => 'Stejné heslo (pro kontrolu)', - 'password_leave_blank' => 'Ponechte prázdné pro ponechání beze změn.', - 'level' => 'Oprávnění', - 'level_10' => 'Administrátor', - 'level_20' => 'Uživatel', - 'level_description' => 'Administrátor má plný přístup: může spravovat servery, uživatele a upravit globální konfiguraci.
    Uživatel má práva pouze na čtení a spustit aktualizaci serverů, které má přiřazeny.', - 'mobile' => 'Mobil', - 'email' => 'E-mail', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover je služba umožňující jednoduše zasílat real-time upozornění. Více na webu Pushover', - 'pushover_key' => 'Pushover Token', - 'pushover_device' => 'Pushover Zařízení', - 'pushover_device_description' => 'Název zařízení, na které má být zráva odeslána. Ponechte prázdné pro odeslání na všechna zařízení.', - 'delete_title' => 'Smazat uživatele', - 'delete_message' => 'Opravdu smazat uživatele \'%1\'?', - 'deleted' => 'Uživatel smazán.', - 'updated' => 'Uživatel aktualizován.', - 'inserted' => 'Uživatel přidán.', - 'profile' => 'Profil', - 'profile_updated' => 'Váš uživatelský profil byl upraven.', - 'error_user_name_bad_length' => 'Uživatelské jméno musí obsahovat 2 až 64 znaků.', - 'error_user_name_invalid' => 'Uživatelské jméno může obsahovat pouze písmena (a-z, A-Z), čísla (0-9), tečky (.) a podtržítka (_).', - 'error_user_name_exists' => 'Zadané uživatelské jméno již existuje v databázi.', - 'error_user_email_bad_length' => 'E-mailová adresa musí obsahovat 5 až 255 znaků .', - 'error_user_email_invalid' => 'E-mailová adresa je neplatná', - 'error_user_level_invalid' => 'Zadané oprávnění je neplatné.', - 'error_user_no_match' => 'Uživatel nebyl nalezen.', - 'error_user_password_invalid' => 'Zadané heslo je neplatné.', - 'error_user_password_no_match' => 'Zadaná hesla neodpovídají.', - ), - 'log' => array( - 'title' => 'Záznamy logu', - 'type' => 'Typ', - 'status' => 'Stav', - 'email' => 'E-mail', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Žádné záznamy', - 'clear' => 'Jasný protokol', - 'delete_title' => 'Odstranit protokol', - 'delete_message' => 'Opravdu chcete odstranit protokoly všechny?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Stav', - 'label' => 'Popis', - 'domain' => 'Doména/IP', - 'timeout' => 'Časový limit', - 'timeout_description' => 'Počet vteřin čekání na odpověď serveru.', - 'authentication_settings' => 'Nastavení autentizace', - 'optional' => 'volitelný', - 'website_username' => 'Uživatelské jméno', - 'website_username_description' => 'Uživatelské jméno pro přístup na stránku. (Pouze Apache autorizace je podporovaná.)', - 'website_password' => 'Heslo', - 'website_password_description' => 'Heslo pro přístup na stránku. Heslo je v databázi šifrované.', - 'fieldset_monitoring' => 'Monitoring', - 'fieldset_permissions' => 'Oprávnění', - 'port' => 'Port', - 'custom_port' => 'Uživatelský Port', - 'popular_ports' => 'Populární Porty', - 'please_select' => 'Prosím vyberte', - 'type' => 'Typ', - 'type_website' => 'Web', - 'type_service' => 'Služba', - 'pattern' => 'Vyhledat řetězec/vzorek', - 'pattern_description' => 'Pokud vzorek nebude na webu nalezen, bude server označen jako offline. Regulární výrazy jsou povoleny.', - 'last_check' => 'Poslední kontrola', - 'last_online' => 'Naposledy online', - 'last_offline' => 'Naposledy offline', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'Žádné monitorované služby', - 'email' => 'E-mail', - 'send_email' => 'Odeslat e-mail', - 'sms' => 'SMS', - 'send_sms' => 'Odeslat SMS', - 'pushover' => 'Pushover', - 'users' => 'Uživatelé', - 'delete_title' => 'Smazat server', - 'delete_message' => 'Opravdu si přejete smazat \'%1\'?', - 'deleted' => 'Server smazán.', - 'updated' => 'Server aktualizován.', - 'inserted' => 'Server přidán.', - 'latency' => 'Latence', - 'latency_max' => 'Latence (maximum)', - 'latency_min' => 'Latence (minimum)', - 'latency_avg' => 'Latence (průměr)', - 'uptime' => 'Uptime', - 'year' => 'Rok', - 'month' => 'Měsíc', - 'week' => 'Týden', - 'day' => 'Den', - 'hour' => 'Hodina', - 'warning_threshold' => 'Stropní hranice varování', - 'warning_threshold_description' => 'Počet neúspěšných pokusů před označením serveru jako offline.', - 'chart_last_week' => 'Minulý týden', - 'chart_history' => 'Historie', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS upozornění jsou vypnuta.', - 'warning_notifications_disabled_email' => 'E-mailová upozornění jsou vypnuta.', - 'warning_notifications_disabled_pushover' => 'Pushover upozornění jsou vypnuta.', - 'error_server_no_match' => 'Server nenalezen.', - 'error_server_label_bad_length' => 'Popisek musí obsahovat 1 až 255 znaků.', - 'error_server_ip_bad_length' => 'Doména/IP adresa musí obsahovat 1 až 255 znaků.', - 'error_server_ip_bad_service' => 'IP adresa není platná.', - 'error_server_ip_bad_website' => 'URL webu není platná.', - 'error_server_type_invalid' => 'Zvolený typ serveru není platný', - 'error_server_warning_threshold_invalid' => 'Hranice varování musí být číslo větší než 0.', - ), - 'config' => array( - 'general' => 'Obecné', - 'language' => 'Jazyk', - 'show_update' => 'Kontrolovat aktualizace?', - 'password_encrypt_key' => 'Šifrovací klíč pro hesla', - 'password_encrypt_key_note' => 'Tímto klíčem se šifrují hesla, která se ukládají u serverů pro přístup na webové stránky. Pokud klíč změníte budou uložená hesla neplatná!', - 'email_status' => 'Povolit odesílání e-mailu', - 'email_from_email' => 'E-mailová adresa odesilatele', - 'email_from_name' => 'Jméno odesilatele', - 'email_smtp' => 'Zapnout SMTP', - 'email_smtp_host' => 'SMTP adresa', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP zabezpečení', - 'email_smtp_security_none' => 'žádné', - 'email_smtp_username' => 'SMTP uživatelské jméno', - 'email_smtp_password' => 'SMTP heslo', - 'email_smtp_noauth' => 'Ponechte prázdné pro použití SMTP bez hesla', - 'sms_status' => 'Povolit odesílání textových zpráv', - 'sms_gateway' => 'Brána použitá pro odesílání zpráv', - 'sms_gateway_username' => 'Uživatelské jméno brány', - 'sms_gateway_password' => 'Heslo brány', - 'sms_from' => 'Telefonní číslo odesilatele', - 'pushover_status' => 'Povolit zasílání Pushover zpráv', - 'pushover_description' => 'Pushover je služba umožňující jednoduše zasílat real-time upozornění. Více na webu Pushover', - 'pushover_clone_app' => 'Klikněte pro vytvoření Pushover aplikace', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Pře použitím Pushoveru se musíte registrovat a získat API Token.', - 'alert_type' => 'Zvolte kdy si přejete být upozorněni.', - 'alert_type_description' => 'Změna stavu: '. - 'Obdržíte upozornění při změně stavu, tedy:online -> offline nebo offline -> online.
    '. - '
    Offline: '. - 'Obdržíte upozornění, kdy server přejde poprvé do offline stavu. Například, pokud je cron nastaven na 15 minut a sledovaný server bude offline mezi 01:00 a 06:00. Obdržíte upozornění pouze v 01:00.
    '. - '
    Vždy: '. - 'Obdržíte upozornění při každém spuštění kontroly, tedy i pokud bude server offline několik hodin.', - 'alert_type_status' => 'Změna stavu', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Vždy', - 'log_status' => 'Log', - 'log_status_description' => 'Pokud je Log nastaven na hodnotu TRUE, systém do něj zapíše veškerá provedená upozornění.', - 'log_email' => 'Logovat odeslané e-maily', - 'log_sms' => 'Logovat odeslané textové zprávy', - 'log_pushover' => 'Logovat odeslané Pushover zprávy', - 'updated' => 'Nastavení bylo aktualizováno.', - 'tab_email' => 'E-mail', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Nastavení e-mailů', - 'settings_sms' => 'Nastavení textových zpráv', - 'settings_pushover' => 'Nastavení Pushover', - 'settings_notification' => 'Nastavení upozornění', - 'settings_log' => 'Nastavení logu', - 'auto_refresh' => 'Automaticky obnovit', - 'auto_refresh_description' => - 'Automaticky obnovit stránku Servery.
    '. - ''. - 'Čas v sekundách, 0 pro vypnutí automatického obnovení.'. - '', - 'seconds' => 'sekund', - 'test' => 'Test', - 'test_email' => 'E-mail bude odeslán na adresu uvedenou v uživatelském profilu.', - 'test_sms' => 'SMS bude odeslána na telefonní číslo uvedené v uživatelském profilu.', - 'test_pushover' => 'Pushover upozornění bude odesláno uživateli/zařízení dle nastavení v uživatelském profilu.', - 'send' => 'Odeslat', - 'test_subject' => 'Test', - 'test_message' => 'Testovací zpráva', - 'email_sent' => 'E-mail odeslán', - 'email_error' => 'Chyba při odeslání e-mailu', - 'sms_sent' => 'SMS odeslána', - 'sms_error' => 'Chyba při odeslání SMS. %s', - 'sms_error_nomobile' => 'Nebylo možné odeslat SMS: v uživatelském profilu nebylo nalezeno platné telefonní číslo.', - 'pushover_sent' => 'Pushover upozornění odesláno.', - 'pushover_error' => 'Nastala chyba při odesílání Pushover upozornění: %s', - 'pushover_error_noapp' => 'Nebylo možné odeslat testovací upozornění: v globálním nastavení nebyl nalezen žádný API token.', - 'pushover_error_nokey' => 'Nebylo možné odeslat testovací upozornění: ve vašem profilu není definován Pushover key.', - 'log_retention_period' => 'Rotace logu', - 'log_retention_period_description' => 'Počet dnů po které budou zachovány logy upozornění. Vložte 0 pro vypnutí autorotace.', - 'log_retention_days' => 'dnů', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%', - 'off_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je offline', - 'off_email_body' => 'Nebylo možné spojit se se serverem:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Chyba: %ERROR%
    Datum: %DATE%', - 'off_pushover_title' => 'Server \'%LABEL%\' je offline', - 'off_pushover_message' => 'Nebylo možné spojit se se serverem:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Chyba: %ERROR%
    Datum: %DATE%', - 'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je online', - 'on_email_body' => "Server '%LABEL%' je opět online, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' je online', - 'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Vítejte, %user_name%', - 'title_sign_in' => 'Prosím přihlašte se', - 'title_forgot' => 'Zapomenuté heslo?', - 'title_reset' => 'Obnova hesla', - 'submit' => 'Odeslat', - 'remember_me' => 'Zapamatovat údaje', - 'login' => 'Přihlásit', - 'logout' => 'Odhlásit', - 'username' => 'Uživatelské jméno', - 'password' => 'Heslo', - 'password_repeat' => 'Opište heslo', - 'password_forgot' => 'Zapomenuté heslo?', - 'password_reset' => 'Obnovit heslo', - 'password_reset_email_subject' => 'Obnovit heslo pro PHP Server Monitor', - 'password_reset_email_body' => 'Použijte následující odkaz pro obnovení hesla. Odkaz je platný jednu hodinu.

    %link%', - 'error_user_incorrect' => 'Zadané uživatelské jméno nebylo nalezeno.', - 'error_login_incorrect' => 'Přihlášení nebylo úspěšné.', - 'error_login_passwords_nomatch' => 'Zadaná hesla neodpovídají.', - 'error_reset_invalid_link' => 'Odkaz je neplatný.', - 'success_password_forgot' => 'Na vaši e-mailovou adresu byl zaslán e-mail s informacemi pro obnovu hesla.', - 'success_password_reset' => 'Vaše heslo bylo úspěšně obnoveno. Prosím přihlašte se.', - ), - 'error' => array( - '401_unauthorized' => 'Nedostatečné oprávnění', - '401_unauthorized_description' => 'Nemáte oprávnění zobrazit tuto stránku.', - ), + 'name' => 'Česky - Czech', + 'locale' => array( + '0' => 'cs_CZ.UTF-8', + '1' => 'cs_CZ', + '2' => 'czech', + '3' => 'czech', + ), + 'locale_tag' => 'cs', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Instalace', + 'action' => 'Akce', + 'save' => 'Uložit', + 'edit' => 'Upravit', + 'delete' => 'Smazat', + 'date' => 'Datum', + 'message' => 'Zpráva', + 'yes' => 'Ano', + 'no' => 'Ne', + 'insert' => 'Vložit', + 'add_new' => 'Přidat', + 'update_available' => 'Nová verze - ({version}) je dostupná na http://www.phpservermonitor.org.', + 'back_to_top' => 'Zpět na začátek', + 'go_back' => 'Zpět', + 'ok' => 'OK', + 'cancel' => 'Zrušit', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Včera v %k:%M', + 'other_day_format' => '%A v %k:%M', + 'never' => 'Nikdy', + 'hours_ago' => 'před %d hodinami', + 'an_hour_ago' => 'cca před hodinou', + 'minutes_ago' => 'před %d minutami', + 'a_minute_ago' => 'cca před minutou', + 'seconds_ago' => 'před %d vteřinami', + 'a_second_ago' => 'před chvílí', + ), + 'menu' => array( + 'config' => 'Konfigurace', + 'server' => 'Servery', + 'server_log' => 'Log', + 'server_status' => 'Status', + 'server_update' => 'Aktualizace', + 'user' => 'Uživatelé', + 'help' => 'Nápověda', + ), + 'users' => array( + 'user' => 'Uživatel', + 'name' => 'Jméno', + 'user_name' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'password_repeat' => 'Stejné heslo (pro kontrolu)', + 'password_leave_blank' => 'Ponechte prázdné pro ponechání beze změn.', + 'level' => 'Oprávnění', + 'level_10' => 'Administrátor', + 'level_20' => 'Uživatel', + 'level_description' => 'Administrátor má plný přístup: může spravovat servery, uživatele a + upravit globální konfiguraci.
    Uživatel má práva pouze na čtení a + spustit aktualizaci serverů, které má přiřazeny.', + 'mobile' => 'Mobil', + 'email' => 'E-mail', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover je služba umožňující jednoduše zasílat real-time upozornění. + Více na webu Pushover', + 'pushover_key' => 'Pushover Token', + 'pushover_device' => 'Pushover Zařízení', + 'pushover_device_description' => 'Název zařízení, na které má být zráva odeslána. Ponechte prázdné + pro odeslání na všechna zařízení.', + 'delete_title' => 'Smazat uživatele', + 'delete_message' => 'Opravdu smazat uživatele \'%1\'?', + 'deleted' => 'Uživatel smazán.', + 'updated' => 'Uživatel aktualizován.', + 'inserted' => 'Uživatel přidán.', + 'profile' => 'Profil', + 'profile_updated' => 'Váš uživatelský profil byl upraven.', + 'error_user_name_bad_length' => 'Uživatelské jméno musí obsahovat 2 až 64 znaků.', + 'error_user_name_invalid' => 'Uživatelské jméno může obsahovat pouze písmena (a-z, A-Z), čísla (0-9), + tečky (.) a podtržítka (_).', + 'error_user_name_exists' => 'Zadané uživatelské jméno již existuje v databázi.', + 'error_user_email_bad_length' => 'E-mailová adresa musí obsahovat 5 až 255 znaků .', + 'error_user_email_invalid' => 'E-mailová adresa je neplatná', + 'error_user_level_invalid' => 'Zadané oprávnění je neplatné.', + 'error_user_no_match' => 'Uživatel nebyl nalezen.', + 'error_user_password_invalid' => 'Zadané heslo je neplatné.', + 'error_user_password_no_match' => 'Zadaná hesla neodpovídají.', + ), + 'log' => array( + 'title' => 'Záznamy logu', + 'type' => 'Typ', + 'status' => 'Stav', + 'email' => 'E-mail', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Žádné záznamy', + 'clear' => 'Jasný protokol', + 'delete_title' => 'Odstranit protokol', + 'delete_message' => 'Opravdu chcete odstranit protokoly všechny?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Stav', + 'label' => 'Popis', + 'domain' => 'Doména/IP', + 'timeout' => 'Časový limit', + 'timeout_description' => 'Počet vteřin čekání na odpověď serveru.', + 'authentication_settings' => 'Nastavení autentizace', + 'optional' => 'volitelný', + 'website_username' => 'Uživatelské jméno', + 'website_username_description' => 'Uživatelské jméno pro přístup na stránku. (Pouze Apache autorizace je + podporovaná.)', + 'website_password' => 'Heslo', + 'website_password_description' => 'Heslo pro přístup na stránku. Heslo je v databázi šifrované.', + 'fieldset_monitoring' => 'Monitoring', + 'fieldset_permissions' => 'Oprávnění', + 'port' => 'Port', + 'custom_port' => 'Uživatelský Port', + 'popular_ports' => 'Populární Porty', + 'please_select' => 'Prosím vyberte', + 'type' => 'Typ', + 'type_website' => 'Web', + 'type_service' => 'Služba', + 'pattern' => 'Vyhledat řetězec/vzorek', + 'pattern_description' => 'Pokud vzorek nebude na webu nalezen, bude server označen jako offline. Regulární + výrazy jsou povoleny.', + 'last_check' => 'Poslední kontrola', + 'last_online' => 'Naposledy online', + 'last_offline' => 'Naposledy offline', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'Žádné monitorované služby', + 'email' => 'E-mail', + 'send_email' => 'Odeslat e-mail', + 'sms' => 'SMS', + 'send_sms' => 'Odeslat SMS', + 'pushover' => 'Pushover', + 'users' => 'Uživatelé', + 'delete_title' => 'Smazat server', + 'delete_message' => 'Opravdu si přejete smazat \'%1\'?', + 'deleted' => 'Server smazán.', + 'updated' => 'Server aktualizován.', + 'inserted' => 'Server přidán.', + 'latency' => 'Latence', + 'latency_max' => 'Latence (maximum)', + 'latency_min' => 'Latence (minimum)', + 'latency_avg' => 'Latence (průměr)', + 'uptime' => 'Uptime', + 'year' => 'Rok', + 'month' => 'Měsíc', + 'week' => 'Týden', + 'day' => 'Den', + 'hour' => 'Hodina', + 'warning_threshold' => 'Stropní hranice varování', + 'warning_threshold_description' => 'Počet neúspěšných pokusů před označením serveru jako offline.', + 'chart_last_week' => 'Minulý týden', + 'chart_history' => 'Historie', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS upozornění jsou vypnuta.', + 'warning_notifications_disabled_email' => 'E-mailová upozornění jsou vypnuta.', + 'warning_notifications_disabled_pushover' => 'Pushover upozornění jsou vypnuta.', + 'error_server_no_match' => 'Server nenalezen.', + 'error_server_label_bad_length' => 'Popisek musí obsahovat 1 až 255 znaků.', + 'error_server_ip_bad_length' => 'Doména/IP adresa musí obsahovat 1 až 255 znaků.', + 'error_server_ip_bad_service' => 'IP adresa není platná.', + 'error_server_ip_bad_website' => 'URL webu není platná.', + 'error_server_type_invalid' => 'Zvolený typ serveru není platný', + 'error_server_warning_threshold_invalid' => 'Hranice varování musí být číslo větší než 0.', + ), + 'config' => array( + 'general' => 'Obecné', + 'language' => 'Jazyk', + 'show_update' => 'Kontrolovat aktualizace?', + 'password_encrypt_key' => 'Šifrovací klíč pro hesla', + 'password_encrypt_key_note' => 'Tímto klíčem se šifrují hesla, která se ukládají u serverů pro + přístup na webové stránky. Pokud klíč změníte budou uložená hesla + neplatná!', + 'email_status' => 'Povolit odesílání e-mailu', + 'email_from_email' => 'E-mailová adresa odesilatele', + 'email_from_name' => 'Jméno odesilatele', + 'email_smtp' => 'Zapnout SMTP', + 'email_smtp_host' => 'SMTP adresa', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP zabezpečení', + 'email_smtp_security_none' => 'žádné', + 'email_smtp_username' => 'SMTP uživatelské jméno', + 'email_smtp_password' => 'SMTP heslo', + 'email_smtp_noauth' => 'Ponechte prázdné pro použití SMTP bez hesla', + 'sms_status' => 'Povolit odesílání textových zpráv', + 'sms_gateway' => 'Brána použitá pro odesílání zpráv', + 'sms_gateway_username' => 'Uživatelské jméno brány', + 'sms_gateway_password' => 'Heslo brány', + 'sms_from' => 'Telefonní číslo odesilatele', + 'pushover_status' => 'Povolit zasílání Pushover zpráv', + 'pushover_description' => 'Pushover je služba umožňující jednoduše zasílat real-time upozornění. + Více na webu Pushover', + 'pushover_clone_app' => 'Klikněte pro vytvoření Pushover aplikace', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Pře použitím Pushoveru se musíte registrovat a získat API Token.', + 'alert_type' => 'Zvolte kdy si přejete být upozorněni.', + 'alert_type_description' => 'Změna stavu: Obdržíte upozornění při změně stavu, tedy:online -> + offline nebo offline -> online.

    Offline: Obdržíte upozornění, + kdy server přejde poprvé do offline stavu. Například, pokud je cron nastaven + na 15 minut a sledovaný server bude offline mezi 01:00 a 06:00. Obdržíte + upozornění pouze v 01:00.

    Vždy: Obdržíte upozornění při + každém spuštění kontroly, tedy i pokud bude server offline několik hodin.', + 'alert_type_status' => 'Změna stavu', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Vždy', + 'log_status' => 'Log', + 'log_status_description' => 'Pokud je Log nastaven na hodnotu TRUE, systém do něj zapíše veškerá + provedená upozornění.', + 'log_email' => 'Logovat odeslané e-maily', + 'log_sms' => 'Logovat odeslané textové zprávy', + 'log_pushover' => 'Logovat odeslané Pushover zprávy', + 'updated' => 'Nastavení bylo aktualizováno.', + 'tab_email' => 'E-mail', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Nastavení e-mailů', + 'settings_sms' => 'Nastavení textových zpráv', + 'settings_pushover' => 'Nastavení Pushover', + 'settings_notification' => 'Nastavení upozornění', + 'settings_log' => 'Nastavení logu', + 'auto_refresh' => 'Automaticky obnovit', + 'auto_refresh_description' => 'Automaticky obnovit stránku Servery.
    Čas v sekundách, + 0 pro vypnutí automatického obnovení.', + 'seconds' => 'sekund', + 'test' => 'Test', + 'test_email' => 'E-mail bude odeslán na adresu uvedenou v uživatelském profilu.', + 'test_sms' => 'SMS bude odeslána na telefonní číslo uvedené v uživatelském profilu.', + 'test_pushover' => 'Pushover upozornění bude odesláno uživateli/zařízení dle nastavení v + uživatelském profilu.', + 'send' => 'Odeslat', + 'test_subject' => 'Test', + 'test_message' => 'Testovací zpráva', + 'email_sent' => 'E-mail odeslán', + 'email_error' => 'Chyba při odeslání e-mailu', + 'sms_sent' => 'SMS odeslána', + 'sms_error' => 'Chyba při odeslání SMS. %s', + 'sms_error_nomobile' => 'Nebylo možné odeslat SMS: v uživatelském profilu nebylo nalezeno platné + telefonní číslo.', + 'pushover_sent' => 'Pushover upozornění odesláno.', + 'pushover_error' => 'Nastala chyba při odesílání Pushover upozornění: %s', + 'pushover_error_noapp' => 'Nebylo možné odeslat testovací upozornění: v globálním nastavení nebyl + nalezen žádný API token.', + 'pushover_error_nokey' => 'Nebylo možné odeslat testovací upozornění: ve vašem profilu není definován + Pushover key.', + 'log_retention_period' => 'Rotace logu', + 'log_retention_period_description' => 'Počet dnů po které budou zachovány logy upozornění. Vložte 0 pro + vypnutí autorotace.', + 'log_retention_days' => 'dnů', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%', + 'off_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je offline', + 'off_email_body' => 'Nebylo možné spojit se se serverem:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Chyba: %ERROR%
    Datum: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' je offline', + 'off_pushover_message' => 'Nebylo možné spojit se se serverem:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Chyba: %ERROR%
    Datum: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'DŮLEŽITÉ: Server \'%LABEL%\' je online', + 'on_email_body' => 'Server \'%LABEL%\' je opět online, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: + %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' je online', + 'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Datum: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Vítejte, %user_name%', + 'title_sign_in' => 'Prosím přihlašte se', + 'title_forgot' => 'Zapomenuté heslo?', + 'title_reset' => 'Obnova hesla', + 'submit' => 'Odeslat', + 'remember_me' => 'Zapamatovat údaje', + 'login' => 'Přihlásit', + 'logout' => 'Odhlásit', + 'username' => 'Uživatelské jméno', + 'password' => 'Heslo', + 'password_repeat' => 'Opište heslo', + 'password_forgot' => 'Zapomenuté heslo?', + 'password_reset' => 'Obnovit heslo', + 'password_reset_email_subject' => 'Obnovit heslo pro PHP Server Monitor', + 'password_reset_email_body' => 'Použijte následující odkaz pro obnovení hesla. Odkaz je platný jednu + hodinu.

    %link%', + 'error_user_incorrect' => 'Zadané uživatelské jméno nebylo nalezeno.', + 'error_login_incorrect' => 'Přihlášení nebylo úspěšné.', + 'error_login_passwords_nomatch' => 'Zadaná hesla neodpovídají.', + 'error_reset_invalid_link' => 'Odkaz je neplatný.', + 'success_password_forgot' => 'Na vaši e-mailovou adresu byl zaslán e-mail s informacemi pro obnovu hesla.', + 'success_password_reset' => 'Vaše heslo bylo úspěšně obnoveno. Prosím přihlašte se.', + ), + 'error' => array( + '401_unauthorized' => 'Nedostatečné oprávnění', + '401_unauthorized_description' => 'Nemáte oprávnění zobrazit tuto stránku.', + ), ); diff --git a/src/lang/da_DK.lang.php b/src/lang/da_DK.lang.php index 41749988..662d1620 100644 --- a/src/lang/da_DK.lang.php +++ b/src/lang/da_DK.lang.php @@ -1,4 +1,5 @@ 'Dansk - Danish', - 'locale' => array('da_DK.UTF-8', 'da_DK', 'danish', 'danish-dk'), - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installér', - 'action' => 'Action', - 'save' => 'Gem', - 'edit' => 'Redigér', - 'delete' => 'Slet', - 'date' => 'Dato', - 'message' => 'Besked', - 'yes' => 'Ja', - 'no' => 'Nej', - 'insert' => 'Indsæt', - 'add_new' => 'Tilføj ny', - 'update_available' => 'En ny version ({version}) er tilgængelig på http://www.phpservermonitor.org.', - 'back_to_top' => 'Til toppen', - 'go_back' => 'Tilbage', - 'ok' => 'OK', - 'cancel' => 'Annullér', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Igår %k:%M', - 'other_day_format' => '%A %k:%M', - 'never' => 'Aldrig', - 'hours_ago' => '%d timer siden', - 'an_hour_ago' => 'omkring en time siden', - 'minutes_ago' => '%d minutter siden', - 'a_minute_ago' => 'omkring et minut siden', - 'seconds_ago' => '%d sekunder siden', - 'a_second_ago' => 'et sekund siden', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Indstillinger', - 'server' => 'Servere', - 'server_log' => 'Log', - 'server_status' => 'Status', - 'server_update' => 'Opdatér', - 'user' => 'Brugere', - 'help' => 'Hjælp', - ), - 'users' => array( - 'user' => 'Bruger', - 'name' => 'Navn', - 'user_name' => 'Brugernavn', - 'password' => 'Adgangskode', - 'password_repeat' => 'Adgangskode igen', - 'password_leave_blank' => 'Udfyldes hvis du vil skifte adgangskode', - 'level' => 'Niveau', - 'level_10' => 'Administrator', - 'level_20' => 'Bruger', - 'level_description' => 'Administratorer har fuld adgang: De kan styre servere, brugere og indstillinger.
    Brugere kan kun se og opdatere servere som er de har adgang til.', - 'mobile' => 'Mobil', - 'email' => 'E-mail', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover er en service der gør det let at modtage real-time notifikationer. Se deres website for mere information.', - 'pushover_key' => 'Pushover nøgle', - 'pushover_device' => 'Pushover enhed', - 'pushover_device_description' => 'Navnet på enheden som beskeden skal sendes til. Lad denne være tom hvis alle skal modtage beskeden.', - 'delete_title' => 'Slet bruger', - 'delete_message' => 'Er du sikker på du vil slette bruger \'%1\'?', - 'deleted' => 'Bruger slettet.', - 'updated' => 'Bruger opdateret.', - 'inserted' => 'Bruger tilføjet.', - 'profile' => 'Profil', - 'profile_updated' => 'Din profil er opdateret.', - 'error_user_name_bad_length' => 'Brugernavn skal være mellem 2 til 64 tegn.', - 'error_user_name_invalid' => 'Brugernavn må kun indholde alfabetiske tegn (a-z, A-Z), tal (0-9), prikker (.) og (_).', - 'error_user_name_exists' => 'Det valgte brugernavn findes allerede.', - 'error_user_email_bad_length' => 'E-mail addresser skal være mellem 5 til 255 tegn.', - 'error_user_email_invalid' => 'Den valgte e-mail er ugyldig.', - 'error_user_level_invalid' => 'Det angivet bruger niveau er ugyldig.', - 'error_user_no_match' => 'Brugeren findes ikke.', - 'error_user_password_invalid' => 'Den indtastede adgangskode er ugyldig.', - 'error_user_password_no_match' => 'De to adgangskode er ikke ens.', - ), - 'log' => array( - 'title' => 'Logposter', - 'type' => 'Type', - 'status' => 'Status', - 'email' => 'E-mail', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Intet i loggen', - 'clear' => 'Ryd log', - 'delete_title' => 'Slet log', - 'delete_message' => 'Er du sikker på, at du vil slette alle logfiler?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Label', - 'domain' => 'Domæne/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Antal sekunder som serveren har til at svare.', - 'port' => 'Port', - 'type' => 'Type', - 'type_website' => 'Hjemmeside', - 'type_service' => 'Tjeneste', - 'pattern' => 'Søgestreng/mønster', - 'pattern_description' => 'Hvis dette mønster ikke findes på hjemmesiden, vil serveren blive markeret som værende offline. Regulære udtryk er tilladt.', - 'last_check' => 'Sidst kontrolleret', - 'last_online' => 'Sidst online', - 'last_offline' => 'Sidst offline', - 'monitoring' => 'Overvågning', - 'no_monitoring' => 'Ingen overvågning', - 'email' => 'E-mail', - 'send_email' => 'Send E-mail', - 'sms' => 'SMS', - 'send_sms' => 'Send SMS', - 'pushover' => 'Pushover', - 'users' => 'Users', - 'delete_title' => 'Slet server', - 'delete_message' => 'Er du sikker på du vil slette server \'%1\'?', - 'deleted' => 'Server slettet.', - 'updated' => 'Server opdateret.', - 'inserted' => 'Server tilføjet.', - 'latency' => 'Forsinkelse', - 'latency_max' => 'Forsinkelse (maksimum)', - 'latency_min' => 'Forsinkelse (minimum)', - 'latency_avg' => 'Forsinkelse (gennemsnitlig)', - 'uptime' => 'Oppetid', - 'year' => 'År', - 'month' => 'Måned', - 'week' => 'Uge', - 'day' => 'Dag', - 'hour' => 'Time', - 'warning_threshold' => 'Advarsel grænse', - 'warning_threshold_description' => 'Antallet af fejl, før status skifter til offline.', - 'chart_last_week' => 'Sidste uge', - 'chart_history' => 'Historie', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d-%m-%Y', - 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS notifikationer er deaktiveret.', - 'warning_notifications_disabled_email' => 'E-mail notifikationer er deaktiveret.', - 'warning_notifications_disabled_pushover' => 'Pushover notifikationer er deaktiveret.', - 'error_server_no_match' => 'Server ikke fundet.', - 'error_server_label_bad_length' => 'Label skal være mellem et og 255 karakterer.', - 'error_server_ip_bad_length' => 'Domænet/IP skal være mellem et og 255 karakterer.', - 'error_server_ip_bad_service' => 'IP adressen er ikke gyldig.', - 'error_server_ip_bad_website' => 'Websitets URL er ikke gyldigt.', - 'error_server_type_invalid' => 'Den valgte servertype er ikke gyldig.', - 'error_server_warning_threshold_invalid' => 'Advarsels-tærskel skal være et gyldigt tal større end 0.', - ), - 'config' => array( - 'general' => 'Generelt', - 'language' => 'Sprog', - 'show_update' => 'Opdateringer', - 'email_status' => 'Tillad at sende e-mail', - 'email_from_email' => 'E-mail fra adresse', - 'email_from_name' => 'E-mail fra navn', - 'email_smtp' => 'Aktiver SMTP', - 'email_smtp_host' => 'SMTP vært', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP c', - 'email_smtp_security_none' => 'Ingen', - 'email_smtp_username' => 'SMTP brugernavn', - 'email_smtp_password' => 'SMTP adgangskode', - 'email_smtp_noauth' => 'Efterlad blank hvis det ikke er krævet', - 'sms_status' => 'Tillad at sende SMS beskeder', - 'sms_gateway' => 'SMS Gateway', - 'sms_gateway_username' => 'Gateway brugernavn/apikey', - 'sms_gateway_password' => 'Gateway adgangskode', - 'sms_from' => 'Afsenderens navn.', - 'pushover_status' => 'Tillad at sende Pushover beskeder', - 'pushover_description' => 'Pushover er en service det gør det nemt at modtage real-time notifikationer. Se deres website for yderligere information.', - 'pushover_clone_app' => 'Klik her for at oprette din Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Før du kan benytte Pushover, skal du registrere en app på deres website og indtaste en App API Token her.', - 'alert_type' => 'Vælg hvornår du vil modtage beskeden', - 'alert_type_description' => 'Status ændring: '. - 'Du vil modtage en notifkation når en server har en ændring i status. Fra online -> offline eller offline -> online.
    '. - '
    Offline: '. - 'Du vil modtage en meddelelse, når en server går offline for første gang. Eksempelvis '. - 'hvis dit cronjob kører hvert kvarter, og din server går ned kl 01 og kommer først op kl 06, '. - ' vil du kun modtage en mail kl 01.
    '. - '
    Altid: '. - 'Du vil modtage en besked, hver gang scriptet kører og et websted er nede, selvom site har været offline i flere timer.', - 'alert_type_status' => 'Status ændret', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Altid', - 'log_status' => 'Log status', - 'log_status_description' => 'Hvis log status er sat til TRUE, vil monitoren logge hændelsen hver gang status ændre sig.', - 'log_email' => 'Log e-mails sendt af systemet', - 'log_sms' => 'Log SMS sendt af systemet', - 'log_pushover' => 'Log pushover messages sent by the script', - 'updated' => 'Indstillingerne er blevet opdateret.', - 'tab_email' => 'E-mail', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'E-mail indstillinger', - 'settings_sms' => 'SMS indstillinger', - 'settings_pushover' => 'Pushover settings', - 'settings_notification' => 'Meddelelse indstillinger', - 'settings_log' => 'Log indstillinger', - 'auto_refresh' => 'Genopfrisk automatisk', - 'auto_refresh_description' => - 'Genopfrisk automatisk serversider.
    '. - ''. - 'Tid i sekunder. Hvis 0 vil siden ikke genopfriske automatisk'. - '', - 'seconds' => 'sekunder', - 'test' => 'Test', - 'test_email' => 'En e-mail vil blive sendt til den adresse, der er angivet i din brugerprofil.', - 'test_sms' => 'En SMS vil blive sendt til det nummer, der er angivet i din brugerprofil.', - 'test_pushover' => 'En Pushover notifikation vil blive sendt til brugerens enhed, specificeret i brugerprofilen.', - 'send' => 'Send', - 'test_subject' => 'Test', - 'test_message' => 'Test besked', - 'email_sent' => 'E-mail sendt', - 'email_error' => 'Fejl ved afsendelse af e-mail', - 'sms_sent' => 'Sms sendt', - 'sms_error' => 'Fejl ved afsendelse af SMS. %s', - 'sms_error_nomobile' => 'Ikke muligt at sende SMS: Intet gyldigt telefonnummer blev fundet i din profil.', - 'pushover_sent' => 'Pushover notifikation blev sendt', - 'pushover_error' => 'En fejl opstod under afsendelse af Pushover notifikation: %s', - 'pushover_error_noapp' => 'Ikke muligt at sende test notifikation: Intet Pushover App API token fundet i den globale konfiguration.', - 'pushover_error_nokey' => 'Ikke muligt at sende test notifikation: Ingen Pushover key fundet i din profil.', - 'log_retention_period' => 'Logs gemmes', - 'log_retention_period_description' => 'Antal dage over hvor længe logs med notifikationer og arkiverede serveres oppetid skal gemmes. Indtast 0 for at deaktivere logoprydning.', - 'log_retention_days' => 'dage', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Fejl=%ERROR%', - 'off_email_subject' => 'VIGTIGT: Server \'%LABEL%\' er NEDE', - 'off_email_body' => "Det lykkedes ikke at oprette forbindelse til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fejl: %ERROR%
    Dato: %DATE%", - 'off_pushover_title' => 'Serveren \'%LABEL%\' er NEDE', - 'off_pushover_message' => "Det lykkedes ikke at oprette forbindelse til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fejl: %ERROR%
    Dato: %DATE%", - 'on_sms' => 'Serveren \'%LABEL%\' KØRER: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'VIGTIGT: Serveren \'%LABEL%\' KØRER', - 'on_email_body' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%", - 'on_pushover_title' => 'Serveren \'%LABEL%\' KØRER', - 'on_pushover_message' => "Serveren '%LABEL%' kører igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => 'Velkommen, %user_name%', - 'title_sign_in' => 'Log ind', - 'title_forgot' => 'Glemt adgangskode?', - 'title_reset' => 'Nulstil din adgangskode', - 'submit' => 'Indsend', - 'remember_me' => 'Husk kode', - 'login' => 'Log ind', - 'logout' => 'Log ud', - 'username' => 'Brugernavn', - 'password' => 'Adgangskode', - 'password_repeat' => 'Skriv adgangskode igen', - 'password_forgot' => 'Glemt adgangskode?', - 'password_reset' => 'Nulstil adgangskode', - 'password_reset_email_subject' => 'Nulstil din adgangskode for PHP Server Monitor', - 'password_reset_email_body' => 'Brug venligst følgende link for at nulstille din adgangskode. Bemærk at linkets gyldighed udløber efter en time.

    %link%', - 'error_user_incorrect' => 'Det angivet brugernavn kunne ikke findes.', - 'error_login_incorrect' => 'Oplysningerne stemmer ikke overens.', - 'error_login_passwords_nomatch' => 'De angivne adgangskoder er ikke ens.', - 'error_reset_invalid_link' => 'Følgende link er ugyldigt.', - 'success_password_forgot' => 'En e-mail er blevet sendt til dig med oplysninger om, hvordan du nulstiller din adgangskode.', - 'success_password_reset' => 'Din adgangskode er blevet nulstillet. Log venligst ind igen.', - ), - 'error' => array( - '401_unauthorized' => 'Uautoriseret', - '401_unauthorized_description' => 'Du har ikke rettigheder til at se denne side.', - ), + 'name' => 'Dansk - Danish', + 'locale' => array( + '0' => 'da_DK.UTF-8', + '1' => 'da_DK', + '2' => 'danish', + '3' => 'danish-dk', + ), + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installér', + 'action' => 'Action', + 'save' => 'Gem', + 'edit' => 'Redigér', + 'delete' => 'Slet', + 'date' => 'Dato', + 'message' => 'Besked', + 'yes' => 'Ja', + 'no' => 'Nej', + 'insert' => 'Indsæt', + 'add_new' => 'Tilføj ny', + 'update_available' => 'En ny version ({version}) er tilgængelig på http://www.phpservermonitor.org.', + 'back_to_top' => 'Til toppen', + 'go_back' => 'Tilbage', + 'ok' => 'OK', + 'cancel' => 'Annullér', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Igår %k:%M', + 'other_day_format' => '%A %k:%M', + 'never' => 'Aldrig', + 'hours_ago' => '%d timer siden', + 'an_hour_ago' => 'omkring en time siden', + 'minutes_ago' => '%d minutter siden', + 'a_minute_ago' => 'omkring et minut siden', + 'seconds_ago' => '%d sekunder siden', + 'a_second_ago' => 'et sekund siden', + ), + 'menu' => array( + 'config' => 'Indstillinger', + 'server' => 'Servere', + 'server_log' => 'Log', + 'server_status' => 'Status', + 'server_update' => 'Opdatér', + 'user' => 'Brugere', + 'help' => 'Hjælp', + ), + 'users' => array( + 'user' => 'Bruger', + 'name' => 'Navn', + 'user_name' => 'Brugernavn', + 'password' => 'Adgangskode', + 'password_repeat' => 'Adgangskode igen', + 'password_leave_blank' => 'Udfyldes hvis du vil skifte adgangskode', + 'level' => 'Niveau', + 'level_10' => 'Administrator', + 'level_20' => 'Bruger', + 'level_description' => 'Administratorer har fuld adgang: De kan styre servere, brugere og + indstillinger.
    Brugere kan kun se og opdatere servere som er de har adgang + til.', + 'mobile' => 'Mobil', + 'email' => 'E-mail', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover er en service der gør det let at modtage real-time notifikationer. Se deres website for mere + information.', + 'pushover_key' => 'Pushover nøgle', + 'pushover_device' => 'Pushover enhed', + 'pushover_device_description' => 'Navnet på enheden som beskeden skal sendes til. Lad denne være tom hvis + alle skal modtage beskeden.', + 'delete_title' => 'Slet bruger', + 'delete_message' => 'Er du sikker på du vil slette bruger \'%1\'?', + 'deleted' => 'Bruger slettet.', + 'updated' => 'Bruger opdateret.', + 'inserted' => 'Bruger tilføjet.', + 'profile' => 'Profil', + 'profile_updated' => 'Din profil er opdateret.', + 'error_user_name_bad_length' => 'Brugernavn skal være mellem 2 til 64 tegn.', + 'error_user_name_invalid' => 'Brugernavn må kun indholde alfabetiske tegn (a-z, A-Z), tal (0-9), prikker (.) + og (_).', + 'error_user_name_exists' => 'Det valgte brugernavn findes allerede.', + 'error_user_email_bad_length' => 'E-mail addresser skal være mellem 5 til 255 tegn.', + 'error_user_email_invalid' => 'Den valgte e-mail er ugyldig.', + 'error_user_level_invalid' => 'Det angivet bruger niveau er ugyldig.', + 'error_user_no_match' => 'Brugeren findes ikke.', + 'error_user_password_invalid' => 'Den indtastede adgangskode er ugyldig.', + 'error_user_password_no_match' => 'De to adgangskode er ikke ens.', + ), + 'log' => array( + 'title' => 'Logposter', + 'type' => 'Type', + 'status' => 'Status', + 'email' => 'E-mail', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Intet i loggen', + 'clear' => 'Ryd log', + 'delete_title' => 'Slet log', + 'delete_message' => 'Er du sikker på, at du vil slette alle logfiler?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Label', + 'domain' => 'Domæne/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Antal sekunder som serveren har til at svare.', + 'port' => 'Port', + 'type' => 'Type', + 'type_website' => 'Hjemmeside', + 'type_service' => 'Tjeneste', + 'pattern' => 'Søgestreng/mønster', + 'pattern_description' => 'Hvis dette mønster ikke findes på hjemmesiden, vil serveren blive markeret som + værende offline. Regulære udtryk er tilladt.', + 'last_check' => 'Sidst kontrolleret', + 'last_online' => 'Sidst online', + 'last_offline' => 'Sidst offline', + 'monitoring' => 'Overvågning', + 'no_monitoring' => 'Ingen overvågning', + 'email' => 'E-mail', + 'send_email' => 'Send E-mail', + 'sms' => 'SMS', + 'send_sms' => 'Send SMS', + 'pushover' => 'Pushover', + 'users' => 'Users', + 'delete_title' => 'Slet server', + 'delete_message' => 'Er du sikker på du vil slette server \'%1\'?', + 'deleted' => 'Server slettet.', + 'updated' => 'Server opdateret.', + 'inserted' => 'Server tilføjet.', + 'latency' => 'Forsinkelse', + 'latency_max' => 'Forsinkelse (maksimum)', + 'latency_min' => 'Forsinkelse (minimum)', + 'latency_avg' => 'Forsinkelse (gennemsnitlig)', + 'uptime' => 'Oppetid', + 'year' => 'År', + 'month' => 'Måned', + 'week' => 'Uge', + 'day' => 'Dag', + 'hour' => 'Time', + 'warning_threshold' => 'Advarsel grænse', + 'warning_threshold_description' => 'Antallet af fejl, før status skifter til offline.', + 'chart_last_week' => 'Sidste uge', + 'chart_history' => 'Historie', + 'chart_day_format' => '%d-%m-%Y', + 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS notifikationer er deaktiveret.', + 'warning_notifications_disabled_email' => 'E-mail notifikationer er deaktiveret.', + 'warning_notifications_disabled_pushover' => 'Pushover notifikationer er deaktiveret.', + 'error_server_no_match' => 'Server ikke fundet.', + 'error_server_label_bad_length' => 'Label skal være mellem et og 255 karakterer.', + 'error_server_ip_bad_length' => 'Domænet/IP skal være mellem et og 255 karakterer.', + 'error_server_ip_bad_service' => 'IP adressen er ikke gyldig.', + 'error_server_ip_bad_website' => 'Websitets URL er ikke gyldigt.', + 'error_server_type_invalid' => 'Den valgte servertype er ikke gyldig.', + 'error_server_warning_threshold_invalid' => 'Advarsels-tærskel skal være et gyldigt tal større end 0.', + ), + 'config' => array( + 'general' => 'Generelt', + 'language' => 'Sprog', + 'show_update' => 'Opdateringer', + 'email_status' => 'Tillad at sende e-mail', + 'email_from_email' => 'E-mail fra adresse', + 'email_from_name' => 'E-mail fra navn', + 'email_smtp' => 'Aktiver SMTP', + 'email_smtp_host' => 'SMTP vært', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP c', + 'email_smtp_security_none' => 'Ingen', + 'email_smtp_username' => 'SMTP brugernavn', + 'email_smtp_password' => 'SMTP adgangskode', + 'email_smtp_noauth' => 'Efterlad blank hvis det ikke er krævet', + 'sms_status' => 'Tillad at sende SMS beskeder', + 'sms_gateway' => 'SMS Gateway', + 'sms_gateway_username' => 'Gateway brugernavn/apikey', + 'sms_gateway_password' => 'Gateway adgangskode', + 'sms_from' => 'Afsenderens navn.', + 'pushover_status' => 'Tillad at sende Pushover beskeder', + 'pushover_description' => 'Pushover er en service det gør det nemt at modtage real-time notifikationer. Se deres website for yderligere + information.', + 'pushover_clone_app' => 'Klik her for at oprette din Pushover app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Før du kan benytte Pushover, skal du registrere en app på deres website og indtaste en App + API Token her.', + 'alert_type' => 'Vælg hvornår du vil modtage beskeden', + 'alert_type_description' => 'Status ændring: Du vil modtage en notifkation når en server har en + ændring i status. Fra online -> offline eller offline -> online.

    Offline: Du vil modtage en meddelelse, når en server går offline for + første gang. Eksempelvis hvis dit cronjob kører hvert kvarter, og din server + går ned kl 01 og kommer først op kl 06, vil du kun modtage en mail kl + 01.

    Altid: Du vil modtage en besked, hver gang scriptet kører og + et websted er nede, selvom site har været offline i flere timer.', + 'alert_type_status' => 'Status ændret', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Altid', + 'log_status' => 'Log status', + 'log_status_description' => 'Hvis log status er sat til TRUE, vil monitoren logge hændelsen hver gang status + ændre sig.', + 'log_email' => 'Log e-mails sendt af systemet', + 'log_sms' => 'Log SMS sendt af systemet', + 'log_pushover' => 'Log pushover messages sent by the script', + 'updated' => 'Indstillingerne er blevet opdateret.', + 'tab_email' => 'E-mail', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'E-mail indstillinger', + 'settings_sms' => 'SMS indstillinger', + 'settings_pushover' => 'Pushover settings', + 'settings_notification' => 'Meddelelse indstillinger', + 'settings_log' => 'Log indstillinger', + 'auto_refresh' => 'Genopfrisk automatisk', + 'auto_refresh_description' => 'Genopfrisk automatisk serversider.
    Tid i sekunder. Hvis + 0 vil siden ikke genopfriske automatisk', + 'seconds' => 'sekunder', + 'test' => 'Test', + 'test_email' => 'En e-mail vil blive sendt til den adresse, der er angivet i din brugerprofil.', + 'test_sms' => 'En SMS vil blive sendt til det nummer, der er angivet i din brugerprofil.', + 'test_pushover' => 'En Pushover notifikation vil blive sendt til brugerens enhed, specificeret i + brugerprofilen.', + 'send' => 'Send', + 'test_subject' => 'Test', + 'test_message' => 'Test besked', + 'email_sent' => 'E-mail sendt', + 'email_error' => 'Fejl ved afsendelse af e-mail', + 'sms_sent' => 'Sms sendt', + 'sms_error' => 'Fejl ved afsendelse af SMS. %s', + 'sms_error_nomobile' => 'Ikke muligt at sende SMS: Intet gyldigt telefonnummer blev fundet i din profil.', + 'pushover_sent' => 'Pushover notifikation blev sendt', + 'pushover_error' => 'En fejl opstod under afsendelse af Pushover notifikation: %s', + 'pushover_error_noapp' => 'Ikke muligt at sende test notifikation: Intet Pushover App API token fundet i den + globale konfiguration.', + 'pushover_error_nokey' => 'Ikke muligt at sende test notifikation: Ingen Pushover key fundet i din profil.', + 'log_retention_period' => 'Logs gemmes', + 'log_retention_period_description' => 'Antal dage over hvor længe logs med notifikationer og arkiverede + serveres oppetid skal gemmes. Indtast 0 for at deaktivere logoprydning.', + 'log_retention_days' => 'dage', + ), + 'notifications' => array( + 'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Fejl=%ERROR%', + 'off_email_subject' => 'VIGTIGT: Server \'%LABEL%\' er NEDE', + 'off_email_body' => 'Det lykkedes ikke at oprette forbindelse til følgende server:

    Server: + %LABEL%
    IP: %IP%
    Port: %PORT%
    Fejl: %ERROR%
    Dato: %DATE%', + 'off_pushover_title' => 'Serveren \'%LABEL%\' er NEDE', + 'off_pushover_message' => 'Det lykkedes ikke at oprette forbindelse til følgende server:

    Server: + %LABEL%
    IP: %IP%
    Port: %PORT%
    Fejl: %ERROR%
    Dato: %DATE%', + 'on_sms' => 'Serveren \'%LABEL%\' KØRER: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'VIGTIGT: Serveren \'%LABEL%\' KØRER', + 'on_email_body' => 'Serveren \'%LABEL%\' kører igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: + %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%', + 'on_pushover_title' => 'Serveren \'%LABEL%\' KØRER', + 'on_pushover_message' => 'Serveren \'%LABEL%\' kører igen, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: + %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Velkommen, %user_name%', + 'title_sign_in' => 'Log ind', + 'title_forgot' => 'Glemt adgangskode?', + 'title_reset' => 'Nulstil din adgangskode', + 'submit' => 'Indsend', + 'remember_me' => 'Husk kode', + 'login' => 'Log ind', + 'logout' => 'Log ud', + 'username' => 'Brugernavn', + 'password' => 'Adgangskode', + 'password_repeat' => 'Skriv adgangskode igen', + 'password_forgot' => 'Glemt adgangskode?', + 'password_reset' => 'Nulstil adgangskode', + 'password_reset_email_subject' => 'Nulstil din adgangskode for PHP Server Monitor', + 'password_reset_email_body' => 'Brug venligst følgende link for at nulstille din adgangskode. Bemærk at + linkets gyldighed udløber efter en time.

    %link%', + 'error_user_incorrect' => 'Det angivet brugernavn kunne ikke findes.', + 'error_login_incorrect' => 'Oplysningerne stemmer ikke overens.', + 'error_login_passwords_nomatch' => 'De angivne adgangskoder er ikke ens.', + 'error_reset_invalid_link' => 'Følgende link er ugyldigt.', + 'success_password_forgot' => 'En e-mail er blevet sendt til dig med oplysninger om, hvordan du nulstiller din + adgangskode.', + 'success_password_reset' => 'Din adgangskode er blevet nulstillet. Log venligst ind igen.', + ), + 'error' => array( + '401_unauthorized' => 'Uautoriseret', + '401_unauthorized_description' => 'Du har ikke rettigheder til at se denne side.', + ), ); diff --git a/src/lang/de_DE.lang.php b/src/lang/de_DE.lang.php index 69d1a5b6..ea8b4074 100644 --- a/src/lang/de_DE.lang.php +++ b/src/lang/de_DE.lang.php @@ -1,4 +1,5 @@ 'Deutsch - German', - 'locale' => array('de_DE.UTF-8', 'de_DE', 'german'), - 'locale_tag' => 'de', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installation', - 'action' => 'Aktion', - 'save' => 'Speichern', - 'edit' => 'Bearbeiten', - 'delete' => 'Löschen', - 'date' => 'Datum', - 'message' => 'Meldung', - 'yes' => 'Ja', - 'no' => 'Nein', - 'insert' => 'Einfügen', - 'add_new' => 'Neuen Eintrag erstellen', - 'update_available' => 'Eine Aktualisierung ({version}) ist verfügbar unter http://www.phpservermonitor.org.', - 'back_to_top' => 'nach oben', - 'go_back' => 'Zurück', - 'ok' => 'OK', - 'cancel' => 'Abbrechen', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Gestern um %k:%M Uhr', - 'other_day_format' => '%A um %k:%M Uhr', - 'never' => 'Never', - 'hours_ago' => 'vor %d Stunden', - 'an_hour_ago' => 'vor über einer Stunde', - 'minutes_ago' => 'vor %d Minuten', - 'a_minute_ago' => 'vor über einer Minute', - 'seconds_ago' => 'vor %d Sekunden', - 'a_second_ago' => 'vor über einer Sekunde', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Einstellungen', - 'server' => 'Server', - 'server_log' => 'Protokoll', - 'server_status' => 'Status', - 'server_update' => 'Update', - 'user' => 'Benutzer', - 'help' => 'Hilfe', - ), - 'users' => array( - 'user' => 'Benutzer', - 'name' => 'Name', - 'user_name' => 'Benutzername', - 'password' => 'Passwort', - 'password_repeat' => 'Passwort wiederholen', - 'password_leave_blank' => 'Passwort ändern...', - 'level' => 'Berechtigungsstufe', - 'level_10' => 'Administrator', - 'level_20' => 'Benutzer', - 'level_description' => 'Administratoren haben vollen Zugriff — sie können Webseiten, Benutzer und globale Einstellungen verwalten.
    Benutzer können nur (für ihnen zugeordnete Webseiten) Analysedaten einsehen und deren Aktualisierung veranlassen.', - 'mobile' => 'Mobil', - 'email' => 'E-Mail', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover ist ein Dienst, der es stark vereinfacht, Statusbenachrichtigungen in Echtzeit zu erhalten. Besuchen Sie pushover.net für weitere Informationen.', - 'pushover_key' => 'Pushover Key/Schlüssel', - 'pushover_device' => 'Pushover Gerät', - 'pushover_device_description' => 'Name des Gerätes, an das die Nachricht gesendet werden soll. Leer lassen, um die Nachricht an alle registrierten Geräte zu senden.', - 'delete_title' => 'Benutzer löschen', - 'delete_message' => 'Sind Sie sicher, dass Sie den Benutzer \'%1\' löschen wollen?', - 'deleted' => 'Benutzer gelöscht.', - 'updated' => 'Benutzer bearbeitet.', - 'inserted' => 'Benutzer hinzugefügt.', - 'profile' => 'Profileinstellungen', - 'profile_updated' => 'Ihr Profil wurde aktualisiert.', - 'error_user_name_bad_length' => 'Benutzernamen müssen zwischen 2 und 64 Zeichen lang sein.', - 'error_user_name_invalid' => 'Der Benutzername darf nur alphanumerische Zeichen (a-z, A-Z), Zahlen (0-9), Punkte (.) und Unterstriche (_) enthalten.', - 'error_user_name_exists' => 'Der gewählte Benutzername existiert bereits in der Datenbank.', - 'error_user_email_bad_length' => 'E-Mail-Adressen müssen zwischen 5 und 255 Zeichen lang sein.', - 'error_user_email_invalid' => 'Die E-Mail-Adresse ist ungültig.', - 'error_user_level_invalid' => 'Die gewählte Berechtigungsstufe ist ungültig.', - 'error_user_no_match' => 'Der Benutzer konnte in der Datenbank nicht gefunden werden.', - 'error_user_password_invalid' => 'Das eingegebene Passwort ist nicht korrekt.', - 'error_user_password_no_match' => 'Die eingegebenen Passwörter stimmen nicht überein.', - ), - 'log' => array( - 'title' => 'Protokoll', - 'type' => 'Typ', - 'status' => 'Status', - 'email' => 'E-Mail', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Keine Logs vorhanden.', - 'clear' => 'Protokoll Logs', - 'delete_title' => 'Protokoll Logs', - 'delete_message' => 'Bist du sicher, dass du alle logs löschen möchtest?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Beschriftung', - 'domain' => 'Domain/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Anzahl der Sekunden, die auf eine Antwort des Servers gewartet werden soll.', - 'port' => 'Port', - 'type' => 'Typ', - 'type_website' => 'Webseite', - 'type_service' => 'Service', - 'type_ping' => 'Ping', - 'pattern' => 'Suchstring/-muster', - 'pattern_description' => 'Wenn das gesuchte Muster nicht in der Webseite ist, wird die Seite als offline markiert. Reguläre Ausdrücke sind erlaubt.', - 'last_check' => 'Letzter Check', - 'last_online' => 'Zuletzt online', - 'last_offline' => 'Zuletzt offline', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'Monitoring inaktiv', - 'email' => 'E-Mail', - 'send_email' => 'E-Mail versenden', - 'sms' => 'SMS', - 'send_sms' => 'SMS versenden', - 'pushover' => 'Pushover', - 'users' => 'Benutzer', - 'delete_title' => 'Server löschen', - 'delete_message' => 'Sind Sie sicher, dass Sie den Server \'%1\' löschen wollen?', - 'deleted' => 'Server gelöscht.', - 'updated' => 'Server aktualisiert.', - 'inserted' => 'Server hinzugefügt.', - 'latency' => 'Antwortzeit', - 'latency_max' => 'Antwortzeit (Maximum)', - 'latency_min' => 'Antwortzeit (Minimum)', - 'latency_avg' => 'Antwortzeit (im Durchschnitt)', - 'uptime' => 'Uptime', - 'year' => 'Jahr', - 'month' => 'Monat', - 'week' => 'Woche', - 'day' => 'Tag', - 'hour' => 'Stunde', - 'warning_threshold' => 'Warnschwelle', - 'warning_threshold_description' => 'Anzahl der fehlgeschlagenen Überprüfungen, bevor der Status als offline markiert wird.', - 'chart_last_week' => 'Letzte Woche', - 'chart_history' => 'Historie', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d.%m.%Y', - 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S Uhr', - 'chart_short_date_format' => '%d.%m %H:%M Uhr', - 'chart_short_time_format' => '%H:%M Uhr', - 'warning_notifications_disabled_sms' => 'SMS-Benachrichtigungen sind deaktiviert.', - 'warning_notifications_disabled_email' => 'E-Mail-Benachrichtigungen sind deaktiviert.', - 'warning_notifications_disabled_pushover' => 'Pushover-Benachrichtigungen sind deaktiviert.', - 'error_server_no_match' => 'Server nicht gefunden.', - 'error_server_label_bad_length' => 'Das Label muss zwischen 1 und 255 Zeichen lang sein.', - 'error_server_ip_bad_length' => 'Die Domain/IP muss zwischen 1 und 255 Zeichen lang sein.', - 'error_server_ip_bad_service' => 'Die eingegebene IP-Adresse ist ungültig.', - 'error_server_ip_bad_website' => 'Die eingegebene Webseiten-URL ist ungültig.', - 'error_server_type_invalid' => 'Der gewählte Server-Typ ist ungültig.', - 'error_server_warning_threshold_invalid' => 'Die Warnschwelle muss eine gültige ganze Zahl größer als 0 sein.', - ), - 'config' => array( - 'general' => 'Allgemein', - 'language' => 'Sprache', - 'show_update' => 'Wöchentlich auf Aktualisierungen prüfen?', - 'email_status' => 'E-Mail-Versand erlauben?', - 'email_from_email' => 'Absenderadresse', - 'email_from_name' => 'Name des Absenders', - 'email_smtp' => 'SMTP-Versand aktivieren', - 'email_smtp_host' => 'SMTP Server/Host', - 'email_smtp_port' => 'SMTP Port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP Benutzername', - 'email_smtp_password' => 'SMTP Passwort', - 'email_smtp_noauth' => 'Feld leer lassen, bei fehlender Authentifizierung', - 'sms_status' => 'SMS-Nachrichtenversand erlauben?', - 'sms_gateway' => 'SMS Gateway', - 'sms_gateway_username' => 'Gateway Benutzername', - 'sms_gateway_password' => 'Gateway Passwort', - 'sms_from' => 'SMS-Sendernummer', - 'pushover_status' => 'Ermögliche das Senden von Pushover-Nachrichten', - 'pushover_description' => 'Pushover ist ein Dienst, der es stark vereinfacht, Statusbenachrichtigungen in Echtzeit zu erhalten. Besuchen Sie pushover.net für weitere Informationen.', - 'pushover_clone_app' => 'Klicken Sie hier, um Ihre Pushover-Anwendung zu erstellen', - 'pushover_api_token' => 'Pushover-Anwendungs-API-Token', - 'pushover_api_token_description' => 'Bevor Sie Pushover verwenden können, müssen Sie Ihre Anwendung hier registrieren und Ihren Anwendungs-API-Token hier eingeben.', - 'alert_type' => 'Wann möchten Sie benachrichtigt werden?', - 'alert_type_description' => 'Status geändert: '. - '... wenn sich der Status ändert
    '. - 'z. B. online -> offline oder offline -> online.
    '. - '
    Offline: '. - 'Sie bekommen eine Benachrichtigung, wenn ein Server offline ist.
    '. - 'Es wird nur eine Mitteilung versendet.
    '. - '
    Immer: '. - 'Sie erhalten jedes Mal eine Benachrichtigung, sobald der CronJob oder das Skript ausgeführt werden, auch wenn der Dienst mehrere Stunden offline sein sollte.', - 'alert_type_status' => 'Status geändert', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Immer', - 'log_status' => 'Protokollierung aktivieren?', - 'log_status_description' => 'Ist die Protokollierung aktiviert (d.h. ist ein Haken gesetzt), wird jeder Status und jede Meldung vom System protokolliert.', - 'log_email' => 'E-Mail-Versand protokollieren?', - 'log_sms' => 'SMS-Versand protokollieren?', - 'log_pushover' => 'Pushover-Versand protokollieren?', - 'updated' => 'Die Einstellungen wurden gespeichert.', - 'tab_email' => 'E-Mail', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'E-Mail-Einstellungen', - 'settings_sms' => 'SMS-Einstellungen', - 'settings_pushover' => 'Pushover-Einstellungen', - 'settings_notification' => 'Benachrichtigungseinstellungen', - 'settings_log' => 'Protokollierungseinstellungen', - 'auto_refresh' => 'Automatische Aktualisierung', - 'auto_refresh_description' => - 'Automatische Aktualisierung der Server-Übersichtsseite
    '. - ''. - 'Zeit in Sekunden - die Ziffer \'0\' deaktiviert die automatische Aktualisierung.'. - '', - 'seconds' => 'Sekunden', - 'test' => 'Test', - 'test_email' => 'Eine E-Mail wird an die E-Mail-Adresse gesendet, die in Ihrem Profil hinterlegt ist.', - 'test_sms' => 'Eine SMS wird an die Telefonnummer gesendet, die in Ihrem Profil hinterlegt ist.', - 'test_pushover' => 'Eine Pushover-Benachrichtigung wird an den Schlüssel/das Gerät gesendet, welche(s) in Ihrem Profil hinterlegt ist.', - 'send' => 'Senden', - 'test_subject' => 'Test', - 'test_message' => 'Testnachricht', - 'email_sent' => 'E-Mail gesendet.', - 'email_error' => 'Beim Versand der E-Mail trat ein Fehler auf.', - 'sms_sent' => 'SMS-Nachricht gesendet.', - 'sms_error' => 'Beim Versand der SMS-Nachricht trat ein Fehler auf. %s', - 'sms_error_nomobile' => 'Versand der SMS-Nachricht nicht möglich: Es wurde keine gültige Telefonnummer in Ihrem Profil hinterlegt.', - 'pushover_sent' => 'Pushover-Benachrichtigung versendet', - 'pushover_error' => 'Beim Versand der Pushover-Benachrichtigung trat ein Fehler auf: %s', - 'pushover_error_noapp' => 'Es konnte keine Testbenachrichtigung versendet werden: Kein Pushover-Anwendungs-API-Token in den allgemeinen Einstellungen hinterlegt.', - 'pushover_error_nokey' => 'Es konnte keine Testbenachrichtigung versendet werden: Es wurde kein Pushover Key/Schlüssel in Ihrem Profil hinterlegt.', - 'log_retention_period' => 'Protokollierungszeitraum', - 'log_retention_period_description' => 'Anzahl in Tagen bis zur automatischen Bereinigung/Löschung sämtlicher Protokollierungsdaten im System. Geben Sie die Ziffer \'0\' ein, um die automatische Bereinigung/Löschung zu deaktivieren.', - 'log_retention_days' => 'Tage', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Dienst/Webseite \'%LABEL%\' ist offline: ip=%IP%, port=%PORT%. Fehler=%ERROR%', - 'off_email_subject' => 'Warnung: Dienst/Webseite \'%LABEL%\' ist offline.', - 'off_email_body' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:

    Dienst/Webseite: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fehler: %ERROR%
    Datum: %DATE% Uhr", - 'off_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist offline.', - 'off_pushover_message' => "Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite aufbauen:

    Dienst/Webseite: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fehler: %ERROR%
    Datum: %DATE% Uhr", - 'on_sms' => 'Dienst/Webseite \'%LABEL%\' ist wieder online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'Hinweis: Dienst/Webseite \'%LABEL%\' ist wieder online.', - 'on_email_body' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: %DATE% Uhr", - 'on_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist wieder online.', - 'on_pushover_message' => "Dienst/Webseite '%LABEL%' ist wieder erreichbar, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: %DATE% Uhr", - ), - 'login' => array( - 'welcome_usermenu' => '%user_name%', - 'title_sign_in' => 'Bitte loggen Sie sich ein.', - 'title_forgot' => 'Passwort vergessen?', - 'title_reset' => 'Ihr Passwort zurücksetzen', - 'submit' => 'Senden', - 'remember_me' => 'Angemeldet bleiben', - 'login' => 'Login', - 'logout' => 'Abmelden', - 'username' => 'Benutzername', - 'password' => 'Passwort', - 'password_repeat' => 'Passwort wiederholen', - 'password_forgot' => 'Passwort vergessen?', - 'password_reset' => 'Passwort zurücksetzen', - 'password_reset_email_subject' => 'Setzen Sie Ihr Zugangspasswort für den Server Monitor', - 'password_reset_email_body' => 'Benutzen Sie bitte den folgenden Link, um Ihr Zugangspasswort zurückzusetzen. Bitte beachten Sie: Der Link verfällt in 1 Stunde.

    %link%', - 'error_user_incorrect' => 'Der angegebene Benutzername konnte nicht gefunden werden.', - 'error_login_incorrect' => 'Die angegebenen Informationen sind leider nicht korrekt.', - 'error_login_passwords_nomatch' => 'Die angegebenen Passwörter stimmen nicht überein.', - 'error_reset_invalid_link' => 'Der angegebene Link, um Ihr Zugangspasswort zurückzusetzen, ist ungültig.', - 'success_password_forgot' => 'Eine Nachricht wurde an Ihre E-Mail-Adresse versendet. Sie beschreibt, wie Sie Ihr Passwort zurücksetzen können.', - 'success_password_reset' => 'Ihr Passwort wurde erfolgreich zurückgesetzt. Bitte versuchen Sie, sich erneut anzumelden.', - ), - 'error' => array( - '401_unauthorized' => 'Nicht autorisiert', - '401_unauthorized_description' => 'Sie haben nicht die erforderlichen Zugriffsrechte, um diese Seite aufzurufen.', - ), + 'name' => 'Deutsch - German', + 'locale' => array( + '0' => 'de_DE.UTF-8', + '1' => 'de_DE', + '2' => 'german', + ), + 'locale_tag' => 'de', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installation', + 'action' => 'Aktion', + 'save' => 'Speichern', + 'edit' => 'Bearbeiten', + 'delete' => 'Löschen', + 'date' => 'Datum', + 'message' => 'Meldung', + 'yes' => 'Ja', + 'no' => 'Nein', + 'insert' => 'Einfügen', + 'add_new' => 'Neuen Eintrag erstellen', + 'update_available' => 'Eine Aktualisierung ({version}) ist verfügbar unter http://www.phpservermonitor.org.', + 'back_to_top' => 'nach oben', + 'go_back' => 'Zurück', + 'ok' => 'OK', + 'cancel' => 'Abbrechen', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Gestern um %k:%M Uhr', + 'other_day_format' => '%A um %k:%M Uhr', + 'never' => 'Never', + 'hours_ago' => 'vor %d Stunden', + 'an_hour_ago' => 'vor über einer Stunde', + 'minutes_ago' => 'vor %d Minuten', + 'a_minute_ago' => 'vor über einer Minute', + 'seconds_ago' => 'vor %d Sekunden', + 'a_second_ago' => 'vor über einer Sekunde', + ), + 'menu' => array( + 'config' => 'Einstellungen', + 'server' => 'Server', + 'server_log' => 'Protokoll', + 'server_status' => 'Status', + 'server_update' => 'Update', + 'user' => 'Benutzer', + 'help' => 'Hilfe', + ), + 'users' => array( + 'user' => 'Benutzer', + 'name' => 'Name', + 'user_name' => 'Benutzername', + 'password' => 'Passwort', + 'password_repeat' => 'Passwort wiederholen', + 'password_leave_blank' => 'Passwort ändern...', + 'level' => 'Berechtigungsstufe', + 'level_10' => 'Administrator', + 'level_20' => 'Benutzer', + 'level_description' => 'Administratoren haben vollen Zugriff — sie können Webseiten, Benutzer und + globale Einstellungen verwalten.
    Benutzer können nur (für ihnen + zugeordnete Webseiten) Analysedaten einsehen und deren Aktualisierung veranlassen.', + 'mobile' => 'Mobil', + 'email' => 'E-Mail', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover ist ein Dienst, der es stark vereinfacht, Statusbenachrichtigungen in + Echtzeit zu erhalten. Besuchen Sie pushover.net für weitere Informationen.', + 'pushover_key' => 'Pushover Key/Schlüssel', + 'pushover_device' => 'Pushover Gerät', + 'pushover_device_description' => 'Name des Gerätes, an das die Nachricht gesendet werden soll. Leer lassen, + um die Nachricht an alle registrierten Geräte zu senden.', + 'delete_title' => 'Benutzer löschen', + 'delete_message' => 'Sind Sie sicher, dass Sie den Benutzer \'%1\' löschen wollen?', + 'deleted' => 'Benutzer gelöscht.', + 'updated' => 'Benutzer bearbeitet.', + 'inserted' => 'Benutzer hinzugefügt.', + 'profile' => 'Profileinstellungen', + 'profile_updated' => 'Ihr Profil wurde aktualisiert.', + 'error_user_name_bad_length' => 'Benutzernamen müssen zwischen 2 und 64 Zeichen lang sein.', + 'error_user_name_invalid' => 'Der Benutzername darf nur alphanumerische Zeichen (a-z, A-Z), Zahlen (0-9), + Punkte (.) und Unterstriche (_) enthalten.', + 'error_user_name_exists' => 'Der gewählte Benutzername existiert bereits in der Datenbank.', + 'error_user_email_bad_length' => 'E-Mail-Adressen müssen zwischen 5 und 255 Zeichen lang sein.', + 'error_user_email_invalid' => 'Die E-Mail-Adresse ist ungültig.', + 'error_user_level_invalid' => 'Die gewählte Berechtigungsstufe ist ungültig.', + 'error_user_no_match' => 'Der Benutzer konnte in der Datenbank nicht gefunden werden.', + 'error_user_password_invalid' => 'Das eingegebene Passwort ist nicht korrekt.', + 'error_user_password_no_match' => 'Die eingegebenen Passwörter stimmen nicht überein.', + ), + 'log' => array( + 'title' => 'Protokoll', + 'type' => 'Typ', + 'status' => 'Status', + 'email' => 'E-Mail', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Keine Logs vorhanden.', + 'clear' => 'Protokoll Logs', + 'delete_title' => 'Protokoll Logs', + 'delete_message' => 'Bist du sicher, dass du alle logs löschen möchtest?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Beschriftung', + 'domain' => 'Domain/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Anzahl der Sekunden, die auf eine Antwort des Servers gewartet werden soll.', + 'port' => 'Port', + 'type' => 'Typ', + 'type_website' => 'Webseite', + 'type_service' => 'Service', + 'type_ping' => 'Ping', + 'pattern' => 'Suchstring/-muster', + 'pattern_description' => 'Wenn das gesuchte Muster nicht in der Webseite ist, wird die Seite als offline + markiert. Reguläre Ausdrücke sind erlaubt.', + 'last_check' => 'Letzter Check', + 'last_online' => 'Zuletzt online', + 'last_offline' => 'Zuletzt offline', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'Monitoring inaktiv', + 'email' => 'E-Mail', + 'send_email' => 'E-Mail versenden', + 'sms' => 'SMS', + 'send_sms' => 'SMS versenden', + 'pushover' => 'Pushover', + 'users' => 'Benutzer', + 'delete_title' => 'Server löschen', + 'delete_message' => 'Sind Sie sicher, dass Sie den Server \'%1\' löschen wollen?', + 'deleted' => 'Server gelöscht.', + 'updated' => 'Server aktualisiert.', + 'inserted' => 'Server hinzugefügt.', + 'latency' => 'Antwortzeit', + 'latency_max' => 'Antwortzeit (Maximum)', + 'latency_min' => 'Antwortzeit (Minimum)', + 'latency_avg' => 'Antwortzeit (im Durchschnitt)', + 'uptime' => 'Uptime', + 'year' => 'Jahr', + 'month' => 'Monat', + 'week' => 'Woche', + 'day' => 'Tag', + 'hour' => 'Stunde', + 'warning_threshold' => 'Warnschwelle', + 'warning_threshold_description' => 'Anzahl der fehlgeschlagenen Überprüfungen, bevor der Status als offline + markiert wird.', + 'chart_last_week' => 'Letzte Woche', + 'chart_history' => 'Historie', + 'chart_day_format' => '%d.%m.%Y', + 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S Uhr', + 'chart_short_date_format' => '%d.%m %H:%M Uhr', + 'chart_short_time_format' => '%H:%M Uhr', + 'warning_notifications_disabled_sms' => 'SMS-Benachrichtigungen sind deaktiviert.', + 'warning_notifications_disabled_email' => 'E-Mail-Benachrichtigungen sind deaktiviert.', + 'warning_notifications_disabled_pushover' => 'Pushover-Benachrichtigungen sind deaktiviert.', + 'error_server_no_match' => 'Server nicht gefunden.', + 'error_server_label_bad_length' => 'Das Label muss zwischen 1 und 255 Zeichen lang sein.', + 'error_server_ip_bad_length' => 'Die Domain/IP muss zwischen 1 und 255 Zeichen lang sein.', + 'error_server_ip_bad_service' => 'Die eingegebene IP-Adresse ist ungültig.', + 'error_server_ip_bad_website' => 'Die eingegebene Webseiten-URL ist ungültig.', + 'error_server_type_invalid' => 'Der gewählte Server-Typ ist ungültig.', + 'error_server_warning_threshold_invalid' => 'Die Warnschwelle muss eine gültige ganze Zahl größer als 0 + sein.', + ), + 'config' => array( + 'general' => 'Allgemein', + 'language' => 'Sprache', + 'show_update' => 'Wöchentlich auf Aktualisierungen prüfen?', + 'email_status' => 'E-Mail-Versand erlauben?', + 'email_from_email' => 'Absenderadresse', + 'email_from_name' => 'Name des Absenders', + 'email_smtp' => 'SMTP-Versand aktivieren', + 'email_smtp_host' => 'SMTP Server/Host', + 'email_smtp_port' => 'SMTP Port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP Benutzername', + 'email_smtp_password' => 'SMTP Passwort', + 'email_smtp_noauth' => 'Feld leer lassen, bei fehlender Authentifizierung', + 'sms_status' => 'SMS-Nachrichtenversand erlauben?', + 'sms_gateway' => 'SMS Gateway', + 'sms_gateway_username' => 'Gateway Benutzername', + 'sms_gateway_password' => 'Gateway Passwort', + 'sms_from' => 'SMS-Sendernummer', + 'pushover_status' => 'Ermögliche das Senden von Pushover-Nachrichten', + 'pushover_description' => 'Pushover ist ein Dienst, der es stark vereinfacht, Statusbenachrichtigungen in + Echtzeit zu erhalten. Besuchen Sie pushover.net für weitere Informationen.', + 'pushover_clone_app' => 'Klicken Sie hier, um Ihre Pushover-Anwendung zu erstellen', + 'pushover_api_token' => 'Pushover-Anwendungs-API-Token', + 'pushover_api_token_description' => 'Bevor Sie Pushover verwenden können, müssen Sie Ihre Anwendung hier registrieren und Ihren + Anwendungs-API-Token hier eingeben.', + 'alert_type' => 'Wann möchten Sie benachrichtigt werden?', + 'alert_type_description' => 'Status geändert: ... wenn sich der Status ändert
    z. B. online -> + offline oder offline -> online.

    Offline: Sie bekommen eine + Benachrichtigung, wenn ein Server offline ist.
    Es wird nur eine Mitteilung + versendet.

    Immer: Sie erhalten jedes Mal eine Benachrichtigung, + sobald der CronJob oder das Skript ausgeführt werden, auch wenn der Dienst + mehrere Stunden offline sein sollte.', + 'alert_type_status' => 'Status geändert', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Immer', + 'log_status' => 'Protokollierung aktivieren?', + 'log_status_description' => 'Ist die Protokollierung aktiviert (d.h. ist ein Haken gesetzt), wird jeder Status + und jede Meldung vom System protokolliert.', + 'log_email' => 'E-Mail-Versand protokollieren?', + 'log_sms' => 'SMS-Versand protokollieren?', + 'log_pushover' => 'Pushover-Versand protokollieren?', + 'updated' => 'Die Einstellungen wurden gespeichert.', + 'tab_email' => 'E-Mail', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'E-Mail-Einstellungen', + 'settings_sms' => 'SMS-Einstellungen', + 'settings_pushover' => 'Pushover-Einstellungen', + 'settings_notification' => 'Benachrichtigungseinstellungen', + 'settings_log' => 'Protokollierungseinstellungen', + 'auto_refresh' => 'Automatische Aktualisierung', + 'auto_refresh_description' => 'Automatische Aktualisierung der Server-Übersichtsseite
    Zeit in Sekunden - die Ziffer \'0\' deaktiviert die automatische + Aktualisierung.', + 'seconds' => 'Sekunden', + 'test' => 'Test', + 'test_email' => 'Eine E-Mail wird an die E-Mail-Adresse gesendet, die in Ihrem Profil hinterlegt ist.', + 'test_sms' => 'Eine SMS wird an die Telefonnummer gesendet, die in Ihrem Profil hinterlegt ist.', + 'test_pushover' => 'Eine Pushover-Benachrichtigung wird an den Schlüssel/das Gerät gesendet, welche(s) in + Ihrem Profil hinterlegt ist.', + 'send' => 'Senden', + 'test_subject' => 'Test', + 'test_message' => 'Testnachricht', + 'email_sent' => 'E-Mail gesendet.', + 'email_error' => 'Beim Versand der E-Mail trat ein Fehler auf.', + 'sms_sent' => 'SMS-Nachricht gesendet.', + 'sms_error' => 'Beim Versand der SMS-Nachricht trat ein Fehler auf. %s', + 'sms_error_nomobile' => 'Versand der SMS-Nachricht nicht möglich: Es wurde keine gültige Telefonnummer in + Ihrem Profil hinterlegt.', + 'pushover_sent' => 'Pushover-Benachrichtigung versendet', + 'pushover_error' => 'Beim Versand der Pushover-Benachrichtigung trat ein Fehler auf: %s', + 'pushover_error_noapp' => 'Es konnte keine Testbenachrichtigung versendet werden: Kein + Pushover-Anwendungs-API-Token in den allgemeinen Einstellungen hinterlegt.', + 'pushover_error_nokey' => 'Es konnte keine Testbenachrichtigung versendet werden: Es wurde kein Pushover + Key/Schlüssel in Ihrem Profil hinterlegt.', + 'log_retention_period' => 'Protokollierungszeitraum', + 'log_retention_period_description' => 'Anzahl in Tagen bis zur automatischen Bereinigung/Löschung sämtlicher + Protokollierungsdaten im System. Geben Sie die Ziffer \'0\' ein, um die + automatische Bereinigung/Löschung zu deaktivieren.', + 'log_retention_days' => 'Tage', + ), + 'notifications' => array( + 'off_sms' => 'Dienst/Webseite \'%LABEL%\' ist offline: ip=%IP%, port=%PORT%. Fehler=%ERROR%', + 'off_email_subject' => 'Warnung: Dienst/Webseite \'%LABEL%\' ist offline.', + 'off_email_body' => 'Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite + aufbauen:

    Dienst/Webseite: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fehler: + %ERROR%
    Datum: %DATE% Uhr', + 'off_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist offline.', + 'off_pushover_message' => 'Kann keine funktionierende Verbindung zum Dienst bzw. der Webseite + aufbauen:

    Dienst/Webseite: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fehler: + %ERROR%
    Datum: %DATE% Uhr', + 'on_sms' => 'Dienst/Webseite \'%LABEL%\' ist wieder online: ip=%IP%, port=%PORT%, it was down for + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'Hinweis: Dienst/Webseite \'%LABEL%\' ist wieder online.', + 'on_email_body' => 'Dienst/Webseite \'%LABEL%\' ist wieder erreichbar, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Datum: + %DATE% Uhr', + 'on_pushover_title' => 'Dienst/Webseite \'%LABEL%\' ist wieder online.', + 'on_pushover_message' => 'Dienst/Webseite \'%LABEL%\' ist wieder erreichbar, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Datum: %DATE% Uhr', + ), + 'login' => array( + 'welcome_usermenu' => '%user_name%', + 'title_sign_in' => 'Bitte loggen Sie sich ein.', + 'title_forgot' => 'Passwort vergessen?', + 'title_reset' => 'Ihr Passwort zurücksetzen', + 'submit' => 'Senden', + 'remember_me' => 'Angemeldet bleiben', + 'login' => 'Login', + 'logout' => 'Abmelden', + 'username' => 'Benutzername', + 'password' => 'Passwort', + 'password_repeat' => 'Passwort wiederholen', + 'password_forgot' => 'Passwort vergessen?', + 'password_reset' => 'Passwort zurücksetzen', + 'password_reset_email_subject' => 'Setzen Sie Ihr Zugangspasswort für den Server Monitor', + 'password_reset_email_body' => 'Benutzen Sie bitte den folgenden Link, um Ihr Zugangspasswort zurückzusetzen. + Bitte beachten Sie: Der Link verfällt in 1 Stunde.

    %link%', + 'error_user_incorrect' => 'Der angegebene Benutzername konnte nicht gefunden werden.', + 'error_login_incorrect' => 'Die angegebenen Informationen sind leider nicht korrekt.', + 'error_login_passwords_nomatch' => 'Die angegebenen Passwörter stimmen nicht überein.', + 'error_reset_invalid_link' => 'Der angegebene Link, um Ihr Zugangspasswort zurückzusetzen, ist ungültig.', + 'success_password_forgot' => 'Eine Nachricht wurde an Ihre E-Mail-Adresse versendet. Sie beschreibt, wie Sie + Ihr Passwort zurücksetzen können.', + 'success_password_reset' => 'Ihr Passwort wurde erfolgreich zurückgesetzt. Bitte versuchen Sie, sich erneut + anzumelden.', + ), + 'error' => array( + '401_unauthorized' => 'Nicht autorisiert', + '401_unauthorized_description' => 'Sie haben nicht die erforderlichen Zugriffsrechte, um diese Seite + aufzurufen.', + ), ); diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index f95e519f..3c461c14 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -1,4 +1,5 @@ 'English', - 'locale' => array('en_US.UTF-8', 'en_US', 'american', 'english-us'), - 'locale_tag' => 'en', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Install', - 'action' => 'Action', - 'save' => 'Save', - 'edit' => 'Edit', - 'delete' => 'Delete', - 'view' => 'View', - 'date' => 'Date', - 'message' => 'Message', - 'yes' => 'Yes', - 'no' => 'No', - 'insert' => 'Insert', - 'add_new' => 'Add new', - 'update_available' => 'A new version ({version}) is available. Click here to download the update.', - 'back_to_top' => 'Back to top', - 'go_back' => 'Go back', - 'ok' => 'OK', - 'bad' => 'bad', - 'cancel' => 'Cancel', - 'none' => 'None', - 'activate' => 'Activate', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Yesterday at %k:%M', - 'other_day_format' => '%A at %k:%M', - 'never' => 'Never', - 'hours_ago' => '%d hours ago', - 'an_hour_ago' => 'about an hour ago', - 'minutes_ago' => '%d minutes ago', - 'a_minute_ago' => 'about a minute ago', - 'seconds_ago' => '%d seconds ago', - 'a_second_ago' => 'a second ago', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - 'current' => 'current', - 'settings' => 'Settings', - 'search' => 'Search' - ), - 'menu' => array( - 'config' => 'Config', - 'server' => 'Servers', - 'server_log' => 'Log', - 'server_status' => 'Status', - 'server_update' => 'Update', - 'user' => 'Users', - 'help' => 'Help', - ), - 'users' => array( - 'user' => 'User', - 'name' => 'Name', - 'user_name' => 'Username', - 'password' => 'Password', - 'password_repeat' => 'Password repeat', - 'password_leave_blank' => 'Leave blank to keep unchanged', - 'level' => 'Level', - 'level_10' => 'Administrator', - 'level_20' => 'User', - 'level_description' => 'Administrators have full access: they can manage servers, users and edit the global configuration.
    Users can only view and run the updater for the servers that have been assigned to them.', - 'mobile' => 'Mobile', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Device name to send the message to. Leave empty to send it to all devices.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram is a chat app that makes it easy to get real-time notifications. Visit the documentation for more info and an install guide.', - 'telegram_chat_id' => 'Telegram chat id', - 'telegram_chat_id_description' => 'The message will be send to the corresponding chat.', - 'telegram_get_chat_id' => 'Click here to get your chat id', - 'activate_telegram' => 'Activate Telegram notifications', - 'activate_telegram_description' => 'Allow Telegram notifications to be sent to the specified chat id. Without this permission, Telegram doesn\'t allow us to send notifications to you.', - 'telegram_bot_username_found' => 'The bot was found!

    This will open a chat with the bot. Here you need to press start of type /start.', - 'telegram_bot_username_error_token' => '401 - Unauthorized. Please make sure that the API token is valid.', - 'telegram_bot_error' => 'An error has occurred while activating Telegram notification: %s', - 'delete_title' => 'Delete User', - 'delete_message' => 'Are you sure you want to delete user \'%1\'?', - 'deleted' => 'User deleted.', - 'updated' => 'User updated.', - 'inserted' => 'User added.', - 'profile' => 'Profile', - 'profile_updated' => 'Your profile has been updated.', - 'error_user_name_bad_length' => 'Usernames must be between 2 and 64 characters.', - 'error_user_name_invalid' => 'The username may only contain alphabetic characters (a-z, A-Z), digits (0-9), dots (.) and underscores (_).', - 'error_user_name_exists' => 'The given username already exists in the database.', - 'error_user_email_bad_length' => 'Email addresses must be between 5 and 255 characters.', - 'error_user_email_invalid' => 'The email address is invalid.', - 'error_user_level_invalid' => 'The given user level is invalid.', - 'error_user_no_match' => 'The user could not be found in the database.', - 'error_user_password_invalid' => 'The entered password is invalid.', - 'error_user_password_no_match' => 'The entered passwords do not match.', - ), - 'log' => array( - 'title' => 'Log entries', - 'type' => 'Type', - 'status' => 'Status', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'No logs', - 'clear' => 'Clear log', - 'delete_title' => 'Delete log', - 'delete_message' => 'Are you sure you want to delete all logs?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Label', - 'domain' => 'Domain/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Number of seconds to wait for the server to respond.', - 'authentication_settings' => 'Authentication Settings', - 'optional' => 'Optional', - 'website_username' => 'Username', - 'website_username_description' => 'Username to access the site. (Only Apache authentication is supported.)', - 'website_password' => 'Password', - 'website_password_description' => 'Password to access the site. The password is encrypted in the database.', - 'fieldset_monitoring' => 'Monitoring', - 'fieldset_permissions' => 'Permissions', - 'permissions' => 'Server will be visible for the following users', - 'port' => 'Port', - 'custom_port' => 'Custom Port', - 'popular_ports' => 'Popular Ports', - 'request_method' => 'Request method', - 'custom_request_method' => 'Custom request method', - 'popular_request_methods' => 'Popular request methods', - 'post_field' => 'Post field', - 'post_field_description' => 'The data that will be send using the request method above.', - 'please_select' => 'Please select', - 'type' => 'Type', - 'type_website' => 'Website', - 'type_service' => 'Service', - 'type_ping' => 'Ping', - 'pattern' => 'Search string/pattern', - 'pattern_description' => 'If this pattern is not found on the website, the server will be marked online/offline. Regular expressions are allowed.', - 'pattern_online' => 'Pattern indicates website is', - 'pattern_online_description' => 'Online: If this pattern is not found on the website, the server will be marked online. Offline: If this pattern is not found on the website, the server will be marked offline.', - 'redirect_check' => 'Redirecting to another domain is', - 'redirect_check_description' => 'Redirect to another domain is usually a bad sign.', - 'allow_http_status' => 'Allow HTTP status code', - 'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as online by default. Seperate with |.', - 'header_name' => 'Header name', - 'header_value' => 'Header value', - 'header_name_description' => 'Case-sensitive.', - 'header_value_description' => 'Regular expressions are allowed.', - 'last_check' => 'Last check', - 'last_online' => 'Last online', - 'last_offline' => 'Last offline', - 'last_output' => 'Last positive output', - 'last_error' => 'Last error', - 'last_error_output' => 'Last error output', - 'output' => 'Output', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'No monitoring', - 'email' => 'Email', - 'send_email' => 'Send Email', - 'sms' => 'SMS', - 'send_sms' => 'Send SMS', - 'pushover' => 'Pushover', - 'send_pushover' => 'Send Pushover notification', - 'telegram' => 'Telegram', - 'send_telegram' => 'Send Telegram notification', - 'users' => 'Users', - 'delete_title' => 'Delete server', - 'delete_message' => 'Are you sure you want to delete server \'%1\'?', - 'deleted' => 'Server deleted.', - 'updated' => 'Server updated.', - 'inserted' => 'Server added.', - 'latency' => 'Latency', - 'latency_max' => 'Latency (maximum)', - 'latency_min' => 'Latency (minimum)', - 'latency_avg' => 'Latency (average)', - 'online' => 'online', - 'offline' => 'offline', - 'uptime' => 'Uptime', - 'year' => 'Year', - 'month' => 'Month', - 'week' => 'Week', - 'day' => 'Day', - 'hour' => 'Hour', - 'warning_threshold' => 'Warning threshold', - 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', - 'chart_last_week' => 'Last week', - 'chart_history' => 'History', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS notifications are disabled.', - 'warning_notifications_disabled_email' => 'Email notifications are disabled.', - 'warning_notifications_disabled_pushover' => 'Pushover notifications are disabled.', - 'warning_notifications_disabled_telegram' => 'Telegram notifications are disabled.', - 'error_server_no_match' => 'Server not found.', - 'error_server_label_bad_length' => 'The label must be between 1 and 255 characters.', - 'error_server_ip_bad_length' => 'The domain / IP must be between 1 and 255 characters.', - 'error_server_ip_bad_service' => 'The IP address is not valid.', - 'error_server_ip_bad_website' => 'The website URL is not valid.', - 'error_server_type_invalid' => 'The selected server type is invalid.', - 'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.', - ), - 'config' => array( - 'general' => 'General', - 'language' => 'Language', - 'show_update' => 'Check for updates?', - 'password_encrypt_key' => 'The encryption key password', - 'password_encrypt_key_note' => 'This key is used to encrypt passwords that are stored on servers for access to websites. If the key will change the stored password is invalid!', - 'proxy' => 'Enable proxy', - 'proxy_url' => 'Proxy URL', - 'proxy_user' => 'Proxy username', - 'proxy_password' => 'Proxy password', - 'email_status' => 'Allow sending email', - 'email_from_email' => 'Email from address', - 'email_from_name' => 'Email from name', - 'email_smtp' => 'Enable SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP username', - 'email_smtp_password' => 'SMTP password', - 'email_smtp_noauth' => 'Leave blank for no authentication', - 'sms_status' => 'Allow sending text messages', - 'sms_gateway' => 'Gateway to use for sending messages', - 'sms_gateway_username' => 'Gateway username', - 'sms_gateway_password' => 'Gateway password', - 'sms_from' => 'Sender\'s phone number', - 'pushover_status' => 'Allow sending Pushover messages', - 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', - 'pushover_clone_app' => 'Click here to create your Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Before you can use Pushover, you need to register an App at their website and enter the App API Token here.', - 'telegram_status' => 'Allow sending Telegram messages', - 'telegram_description' => 'Telegram is a chat app that makes it easy to get real-time notifications. Visit the documentation for more info and an install guide.', - 'telegram_api_token' => 'Telegram API Token', - 'telegram_api_token_description' => 'Before you can use Telegram, you need to get a API token. Visit the documentation for help.', - 'alert_type' => 'Select when you\'d like to be notified.', - 'alert_type_description' => 'Status change: '. - 'You will receive a notification when a server has a change in status. So from online -> offline or offline -> online.
    '. - '
    Offline: '. - 'You will receive a notification when a server goes offline for the *FIRST TIME ONLY*. For example, '. - 'your cronjob is every 15 minutes and your server goes down at 1 am and stays down till 6 am. '. - 'You will get 1 notification at 1 am and that\'s it.
    '. - '
    Always: '. - 'You will receive a notification every time the script runs and a site is down, even if the site has been offline for hours.', - 'alert_type_status' => 'Status change', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Always', + 'name' => 'English', + 'locale' => array( + '0' => 'en_US.UTF-8', + '1' => 'en_US', + '2' => 'american', + '3' => 'english-us', + ), + 'locale_tag' => 'en', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Install', + 'action' => 'Action', + 'save' => 'Save', + 'edit' => 'Edit', + 'delete' => 'Delete', + 'view' => 'View', + 'date' => 'Date', + 'message' => 'Message', + 'yes' => 'Yes', + 'no' => 'No', + 'insert' => 'Insert', + 'add_new' => 'Add new', + 'update_available' => 'A new version ({version}) is available. Click here to download the update.', + 'back_to_top' => 'Back to top', + 'go_back' => 'Go back', + 'ok' => 'OK', + 'bad' => 'bad', + 'cancel' => 'Cancel', + 'none' => 'None', + 'activate' => 'Activate', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Yesterday at %k:%M', + 'other_day_format' => '%A at %k:%M', + 'never' => 'Never', + 'hours_ago' => '%d hours ago', + 'an_hour_ago' => 'about an hour ago', + 'minutes_ago' => '%d minutes ago', + 'a_minute_ago' => 'about a minute ago', + 'seconds_ago' => '%d seconds ago', + 'a_second_ago' => 'a second ago', + 'year' => 'year', + 'years' => 'years', + 'month' => 'month', + 'months' => 'months', + 'day' => 'day', + 'days' => 'days', + 'hour' => 'hour', + 'hours' => 'hours', + 'minute' => 'minute', + 'minutes' => 'minutes', + 'second' => 'second', + 'seconds' => 'seconds', + 'current' => 'current', + 'settings' => 'Settings', + 'search' => 'Search', + ), + 'menu' => array( + 'config' => 'Config', + 'server' => 'Servers', + 'server_log' => 'Log', + 'server_status' => 'Status', + 'server_update' => 'Update', + 'user' => 'Users', + 'help' => 'Help', + ), + 'users' => array( + 'user' => 'User', + 'name' => 'Name', + 'user_name' => 'Username', + 'password' => 'Password', + 'password_repeat' => 'Password repeat', + 'password_leave_blank' => 'Leave blank to keep unchanged', + 'level' => 'Level', + 'level_10' => 'Administrator', + 'level_20' => 'User', + 'level_description' => 'Administrators have full access: they can manage servers, users and edit the + global configuration.
    Users can only view and run the updater for the + servers that have been assigned to them.', + 'mobile' => 'Mobile', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Device name to send the message to. Leave empty to send it to all devices.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram is a chat app that + makes it easy to get real-time notifications. Visit the documentation for more + info and an install guide.', + 'telegram_chat_id' => 'Telegram chat id', + 'telegram_chat_id_description' => 'The message will be send to the corresponding chat.', + 'telegram_get_chat_id' => 'Click here to get your chat id', + 'activate_telegram' => 'Activate Telegram notifications', + 'activate_telegram_description' => 'Allow Telegram notifications to be sent to the specified chat id. Without + this permission, Telegram doesn\'t allow us to send notifications to you.', + 'telegram_bot_username_found' => 'The bot was found!

    This will open a chat + with the bot. Here you need to press start or type /start.', + 'telegram_bot_username_error_token' => '401 - Unauthorized. Please make sure that the API token is valid.', + 'telegram_bot_error' => 'An error has occurred while activating Telegram notification: %s', + 'jabber' => 'Jabber', + 'jabber_label' => 'Jabber', + 'jabber_description' => 'You Jabber account', + 'delete_title' => 'Delete User', + 'delete_message' => 'Are you sure you want to delete user \'%1\'?', + 'deleted' => 'User deleted.', + 'updated' => 'User updated.', + 'inserted' => 'User added.', + 'profile' => 'Profile', + 'profile_updated' => 'Your profile has been updated.', + 'error_user_name_bad_length' => 'Usernames must be between 2 and 64 characters.', + 'error_user_name_invalid' => 'The username may only contain alphabetic characters (a-z, A-Z), digits (0-9), + dots (.) and underscores (_).', + 'error_user_name_exists' => 'The given username already exists in the database.', + 'error_user_email_bad_length' => 'Email addresses must be between 5 and 255 characters.', + 'error_user_email_invalid' => 'The email address is invalid.', + 'error_user_level_invalid' => 'The given user level is invalid.', + 'error_user_no_match' => 'The user could not be found in the database.', + 'error_user_password_invalid' => 'The entered password is invalid.', + 'error_user_password_no_match' => 'The entered passwords do not match.', + 'error_user_admin_cant_be_deleted' => 'You can\'t remove the last administrator.', + ), + 'log' => array( + 'title' => 'Log entries', + 'type' => 'Type', + 'status' => 'Status', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'jabber' => 'Jabber', + 'no_logs' => 'No logs', + 'clear' => 'Clear log', + 'delete_title' => 'Delete log', + 'delete_message' => 'Are you sure you want to delete all logs?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Label', + 'domain' => 'Domain/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Number of seconds to wait for the server to respond.', + 'authentication_settings' => 'Authentication Settings', + 'optional' => 'Optional', + 'website_username' => 'Username', + 'website_username_description' => 'Username to access the site. (Only Apache authentication is supported.)', + 'website_password' => 'Password', + 'website_password_description' => 'Password to access the site. The password is encrypted in the database.', + 'fieldset_monitoring' => 'Monitoring', + 'fieldset_permissions' => 'Permissions', + 'permissions' => 'Server will be visible for the following users', + 'port' => 'Port', + 'custom_port' => 'Custom Port', + 'popular_ports' => 'Popular Ports', + 'request_method' => 'Request method', + 'custom_request_method' => 'Custom request method', + 'popular_request_methods' => 'Popular request methods', + 'post_field' => 'Post field', + 'post_field_description' => 'The data that will be send using the request method above.', + 'please_select' => 'Please select', + 'type' => 'Type', + 'type_website' => 'Website', + 'type_service' => 'Service', + 'type_ping' => 'Ping', + 'pattern' => 'Search string/pattern', + 'pattern_description' => 'If this pattern is not found on the website, the server will be marked + online/offline. Regular expressions are allowed.', + 'pattern_online' => 'Pattern indicates website is', + 'pattern_online_description' => 'Online: If this pattern was found on the website, the server will be marked + online. Offline: If this pattern was not found on the website, the server + will be marked offline.', + 'redirect_check' => 'Redirecting to another domain is', + 'redirect_check_description' => 'Redirect to another domain is usually a bad sign.', + 'allow_http_status' => 'Allow HTTP status code', + 'allow_http_status_description' => 'Mark website as online. HTTP Status codes lower then 400 are marked as + online by default. Seperate with |.', + 'header_name' => 'Header name', + 'header_value' => 'Header value', + 'header_name_description' => 'Case-sensitive.', + 'header_value_description' => 'Regular expressions are allowed.', + 'last_check' => 'Last check', + 'last_online' => 'Last online', + 'last_offline' => 'Last offline', + 'last_output' => 'Last positive output', + 'last_error' => 'Last error', + 'last_error_output' => 'Last error output', + 'output' => 'Output', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'No monitoring', + 'email' => 'Email', + 'send_email' => 'Send Email', + 'sms' => 'SMS', + 'send_sms' => 'Send SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Send Pushover notification', + 'telegram' => 'Telegram', + 'send_telegram' => 'Send Telegram notification', + 'jabber' => 'Jabber', + 'send_jabber' => 'Send Jabber notification', + 'users' => 'Users', + 'delete_title' => 'Delete server', + 'delete_message' => 'Are you sure you want to delete server \'%1\'?', + 'deleted' => 'Server deleted.', + 'updated' => 'Server updated.', + 'inserted' => 'Server added.', + 'latency' => 'Latency', + 'latency_max' => 'Latency (maximum)', + 'latency_min' => 'Latency (minimum)', + 'latency_avg' => 'Latency (average)', + 'online' => 'online', + 'offline' => 'offline', + 'uptime' => 'Uptime', + 'year' => 'Year', + 'month' => 'Month', + 'week' => 'Week', + 'day' => 'Day', + 'hour' => 'Hour', + 'warning_threshold' => 'Warning threshold', + 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', + 'ssl_cert_expiry_days' => 'SSL Certificate Validity', + 'ssl_cert_expiry_days_description' => 'The minimum remaining days the SSL certificate is still valid. Use 0 to + disable check.', + 'ssl_cert_expired' => 'SSL certificate expired since', + 'ssl_cert_expiring' => 'SSL certificate expiring:', + 'chart_last_week' => 'Last week', + 'chart_history' => 'History', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS notifications are disabled.', + 'warning_notifications_disabled_email' => 'Email notifications are disabled.', + 'warning_notifications_disabled_pushover' => 'Pushover notifications are disabled.', + 'warning_notifications_disabled_telegram' => 'Telegram notifications are disabled.', + 'warning_notifications_disabled_jabber' => 'Jabber notifications are disabled.', + 'error_server_no_match' => 'Server not found.', + 'error_server_label_bad_length' => 'The label must be between 1 and 255 characters.', + 'error_server_ip_bad_length' => 'The domain / IP must be between 1 and 255 characters.', + 'error_server_ip_bad_service' => 'The IP address is not valid.', + 'error_server_ip_bad_website' => 'The website URL is not valid.', + 'error_server_type_invalid' => 'The selected server type is invalid.', + 'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.', + 'error_server_ssl_cert_expiry_days' => 'The remaining days for SSL certificate validity must be a valid + integer greater than or equal to 0.', + ), + 'config' => array( + 'general' => 'General', + 'language' => 'Language', + 'show_update' => 'Check for updates?', + 'password_encrypt_key' => 'The encryption key password', + 'password_encrypt_key_note' => 'This key is used to encrypt passwords that are stored on servers for access to + websites. If the key will change the stored password is invalid!', + 'proxy' => 'Enable proxy', + 'proxy_url' => 'Proxy URL', + 'proxy_user' => 'Proxy username', + 'proxy_password' => 'Proxy password', + 'email_status' => 'Allow sending email', + 'email_from_email' => 'Email from address', + 'email_from_name' => 'Email from name', + 'email_smtp' => 'Enable SMTP', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP username', + 'email_smtp_password' => 'SMTP password', + 'email_smtp_noauth' => 'Leave blank for no authentication', + 'sms_status' => 'Allow sending text messages', + 'sms_gateway' => 'Gateway to use for sending messages', + 'sms_gateway_username' => 'Gateway username', + 'sms_gateway_password' => 'Gateway password', + 'sms_from' => 'Sender\'s phone number', + 'pushover_status' => 'Allow sending Pushover messages', + 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', + 'pushover_clone_app' => 'Click here to create your Pushover app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Before you can use Pushover, you need to register an App at their website and enter the App API + Token here.', + 'telegram_status' => 'Allow sending Telegram messages', + 'telegram_description' => 'Telegram is a chat app that + makes it easy to get real-time notifications. Visit the documentation for more + info and an install guide.', + 'telegram_api_token' => 'Telegram API Token', + 'telegram_api_token_description' => 'Before you can use Telegram, you need to get a API token. Visit the documentation for help.', + 'jabber_status' => 'Allow sending Jabber (XMPP) messages', + 'jabber_description' => 'Visit the documentation for more info and an + install guide.', + 'jabber_host' => 'Host', + 'jabber_host_description' => 'Host of your Jabber account provider. For Google Account use talk.google.com.', + 'jabber_port' => 'Port', + 'jabber_port_description' => 'Port of your Jabber provider. Default 5222. For Google Account use 5223.', + 'jabber_username' => 'Username', + 'jabber_username_description' => 'For Google Account use incl. domain so for example example@google.com.', + 'jabber_domain' => 'Domain', + 'jabber_domain_description' => 'Domain of your Jabber provider. Left empty for Google Account.', + 'jabber_password' => 'Password', + 'jabber_password_description' => 'Fill only to set or change.', + 'jabber_check' => 'Check your Jabber account if message was received.', + 'alert_type' => 'Select when you\'d like to be notified.', + 'alert_type_description' => 'Status change: You will receive a notification when a server has a change + in status. So from online -> offline or offline -> online.

    Offline: + You will receive a notification when a server goes offline for the *FIRST TIME + ONLY*. For example, your cronjob is every 15 minutes and your server goes down at + 1 am and stays down till 6 am. You will get 1 notification at 1 am and that\'s + it.

    Always: You will receive a notification every time the script + runs and a site is down, even if the site has been offline for hours.', + 'alert_type_status' => 'Status change', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Always', 'combine_notifications' => 'Combine notifications', - 'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into 1 single notification. (This does not affect SMS notifications.)', - 'alert_proxy' => 'Even if enabled, proxy is never used for services', - 'alert_proxy_url' => 'Format: host:port', - 'log_status' => 'Log status', - 'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the notification settings are passed.', - 'log_email' => 'Log emails sent by the script', - 'log_sms' => 'Log text messages sent by the script', - 'log_pushover' => 'Log pushover messages sent by the script', - 'log_telegram' => 'Log Telegram messages sent by the script', - 'updated' => 'The configuration has been updated.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Email settings', - 'settings_sms' => 'Text message settings', - 'settings_pushover' => 'Pushover settings', - 'settings_telegram' => 'Telegram settings', - 'settings_notification' => 'Notification settings', - 'settings_log' => 'Log settings', - 'settings_proxy' => 'Proxy settings', - 'auto_refresh' => 'Auto-refresh', - 'auto_refresh_description' => - 'Auto-refresh servers page.
    '. - ''. - 'Time in seconds, if 0 the page won\'t refresh.'. - '', - 'seconds' => 'seconds', - 'test' => 'Test', - 'test_email' => 'An email will be sent to the address specified in your user profile.', - 'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.', - 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user profile.', - 'test_telegram' => 'A Telegram notification will be sent to the chat id specified in your user profile.', - 'send' => 'Send', - 'test_subject' => 'Test', - 'test_message' => 'Test message', - 'email_sent' => 'Email sent', - 'email_error' => 'Error in email sending', - 'sms_sent' => 'SMS sent', - 'sms_error' => 'An error has occurred while sending the SMS: %s', - 'sms_error_nomobile' => 'Unable to send test SMS: no valid phone number found in your profile.', - 'pushover_sent' => 'Pushover notification sent', - 'pushover_error' => 'An error has occurred while sending the Pushover notification: %s', - 'pushover_error_noapp' => 'Unable to send test notification: no Pushover App API token found in the global configuration.', - 'pushover_error_nokey' => 'Unable to send test notification: no Pushover key found in your profile.', - 'telegram_sent' => 'Telegram notification sent', - 'telegram_error' => 'An error has occurred while sending the Telegram notification: %s', - 'telegram_error_notoken' => 'Unable to send test notification: no Telegram API token found in the global configuration.', - 'telegram_error_noid' => 'Unable to send test notification: no chat id found in your profile.', - 'log_retention_period' => 'Log retention period', - 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server uptime. Enter 0 to disable log cleanup.', - 'log_retention_days' => 'days', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', - 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', - 'off_email_body' => "Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', - 'off_pushover_message' => "Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'off_telegram_message' => "Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING', - 'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', - 'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%', - 'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for: %LAST_OFFLINE_DURATION%

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%', - 'combi_off_email_message' => "
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: %ERROR%
    • Date: %DATE%
    ", - 'combi_off_pushover_message' => "
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: %ERROR%
    • Date: %DATE%
    ", - 'combi_off_telegram_message' => "- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Error: %ERROR%
    - Date: %DATE%

    ", - 'combi_on_email_message' => "
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Downtime: %LAST_OFFLINE_DURATION%
    • Date: %DATE%
    ", - 'combi_on_pushover_message' => '
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Downtime: %LAST_OFFLINE_DURATION%
    • Date: %DATE%
    ', - 'combi_on_telegram_message' => '- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Downtime: %LAST_OFFLINE_DURATION%
    - Date: %DATE%

    ', + 'combine_notifications_description' => 'Reduces the amount of notification by combining the notifications into + 1 single notification. (This does not affect SMS notifications.)', + 'alert_proxy' => 'Even if enabled, proxy is never used for services', + 'alert_proxy_url' => 'Format: host:port', + 'log_status' => 'Log status', + 'log_status_description' => 'If log status is set to TRUE, the monitor will log the event whenever the + notification settings are passed.', + 'log_email' => 'Log emails sent by the script', + 'log_sms' => 'Log text messages sent by the script', + 'log_pushover' => 'Log pushover messages sent by the script', + 'log_telegram' => 'Log Telegram messages sent by the script', + 'log_jabber' => 'Log Jabber messages sent by the script', + 'updated' => 'The configuration has been updated.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'tab_jabber' => 'Jabber', + 'settings_email' => 'Email settings', + 'settings_sms' => 'Text message settings', + 'settings_pushover' => 'Pushover settings', + 'settings_telegram' => 'Telegram settings', + 'settings_jabber' => 'Jabber settings', + 'settings_notification' => 'Notification settings', + 'settings_log' => 'Log settings', + 'settings_proxy' => 'Proxy settings', + 'auto_refresh' => 'Auto-refresh', + 'auto_refresh_description' => 'Auto-refresh servers page.
    Time in seconds, if 0 the + page won\'t refresh.', + 'seconds' => 'seconds', + 'test' => 'Test', + 'test_email' => 'An email will be sent to the address specified in your user profile.', + 'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.', + 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user + profile.', + 'test_telegram' => 'A Telegram notification will be sent to the chat id specified in your user profile.', + 'test_jabber' => 'A Jabber notification will be sent to the jabber account specified in your user profile.', + 'send' => 'Send', + 'test_subject' => 'Test', + 'test_message' => 'Test message', + 'email_sent' => 'Email sent', + 'email_error' => 'Error in email sending', + 'sms_sent' => 'SMS sent', + 'sms_error' => 'An error has occurred while sending the SMS: %s', + 'sms_error_nomobile' => 'Unable to send test SMS: no valid phone number found in your profile.', + 'pushover_sent' => 'Pushover notification sent', + 'pushover_error' => 'An error has occurred while sending the Pushover notification: %s', + 'pushover_error_noapp' => 'Unable to send test notification: no Pushover App API token found in the global + configuration.', + 'pushover_error_nokey' => 'Unable to send test notification: no Pushover key found in your profile.', + 'telegram_sent' => 'Telegram notification sent', + 'telegram_error' => 'An error has occurred while sending the Telegram notification: %s', + 'telegram_error_notoken' => 'Unable to send test notification: no Telegram API token found in the global + configuration.', + 'telegram_error_noid' => 'Unable to send test notification: no chat id found in your profile.', + 'jabber_sent' => 'Telegram notification sent', + 'jabber_error' => 'An error has occurred while sending the Telegram notification: %s', + 'jabber_error_noconfig' => 'Unable to send test notification: no Jabber account set in the global + configuration.', + 'jabber_error_noaccount' => 'Unable to send test notification: no Jabber account found in your profile.', + 'log_retention_period' => 'Log retention period', + 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server + uptime. Enter 0 to disable log cleanup.', + 'log_retention_days' => 'days', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', + 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', + 'off_email_body' => 'Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', + 'off_pushover_message' => 'Failed to connect to the following server:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'off_telegram_message' => 'Failed to connect to the following server:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'off_jabber_message' => 'Failed to connect to the following server:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING', + 'on_email_body' => 'Server \'%LABEL%\' is running again, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', + 'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for: + %LAST_OFFLINE_DURATION%

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'on_jabber_message' => 'Server \'%LABEL%\' is running again, it was down for: + %LAST_OFFLINE_DURATION%

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'combi_off_email_message' => '
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: + %ERROR%
    • Date: %DATE%
    ', + 'combi_off_pushover_message' => '
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Error: + %ERROR%
    • Date: %DATE%
    ', + 'combi_off_telegram_message' => '- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Error: %ERROR%
    - + Date: %DATE%

    ', + 'combi_off_jabber_message' => '- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Error: %ERROR%
    - + Date: %DATE%

    ', + 'combi_on_email_message' => '
    • Server: %LABEL%
    • IP: %IP%
    • Port: %PORT%
    • Downtime: + %LAST_OFFLINE_DURATION%
    • Date: %DATE%
    ', + 'combi_on_pushover_message' => '
    • Server: %LABEL%
    • IP: %IP%
    • Port: + %PORT%
    • Downtime: %LAST_OFFLINE_DURATION%
    • Date: + %DATE%
    ', + 'combi_on_telegram_message' => '- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Downtime: + %LAST_OFFLINE_DURATION%
    - Date: %DATE%

    ', + 'combi_on_jabber_message' => '- Server: %LABEL%
    - IP: %IP%
    - Port: %PORT%
    - Downtime: + %LAST_OFFLINE_DURATION%
    - Date: %DATE%

    ', 'combi_email_subject' => 'IMPORTANT: \'%UP%\' servers UP again, \'%DOWN%\' servers DOWN', - 'combi_pushover_subject' => '\'%UP%\' servers UP again, \'%DOWN%\' servers DOWN', - 'combi_email_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following servers are up again:
    %UP_SERVERS%', - 'combi_pushover_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following servers are up again:
    %UP_SERVERS%', - 'combi_telegram_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following servers are up again:
    %UP_SERVERS%', - ), - 'login' => array( - 'welcome_usermenu' => 'Welcome, %user_name%', - 'title_sign_in' => 'Please sign in', - 'title_forgot' => 'Forgot your password?', - 'title_reset' => 'Reset your password', - 'submit' => 'Submit', - 'remember_me' => 'Remember me', - 'login' => 'Login', - 'logout' => 'Logout', - 'username' => 'Username', - 'password' => 'Password', - 'password_repeat' => 'Repeat password', - 'password_forgot' => 'Forgot password?', - 'password_reset' => 'Reset password', - 'password_reset_email_subject' => 'Reset your password for PHP Server Monitor', - 'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.

    %link%', - 'error_user_incorrect' => 'The provided username could not be found.', - 'error_login_incorrect' => 'The information is incorrect.', - 'error_login_passwords_nomatch' => 'The provided passwords do not match.', - 'error_reset_invalid_link' => 'The reset link you provided is invalid.', - 'success_password_forgot' => 'An email has been sent to you with information how to reset your password.', - 'success_password_reset' => 'Your password has been reset successfully. Please login.', - ), - 'error' => array( - '401_unauthorized' => 'Unauthorized', - '401_unauthorized_description' => 'You do not have the privileges to view this page.', - ), + 'combi_pushover_subject' => '\'%UP%\' servers UP again, \'%DOWN%\' servers DOWN', + 'combi_email_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following + servers are up again:
    %UP_SERVERS%', + 'combi_pushover_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following + servers are up again:
    %UP_SERVERS%', + 'combi_telegram_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following + servers are up again:
    %UP_SERVERS%', + 'combi_jabber_message' => 'The following servers went down:
    %DOWN_SERVERS%
    The following + servers are up again:
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => 'Welcome, %user_name%', + 'title_sign_in' => 'Please sign in', + 'title_forgot' => 'Forgot your password?', + 'title_reset' => 'Reset your password', + 'submit' => 'Submit', + 'remember_me' => 'Remember me', + 'login' => 'Login', + 'logout' => 'Logout', + 'username' => 'Username', + 'password' => 'Password', + 'password_repeat' => 'Repeat password', + 'password_forgot' => 'Forgot password?', + 'password_reset' => 'Reset password', + 'password_reset_email_subject' => 'Reset your password for PHP Server Monitor', + 'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires + in 1 hour.

    %link%', + 'error_user_incorrect' => 'The provided username could not be found.', + 'error_login_incorrect' => 'The information is incorrect.', + 'error_login_passwords_nomatch' => 'The provided passwords do not match.', + 'error_reset_invalid_link' => 'The reset link you provided is invalid.', + 'success_password_forgot' => 'An email has been sent to you with information how to reset your password.', + 'success_password_reset' => 'Your password has been reset successfully. Please login.', + ), + 'error' => array( + '401_unauthorized' => 'Unauthorized', + '401_unauthorized_description' => 'You do not have the privileges to view this page.', + ), ); diff --git a/src/lang/es_ES.lang.php b/src/lang/es_ES.lang.php index 23d56cde..f869320a 100644 --- a/src/lang/es_ES.lang.php +++ b/src/lang/es_ES.lang.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Klemens Häckel - * @author Luis Rodriguez - * @author Mauro Vietri - * @author Federico Vera - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ + * @package phpservermon + * @author Klemens Häckel + * @author Luis Rodriguez + * @author Mauro Vietri + * @author Federico Vera + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ **/ + $sm_lang = array( - 'name' => 'Español - Spanish', - 'locale' => array( - '0' => 'es_ES.UTF-8', - '1' => 'es_ES', - '2' => 'spanish', - '3' => 'esp', - ), - 'locale_tag' => 'es', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Instalar', - 'action' => 'Acción', - 'save' => 'Guardar', - 'edit' => 'Modificar', - 'delete' => 'Eliminar', - 'view' => 'Ver', - 'date' => 'Fecha', - 'message' => 'Mensaje', - 'yes' => 'Si', - 'no' => 'No', - 'insert' => 'Insertar', - 'add_new' => 'Agregar nuevo', - 'update_available' => 'Hay una nueva versión ({version}) disponible en http://www.phpservermonitor.org.', - 'back_to_top' => 'Volver arriba', - 'go_back' => 'Volver', - 'ok' => 'Bueno', - 'bad' => 'Malo', - 'cancel' => 'Cancelar', - 'none' => 'None', - 'activate' => 'Activar', - 'short_day_format' => '%e de %B', - 'long_day_format' => '%e de %B de %Y', - 'yesterday_format' => 'Ayer a las %k:%M', - 'other_day_format' => '%A a las %k:%M', - 'never' => 'Nunca', - 'hours_ago' => 'Hace %d horas', - 'an_hour_ago' => 'Hace aproximadamente una hora', - 'minutes_ago' => 'Hace %d minutos', - 'a_minute_ago' => 'Hace aproximadamente un minuto', - 'seconds_ago' => 'Hace %d segundos', - 'a_second_ago' => 'Hace aproximadamente un segundo', - 'year' => 'año', - 'years' => 'años', - 'month' => 'mes', - 'months' => 'meses', - 'day' => 'día', - 'days' => 'días', - 'hour' => 'hora', - 'hours' => 'horas', - 'minute' => 'minuto', - 'minutes' => 'minutos', - 'second' => 'segundo', - 'seconds' => 'segundos', - 'current' => 'actual', - 'settings' => 'Configuración', - 'search' => 'Buscar', - ), - 'menu' => array( - 'config' => 'Configurar', - 'server' => 'Servidores', - 'server_log' => 'Registro', - 'server_status' => 'Estado', - 'server_update' => 'Actualizar', - 'user' => 'Usuarios', - 'help' => 'Ayuda', - ), - 'users' => array( - 'user' => 'Usuario', - 'name' => 'Nombre', - 'user_name' => 'Nombre de Usuario', - 'password' => 'Contraseña', - 'password_repeat' => 'Repetir Contraseña', - 'password_leave_blank' => 'Dejar en blanco para mantener sin cambios', - 'level' => 'Nivel', - 'level_10' => 'Administrador', - 'level_20' => 'Usuarios', - 'level_description' => 'Administradores tienen acceso completo: pueden administrar servidores, usuarios y editar la configuración global.
    Los usuarios sólo pueden ver y ejecutar el programa de actualización para los servidores que se han asignado a los mismos.', - 'mobile' => 'Móvil', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover es un servicio que hace que sea fácil de obtener notificaciones en tiempo real. Vea su página web para más información.', - 'pushover_key' => 'Clave Pushover', - 'pushover_device' => 'Dispositivo Pushover', - 'pushover_device_description' => 'Nombre del dispositivo para enviar el mensaje. Dejar en blanco para enviarlo a todos los dispositivos.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram is a chat app that makes it easy to get real-time notifications. Visit the documentation for more info and an install guide.', - 'telegram_chat_id' => 'Telegram chat id', - 'telegram_chat_id_description' => 'El mensaje será enviado al chat correspondiente.', - 'telegram_get_chat_id' => 'Haga click aquí para obtener su chat id', - 'activate_telegram' => 'Activar las notificaciones de Telegram', - 'activate_telegram_description' => 'Permitir a Telegram enviar notificaciones al chat id especificado. Sin este permiso, Telegram no podrá enviarle mensajes.', - 'telegram_bot_username_found' => '¡El bot fue encontrado!

    Esto abrirá un chat con el bot. Necesita presionar start o escribir /start.', - 'telegram_bot_username_error_token' => '401 - No autorizado. Por favor asegúrese que el Token es válido.', - 'telegram_bot_error' => 'Ocurrió un error activando las notificaciones de Telegram: %s', - 'delete_title' => 'Eliminar usuario', - 'delete_message' => 'Realmente desea eliminar el usuario \'%1\'?', - 'deleted' => 'Usuario eliminado.', - 'updated' => 'Usuario actualizado.', - 'inserted' => 'Usuario ingresado.', - 'profile' => 'Perfil', - 'profile_updated' => 'Su perfil ha sido actualizado.', - 'error_user_name_bad_length' => 'Los nombres de usuario deben tener entre 2 y 64 caracteres.', - 'error_user_name_invalid' => 'El nombre de usuario sólo puede contener caracteres alfabéticos (a-z, A-Z), números (0-9), puntos (.) y guiones bajos (_).', - 'error_user_name_exists' => 'El nombre de usuario dado ya existe en la base de datos.', - 'error_user_email_bad_length' => 'Direcciones de correo electrónico deben estar entre 5 y 255 caracteres.', - 'error_user_email_invalid' => 'La dirección de correo electrónico no es válida.', - 'error_user_level_invalid' => 'El nivel de usuario dado es inválido.', - 'error_user_no_match' => 'El usuario no se pudo encontrar en la base de datos.', - 'error_user_password_invalid' => 'La contraseña introducida no es válida.', - 'error_user_password_no_match' => 'Las contraseñas introducidas no coinciden.', - ), - 'log' => array( - 'title' => 'Registro', - 'type' => 'Tipo', - 'status' => 'Estado', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'No hay registros', - 'clear' => 'Borrar registros', - 'delete_title' => 'Eliminar registro', - 'delete_message' => '¿Estás seguro de que quieres eliminar todos los registros?', - ), - 'servers' => array( - 'server' => 'Servidores', - 'status' => 'Estado', - 'label' => 'Título', - 'domain' => 'Dominio/IP', - 'timeout' => 'Tiempo de espera', - 'timeout_description' => 'Número de segundos a esperar para que el servidor responda.', - 'authentication_settings' => 'Configuración de autenticación', - 'optional' => 'Opcional', - 'website_username' => 'Nombre de usuario', - 'website_username_description' => 'Nombre de usuario para acceder al sitio. (Solo se soporta la autenticación de Apache.)', - 'website_password' => 'Contraseña', - 'website_password_description' => 'Contraseña para acceder al sitio. La contraseña se almacenará encriptada en la base de datos.', - 'fieldset_monitoring' => 'Monitoreo', - 'fieldset_permissions' => 'Permisos', - 'permissions' => 'El servidor será visible para los siguientes usuarios', - 'port' => 'Puerto', - 'custom_port' => 'Puerto personalizado', - 'popular_ports' => 'Puertos comunes', - 'request_method' => 'Método', - 'custom_request_method' => 'Método personalizado', - 'popular_request_methods' => 'Método común', - 'post_field' => 'Post field', - 'post_field_description' => 'Los datos que serán enviado utilizando el método especificado.', - 'please_select' => 'Por favor seleccionar', - 'type' => 'Tipo', - 'type_website' => 'Sitio Web', - 'type_service' => 'Servicio', - 'type_ping' => 'Ping', - 'pattern' => 'Patrón/texto de búsqueda', - 'pattern_description' => 'Si el patrón no se encuentra en el sitio, se marcará al servidor como en línea/fuera de línea. Se permiten expresiones regulares.', - 'pattern_online' => 'El patrón indica si el servidor está:', - 'pattern_online_description' => 'En línea: Si el patrón no se encutra en el sitio, se marcará al servidor como en línea. Fuera de línea: Si el patrón no se encutra en el sitio, se marcará al servidor como furea de línea.', - 'redirect_check' => 'Redirigir a otra dirección es:', - 'redirect_check_description' => 'Redirigir normalmente es una mala señal.', - 'allow_http_status' => 'Permitir revisar el código de estado HTTP', - 'allow_http_status_description' => 'Marcar el sitio como en línea. Los estados HTTP menores que 400 son marcados como en línea por defecto. Separar con |.', - 'header_name' => 'Nombre del encabezado', - 'header_value' => 'Valor del encabezado', - 'header_name_description' => 'Respetar mayúsculas y minúsculas.', - 'header_value_description' => 'Se permiten expresiones regulares.', - 'last_check' => 'Último control', - 'last_online' => 'Última vez en línea', - 'last_offline' => 'Última vez fuera de línea', - 'last_output' => 'Última salida', - 'last_error' => 'Último error', - 'last_error_output' => 'Último error', - 'output' => 'Salida', - 'monitoring' => 'Monitoreado', - 'no_monitoring' => 'No monitoreando', - 'email' => 'Email', - 'send_email' => 'Enviar correo electrónico', - 'sms' => 'SMS', - 'send_sms' => 'Eviar SMS', - 'pushover' => 'Pushover', - 'send_pushover' => 'Enviar notificación por Pushover', - 'telegram' => 'Telegram', - 'send_telegram' => 'Enviar notificación por Telegram', - 'users' => 'Usuarios', - 'delete_title' => 'Eliminar servidor', - 'delete_message' => '¿Seguro que desea eliminar el servidor \'%1\'?', - 'deleted' => 'Servidor eliminado.', - 'updated' => 'Servidor actualizado.', - 'inserted' => 'Servidor ingresado.', - 'latency' => 'Latencia', - 'latency_max' => 'Latencia (máximo)', - 'latency_min' => 'Latencia (mínimo)', - 'latency_avg' => 'Latencia (promedio)', - 'online' => 'en línea', - 'offline' => 'fuera de línea', - 'uptime' => 'Activo', - 'year' => 'Año', - 'month' => 'Mes', - 'week' => 'Semana', - 'day' => 'Día', - 'hour' => 'Hora', - 'warning_threshold' => 'Umbral de advertencia', - 'warning_threshold_description' => 'Número de controles fallidos necesarios antes de que se marque como fuera de línea.', - 'chart_last_week' => 'Última semana', - 'chart_history' => 'Historial', - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Las notificaciones por SMS están desactivadas.', - 'warning_notifications_disabled_email' => 'Las notificaciones por correo electrónico están desactivados.', - 'warning_notifications_disabled_pushover' => 'Las notificaciones Pushover están desactivadas.', - 'warning_notifications_disabled_telegram' => 'Las notificaciones Telegram están desactivadas.', - 'error_server_no_match' => 'Servidor no encontrado.', - 'error_server_label_bad_length' => 'La etiqueta debe estar entre 1 y 255 caracteres.', - 'error_server_ip_bad_length' => 'El dominio / IP debe estar entre 1 y 255 caracteres.', - 'error_server_ip_bad_service' => 'La dirección IP no es válida.', - 'error_server_ip_bad_website' => 'El URL del Sitio Web no es válido.', - 'error_server_type_invalid' => 'El tipo de servidor seleccionado no es válido.', - 'error_server_warning_threshold_invalid' => 'El umbral de advertencia debe ser un entero válido mayor que 0.', - ), - 'config' => array( - 'general' => 'General', - 'language' => 'Idioma', - 'show_update' => '¿Comprobar actualizaciones?', - 'password_encrypt_key' => 'Clave cripográfica', - 'password_encrypt_key_note' => 'Esta es la clave utilizada para encriptar las contraseñas de acceso a los servidores. ¡Si la contraseña cambia las credenciales serán inválidas!', - 'proxy' => 'Activar Proxy', - 'proxy_url' => 'URL del proxy', - 'proxy_user' => 'Usuario', - 'proxy_password' => 'Contraseña', - 'email_status' => '¿Habilitar envio de email?', - 'email_from_email' => 'Dirección del Remitente', - 'email_from_name' => 'Nombre del Remitente', - 'email_smtp' => 'Habilitar SMTP', - 'email_smtp_host' => 'Servidor SMTP', - 'email_smtp_port' => 'Puerto SMTP', - 'email_smtp_security' => 'Seguridad SMTP', - 'email_smtp_security_none' => 'Ninguna', - 'email_smtp_username' => 'Usuario SMTP', - 'email_smtp_password' => 'Contraseña SMTP', - 'email_smtp_noauth' => 'Deja en blanco para ninguna autenticación', - 'sms_status' => '¿Habilitar envio de SMS?', - 'sms_gateway' => 'Proveedor de SMS', - 'sms_gateway_username' => 'Usuario', - 'sms_gateway_password' => 'Contraseña', - 'sms_from' => 'Número origen del SMS', - 'pushover_status' => '¿Habilitar el envío de mensajes Pushover?', - 'pushover_description' => 'Pushover es un servicio que hace que sea fácil de obtener notificaciones en tiempo real. Vea su página web para más información.', - 'pushover_clone_app' => 'Haga clic aquí para crear tu aplicación Pushover', - 'pushover_api_token' => 'Token API de Pushover', - 'pushover_api_token_description' => 'Antes de poder utilizar Pushover, necesita registrar su aplicación en la página web e ingresar el token API.', - 'telegram_status' => '¿Habilitar el envío de mensajes de Telegram?', - 'telegram_description' => 'Telegram es una aplicación de mensajería instantánea que permite recibir notificaciones en tiempo real. Visite la documentación para una guía mas detallada.', - 'telegram_api_token' => 'Token API de Telegram', - 'telegram_api_token_description' => 'Antes de utilizar Telegram, necesita un Token de API. Visite la documentación para más información.', - 'alert_type' => '¿Cuándo desea recibir notificaciones?', - 'alert_type_description' => 'Al cambiar el estado: p.ej. en línea -> fuera de línea o fuera de línea -> en línea.

    Fuera de Línea: Recibirá una notificación cuando el servidor esté fuera de línea.Se envia un sólo mensaje cuando se detecte la caída por primera vez.

    Siempre: Se le enviará una notificación cada vez que se ejecuta el script aunqué el servicio puede haber estado fuera de línea por varias horas.', - 'alert_type_status' => 'Cambio de estado', - 'alert_type_offline' => 'Fuera de Línea', - 'alert_type_always' => 'Siempre', - 'combine_notifications' => 'Combinar notificaciones', - 'combine_notifications_description' => 'Reduce la cantidad de notificaciones combinando los mensajes en una sola notificación. (Esto no afecta a las notificaciones por SMS.)', - 'alert_proxy' => 'Incluso si está activo, los proxy no se utilizarán para los servicios.', - 'alert_proxy_url' => 'Formato: host:puerto', - 'log_status' => 'Registro de estados', - 'log_status_description' => 'Al setear TRUE (marcar) se registrarán todos los estados.', - 'log_email' => 'Guardar emails enviados en el registro', - 'log_sms' => 'Guardar SMS enviados en el registro', - 'log_pushover' => 'Guardar notificaciones Pushover enviadas en el registro', - 'log_telegram' => 'Guardar notificaciones Telegram enviadas en el registro', - 'updated' => 'Configuración guardada.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Configuración de Correo Electrónico', - 'settings_sms' => 'Configuración de Mensajes de Texto', - 'settings_pushover' => 'Configuración de Pushover', - 'settings_telegram' => 'Configuración de Telegram', - 'settings_notification' => 'Configuración de las notificaciones', - 'settings_log' => 'Configuración de registros', - 'settings_proxy' => 'Configuración del proxy', - 'auto_refresh' => 'Auto-actualizar', - 'auto_refresh_description' => 'Auto-actualizar la página de servidores.
    Tiempo en segundos, si se utiliza 0 la página no se actualizará.', - 'seconds' => 'segundos', - 'test' => 'Prueba', - 'test_email' => 'Un correo electrónico será enviado a la dirección especificada en su perfil de usuario.', - 'test_sms' => 'Un SMS se enviará al número de teléfono especificado en su perfil de usuario.', - 'test_pushover' => 'Una notificación Pushover será enviada a la clave de usuario / dispositivo especificado en su perfil de usuario.', - 'test_telegram' => 'Una notificación de Telegram será enviada al chat id especificado en su perfil de usuario.', - 'send' => 'Enviar', - 'test_subject' => 'Prueba', - 'test_message' => 'Mensaje de prueba', - 'email_sent' => 'Correo enviado', - 'email_error' => 'Error al enviar el correo', - 'sms_sent' => 'SMS enviado', - 'sms_error' => 'Error al enviar el SMS: %s', - 'sms_error_nomobile' => 'Imposible enviar el SMS: no se encontró un número de teléfono válido en su perfil.', - 'pushover_sent' => 'Notificación de Pushover enviada', - 'pushover_error' => 'Ocurrió un error enviado la notificación de Pushover: %s', - 'pushover_error_noapp' => 'No se puede enviar una notificación de prueba: no existe un token API de Pushover en la configuración global.', - 'pushover_error_nokey' => 'No se puede enviar una notificación de prueba: no existe ninguna clave de Pushover en su perfil.', - 'telegram_sent' => 'Notificación de Telegram enviada', - 'telegram_error' => 'Ocurrió un error enviado la notificación de Telegram: %s', - 'telegram_error_notoken' => 'Imposible enviar la notificación: No se encontró un Token de API en la configuración global.', - 'telegram_error_noid' => 'Imposible enviar la notificación: No se encontró un chat id en su perfil.', - 'log_retention_period' => 'Período de retención del registro', - 'log_retention_period_description' => 'Número de días que se conservan registros de las notificaciones y los archivos de tiempo de actividad del servidor. Introduzca 0 para desactivar la limpieza de los registros.', - 'log_retention_days' => 'días', - ), - 'notifications' => array( - 'off_sms' => 'Servidor \'%LABEL%\' está fuera de línea: ip=%IP%, puerto=%PORT%. error=%ERROR%', - 'off_email_subject' => 'Importante: Servidor \'%LABEL%\' está fuera de línea', - 'off_email_body' => 'Imposible conectar al servidor:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Error: %ERROR%
    Fecha: %DATE%', - 'off_pushover_title' => 'Servidor \'%LABEL%\' está fuera de línea', - 'off_pushover_message' => 'No posible conectar al servidor:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Error: %ERROR%
    Fecha: %DATE%', - 'off_telegram_message' => 'No posible conectar al servidor:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Error: %ERROR%
    Fecha: %DATE%', - 'on_sms' => 'Servidor \'%LABEL%\' ya está de nuevo funcionando en línea: ip=%IP%, puerto=%PORT%, la duración de la caída fue de %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'Importante: Servidor \'%LABEL%\' ya está de nuevo en línea', - 'on_email_body' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la caída fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Fecha: %DATE%', - 'on_pushover_title' => 'Servidor \'%LABEL%\' ya está de nuevo en línea', - 'on_pushover_message' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la caída fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Fecha: %DATE%', - 'on_telegram_message' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la caída fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: %PORT%
    Fecha: %DATE%', - 'combi_off_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: %PORT%
    • Error: %ERROR%
    • Fecha: %DATE%
    ', - 'combi_off_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: %PORT%
    • Error: %ERROR%
    • Fecha: %DATE%
    ', - 'combi_off_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Puerto: %PORT%
    - Error: %ERROR%
    - Fecha: %DATE%

    ', - 'combi_on_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: %PORT%
    • Duración de la caída: %LAST_OFFLINE_DURATION%
    • Fecha: %DATE%
    ', - 'combi_on_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: %PORT%
    • Duración de la caída: %LAST_OFFLINE_DURATION%
    • Fecha: %DATE%
    ', - 'combi_on_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Puerto: %PORT%
    - Duración de la caída: %LAST_OFFLINE_DURATION%
    - Fecha: %DATE%

    ', - 'combi_email_subject' => 'IMPORTANTE: %UP% servidores están en línea, %DOWN% servidores están ahora fuera de línea', - 'combi_pushover_subject' => '%UP% servidores están en línea, %DOWN% servidores están ahora fuera de línea', - 'combi_email_message' => 'Los siguentes servidores están fuera de línea:
    %DOWN_SERVERS%
    Los siguientes servidores están en línea:
    %UP_SERVERS%', - 'combi_pushover_message' => 'Los siguentes servidores están fuera de línea:
    %DOWN_SERVERS%
    Los siguientes servidores están en línea:
    %UP_SERVERS%', - 'combi_telegram_message' => 'Los siguentes servidores están fuera de línea:
    %DOWN_SERVERS%
    Los siguientes servidores están en línea:
    %UP_SERVERS%', - ), - 'login' => array( - 'welcome_usermenu' => '%user_name%', - 'title_sign_in' => 'Por favor, inicie sesión', - 'title_forgot' => '¿Olvidaste tu contraseña?', - 'title_reset' => 'Restablecer su contraseña', - 'submit' => 'Enviar', - 'remember_me' => 'Recordarme', - 'login' => 'Iniciar sesión', - 'logout' => 'Salir', - 'username' => 'Nombre de usuario', - 'password' => 'Contraseña', - 'password_repeat' => 'Repita la contraseña', - 'password_forgot' => '¿Has olvidado tu contraseña?', - 'password_reset' => 'Perdí mi contraseña', - 'password_reset_email_subject' => 'Restablecer la contraseña para PHP Server Monitor', - 'password_reset_email_body' => 'Utilice el siguiente enlace para restablecer tu contraseña. Tenga en cuenta que expira de 1 hora.

    %link%', - 'error_user_incorrect' => 'El nombre de usuario proporcionado no se pudo encontrar.', - 'error_login_incorrect' => 'La información es incorrecta.', - 'error_login_passwords_nomatch' => 'Las contraseñas proporcionadas no coinciden.', - 'error_reset_invalid_link' => 'El vínculo de cambio que ya ha proporcionado no es válido.', - 'success_password_forgot' => 'Un correo electrónico ha sido enviado a usted con información de cómo restablecer su contraseña.', - 'success_password_reset' => 'Su contraseña ha sido restablecida correctamente. Por favor, inicia sesión.', - ), - 'error' => array( - '401_unauthorized' => 'No Autorizado', - '401_unauthorized_description' => 'Usted no tiene los privilegios para ver esta página.', - ), + 'name' => 'Español - Spanish', + 'locale' => array( + '0' => 'es_ES.UTF-8', + '1' => 'es_ES', + '2' => 'spanish', + '3' => 'esp', + ), + 'locale_tag' => 'es', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Instalar', + 'action' => 'Acción', + 'save' => 'Guardar', + 'edit' => 'Modificar', + 'delete' => 'Eliminar', + 'view' => 'Ver', + 'date' => 'Fecha', + 'message' => 'Mensaje', + 'yes' => 'Si', + 'no' => 'No', + 'insert' => 'Insertar', + 'add_new' => 'Agregar nuevo', + 'update_available' => 'Hay una nueva versión ({version}) disponible en http://www.phpservermonitor.org.', + 'back_to_top' => 'Volver arriba', + 'go_back' => 'Volver', + 'ok' => 'Bueno', + 'bad' => 'Malo', + 'cancel' => 'Cancelar', + 'none' => 'None', + 'activate' => 'Activar', + 'short_day_format' => '%e de %B', + 'long_day_format' => '%e de %B de %Y', + 'yesterday_format' => 'Ayer a las %k:%M', + 'other_day_format' => '%A a las %k:%M', + 'never' => 'Nunca', + 'hours_ago' => 'Hace %d horas', + 'an_hour_ago' => 'Hace aproximadamente una hora', + 'minutes_ago' => 'Hace %d minutos', + 'a_minute_ago' => 'Hace aproximadamente un minuto', + 'seconds_ago' => 'Hace %d segundos', + 'a_second_ago' => 'Hace aproximadamente un segundo', + 'year' => 'año', + 'years' => 'años', + 'month' => 'mes', + 'months' => 'meses', + 'day' => 'día', + 'days' => 'días', + 'hour' => 'hora', + 'hours' => 'horas', + 'minute' => 'minuto', + 'minutes' => 'minutos', + 'second' => 'segundo', + 'seconds' => 'segundos', + 'current' => 'actual', + 'settings' => 'Configuración', + 'search' => 'Buscar', + ), + 'menu' => array( + 'config' => 'Configurar', + 'server' => 'Servidores', + 'server_log' => 'Registro', + 'server_status' => 'Estado', + 'server_update' => 'Actualizar', + 'user' => 'Usuarios', + 'help' => 'Ayuda', + ), + 'users' => array( + 'user' => 'Usuario', + 'name' => 'Nombre', + 'user_name' => 'Nombre de Usuario', + 'password' => 'Contraseña', + 'password_repeat' => 'Repetir Contraseña', + 'password_leave_blank' => 'Dejar en blanco para mantener sin cambios', + 'level' => 'Nivel', + 'level_10' => 'Administrador', + 'level_20' => 'Usuarios', + 'level_description' => 'Administradores tienen acceso completo: pueden administrar servidores, usuarios + y editar la configuración global.
    Los usuarios sólo pueden ver y ejecutar + el programa de actualización para los servidores que se han asignado a los mismos.', + 'mobile' => 'Móvil', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover es un servicio que hace que sea fácil de obtener notificaciones en tiempo + real. Vea su página web para + más información.', + 'pushover_key' => 'Clave Pushover', + 'pushover_device' => 'Dispositivo Pushover', + 'pushover_device_description' => 'Nombre del dispositivo para enviar el mensaje. Dejar en blanco para enviarlo + a todos los dispositivos.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram is a chat app that + makes it easy to get real-time notifications. Visit the documentation for more + info and an install guide.', + 'telegram_chat_id' => 'Telegram chat id', + 'telegram_chat_id_description' => 'El mensaje será enviado al chat correspondiente.', + 'telegram_get_chat_id' => 'Haga click aquí para obtener su chat id', + 'activate_telegram' => 'Activar las notificaciones de Telegram', + 'activate_telegram_description' => 'Permitir a Telegram enviar notificaciones al chat id especificado. Sin + este permiso, Telegram no podrá enviarle mensajes.', + 'telegram_bot_username_found' => '¡El bot fue encontrado!
    +
    Esto abrirá un chat con el bot. Necesita presionar start o escribir + /start.', + 'telegram_bot_username_error_token' => '401 - No autorizado. Por favor asegúrese que el Token es válido.', + 'telegram_bot_error' => 'Ocurrió un error activando las notificaciones de Telegram: %s', + 'delete_title' => 'Eliminar usuario', + 'delete_message' => 'Realmente desea eliminar el usuario \'%1\'?', + 'deleted' => 'Usuario eliminado.', + 'updated' => 'Usuario actualizado.', + 'inserted' => 'Usuario ingresado.', + 'profile' => 'Perfil', + 'profile_updated' => 'Su perfil ha sido actualizado.', + 'error_user_name_bad_length' => 'Los nombres de usuario deben tener entre 2 y 64 caracteres.', + 'error_user_name_invalid' => 'El nombre de usuario sólo puede contener caracteres alfabéticos (a-z, A-Z), + números (0-9), puntos (.) y guiones bajos (_).', + 'error_user_name_exists' => 'El nombre de usuario dado ya existe en la base de datos.', + 'error_user_email_bad_length' => 'Direcciones de correo electrónico deben estar entre 5 y 255 caracteres.', + 'error_user_email_invalid' => 'La dirección de correo electrónico no es válida.', + 'error_user_level_invalid' => 'El nivel de usuario dado es inválido.', + 'error_user_no_match' => 'El usuario no se pudo encontrar en la base de datos.', + 'error_user_password_invalid' => 'La contraseña introducida no es válida.', + 'error_user_password_no_match' => 'Las contraseñas introducidas no coinciden.', + ), + 'log' => array( + 'title' => 'Registro', + 'type' => 'Tipo', + 'status' => 'Estado', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'No hay registros', + 'clear' => 'Borrar registros', + 'delete_title' => 'Eliminar registro', + 'delete_message' => '¿Estás seguro de que quieres eliminar todos los registros?', + ), + 'servers' => array( + 'server' => 'Servidores', + 'status' => 'Estado', + 'label' => 'Título', + 'domain' => 'Dominio/IP', + 'timeout' => 'Tiempo de espera', + 'timeout_description' => 'Número de segundos a esperar para que el servidor responda.', + 'authentication_settings' => 'Configuración de autenticación', + 'optional' => 'Opcional', + 'website_username' => 'Nombre de usuario', + 'website_username_description' => 'Nombre de usuario para acceder al sitio. (Solo se soporta la autenticación + de Apache.)', + 'website_password' => 'Contraseña', + 'website_password_description' => 'Contraseña para acceder al sitio. La contraseña se almacenará encriptada + en la base de datos.', + 'fieldset_monitoring' => 'Monitoreo', + 'fieldset_permissions' => 'Permisos', + 'permissions' => 'El servidor será visible para los siguientes usuarios', + 'port' => 'Puerto', + 'custom_port' => 'Puerto personalizado', + 'popular_ports' => 'Puertos comunes', + 'request_method' => 'Método', + 'custom_request_method' => 'Método personalizado', + 'popular_request_methods' => 'Método común', + 'post_field' => 'Post field', + 'post_field_description' => 'Los datos que serán enviado utilizando el método especificado.', + 'please_select' => 'Por favor seleccionar', + 'type' => 'Tipo', + 'type_website' => 'Sitio Web', + 'type_service' => 'Servicio', + 'type_ping' => 'Ping', + 'pattern' => 'Patrón/texto de búsqueda', + 'pattern_description' => 'Si el patrón no se encuentra en el sitio, se marcará al servidor como en + línea/fuera de línea. Se permiten expresiones regulares.', + 'pattern_online' => 'El patrón indica si el servidor está:', + 'pattern_online_description' => 'En línea: Si el patrón encuentra en el sitio, se marcará al servidor como + en línea. Fuera de línea: Si el patrón no se encutra en el sitio, se + marcará al servidor como furea de línea.', + 'redirect_check' => 'Redirigir a otra dirección es:', + 'redirect_check_description' => 'Redirigir normalmente es una mala señal.', + 'allow_http_status' => 'Permitir revisar el código de estado HTTP', + 'allow_http_status_description' => 'Marcar el sitio como en línea. Los estados HTTP menores que 400 son + marcados como en línea por defecto. Separar con |.', + 'header_name' => 'Nombre del encabezado', + 'header_value' => 'Valor del encabezado', + 'header_name_description' => 'Respetar mayúsculas y minúsculas.', + 'header_value_description' => 'Se permiten expresiones regulares.', + 'last_check' => 'Último control', + 'last_online' => 'Última vez en línea', + 'last_offline' => 'Última vez fuera de línea', + 'last_output' => 'Última salida', + 'last_error' => 'Último error', + 'last_error_output' => 'Último error', + 'output' => 'Salida', + 'monitoring' => 'Monitoreado', + 'no_monitoring' => 'No monitoreando', + 'email' => 'Email', + 'send_email' => 'Enviar correo electrónico', + 'sms' => 'SMS', + 'send_sms' => 'Eviar SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Enviar notificación por Pushover', + 'telegram' => 'Telegram', + 'send_telegram' => 'Enviar notificación por Telegram', + 'users' => 'Usuarios', + 'delete_title' => 'Eliminar servidor', + 'delete_message' => '¿Seguro que desea eliminar el servidor \'%1\'?', + 'deleted' => 'Servidor eliminado.', + 'updated' => 'Servidor actualizado.', + 'inserted' => 'Servidor ingresado.', + 'latency' => 'Latencia', + 'latency_max' => 'Latencia (máximo)', + 'latency_min' => 'Latencia (mínimo)', + 'latency_avg' => 'Latencia (promedio)', + 'online' => 'en línea', + 'offline' => 'fuera de línea', + 'uptime' => 'Activo', + 'year' => 'Año', + 'month' => 'Mes', + 'week' => 'Semana', + 'day' => 'Día', + 'hour' => 'Hora', + 'warning_threshold' => 'Umbral de advertencia', + 'warning_threshold_description' => 'Número de controles fallidos necesarios antes de que se marque como fuera + de línea.', + 'chart_last_week' => 'Última semana', + 'chart_history' => 'Historial', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Las notificaciones por SMS están desactivadas.', + 'warning_notifications_disabled_email' => 'Las notificaciones por correo electrónico están desactivados.', + 'warning_notifications_disabled_pushover' => 'Las notificaciones Pushover están desactivadas.', + 'warning_notifications_disabled_telegram' => 'Las notificaciones Telegram están desactivadas.', + 'error_server_no_match' => 'Servidor no encontrado.', + 'error_server_label_bad_length' => 'La etiqueta debe estar entre 1 y 255 caracteres.', + 'error_server_ip_bad_length' => 'El dominio / IP debe estar entre 1 y 255 caracteres.', + 'error_server_ip_bad_service' => 'La dirección IP no es válida.', + 'error_server_ip_bad_website' => 'El URL del Sitio Web no es válido.', + 'error_server_type_invalid' => 'El tipo de servidor seleccionado no es válido.', + 'error_server_warning_threshold_invalid' => 'El umbral de advertencia debe ser un entero válido mayor que 0.', + ), + 'config' => array( + 'general' => 'General', + 'language' => 'Idioma', + 'show_update' => '¿Comprobar actualizaciones?', + 'password_encrypt_key' => 'Clave cripográfica', + 'password_encrypt_key_note' => 'Esta es la clave utilizada para encriptar las contraseñas de acceso a los + servidores. ¡Si la contraseña cambia las credenciales serán inválidas!', + 'proxy' => 'Activar Proxy', + 'proxy_url' => 'URL del proxy', + 'proxy_user' => 'Usuario', + 'proxy_password' => 'Contraseña', + 'email_status' => '¿Habilitar envio de email?', + 'email_from_email' => 'Dirección del Remitente', + 'email_from_name' => 'Nombre del Remitente', + 'email_smtp' => 'Habilitar SMTP', + 'email_smtp_host' => 'Servidor SMTP', + 'email_smtp_port' => 'Puerto SMTP', + 'email_smtp_security' => 'Seguridad SMTP', + 'email_smtp_security_none' => 'Ninguna', + 'email_smtp_username' => 'Usuario SMTP', + 'email_smtp_password' => 'Contraseña SMTP', + 'email_smtp_noauth' => 'Deja en blanco para ninguna autenticación', + 'sms_status' => '¿Habilitar envio de SMS?', + 'sms_gateway' => 'Proveedor de SMS', + 'sms_gateway_username' => 'Usuario', + 'sms_gateway_password' => 'Contraseña', + 'sms_from' => 'Número origen del SMS', + 'pushover_status' => '¿Habilitar el envío de mensajes Pushover?', + 'pushover_description' => 'Pushover es un servicio que hace que sea fácil de obtener notificaciones en tiempo + real. Vea su página web para + más información.', + 'pushover_clone_app' => 'Haga clic aquí para crear tu aplicación Pushover', + 'pushover_api_token' => 'Token API de Pushover', + 'pushover_api_token_description' => 'Antes de poder utilizar Pushover, necesita registrar su aplicación en la página web e + ingresar el token API.', + 'telegram_status' => '¿Habilitar el envío de mensajes de Telegram?', + 'telegram_description' => 'Telegram es una aplicación de + mensajería instantánea que permite recibir notificaciones en tiempo real. Visite + la documentación + para una guía mas detallada.', + 'telegram_api_token' => 'Token API de Telegram', + 'telegram_api_token_description' => 'Antes de utilizar Telegram, necesita un Token de API. Visite la documentación para más información.', + 'alert_type' => '¿Cuándo desea recibir notificaciones?', + 'alert_type_description' => 'Al cambiar el estado: p.ej. en línea -> fuera de línea o fuera de línea + -> en línea.

    Fuera de Línea: Recibirá una notificación cuando + el servidor esté fuera de línea.Se envia un sólo mensaje cuando se detecte la + caída por primera vez.

    Siempre: Se le enviará una notificación + cada vez que se ejecuta el script aunqué el servicio puede haber estado fuera de + línea por varias horas.', + 'alert_type_status' => 'Cambio de estado', + 'alert_type_offline' => 'Fuera de Línea', + 'alert_type_always' => 'Siempre', + 'combine_notifications' => 'Combinar notificaciones', + 'combine_notifications_description' => 'Reduce la cantidad de notificaciones combinando los mensajes en una + sola notificación. (Esto no afecta a las notificaciones por SMS.)', + 'alert_proxy' => 'Incluso si está activo, los proxy no se utilizarán para los servicios.', + 'alert_proxy_url' => 'Formato: host:puerto', + 'log_status' => 'Registro de estados', + 'log_status_description' => 'Al setear TRUE (marcar) se registrarán todos los estados.', + 'log_email' => 'Guardar emails enviados en el registro', + 'log_sms' => 'Guardar SMS enviados en el registro', + 'log_pushover' => 'Guardar notificaciones Pushover enviadas en el registro', + 'log_telegram' => 'Guardar notificaciones Telegram enviadas en el registro', + 'updated' => 'Configuración guardada.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Configuración de Correo Electrónico', + 'settings_sms' => 'Configuración de Mensajes de Texto', + 'settings_pushover' => 'Configuración de Pushover', + 'settings_telegram' => 'Configuración de Telegram', + 'settings_notification' => 'Configuración de las notificaciones', + 'settings_log' => 'Configuración de registros', + 'settings_proxy' => 'Configuración del proxy', + 'auto_refresh' => 'Auto-actualizar', + 'auto_refresh_description' => 'Auto-actualizar la página de servidores.
    Tiempo en + segundos, si se utiliza 0 la página no se actualizará.', + 'seconds' => 'segundos', + 'test' => 'Prueba', + 'test_email' => 'Un correo electrónico será enviado a la dirección especificada en su perfil de usuario.', + 'test_sms' => 'Un SMS se enviará al número de teléfono especificado en su perfil de usuario.', + 'test_pushover' => 'Una notificación Pushover será enviada a la clave de usuario / dispositivo especificado + en su perfil de usuario.', + 'test_telegram' => 'Una notificación de Telegram será enviada al chat id especificado en su perfil de + usuario.', + 'send' => 'Enviar', + 'test_subject' => 'Prueba', + 'test_message' => 'Mensaje de prueba', + 'email_sent' => 'Correo enviado', + 'email_error' => 'Error al enviar el correo', + 'sms_sent' => 'SMS enviado', + 'sms_error' => 'Error al enviar el SMS: %s', + 'sms_error_nomobile' => 'Imposible enviar el SMS: no se encontró un número de teléfono válido en su + perfil.', + 'pushover_sent' => 'Notificación de Pushover enviada', + 'pushover_error' => 'Ocurrió un error enviado la notificación de Pushover: %s', + 'pushover_error_noapp' => 'No se puede enviar una notificación de prueba: no existe un token API de Pushover + en la configuración global.', + 'pushover_error_nokey' => 'No se puede enviar una notificación de prueba: no existe ninguna clave de Pushover + en su perfil.', + 'telegram_sent' => 'Notificación de Telegram enviada', + 'telegram_error' => 'Ocurrió un error enviado la notificación de Telegram: %s', + 'telegram_error_notoken' => 'Imposible enviar la notificación: No se encontró un Token de API en la + configuración global.', + 'telegram_error_noid' => 'Imposible enviar la notificación: No se encontró un chat id en su perfil.', + 'log_retention_period' => 'Período de retención del registro', + 'log_retention_period_description' => 'Número de días que se conservan registros de las notificaciones y los + archivos de tiempo de actividad del servidor. Introduzca 0 para + desactivar la limpieza de los registros.', + 'log_retention_days' => 'días', + ), + 'notifications' => array( + 'off_sms' => 'Servidor \'%LABEL%\' está fuera de línea: ip=%IP%, puerto=%PORT%. error=%ERROR%', + 'off_email_subject' => 'Importante: Servidor \'%LABEL%\' está fuera de línea', + 'off_email_body' => 'Imposible conectar al servidor:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: + %PORT%
    Error: %ERROR%
    Fecha: %DATE%', + 'off_pushover_title' => 'Servidor \'%LABEL%\' está fuera de línea', + 'off_pushover_message' => 'No posible conectar al servidor:

    Servidor: %LABEL%
    IP: + %IP%
    Puerto: %PORT%
    Error: %ERROR%
    Fecha: %DATE%', + 'off_telegram_message' => 'No posible conectar al servidor:

    Servidor: %LABEL%
    IP: + %IP%
    Puerto: %PORT%
    Error: %ERROR%
    Fecha: %DATE%', + 'on_sms' => 'Servidor \'%LABEL%\' ya está de nuevo funcionando en línea: ip=%IP%, puerto=%PORT%, la + duración de la caída fue de %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'Importante: Servidor \'%LABEL%\' ya está de nuevo en línea', + 'on_email_body' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la caída + fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Puerto: + %PORT%
    Fecha: %DATE%', + 'on_pushover_title' => 'Servidor \'%LABEL%\' ya está de nuevo en línea', + 'on_pushover_message' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la + caída fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: + %IP%
    Puerto: %PORT%
    Fecha: %DATE%', + 'on_telegram_message' => 'Servidor \'%LABEL%\' ya está funcionando en línea de nuevo, la duración de la + caída fue de %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: + %IP%
    Puerto: %PORT%
    Fecha: %DATE%', + 'combi_off_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: %PORT%
    • Error: + %ERROR%
    • Fecha: %DATE%
    ', + 'combi_off_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: + %PORT%
    • Error: %ERROR%
    • Fecha: %DATE%
    ', + 'combi_off_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Puerto: %PORT%
    - Error: + %ERROR%
    - Fecha: %DATE%

    ', + 'combi_on_email_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: + %PORT%
    • Duración de la caída: %LAST_OFFLINE_DURATION%
    • Fecha: + %DATE%
    ', + 'combi_on_pushover_message' => '
    • Servidor: %LABEL%
    • IP: %IP%
    • Puerto: + %PORT%
    • Duración de la caída: %LAST_OFFLINE_DURATION%
    • Fecha: + %DATE%
    ', + 'combi_on_telegram_message' => '- Servidor: %LABEL%
    - IP: %IP%
    - Puerto: %PORT%
    - Duración de la + caída: %LAST_OFFLINE_DURATION%
    - Fecha: %DATE%

    ', + 'combi_email_subject' => 'IMPORTANTE: %UP% servidores están en línea, %DOWN% servidores están ahora fuera + de línea', + 'combi_pushover_subject' => '%UP% servidores están en línea, %DOWN% servidores están ahora fuera de línea', + 'combi_email_message' => 'Los siguentes servidores están fuera de línea:
    %DOWN_SERVERS%
    Los + siguientes servidores están en línea:
    %UP_SERVERS%', + 'combi_pushover_message' => 'Los siguentes servidores están fuera de + línea:
    %DOWN_SERVERS%
    Los siguientes servidores están en + línea:
    %UP_SERVERS%', + 'combi_telegram_message' => 'Los siguentes servidores están fuera de + línea:
    %DOWN_SERVERS%
    Los siguientes servidores están en + línea:
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => '%user_name%', + 'title_sign_in' => 'Por favor, inicie sesión', + 'title_forgot' => '¿Olvidaste tu contraseña?', + 'title_reset' => 'Restablecer su contraseña', + 'submit' => 'Enviar', + 'remember_me' => 'Recordarme', + 'login' => 'Iniciar sesión', + 'logout' => 'Salir', + 'username' => 'Nombre de usuario', + 'password' => 'Contraseña', + 'password_repeat' => 'Repita la contraseña', + 'password_forgot' => '¿Has olvidado tu contraseña?', + 'password_reset' => 'Perdí mi contraseña', + 'password_reset_email_subject' => 'Restablecer la contraseña para PHP Server Monitor', + 'password_reset_email_body' => 'Utilice el siguiente enlace para restablecer tu contraseña. Tenga en cuenta + que expira de 1 hora.

    %link%', + 'error_user_incorrect' => 'El nombre de usuario proporcionado no se pudo encontrar.', + 'error_login_incorrect' => 'La información es incorrecta.', + 'error_login_passwords_nomatch' => 'Las contraseñas proporcionadas no coinciden.', + 'error_reset_invalid_link' => 'El vínculo de cambio que ya ha proporcionado no es válido.', + 'success_password_forgot' => 'Un correo electrónico ha sido enviado a usted con información de cómo + restablecer su contraseña.', + 'success_password_reset' => 'Su contraseña ha sido restablecida correctamente. Por favor, inicia sesión.', + ), + 'error' => array( + '401_unauthorized' => 'No Autorizado', + '401_unauthorized_description' => 'Usted no tiene los privilegios para ver esta página.', + ), ); diff --git a/src/lang/et_ET.lang.php b/src/lang/et_ET.lang.php index d7a90bd5..31d5850f 100644 --- a/src/lang/et_ET.lang.php +++ b/src/lang/et_ET.lang.php @@ -1,4 +1,5 @@ 'Eesti keel - Estonian', - 'locale' => array('et_ET.UTF-8', 'et_ET', 'estonian'), - 'locale_tag' => 'et', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Serveri Monitor', - 'install' => 'Installeeri', - 'action' => 'Toiming', - 'save' => 'Salvesta', - 'edit' => 'Muuda', - 'delete' => 'Kustuta', - 'date' => 'Kuupäev', - 'message' => 'Sõnum', - 'yes' => 'Jah', - 'no' => 'Ei', - 'insert' => 'Sisesta', - 'add_new' => 'Lisa uus', - 'update_available' => 'Uus versioon ({version}) on saadaval http://www.phpservermonitor.org.', - 'back_to_top' => 'Tagasi üles', - 'go_back' => 'Mine tagasi', - 'ok' => 'OK', - 'cancel' => 'Tühista', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Eile kell %k:%M', - 'other_day_format' => '%A kell %k:%M', - 'never' => 'Never', - 'hours_ago' => '%d tundi tagasi', - 'an_hour_ago' => 'umbes tund aega tagasi', - 'minutes_ago' => '%d minutit tagasi', - 'a_minute_ago' => 'umbes minut aega tagasi', - 'seconds_ago' => '%d sekundit tagasi', - 'a_second_ago' => 'üks sekund tagasi', - ), - 'menu' => array( - 'config' => 'Konfiguratsioon', - 'server' => 'Serverid', - 'server_log' => 'Logi', - 'server_status' => 'Staatus', - 'server_update' => 'Uuenda', - 'user' => 'Kasutajad', - 'help' => 'Abi', - ), - 'users' => array( - 'user' => 'Kasutaja', - 'name' => 'Nimi', - 'user_name' => 'Kasutajanimi', - 'password' => 'Parool', - 'password_repeat' => 'Korda parooli', - 'password_leave_blank' => 'Jäta tühjaks, et jätta samaks', - 'level' => 'Tase', - 'level_10' => 'Administraator', - 'level_20' => 'Kasutaja', - 'level_description' => 'Administraatoritel on täielik ligipääs: nad saavad hallata servereid, kasutajaid ja muuta globaalset konfiguratsiooni.
    Kasutajad saavad ainult näha ja uuendada neid servereid, mis on neile määratud.', - 'mobile' => 'Mobiil', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover on teenus, mis teeb reaalaja teavitused imelihtsaks. Vaata nende kodulehte rohkema info jaoks.', - 'pushover_key' => 'Pushoveri Võti', - 'pushover_device' => 'Pushoveri Seade', - 'pushover_device_description' => 'Seadme nimi, kuhu teavitus saata. Jäta tühjaks, et saata igale seadmele.', - 'delete_title' => 'Kustuta Kasutaja', - 'delete_message' => 'Oled kindel, et soovid selle kasutaja kustutada \'%1\'?', - 'deleted' => 'Kasutaja kustutatud.', - 'updated' => 'Kasutaja uuendatud.', - 'inserted' => 'Kasutaja lisatud.', - 'profile' => 'Profiil', - 'profile_updated' => 'Sinu profiil on uuendatud.', - 'error_user_name_bad_length' => 'Kasutajanimi peab olema 2 kuni 64 tähemärki pikk.', - 'error_user_name_invalid' => 'Kasutajanimi võib koosneda ainult tähenumbrilistest kombinatsioonidest (a-z, A-Z), numbritest (0-9), punktid (.) ja alakriipsust (_).', - 'error_user_name_exists' => 'Antud kasutaja juba eksisteerib andmebaasis.', - 'error_user_email_bad_length' => 'Email võib olla 5 kuni 255 tähemärki pikk.', - 'error_user_email_invalid' => 'Emaili aadress on kehtetu.', - 'error_user_level_invalid' => 'Antud kasutaja tase on kehtetu.', - 'error_user_no_match' => 'Kasutajat ei leitud andmebaasist.', - 'error_user_password_invalid' => 'Sisestatud parool on kehtetu.', - 'error_user_password_no_match' => 'Sisestatud paroolid ei kattu.', - ), - 'log' => array( - 'title' => 'Logi kirjed', - 'type' => 'Tüüp', - 'status' => 'Staatus', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Logisid ei eksisteeri', - 'clear' => 'Puhasta logig', - 'delete_title' => 'Kustuta logi', - 'delete_message' => 'Kas olete kindel, et soovite kustutada kõik logid?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Staatus', - 'label' => 'Silt', - 'domain' => 'Domeen/IP', - 'timeout' => 'Ajalõpp', - 'timeout_description' => 'Arv sekundeid oodata serveri vastamiseks.', - 'port' => 'Port', - 'type' => 'Tüüp', - 'type_website' => 'Veebileht', - 'type_service' => 'Teenus', - 'pattern' => 'Otsi nööri/mudelit', - 'pattern_description' => 'Kui seda mudelit serverist ei leita, siis server märgitakse võrgustväljas. Tavapärased väljendid on lubatud.', - 'last_check' => 'Viimane kontroll', - 'last_online' => 'Viimati oli võrgus', - 'monitoring' => 'Jälgib', - 'no_monitoring' => 'Ei jälgi', - 'email' => 'Email', - 'send_email' => 'Saada Email', - 'sms' => 'SMS', - 'send_sms' => 'Saada SMS', - 'pushover' => 'Pushover', - 'users' => 'Kasutajad', - 'delete_title' => 'Kustuta server', - 'delete_message' => 'Oled kindel, et soovid serveri kustutada \'%1\'?', - 'deleted' => 'Server kustutatud.', - 'updated' => 'Server uuendatud.', - 'inserted' => 'Server lisatud.', - 'latency' => 'Viivitus', - 'latency_max' => 'Viivitus (maksimaalne)', - 'latency_min' => 'Viivitus (minimaalne)', - 'latency_avg' => 'Viivitus (keskmine)', - 'uptime' => 'Võrgus oldud aeg', - 'year' => 'Aasta', - 'month' => 'Kuu', - 'week' => 'Nädal', - 'day' => 'Päev', - 'hour' => 'Tund', - 'warning_threshold' => 'Hoiatuskünnis', - 'warning_threshold_description' => 'Arv ebaõnnestunud kontrolle enne võrgustväljas märkimist.', - 'chart_last_week' => 'Eelmine nädal', - 'chart_history' => 'Ajalugu', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS teavitused on väljas.', - 'warning_notifications_disabled_email' => 'Emaili teavitused on väljas.', - 'warning_notifications_disabled_pushover' => 'Pushover teavitused on väljas.', - 'error_server_no_match' => 'Serverit ei leitud.', - 'error_server_label_bad_length' => 'Silt peab olema 1 kuni 255 tähemärki pikk.', - 'error_server_ip_bad_length' => 'Domeen / IP peab olema 1 kuni 255 tähemärki pikk.', - 'error_server_ip_bad_service' => 'Antud IP aadress ei ole kehtiv.', - 'error_server_ip_bad_website' => 'Antud veebileht ei ole kehtiv.', - 'error_server_type_invalid' => 'Valitud server oli kehtetu.', - 'error_server_warning_threshold_invalid' => 'Hoiatuskünnis peab olema suurem täisarv kui 0.', - ), - 'config' => array( - 'general' => 'Üldine', - 'language' => 'Keel', - 'show_update' => 'Otsi värskendusi?', - 'email_status' => 'Luba emailide saatmine', - 'email_from_email' => 'Email aadressilt', - 'email_from_name' => 'Email nimelt', - 'email_smtp' => 'Luba SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP turvalisus', - 'email_smtp_security_none' => 'Mitte ükski', - 'email_smtp_username' => 'SMTP kasutajanimi', - 'email_smtp_password' => 'SMTP parool', - 'email_smtp_noauth' => 'Jäta tühjaks, et jätkata ilma autentimiseta', - 'sms_status' => 'Luba sõnumite saatmine', - 'sms_gateway' => 'Väravad sõnumite saatmiseks', - 'sms_gateway_username' => 'Värava kasutajanimi', - 'sms_gateway_password' => 'Värava parool', - 'sms_from' => 'Saatja telefoni number', - 'pushover_status' => 'Luba Pushoveri sõnumite saatmine', - 'pushover_description' => 'Pushover on teenus, mis teeb reaalaja teavitused imelihtsaks. Vaata nende kodulehte rohkema info jaoks.', - 'pushover_clone_app' => 'Kliki siia, et teha oma Pushover äpp', - 'pushover_api_token' => 'Pushover Äppi API Žetoon', - 'pushover_api_token_description' => 'Enne, kui saad Pushoverida pead sa regristreerima äpi nende kodulehel ja sisestama API žetooni siia.', - 'alert_type' => 'Vali, millal sa sooviksid olla teavitatud.', - 'alert_type_description' => 'Staatuse muutus: '. - 'Saate teavituse kui serveri staatuses toimub muudatusi. Seega kättesaadav -> võrgust väljas või võrgust väljas -> kättesaadav.
    '. - '
    Võrgust väljas: '. - 'Saate teavituse kui server läheb võrgust välja *ESIMEST KORDA*. Näiteks, '. - 'sinu cronjob on iga 15 minuti tagant ja sulgub kell 1 öösel kuni kella 6ni hommikul. '. - 'Saate 1 teavituse kell 1 öösel ja see on kõik.
    '. - '
    Alati: '. - 'Saate teavituse iga kord kui staatust uuendatakse, isegi kui leht on olnud maas juba tunde.', - 'alert_type_status' => 'Staatuse muutus', - 'alert_type_offline' => 'Võrgust väljas', - 'alert_type_always' => 'Alati', - 'log_status' => 'Logi staatus', - 'log_status_description' => 'Kui logimine on seatud TÕESEKS, siis monitor logib aktiivsuse mil teavituse seaded on läbitud.', - 'log_email' => 'Logi saadetud emailid', - 'log_sms' => 'Logi saadetud sõnumid', - 'log_pushover' => 'Logi Pushoveri saadetud teavitused', - 'updated' => 'Konfiguratsioon on uuendatud.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Emaili seaded', - 'settings_sms' => 'Sõnumite seaded', - 'settings_pushover' => 'Pushoveri seaded', - 'settings_notification' => 'Teavituste seaded', - 'settings_log' => 'Logi seaded', - 'auto_refresh' => 'Automaatne värskendamine', - 'auto_refresh_description' => - 'Värskenda lehte automaatselt.
    '. - ''. - 'Aeg sekundites, kui 0 siis lehte ei värskendata.'. - '', - 'seconds' => 'sekundit', - 'test' => 'Test', - 'test_email' => 'Email saadetakse profiilil märgitud aadressile.', - 'test_sms' => 'SMS saadetakse profiilil märgitud numbrile.', - 'test_pushover' => 'Pushover teavitus saadetakse profiilil märgitud seadmele/tele.', - 'send' => 'Saada', - 'test_subject' => 'Test', - 'test_message' => 'Test sõnum', - 'email_sent' => 'Email saadetud', - 'email_error' => 'Emaili saatmisel esines error', - 'sms_sent' => 'Sms saadetud', - 'sms_error' => 'Smsi saatmisel esines error. %s', - 'sms_error_nomobile' => 'Test SMSi ei saadetud: kehtivat telefoni numbrit ei leitud.', - 'pushover_sent' => 'Pushover teavitus saadetud', - 'pushover_error' => 'Pushover teavituse saatmisel esines error: %s', - 'pushover_error_noapp' => 'Test teavitust ei saadetud: Pushover API žetooni ei leitud globaalsest konfiguratsioonist.', - 'pushover_error_nokey' => 'Test teavitust ei saadetud: Pushover võtit ei leitud.', - 'log_retention_period' => 'Logi säilitamis periood', - 'log_retention_period_description' => 'Arv päevi, mil hoida logid alles. Sisesta 0, et keelata logide puhastus.', - 'log_retention_days' => 'päeva', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' on MAAS: ip=%IP%, port=%PORT%. Error=%ERROR%', - 'off_email_subject' => 'TÄHTIS: Server \'%LABEL%\' is MAAS', - 'off_email_body' => "Ühendus järgnevasse serverisse ebaõnnestus:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Kuupäev: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' on MAAS', - 'off_pushover_message' => "Ühendus järgnevasse serverisse ebaõnnestus:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Kuupäev: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' on KÄTTESAADAV: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'TÄHTIS: Server \'%LABEL%\' on kättesaadav', - 'on_email_body' => "Server '%LABEL%' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Kuupäev: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' on kättesaadav', - 'on_pushover_message' => 'Server \'%LABEL%\' on jälle kättesaadav, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Kuupäev: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Teretulemast, %user_name%', - 'title_sign_in' => 'Palun logi sisse', - 'title_forgot' => 'Unustasid oma salasõna?', - 'title_reset' => 'Lähtesta oma parool', - 'submit' => 'Esita', - 'remember_me' => 'Mäleta mind', - 'login' => 'Logi sisse', - 'logout' => 'Logi välja', - 'username' => 'Kasutajanimi', - 'password' => 'Parool', - 'password_repeat' => 'Korda salasõna', - 'password_forgot' => 'Unustasid salasõna?', - 'password_reset' => 'Lähtesta parool', - 'password_reset_email_subject' => 'Lähtestage oma PHP Serveri Monitori parool', - 'password_reset_email_body' => 'Palun kasutage järgnevat linki oma parooli lähtestamiseks. Palume tähendada, et see aegub 1 tunni jooksul.

    %link%', - 'error_user_incorrect' => 'Antud kasutaja ei ole kehtiv.', - 'error_login_incorrect' => 'Informatsioon ei ole õige.', - 'error_login_passwords_nomatch' => 'Sisestatud paroolid ei kattu.', - 'error_reset_invalid_link' => 'Teie antud lähtestus link ei kehti.', - 'success_password_forgot' => 'Teile saadeti email, kuidas lähtestada oma parooli.', - 'success_password_reset' => 'Teie parool on edukalt muudetud. Palun logige sisse.', - ), - 'error' => array( - '401_unauthorized' => 'Puuduvad õigused', - '401_unauthorized_description' => 'Teil ei ole piisavalt õigusi seda lehte vaadata.', - ), + 'name' => 'Eesti keel - Estonian', + 'locale' => array( + '0' => 'et_ET.UTF-8', + '1' => 'et_ET', + '2' => 'estonian', + ), + 'locale_tag' => 'et', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Serveri Monitor', + 'install' => 'Installeeri', + 'action' => 'Toiming', + 'save' => 'Salvesta', + 'edit' => 'Muuda', + 'delete' => 'Kustuta', + 'date' => 'Kuupäev', + 'message' => 'Sõnum', + 'yes' => 'Jah', + 'no' => 'Ei', + 'insert' => 'Sisesta', + 'add_new' => 'Lisa uus', + 'update_available' => 'Uus versioon ({version}) on saadaval http://www.phpservermonitor.org.', + 'back_to_top' => 'Tagasi üles', + 'go_back' => 'Mine tagasi', + 'ok' => 'OK', + 'cancel' => 'Tühista', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Eile kell %k:%M', + 'other_day_format' => '%A kell %k:%M', + 'never' => 'Never', + 'hours_ago' => '%d tundi tagasi', + 'an_hour_ago' => 'umbes tund aega tagasi', + 'minutes_ago' => '%d minutit tagasi', + 'a_minute_ago' => 'umbes minut aega tagasi', + 'seconds_ago' => '%d sekundit tagasi', + 'a_second_ago' => 'üks sekund tagasi', + ), + 'menu' => array( + 'config' => 'Konfiguratsioon', + 'server' => 'Serverid', + 'server_log' => 'Logi', + 'server_status' => 'Staatus', + 'server_update' => 'Uuenda', + 'user' => 'Kasutajad', + 'help' => 'Abi', + ), + 'users' => array( + 'user' => 'Kasutaja', + 'name' => 'Nimi', + 'user_name' => 'Kasutajanimi', + 'password' => 'Parool', + 'password_repeat' => 'Korda parooli', + 'password_leave_blank' => 'Jäta tühjaks, et jätta samaks', + 'level' => 'Tase', + 'level_10' => 'Administraator', + 'level_20' => 'Kasutaja', + 'level_description' => 'Administraatoritel on täielik ligipääs: nad saavad hallata servereid, + kasutajaid ja muuta globaalset konfiguratsiooni.
    Kasutajad saavad ainult + näha ja uuendada neid servereid, mis on neile määratud.', + 'mobile' => 'Mobiil', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover on teenus, mis teeb reaalaja teavitused imelihtsaks. Vaata nende kodulehte rohkema info + jaoks.', + 'pushover_key' => 'Pushoveri Võti', + 'pushover_device' => 'Pushoveri Seade', + 'pushover_device_description' => 'Seadme nimi, kuhu teavitus saata. Jäta tühjaks, et saata igale seadmele.', + 'delete_title' => 'Kustuta Kasutaja', + 'delete_message' => 'Oled kindel, et soovid selle kasutaja kustutada \'%1\'?', + 'deleted' => 'Kasutaja kustutatud.', + 'updated' => 'Kasutaja uuendatud.', + 'inserted' => 'Kasutaja lisatud.', + 'profile' => 'Profiil', + 'profile_updated' => 'Sinu profiil on uuendatud.', + 'error_user_name_bad_length' => 'Kasutajanimi peab olema 2 kuni 64 tähemärki pikk.', + 'error_user_name_invalid' => 'Kasutajanimi võib koosneda ainult tähenumbrilistest kombinatsioonidest (a-z, + A-Z), numbritest (0-9), punktid (.) ja alakriipsust (_).', + 'error_user_name_exists' => 'Antud kasutaja juba eksisteerib andmebaasis.', + 'error_user_email_bad_length' => 'Email võib olla 5 kuni 255 tähemärki pikk.', + 'error_user_email_invalid' => 'Emaili aadress on kehtetu.', + 'error_user_level_invalid' => 'Antud kasutaja tase on kehtetu.', + 'error_user_no_match' => 'Kasutajat ei leitud andmebaasist.', + 'error_user_password_invalid' => 'Sisestatud parool on kehtetu.', + 'error_user_password_no_match' => 'Sisestatud paroolid ei kattu.', + ), + 'log' => array( + 'title' => 'Logi kirjed', + 'type' => 'Tüüp', + 'status' => 'Staatus', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Logisid ei eksisteeri', + 'clear' => 'Puhasta logig', + 'delete_title' => 'Kustuta logi', + 'delete_message' => 'Kas olete kindel, et soovite kustutada kõik logid?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Staatus', + 'label' => 'Silt', + 'domain' => 'Domeen/IP', + 'timeout' => 'Ajalõpp', + 'timeout_description' => 'Arv sekundeid oodata serveri vastamiseks.', + 'port' => 'Port', + 'type' => 'Tüüp', + 'type_website' => 'Veebileht', + 'type_service' => 'Teenus', + 'pattern' => 'Otsi nööri/mudelit', + 'pattern_description' => 'Kui seda mudelit serverist ei leita, siis server märgitakse võrgustväljas. + Tavapärased väljendid on lubatud.', + 'last_check' => 'Viimane kontroll', + 'last_online' => 'Viimati oli võrgus', + 'monitoring' => 'Jälgib', + 'no_monitoring' => 'Ei jälgi', + 'email' => 'Email', + 'send_email' => 'Saada Email', + 'sms' => 'SMS', + 'send_sms' => 'Saada SMS', + 'pushover' => 'Pushover', + 'users' => 'Kasutajad', + 'delete_title' => 'Kustuta server', + 'delete_message' => 'Oled kindel, et soovid serveri kustutada \'%1\'?', + 'deleted' => 'Server kustutatud.', + 'updated' => 'Server uuendatud.', + 'inserted' => 'Server lisatud.', + 'latency' => 'Viivitus', + 'latency_max' => 'Viivitus (maksimaalne)', + 'latency_min' => 'Viivitus (minimaalne)', + 'latency_avg' => 'Viivitus (keskmine)', + 'uptime' => 'Võrgus oldud aeg', + 'year' => 'Aasta', + 'month' => 'Kuu', + 'week' => 'Nädal', + 'day' => 'Päev', + 'hour' => 'Tund', + 'warning_threshold' => 'Hoiatuskünnis', + 'warning_threshold_description' => 'Arv ebaõnnestunud kontrolle enne võrgustväljas märkimist.', + 'chart_last_week' => 'Eelmine nädal', + 'chart_history' => 'Ajalugu', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS teavitused on väljas.', + 'warning_notifications_disabled_email' => 'Emaili teavitused on väljas.', + 'warning_notifications_disabled_pushover' => 'Pushover teavitused on väljas.', + 'error_server_no_match' => 'Serverit ei leitud.', + 'error_server_label_bad_length' => 'Silt peab olema 1 kuni 255 tähemärki pikk.', + 'error_server_ip_bad_length' => 'Domeen / IP peab olema 1 kuni 255 tähemärki pikk.', + 'error_server_ip_bad_service' => 'Antud IP aadress ei ole kehtiv.', + 'error_server_ip_bad_website' => 'Antud veebileht ei ole kehtiv.', + 'error_server_type_invalid' => 'Valitud server oli kehtetu.', + 'error_server_warning_threshold_invalid' => 'Hoiatuskünnis peab olema suurem täisarv kui 0.', + ), + 'config' => array( + 'general' => 'Üldine', + 'language' => 'Keel', + 'show_update' => 'Otsi värskendusi?', + 'email_status' => 'Luba emailide saatmine', + 'email_from_email' => 'Email aadressilt', + 'email_from_name' => 'Email nimelt', + 'email_smtp' => 'Luba SMTP', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP turvalisus', + 'email_smtp_security_none' => 'Mitte ükski', + 'email_smtp_username' => 'SMTP kasutajanimi', + 'email_smtp_password' => 'SMTP parool', + 'email_smtp_noauth' => 'Jäta tühjaks, et jätkata ilma autentimiseta', + 'sms_status' => 'Luba sõnumite saatmine', + 'sms_gateway' => 'Väravad sõnumite saatmiseks', + 'sms_gateway_username' => 'Värava kasutajanimi', + 'sms_gateway_password' => 'Värava parool', + 'sms_from' => 'Saatja telefoni number', + 'pushover_status' => 'Luba Pushoveri sõnumite saatmine', + 'pushover_description' => 'Pushover on teenus, mis teeb reaalaja teavitused imelihtsaks. Vaata nende kodulehte rohkema info + jaoks.', + 'pushover_clone_app' => 'Kliki siia, et teha oma Pushover äpp', + 'pushover_api_token' => 'Pushover Äppi API Žetoon', + 'pushover_api_token_description' => 'Enne, kui saad Pushoverida pead sa regristreerima äpi nende kodulehel ja sisestama API + žetooni siia.', + 'alert_type' => 'Vali, millal sa sooviksid olla teavitatud.', + 'alert_type_description' => 'Staatuse muutus: Saate teavituse kui serveri staatuses toimub muudatusi. + Seega kättesaadav -> võrgust väljas või võrgust väljas -> + kättesaadav.

    Võrgust väljas: Saate teavituse kui server läheb + võrgust välja *ESIMEST KORDA*. Näiteks, sinu cronjob on iga 15 minuti tagant + ja sulgub kell 1 öösel kuni kella 6ni hommikul. Saate 1 teavituse kell 1 + öösel ja see on kõik.

    Alati: Saate teavituse iga kord kui + staatust uuendatakse, isegi kui leht on olnud maas juba tunde.', + 'alert_type_status' => 'Staatuse muutus', + 'alert_type_offline' => 'Võrgust väljas', + 'alert_type_always' => 'Alati', + 'log_status' => 'Logi staatus', + 'log_status_description' => 'Kui logimine on seatud TÕESEKS, siis monitor logib aktiivsuse mil teavituse + seaded on läbitud.', + 'log_email' => 'Logi saadetud emailid', + 'log_sms' => 'Logi saadetud sõnumid', + 'log_pushover' => 'Logi Pushoveri saadetud teavitused', + 'updated' => 'Konfiguratsioon on uuendatud.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Emaili seaded', + 'settings_sms' => 'Sõnumite seaded', + 'settings_pushover' => 'Pushoveri seaded', + 'settings_notification' => 'Teavituste seaded', + 'settings_log' => 'Logi seaded', + 'auto_refresh' => 'Automaatne värskendamine', + 'auto_refresh_description' => 'Värskenda lehte automaatselt.
    Aeg sekundites, kui 0 + siis lehte ei värskendata.', + 'seconds' => 'sekundit', + 'test' => 'Test', + 'test_email' => 'Email saadetakse profiilil märgitud aadressile.', + 'test_sms' => 'SMS saadetakse profiilil märgitud numbrile.', + 'test_pushover' => 'Pushover teavitus saadetakse profiilil märgitud seadmele/tele.', + 'send' => 'Saada', + 'test_subject' => 'Test', + 'test_message' => 'Test sõnum', + 'email_sent' => 'Email saadetud', + 'email_error' => 'Emaili saatmisel esines error', + 'sms_sent' => 'Sms saadetud', + 'sms_error' => 'Smsi saatmisel esines error. %s', + 'sms_error_nomobile' => 'Test SMSi ei saadetud: kehtivat telefoni numbrit ei leitud.', + 'pushover_sent' => 'Pushover teavitus saadetud', + 'pushover_error' => 'Pushover teavituse saatmisel esines error: %s', + 'pushover_error_noapp' => 'Test teavitust ei saadetud: Pushover API žetooni ei leitud globaalsest + konfiguratsioonist.', + 'pushover_error_nokey' => 'Test teavitust ei saadetud: Pushover võtit ei leitud.', + 'log_retention_period' => 'Logi säilitamis periood', + 'log_retention_period_description' => 'Arv päevi, mil hoida logid alles. Sisesta 0, et keelata logide + puhastus.', + 'log_retention_days' => 'päeva', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' on MAAS: ip=%IP%, port=%PORT%. Error=%ERROR%', + 'off_email_subject' => 'TÄHTIS: Server \'%LABEL%\' is MAAS', + 'off_email_body' => 'Ühendus järgnevasse serverisse ebaõnnestus:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Kuupäev: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' on MAAS', + 'off_pushover_message' => 'Ühendus järgnevasse serverisse ebaõnnestus:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Error: %ERROR%
    Kuupäev: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' on KÄTTESAADAV: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'TÄHTIS: Server \'%LABEL%\' on kättesaadav', + 'on_email_body' => 'Server \'%LABEL%\' on jälle kättesaadav, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Kuupäev: + %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' on kättesaadav', + 'on_pushover_message' => 'Server \'%LABEL%\' on jälle kättesaadav, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Kuupäev: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Teretulemast, %user_name%', + 'title_sign_in' => 'Palun logi sisse', + 'title_forgot' => 'Unustasid oma salasõna?', + 'title_reset' => 'Lähtesta oma parool', + 'submit' => 'Esita', + 'remember_me' => 'Mäleta mind', + 'login' => 'Logi sisse', + 'logout' => 'Logi välja', + 'username' => 'Kasutajanimi', + 'password' => 'Parool', + 'password_repeat' => 'Korda salasõna', + 'password_forgot' => 'Unustasid salasõna?', + 'password_reset' => 'Lähtesta parool', + 'password_reset_email_subject' => 'Lähtestage oma PHP Serveri Monitori parool', + 'password_reset_email_body' => 'Palun kasutage järgnevat linki oma parooli lähtestamiseks. Palume + tähendada, et see aegub 1 tunni jooksul.

    %link%', + 'error_user_incorrect' => 'Antud kasutaja ei ole kehtiv.', + 'error_login_incorrect' => 'Informatsioon ei ole õige.', + 'error_login_passwords_nomatch' => 'Sisestatud paroolid ei kattu.', + 'error_reset_invalid_link' => 'Teie antud lähtestus link ei kehti.', + 'success_password_forgot' => 'Teile saadeti email, kuidas lähtestada oma parooli.', + 'success_password_reset' => 'Teie parool on edukalt muudetud. Palun logige sisse.', + ), + 'error' => array( + '401_unauthorized' => 'Puuduvad õigused', + '401_unauthorized_description' => 'Teil ei ole piisavalt õigusi seda lehte vaadata.', + ), ); diff --git a/src/lang/fa_IR.lang.php b/src/lang/fa_IR.lang.php index d55249d2..a3b0e904 100644 --- a/src/lang/fa_IR.lang.php +++ b/src/lang/fa_IR.lang.php @@ -1,4 +1,5 @@ 'فارسی - Persian', - 'locale' => array('fa_IR.UTF-8', 'fa_IR', 'far', 'per', 'fa'), - 'locale_tag' => 'fa', - 'locale_dir' => 'rtl', - 'system' => array( - 'title' => 'مانیتورینگ سرور', - 'install' => 'نصب', - 'action' => 'عملیات', - 'save' => 'ذخیره', - 'edit' => 'ویرایش', - 'delete' => 'حذف', - 'date' => 'تاریخ', - 'message' => 'پیغام', - 'yes' => 'بله', - 'no' => 'خیر', - 'insert' => 'افزودن', - 'add_new' => 'افزودن', - 'update_available' => 'نسخه جدیدتر ({version}) در http://www.phpservermonitor.org موجود است.', - 'back_to_top' => 'برو به بالا', - 'go_back' => 'برگرد', - 'ok' => 'تایید', - 'cancel' => 'انصراف', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'دیروز در %k:%M', - 'other_day_format' => '%A در %k:%M', - 'never' => 'هرگز', - 'hours_ago' => '%d ساعت پیش', - 'an_hour_ago' => 'حدود یک ساعت پیش', - 'minutes_ago' => '%d دقیقه پیش', - 'a_minute_ago' => 'حدود یک دقیقه پیش', - 'seconds_ago' => '%d ثانیه پیش', - 'a_second_ago' => 'یک ثانیه پیش', - ), - 'menu' => array( - 'config' => 'تنظیم', - 'server' => 'سرور', - 'server_log' => 'لاگ', - 'server_status' => 'وضعیت', - 'server_update' => 'بروزرسانی', - 'user' => 'کاربران', - 'help' => 'پشتیبانی', - ), - 'users' => array( - 'user' => 'کاربر', - 'name' => 'نام', - 'user_name' => 'نام کاربری', - 'password' => 'کلمه عبور', - 'password_repeat' => 'تکرار کلمه عبور', - 'password_leave_blank' => 'برای عدم تغییر خالی بگذارید', - 'level' => 'سطح', - 'level_10' => 'مدیر', - 'level_20' => 'کاربر', - 'level_description' => 'مدیر دسترسی کامل: این گروه ها توانایی مدیریت سرورها، کاربران و ویرایش تنظیمات عمومی را داردند.
    کاربران تنها توانایی دیدن و بروزرسانی سرورهای اختصاص داده شده به خودشان را داردند.', - 'mobile' => 'موبایل', - 'email' => 'ایمیل', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover سرویسی است که دریافت اطلاعیه های بلادرنگ را ساده می کند. برای اطلاعات بیشتر سایت آن ها را ببینید.', - 'pushover_key' => 'کلید Pushover', - 'pushover_device' => 'دستگاه Pushover', - 'pushover_device_description' => 'نام دستگاه برای ارسال پیام. برای ارسال به همه دستگاه ها آن را خالی بگذارید', - 'delete_title' => 'حذف کاربر', - 'delete_message' => 'آیا برای حذف کاربر \'%1\' مطئن هستیند؟', - 'deleted' => 'کاربر حذف شد.', - 'updated' => 'کاربر بروزرسانی شد.', - 'inserted' => 'کاربر اضافه شد.', - 'profile' => 'پروفایل', - 'profile_updated' => 'پروفایل شما بروزرسانی شد.', - 'error_user_name_bad_length' => 'نام های کاربری باید بین 2 و 64 کاراکتر باشد.', - 'error_user_name_invalid' => 'نام کاربری باید فقط شامل حروف (a-z, A-Z)، نقطه (.) اعداد (0-9) و علامت (_) باشد.', - 'error_user_name_exists' => 'نام کاربری وارد شده در حال حاضر در پایگاه داده موجود است.', - 'error_user_email_bad_length' => 'آدرس های ایمیل باید بین 5 و 255 کاراکتر باشد.', - 'error_user_email_invalid' => 'آدرس ایمیل نامعتبر است.', - 'error_user_level_invalid' => 'سطح کاربرد داده شده نامعتبر است.', - 'error_user_no_match' => 'کاربر داده شده در پایگاه داده موجود نیست.', - 'error_user_password_invalid' => 'کلمه عبور وارد شده نامعتبر است.', - 'error_user_password_no_match' => 'کلمه های عبور وارد شده یکسان نیستند.', - ), - 'log' => array( - 'title' => 'ورودی های لاگ', - 'type' => 'نوع', - 'status' => 'وضعیت', - 'email' => 'ایمیل', - 'sms' => 'پیامک', - 'pushover' => 'Pushover', - 'no_logs' => 'لاگی وجود ندارد.', - 'clear' => 'پاک کردن ورود', - 'delete_title' => 'حذف ورود', - 'delete_message' => 'آیا مطمئن هستید که میخواهید سیاهههای «همه» را حذف کنید؟', - ), - 'servers' => array( - 'server' => 'سرور', - 'status' => 'وضعیت', - 'label' => 'برچسب', - 'domain' => 'دامنه/آی پی', - 'timeout' => 'تایم اوت', - 'timeout_description' => 'زمان مورد نیاز برای سرور جهت پاسخ دهی به ثانیه', - 'port' => 'پورت', - 'type' => 'نوع', - 'type_website' => 'وب سایت', - 'type_service' => 'سرویس', - 'pattern' => 'جستجوری رشته/الگو', - 'pattern_description' => 'اگر این الگو در سایت یافته نشد، سرور آفلاین نمایش داده خواهد شد. عبارات منظم مجاز هستند.', - 'last_check' => 'آخرین بررسی', - 'last_online' => 'آخرین زمان آنلاین بودن', - 'monitoring' => 'مانیتورینگ', - 'no_monitoring' => 'بدون مانیتورینگ', - 'email' => 'ایمیل', - 'send_email' => 'ارسال ایمیل', - 'sms' => 'پیامک', - 'send_sms' => 'ارسال پیامک', - 'pushover' => 'Pushover', - 'users' => 'کاربران', - 'delete_title' => 'حذف سرور', - 'delete_message' => 'مطمئنید که میخواهید سرور را پاک کنید \'%1\'؟', - 'deleted' => 'سرور پاک شد.', - 'updated' => 'سرور به روز رسانی شد.', - 'inserted' => 'سرور اضافه شد.', - 'latency' => 'زمان بررسی', - 'latency_max' => 'زمان بررسی (حداکثر)', - 'latency_min' => 'زمان بررسی (حداقل)', - 'latency_avg' => 'زمان بررسی (میانگین)', - 'uptime' => 'آپ تایم', - 'year' => 'سال', - 'month' => 'ماه', - 'week' => 'هفته', - 'day' => 'روز', - 'hour' => 'ساعت', - 'warning_threshold' => 'آستانه هشدار', - 'warning_threshold_description' => 'تعداد چک های شکست خورده قبل از اینکه به عنوان آفلاین نشانه گذاری شود.', - 'chart_last_week' => 'هفته گذشته', - 'chart_history' => 'تاریخچه', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'اطلاعیه های پیامک غیرفعال هستند.', - 'warning_notifications_disabled_email' => 'اطلاعیه های ایمیل غیرفعال هستند.', - 'warning_notifications_disabled_pushover' => 'اطلاعیه های پوش آور غیرفعال هستند.', - 'error_server_no_match' => 'سرور پیدا نشد.', - 'error_server_label_bad_length' => 'برچسب باید بین 1 و 255 کاراکتر باشد.', - 'error_server_ip_bad_length' => 'دامنمه / آی پی باید بین 1 و 255 کاراکتر باشد.', - 'error_server_ip_bad_service' => 'آدرس آی پی معتبر نیست.', - 'error_server_ip_bad_website' => 'آدرس وب سایت معتبر نیست.', - 'error_server_type_invalid' => 'نوع سرور انتخاب شده نامعتبر است.', - 'error_server_warning_threshold_invalid' => 'آستانه هشدار باید یک عدد صحیح بزرگتر از 0 باشد.', - ), - 'config' => array( - 'general' => 'عمومی', - 'language' => 'زبان', - 'show_update' => 'به روز رسانی بررسی شود؟', - 'email_status' => 'اجازه ارسال ایمیل', - 'email_from_email' => 'ایمیل ارسال کننده', - 'email_from_name' => 'نام ارسال کننده', - 'email_smtp' => 'فعالسازی SMTP', - 'email_smtp_host' => 'هاست SMTP', - 'email_smtp_port' => 'پورت SMTP', - 'email_smtp_security' => 'امنیت SMTP', - 'email_smtp_security_none' => 'هیچ کدام', - 'email_smtp_username' => 'نام کاربری SMTP', - 'email_smtp_password' => 'کلمه عبور SMTP', - 'email_smtp_noauth' => 'برای عدم احراز هویت اینجا را خالی بگذارید.', - 'sms_status' => 'اجازه ارسال پیام های متنی', - 'sms_gateway' => 'گیت وی برای ارسال پیام ها', - 'sms_gateway_username' => 'نام کاربری Gateway', - 'sms_gateway_password' => 'کلمه عبور Gateway', - 'sms_from' => 'شماره تلفن ارسال کننده', - 'pushover_status' => 'اجازه ارسال پیام های Pushover', - 'pushover_description' => 'Pushover سرویسی است که دریافت اطلاعیه های بلادرنگ را ساده می کند. برای اطلاعات بیشتر سایت آن ها را ببینید.', - 'pushover_clone_app' => 'برای ایجاد برنامه پوش آور خود اینجا را کلیک کنید.', - 'pushover_api_token' => 'رمز API برنامه پوش آور', - 'pushover_api_token_description' => 'قبل از استفاده از پوش آور، شما باید در سایت آن ها یک برنامه ثبت نام کنید و رمز API برنامه پوش آور را اینجا وارد کنید.', - 'alert_type' => 'زمان دلخواه خورد برای دریافت اطلاعیه ها را انتخاب کنید.', - 'alert_type_description' => 'تغییر وضعیت: '. - 'زمانی که وضعیت سرور تغییر کرد شما یک اطلاعیته دریافت خواهید کرد. از آنلاین -> آفلاین یا آفلاین -> آنلاین.
    '. - '
    آفلاین: '. - 'زمانی که یک سرور *فقط برای اولین بار* آفلاین شد شما یک اطلاعیه دریافت خواهید کرد. به عنوان مثال،'. - 'cronjob شما هر 15 دقیقه است و سرور شما در ساعت 1 صبح دان می شود و تا ساعت 6 صبح دان می ماند.'. - 'شما 1 اطلاعیه در ساعت 1 صبح دریافت خواهید کرد. همین و بس!'. - '
    همیشه: '. - 'هر بار که اسکریپت اجرا شود و یک سایت دان شود شما یک اطلاعیه دریافت خواهید کرد، حتی اگر سایت چند ساعت آفلاین باشد.', - 'alert_type_status' => 'تغییر وضعیت', - 'alert_type_offline' => 'آفلاین', - 'alert_type_always' => 'همیشه', - 'log_status' => 'وضعیت لاگ', - 'log_status_description' => 'اگر لاگ در وضعیت درست باشد مانیتور هر وقت که تنظیمات اطلاعیه ها وارد شود رویدادها را لاگ می کند.', - 'log_email' => 'لاگ کردن ایمیل هایی که ارسال شده توسط اسکریپت', - 'log_sms' => 'لاگ کردن پیامک های ارسال شده توسط اسکریپت', - 'log_pushover' => 'لاگ پیام های پوش آور ارسال شده توسط سرور', - 'updated' => 'پیکربندی به روز رسانی شد.', - 'tab_email' => 'ایمیل', - 'tab_sms' => 'پیامک', - 'tab_pushover' => 'پوش آور', - 'settings_email' => 'تنظیمات ایمیل', - 'settings_sms' => 'تنظیمات پیامک', - 'settings_pushover' => 'تنظیمات پوش آور', - 'settings_notification' => 'تنظیمات اطلاعیه ها', - 'settings_log' => 'تنظیمات لاگ', - 'auto_refresh' => 'رفرش خودکار', - 'auto_refresh_description' => - 'رفرش خودکار صفحه سرورها.
    '. - ''. - 'زمان به ثنیه, اگر 0 باشد صفحه رفرش نخواهد شد.'. - '', - 'seconds' => 'ثانیه', - 'test' => 'تست', - 'test_email' => 'یک ایمیل به آدرس تعیین شده در پروفایل شما ارسال خواهد شد.', - 'test_sms' => 'یک پیامک به شماره تلفن تعیین شده در پروفایل شما ارسال خواهد شد.', - 'test_pushover' => 'یک پیام پوش آور به کلید کاربر/دستگاه تعیین شده در پروفایل شما ارسال خواهد شد.', - 'send' => 'ارسال', - 'test_subject' => 'تست', - 'test_message' => 'پیام تستی', - 'email_sent' => 'ایمیل ارسال شد', - 'email_error' => 'خطا در ارسال ایمیل', - 'sms_sent' => 'پیامک ارسال شد', - 'sms_error' => '%s خطا در ارسال پیامک', - 'sms_error_nomobile' => 'قادر به ارسال پیامک تستی نیستیم: شماره تلفن معتبر در پروفایل شما یافته نشد.', - 'pushover_sent' => 'اطلاعیه پوش آور ارسال شد.', - 'pushover_error' => 'یک خطا در هنگام ارسال اطلاعیه پوش آور رخ داده است: %s', - 'pushover_error_noapp' => 'قادر به ارسال اطلاعیه تستی نیستیم: رمز API برنامه پوش آور در پیکربندی عمومی یافته نشد.', - 'pushover_error_nokey' => 'قادر به ارسال اطلاعیه تستی نیستیم: کلید پوش آور در پروفایل شما یافته نشد.', - 'log_retention_period' => 'مدت زمان ذخیره سازی لاگ ها', - 'log_retention_period_description' => 'تعداد روزها برای نگهداری لاگ اطلاعیه ها و آرشیو های آپ تایم های سرور. برای غیرفعال کردن پاکسازی لاگ 0 وارد کنید.', - 'log_retention_days' => 'روزها', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' دان است: آی پی=%IP%, پورت=%PORT%. خطا=%ERROR%', - 'off_email_subject' => 'مهم: سرور \'%LABEL%\' دان است', - 'off_email_body' => "اتصال به سرور زیر با شکست مواجه شد:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    خطا: %ERROR%
    تاریخ: %DATE%", - 'off_pushover_title' => 'سرور \'%LABEL%\' دان است', - 'off_pushover_message' => "اتصال به سرور زیر با شکست مواجه شد:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    خطا: %ERROR%
    تاریخ: %DATE%", - 'on_sms' => 'سرور \'%LABEL%\' در حال اجراست: آی پی=%IP%, پورت=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'مهم: سرور \'%LABEL%\' در حال اجراست', - 'on_email_body' => "سرور '%LABEL%' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    تاریخ: %DATE%", - 'on_pushover_title' => 'سرور \'%LABEL%\' در حال اجراست', - 'on_pushover_message' => 'سرور \'%LABEL%\' دوباره در حال اجراست, it was down for %LAST_OFFLINE_DURATION%:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    تاریخ: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'خوش آمدید, %user_name%', - 'title_sign_in' => 'لطفا وارد شوید', - 'title_forgot' => 'کلمه عبور خود را فراموش کرده اید؟', - 'title_reset' => 'کلمه عبور خود را بازنشانی کنید', - 'submit' => 'ثبت کردن', - 'remember_me' => 'من را به خاطر بسپار', - 'login' => 'ورود', - 'logout' => 'خروج', - 'username' => 'نام کاربری', - 'password' => 'کلمه عبور', - 'password_repeat' => 'تکرار کلمه عبور', - 'password_forgot' => 'کلمه عبور خود را فراموش کرده اید؟', - 'password_reset' => 'بازنشانی کلمه عبور', - 'password_reset_email_subject' => 'کلمه عبور خود را برای مانیتور سرور PHP بازنشانی کنید', - 'password_reset_email_body' => 'لطفا برای بازنشانی کلمه عبور خود از این لینک استفاده کنید. لطفا توجه کنید تنها 1 ساعت وقت دارید.

    %link%', - 'error_user_incorrect' => 'نام کاربری ارائه شده یافته نشد.', - 'error_login_incorrect' => 'اطلاعات نادرست است.', - 'error_login_passwords_nomatch' => 'کلمه های عبور یکسان نیستند.', - 'error_reset_invalid_link' => 'لینک بازنشانی شما نامعتبر است.', - 'success_password_forgot' => 'یک ایمیل حاوی اطلاعات مورد نیاز برای بازنشانی کلمه عبور برای شما ارسال شد.', - 'success_password_reset' => 'کلمه عبور شما با موفقیت بازنشانی شد. لطفا وارد شوید.', - ), - 'error' => array( - '401_unauthorized' => 'غیر مجاز', - '401_unauthorized_description' => 'شما اجازه مشاهده این صفحه را ندارید.', - ), + 'name' => 'فارسی - Persian', + 'locale' => array( + '0' => 'fa_IR.UTF-8', + '1' => 'fa_IR', + '2' => 'far', + '3' => 'per', + ), + 'locale_tag' => 'fa', + 'locale_dir' => 'rtl', + 'system' => array( + 'title' => 'مانیتورینگ سرور', + 'install' => 'نصب', + 'action' => 'عملیات', + 'save' => 'ذخیره', + 'edit' => 'ویرایش', + 'delete' => 'حذف', + 'date' => 'تاریخ', + 'message' => 'پیغام', + 'yes' => 'بله', + 'no' => 'خیر', + 'insert' => 'افزودن', + 'add_new' => 'افزودن', + 'update_available' => 'نسخه جدیدتر ({version}) در http://www.phpservermonitor.org موجود است.', + 'back_to_top' => 'برو به بالا', + 'go_back' => 'برگرد', + 'ok' => 'تایید', + 'cancel' => 'انصراف', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'دیروز در %k:%M', + 'other_day_format' => '%A در %k:%M', + 'never' => 'هرگز', + 'hours_ago' => '%d ساعت پیش', + 'an_hour_ago' => 'حدود یک ساعت پیش', + 'minutes_ago' => '%d دقیقه پیش', + 'a_minute_ago' => 'حدود یک دقیقه پیش', + 'seconds_ago' => '%d ثانیه پیش', + 'a_second_ago' => 'یک ثانیه پیش', + ), + 'menu' => array( + 'config' => 'تنظیم', + 'server' => 'سرور', + 'server_log' => 'لاگ', + 'server_status' => 'وضعیت', + 'server_update' => 'بروزرسانی', + 'user' => 'کاربران', + 'help' => 'پشتیبانی', + ), + 'users' => array( + 'user' => 'کاربر', + 'name' => 'نام', + 'user_name' => 'نام کاربری', + 'password' => 'کلمه عبور', + 'password_repeat' => 'تکرار کلمه عبور', + 'password_leave_blank' => 'برای عدم تغییر خالی بگذارید', + 'level' => 'سطح', + 'level_10' => 'مدیر', + 'level_20' => 'کاربر', + 'level_description' => 'مدیر دسترسی کامل: این گروه ها توانایی + مدیریت سرورها، کاربران و ویرایش تنظیمات عمومی + را داردند.
    کاربران تنها توانایی دیدن و + بروزرسانی سرورهای اختصاص داده شده به خودشان را + داردند.', + 'mobile' => 'موبایل', + 'email' => 'ایمیل', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover سرویسی است که دریافت اطلاعیه های بلادرنگ + را ساده می کند. برای اطلاعات بیشتر سایت آن ها را + ببینید.', + 'pushover_key' => 'کلید Pushover', + 'pushover_device' => 'دستگاه Pushover', + 'pushover_device_description' => 'نام دستگاه برای ارسال پیام. برای ارسال به + همه دستگاه ها آن را خالی بگذارید', + 'delete_title' => 'حذف کاربر', + 'delete_message' => 'آیا برای حذف کاربر \'%1\' مطئن هستیند؟', + 'deleted' => 'کاربر حذف شد.', + 'updated' => 'کاربر بروزرسانی شد.', + 'inserted' => 'کاربر اضافه شد.', + 'profile' => 'پروفایل', + 'profile_updated' => 'پروفایل شما بروزرسانی شد.', + 'error_user_name_bad_length' => 'نام های کاربری باید بین 2 و 64 کاراکتر باشد.', + 'error_user_name_invalid' => 'نام کاربری باید فقط شامل حروف (a-z, A-Z)، نقطه (.) + اعداد (0-9) و علامت (_) باشد.', + 'error_user_name_exists' => 'نام کاربری وارد شده در حال حاضر در پایگاه + داده موجود است.', + 'error_user_email_bad_length' => 'آدرس های ایمیل باید بین 5 و 255 کاراکتر باشد.', + 'error_user_email_invalid' => 'آدرس ایمیل نامعتبر است.', + 'error_user_level_invalid' => 'سطح کاربرد داده شده نامعتبر است.', + 'error_user_no_match' => 'کاربر داده شده در پایگاه داده موجود نیست.', + 'error_user_password_invalid' => 'کلمه عبور وارد شده نامعتبر است.', + 'error_user_password_no_match' => 'کلمه های عبور وارد شده یکسان نیستند.', + ), + 'log' => array( + 'title' => 'ورودی های لاگ', + 'type' => 'نوع', + 'status' => 'وضعیت', + 'email' => 'ایمیل', + 'sms' => 'پیامک', + 'pushover' => 'Pushover', + 'no_logs' => 'لاگی وجود ندارد.', + 'clear' => 'پاک کردن ورود', + 'delete_title' => 'حذف ورود', + 'delete_message' => 'آیا مطمئن هستید که میخواهید سیاهههای «همه» را + حذف کنید؟', + ), + 'servers' => array( + 'server' => 'سرور', + 'status' => 'وضعیت', + 'label' => 'برچسب', + 'domain' => 'دامنه/آی پی', + 'timeout' => 'تایم اوت', + 'timeout_description' => 'زمان مورد نیاز برای سرور جهت پاسخ دهی به ثانیه', + 'port' => 'پورت', + 'type' => 'نوع', + 'type_website' => 'وب سایت', + 'type_service' => 'سرویس', + 'pattern' => 'جستجوری رشته/الگو', + 'pattern_description' => 'اگر این الگو در سایت یافته نشد، سرور آفلاین + نمایش داده خواهد شد. عبارات منظم مجاز هستند.', + 'last_check' => 'آخرین بررسی', + 'last_online' => 'آخرین زمان آنلاین بودن', + 'monitoring' => 'مانیتورینگ', + 'no_monitoring' => 'بدون مانیتورینگ', + 'email' => 'ایمیل', + 'send_email' => 'ارسال ایمیل', + 'sms' => 'پیامک', + 'send_sms' => 'ارسال پیامک', + 'pushover' => 'Pushover', + 'users' => 'کاربران', + 'delete_title' => 'حذف سرور', + 'delete_message' => 'مطمئنید که میخواهید سرور را پاک کنید \'%1\'؟', + 'deleted' => 'سرور پاک شد.', + 'updated' => 'سرور به روز رسانی شد.', + 'inserted' => 'سرور اضافه شد.', + 'latency' => 'زمان بررسی', + 'latency_max' => 'زمان بررسی (حداکثر)', + 'latency_min' => 'زمان بررسی (حداقل)', + 'latency_avg' => 'زمان بررسی (میانگین)', + 'uptime' => 'آپ تایم', + 'year' => 'سال', + 'month' => 'ماه', + 'week' => 'هفته', + 'day' => 'روز', + 'hour' => 'ساعت', + 'warning_threshold' => 'آستانه هشدار', + 'warning_threshold_description' => 'تعداد چک های شکست خورده قبل از اینکه به + عنوان آفلاین نشانه گذاری شود.', + 'chart_last_week' => 'هفته گذشته', + 'chart_history' => 'تاریخچه', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'اطلاعیه های پیامک غیرفعال هستند.', + 'warning_notifications_disabled_email' => 'اطلاعیه های ایمیل غیرفعال هستند.', + 'warning_notifications_disabled_pushover' => 'اطلاعیه های پوش آور غیرفعال هستند.', + 'error_server_no_match' => 'سرور پیدا نشد.', + 'error_server_label_bad_length' => 'برچسب باید بین 1 و 255 کاراکتر باشد.', + 'error_server_ip_bad_length' => 'دامنمه / آی پی باید بین 1 و 255 کاراکتر باشد.', + 'error_server_ip_bad_service' => 'آدرس آی پی معتبر نیست.', + 'error_server_ip_bad_website' => 'آدرس وب سایت معتبر نیست.', + 'error_server_type_invalid' => 'نوع سرور انتخاب شده نامعتبر است.', + 'error_server_warning_threshold_invalid' => 'آستانه هشدار باید یک عدد صحیح + بزرگتر از 0 باشد.', + ), + 'config' => array( + 'general' => 'عمومی', + 'language' => 'زبان', + 'show_update' => 'به روز رسانی بررسی شود؟', + 'email_status' => 'اجازه ارسال ایمیل', + 'email_from_email' => 'ایمیل ارسال کننده', + 'email_from_name' => 'نام ارسال کننده', + 'email_smtp' => 'فعالسازی SMTP', + 'email_smtp_host' => 'هاست SMTP', + 'email_smtp_port' => 'پورت SMTP', + 'email_smtp_security' => 'امنیت SMTP', + 'email_smtp_security_none' => 'هیچ کدام', + 'email_smtp_username' => 'نام کاربری SMTP', + 'email_smtp_password' => 'کلمه عبور SMTP', + 'email_smtp_noauth' => 'برای عدم احراز هویت اینجا را خالی بگذارید.', + 'sms_status' => 'اجازه ارسال پیام های متنی', + 'sms_gateway' => 'گیت وی برای ارسال پیام ها', + 'sms_gateway_username' => 'نام کاربری Gateway', + 'sms_gateway_password' => 'کلمه عبور Gateway', + 'sms_from' => 'شماره تلفن ارسال کننده', + 'pushover_status' => 'اجازه ارسال پیام های Pushover', + 'pushover_description' => 'Pushover سرویسی است که دریافت اطلاعیه های بلادرنگ + را ساده می کند. برای اطلاعات بیشتر سایت آن ها را + ببینید.', + 'pushover_clone_app' => 'برای ایجاد برنامه پوش آور خود اینجا را کلیک + کنید.', + 'pushover_api_token' => 'رمز API برنامه پوش آور', + 'pushover_api_token_description' => 'قبل از استفاده از پوش آور، شما باید در + سایت آن ها یک + برنامه ثبت نام کنید و رمز API برنامه پوش + آور را اینجا وارد کنید.', + 'alert_type' => 'زمان دلخواه خورد برای دریافت اطلاعیه ها را انتخاب + کنید.', + 'alert_type_description' => 'تغییر وضعیت: زمانی که وضعیت سرور تغییر + کرد شما یک اطلاعیته دریافت خواهید کرد. از + آنلاین -> آفلاین یا آفلاین -> آنلاین.

    آفلاین: زمانی که یک سرور *فقط برای اولین + بار* آفلاین شد شما یک اطلاعیه دریافت خواهید + کرد. به عنوان مثال،cronjob شما هر 15 دقیقه است و + سرور شما در ساعت 1 صبح دان می شود و تا ساعت 6 + صبح دان می ماند.شما 1 اطلاعیه در ساعت 1 صبح + دریافت خواهید کرد. همین و بس!
    همیشه: هر + بار که اسکریپت اجرا شود و یک سایت دان شود شما + یک اطلاعیه دریافت خواهید کرد، حتی اگر سایت + چند ساعت آفلاین باشد.', + 'alert_type_status' => 'تغییر وضعیت', + 'alert_type_offline' => 'آفلاین', + 'alert_type_always' => 'همیشه', + 'log_status' => 'وضعیت لاگ', + 'log_status_description' => 'اگر لاگ در وضعیت درست باشد مانیتور هر وقت که + تنظیمات اطلاعیه ها وارد شود رویدادها را لاگ + می کند.', + 'log_email' => 'لاگ کردن ایمیل هایی که ارسال شده توسط اسکریپت', + 'log_sms' => 'لاگ کردن پیامک های ارسال شده توسط اسکریپت', + 'log_pushover' => 'لاگ پیام های پوش آور ارسال شده توسط سرور', + 'updated' => 'پیکربندی به روز رسانی شد.', + 'tab_email' => 'ایمیل', + 'tab_sms' => 'پیامک', + 'tab_pushover' => 'پوش آور', + 'settings_email' => 'تنظیمات ایمیل', + 'settings_sms' => 'تنظیمات پیامک', + 'settings_pushover' => 'تنظیمات پوش آور', + 'settings_notification' => 'تنظیمات اطلاعیه ها', + 'settings_log' => 'تنظیمات لاگ', + 'auto_refresh' => 'رفرش خودکار', + 'auto_refresh_description' => 'رفرش خودکار صفحه سرورها.
    زمان + به ثنیه, اگر 0 باشد صفحه رفرش نخواهد شد.', + 'seconds' => 'ثانیه', + 'test' => 'تست', + 'test_email' => 'یک ایمیل به آدرس تعیین شده در پروفایل شما ارسال + خواهد شد.', + 'test_sms' => 'یک پیامک به شماره تلفن تعیین شده در پروفایل شما + ارسال خواهد شد.', + 'test_pushover' => 'یک پیام پوش آور به کلید کاربر/دستگاه تعیین شده در + پروفایل شما ارسال خواهد شد.', + 'send' => 'ارسال', + 'test_subject' => 'تست', + 'test_message' => 'پیام تستی', + 'email_sent' => 'ایمیل ارسال شد', + 'email_error' => 'خطا در ارسال ایمیل', + 'sms_sent' => 'پیامک ارسال شد', + 'sms_error' => '%s خطا در ارسال پیامک', + 'sms_error_nomobile' => 'قادر به ارسال پیامک تستی نیستیم: شماره تلفن + معتبر در پروفایل شما یافته نشد.', + 'pushover_sent' => 'اطلاعیه پوش آور ارسال شد.', + 'pushover_error' => 'یک خطا در هنگام ارسال اطلاعیه پوش آور رخ داده است: + %s', + 'pushover_error_noapp' => 'قادر به ارسال اطلاعیه تستی نیستیم: رمز API + برنامه پوش آور در پیکربندی عمومی یافته نشد.', + 'pushover_error_nokey' => 'قادر به ارسال اطلاعیه تستی نیستیم: کلید پوش + آور در پروفایل شما یافته نشد.', + 'log_retention_period' => 'مدت زمان ذخیره سازی لاگ ها', + 'log_retention_period_description' => 'تعداد روزها برای نگهداری لاگ اطلاعیه + ها و آرشیو های آپ تایم های سرور. برای + غیرفعال کردن پاکسازی لاگ 0 وارد کنید.', + 'log_retention_days' => 'روزها', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' دان است: آی پی=%IP%, پورت=%PORT%. خطا=%ERROR%', + 'off_email_subject' => 'مهم: سرور \'%LABEL%\' دان است', + 'off_email_body' => 'اتصال به سرور زیر با شکست مواجه شد:

    سرور: + %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    خطا: %ERROR%
    تاریخ: %DATE%', + 'off_pushover_title' => 'سرور \'%LABEL%\' دان است', + 'off_pushover_message' => 'اتصال به سرور زیر با شکست مواجه شد:

    سرور: + %LABEL%
    آی پی: %IP%
    پورت: %PORT%
    خطا: %ERROR%
    تاریخ: + %DATE%', + 'on_sms' => 'سرور \'%LABEL%\' در حال اجراست: آی پی=%IP%, پورت=%PORT%, it was down for + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'مهم: سرور \'%LABEL%\' در حال اجراست', + 'on_email_body' => 'سرور \'%LABEL%\' دوباره در حال اجراست, it was down for + %LAST_OFFLINE_DURATION%:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: + %PORT%
    تاریخ: %DATE%', + 'on_pushover_title' => 'سرور \'%LABEL%\' در حال اجراست', + 'on_pushover_message' => 'سرور \'%LABEL%\' دوباره در حال اجراست, it was down for + %LAST_OFFLINE_DURATION%:

    سرور: %LABEL%
    آی پی: %IP%
    پورت: + %PORT%
    تاریخ: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'خوش آمدید, %user_name%', + 'title_sign_in' => 'لطفا وارد شوید', + 'title_forgot' => 'کلمه عبور خود را فراموش کرده اید؟', + 'title_reset' => 'کلمه عبور خود را بازنشانی کنید', + 'submit' => 'ثبت کردن', + 'remember_me' => 'من را به خاطر بسپار', + 'login' => 'ورود', + 'logout' => 'خروج', + 'username' => 'نام کاربری', + 'password' => 'کلمه عبور', + 'password_repeat' => 'تکرار کلمه عبور', + 'password_forgot' => 'کلمه عبور خود را فراموش کرده اید؟', + 'password_reset' => 'بازنشانی کلمه عبور', + 'password_reset_email_subject' => 'کلمه عبور خود را برای مانیتور سرور PHP + بازنشانی کنید', + 'password_reset_email_body' => 'لطفا برای بازنشانی کلمه عبور خود از این + لینک استفاده کنید. لطفا توجه کنید تنها 1 + ساعت وقت دارید.

    %link%', + 'error_user_incorrect' => 'نام کاربری ارائه شده یافته نشد.', + 'error_login_incorrect' => 'اطلاعات نادرست است.', + 'error_login_passwords_nomatch' => 'کلمه های عبور یکسان نیستند.', + 'error_reset_invalid_link' => 'لینک بازنشانی شما نامعتبر است.', + 'success_password_forgot' => 'یک ایمیل حاوی اطلاعات مورد نیاز برای + بازنشانی کلمه عبور برای شما ارسال شد.', + 'success_password_reset' => 'کلمه عبور شما با موفقیت بازنشانی شد. لطفا + وارد شوید.', + ), + 'error' => array( + '401_unauthorized' => 'غیر مجاز', + '401_unauthorized_description' => 'شما اجازه مشاهده این صفحه را ندارید.', + ), ); diff --git a/src/lang/fi_FI.lang.php b/src/lang/fi_FI.lang.php index 73557789..8c3d8da2 100644 --- a/src/lang/fi_FI.lang.php +++ b/src/lang/fi_FI.lang.php @@ -1,4 +1,5 @@ 'Suomi - Finnish', - 'locale' => array('fi_FI.UTF-8', 'fi_FI', 'finnish', 'finnish-fi'), - 'locale_tag' => 'fi', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Asenna', - 'action' => 'Toiminta', - 'save' => 'Tallenna', - 'edit' => 'Muokkaa', - 'delete' => 'Poista', - 'date' => 'Päivä', - 'message' => 'Viesti', - 'yes' => 'Kyllä', - 'no' => 'Ei', - 'insert' => 'Asetukset', - 'add_new' => 'Lisää uusi', - 'update_available' => 'Uusi versio ({version}) on ladattavissa osoitteessa http://www.phpservermonitor.org.', - 'back_to_top' => 'Takaisin ylös', - 'go_back' => 'Takaisin', - 'ok' => 'OK', - 'cancel' => 'Peruuta', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Eilen klo %k:%M', - 'other_day_format' => '%A klo %k:%M', - 'never' => 'Ei koskaan', - 'hours_ago' => '%d tuntia sitten', - 'an_hour_ago' => 'noin tunti sitten', - 'minutes_ago' => '%d minuuttia sitten', - 'a_minute_ago' => 'noin minuutti sitten', - 'seconds_ago' => '%d sekuntia sitten', - 'a_second_ago' => 'sekunti sitten', - ), - 'menu' => array( - 'config' => 'Asetukset', - 'server' => 'Palvelimet', - 'server_log' => 'Tapahtumat', - 'server_status' => 'Tila', - 'server_update' => 'Päivitä', - 'user' => 'Käyttäjät', - 'help' => 'Apua', - ), - 'users' => array( - 'user' => 'Käyttäjä', - 'name' => 'Nimi', - 'user_name' => 'Käyttäjänimi', - 'password' => 'Salasana', - 'password_repeat' => 'Salasana uudestaan', - 'password_leave_blank' => 'Jätä tyhjäksi jos et halua vaihtaa', - 'level' => 'Taso', - 'level_10' => 'Järjestelmänvalvoja', - 'level_20' => 'Käyttäjä', - 'level_description' => 'Järjestelmänvalvojilla on täydet oikeudet: he voivat hallita palvelimia, käyttäjiä ja muokata ohjelmiston asetuksia.
    Käyttäjät voivat vain nähdä ja päivittää palvelimia jotka on asetettu heille.', - 'mobile' => 'Puhelin', - 'email' => 'Sähköposti', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover on palvelu jolla on helppo lähettää reaaliaikaisia tilaviestejä. Katso verkkosivuilta lisäinfoa.', - 'pushover_key' => 'Pushover avain', - 'pushover_device' => 'Pushover laite', - 'pushover_device_description' => 'Laitteen nimi johon viesti lähetetään. Jätä tyhjäksi lähettääksesi kaikkiin laitteisiin.', - 'delete_title' => 'Poista käyttäjä', - 'delete_message' => 'Haluatko varmasti poistaa käyttäjän \'%1\'?', - 'deleted' => 'Käyttäjä poistettu.', - 'updated' => 'Käyttäjä päivitetty.', - 'inserted' => 'Käyttäjä lisätty.', - 'profile' => 'Profiili', - 'profile_updated' => 'Profiilisi on päivitetty.', - 'error_user_name_bad_length' => 'Käyttäjänimi saa olla 2-64 merkkiä pitkä.', - 'error_user_name_invalid' => 'Käyttäjänimessä saa olla vain kirjaimia (a-z, A-Z), numeroita (0-9), pisteitä (.) ja alaviivoja (_).', - 'error_user_name_exists' => 'Annettu käyttäjänimi on jo tietokannassa.', - 'error_user_email_bad_length' => 'Sähköpostiosoitteen täytyy olla 5-255 merkkiä pitkä.', - 'error_user_email_invalid' => 'Annettu sähköposti ei kelpaa.', - 'error_user_level_invalid' => 'Annettu käyttäjän taso ei kelpaa.', - 'error_user_no_match' => 'Käyttäjää ei löydetty tietokannasta.', - 'error_user_password_invalid' => 'Annettu salasana on väärin.', - 'error_user_password_no_match' => 'Annetut salasanat eivät täsmää.', - ), - 'log' => array( - 'title' => 'Tapahtumamerkinnät', - 'type' => 'Tyyppi', - 'status' => 'Tila', - 'email' => 'Sähköposti', - 'sms' => 'Tekstiviesti', - 'pushover' => 'Pushover', - 'no_logs' => 'Ei tapahtumia', - 'clear' => 'Tyhjennä loki', - 'delete_title' => 'Poista loki', - 'delete_message' => 'Haluatko varmasti poistaa kaikki lokit?', - ), - 'servers' => array( - 'server' => 'Palvelin', - 'status' => 'Tila', - 'label' => 'Nimi', - 'domain' => 'Isäntänimi/IP', - 'timeout' => 'Aikakatkaisu', - 'timeout_description' => 'Kuinka monta sekuntia odottaa kunnes palvelin merkitään sammuneeksi.', - 'port' => 'Portti', - 'type' => 'Tyyppi', - 'type_website' => 'Verkkosivu', - 'type_service' => 'Palvelu', - 'pattern' => 'Etsittävä sarja/kuvio', - 'pattern_description' => 'Jos määriteltyä sarjaa ei löydetä verkkosivuilta, palvelin merkitään sammuneeksi. REGEX on sallittua.', - 'last_check' => 'Viimeisin tarkistus', - 'last_online' => 'Viimeksi nähty', - 'monitoring' => 'Valvottava', - 'no_monitoring' => 'Ei valvontaa', - 'email' => 'Sähköposti', - 'send_email' => 'Lähetä sähköposti', - 'sms' => 'Tekstiviesti', - 'send_sms' => 'Lähetä tekstiviesti', - 'pushover' => 'Pushover', - 'users' => 'Käyttäjät', - 'delete_title' => 'Poista palvelin', - 'delete_message' => 'Haluatko varmasti poistaa palvelimen \'%1\'?', - 'deleted' => 'Palvelin poistettu.', - 'updated' => 'Palvelin päivitetty.', - 'inserted' => 'Palvelin lisätty.', - 'latency' => 'Viive', - 'latency_max' => 'Viive (maksimi)', - 'latency_min' => 'Viive (minimi)', - 'latency_avg' => 'Viive (keskiarvo)', - 'uptime' => 'Päälläoloaika', - 'year' => 'Vuosi', - 'month' => 'Kuukausi', - 'week' => 'Viikko', - 'day' => 'Päivä', - 'hour' => 'Tunti', - 'warning_threshold' => 'Varoituskynnys', - 'warning_threshold_description' => 'Epäonnistuneiden tarkistuksien määrä kunnes se merkataan sammuneeksi.', - 'chart_last_week' => 'Viime viikolla', - 'chart_history' => 'Historia', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Tekstiviesti-ilmoitukset on poistettu käytöstä.', - 'warning_notifications_disabled_email' => 'Sähköposti-ilmoitukset on poistettu käytöstä.', - 'warning_notifications_disabled_pushover' => 'Pushover-ilmoitukset on poistettu käytöstä.', - 'error_server_no_match' => 'Palvelinta ei löydetty.', - 'error_server_label_bad_length' => 'Nimen pitää olla 1-255 merkkiä pitkä.', - 'error_server_ip_bad_length' => 'Isäntänimen / IP:n pitää olla 1-255 merkkiä pitkä.', - 'error_server_ip_bad_service' => 'Annettu IP osoite ei kelpaa.', - 'error_server_ip_bad_website' => 'Annettu verkkosivun osoite ei kelpaa.', - 'error_server_type_invalid' => 'Valittu palvelintyyppi ei kelpaa.', - 'error_server_warning_threshold_invalid' => 'Varoituskynnyksen arvo pitää olla suurempi kuin 0.', - ), - 'config' => array( - 'general' => 'Yleiset', - 'language' => 'Kieli', - 'show_update' => 'Tarkista päivitykset?', - 'email_status' => 'Salli sähköpostin lähettäminen', - 'email_from_email' => 'Lähettäjän osoite', - 'email_from_name' => 'Lähettäjän nimi', - 'email_smtp' => 'Käytä SMTP:tä', - 'email_smtp_host' => 'SMTP isäntä', - 'email_smtp_port' => 'SMTP portti', - 'email_smtp_security' => 'SMTP turvallisuus', - 'email_smtp_security_none' => 'Ei mitään', - 'email_smtp_username' => 'SMTP käyttäjänimi', - 'email_smtp_password' => 'SMTP salasana', - 'email_smtp_noauth' => 'Jätä tyhjäksi jos ei varmennusta', - 'sms_status' => 'Salli tekstiviestien lähetys', - 'sms_gateway' => 'Palvelu jonka kautta tekstiviestit lähetetään', - 'sms_gateway_username' => 'Palvelun käyttäjänimi', - 'sms_gateway_password' => 'Palvelun salasana', - 'sms_from' => 'Lähettäjän puhelinnumero', - 'pushover_status' => 'Salli Pushover-viestien lähetys', - 'pushover_description' => 'Pushover on palvelu jolla on helppo lähettää reaaliaikaisia tilaviestejä. Katso verkkosivuilta lisäinfoa.', - 'pushover_clone_app' => 'Paina tästä luodaksesi Pushover-sovelluksesi', - 'pushover_api_token' => 'Pushover API-avain', - 'pushover_api_token_description' => 'Ennen kuin voit käyttää Pushoveria, sinun täytyy rekisteröidä sovellus heidän nettisivuillaan, ja kopioida API-avain tänne.', - 'alert_type' => 'Valitse milloin haluat ilmoituksia.', - 'alert_type_description' => 'Tilan muutos: '. - 'Saat ilmoituksen kun palvelimen tila vaihtuu. Eli tilasta päällä -> sammunut tai sammunut -> päällä.
    '. - '
    Sammunut: '. - 'Saat yhden ilmoituksen kun palvelimen tila vaihtuu sammuneeksi, mutta *VAIN ENSIMMÄISEN KERRAN*. Esimerkiksi, '. - 'jos tarkistus tehdään joka 15 minuutti, ja palvelin sammuu klo 1 ja pysyy sammuneena klo 6 asti. '. - 'Saat vain yhden ilmoituksen klo 1, ei muuta.
    '. - '
    Aina: '. - 'Saat ilmoituksen joka kerta kun palvelin tarkistetaan, vaikka palvelin olisi ollut sammuneena tunteja.', - 'alert_type_status' => 'Tilan muutos', - 'alert_type_offline' => 'Sammunut', - 'alert_type_always' => 'Aina', - 'log_status' => 'Tallenna tapahtumat', - 'log_status_description' => 'Jos arvo on tosi, palvelin tallentaa tapahtumamerkinnän jokaisesta tilan muutoksesta.', - 'log_email' => 'Tallenna lähetetyt sähköpostitapahtumat', - 'log_sms' => 'Tallenna lähetetyt tekstiviestitapahtumat', - 'log_pushover' => 'Tallenna lähetetyt Pushover-tapahtumat', - 'updated' => 'Asetukset tallennettu ja päivitetty.', - 'tab_email' => 'Sähköposti', - 'tab_sms' => 'Tekstiviesti', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Sähköposti asetukset', - 'settings_sms' => 'Tekstiviesti asetukset', - 'settings_pushover' => 'Pushover asetukset', - 'settings_notification' => 'Ilmoitusasetukset', - 'settings_log' => 'Tapahtumamerkintöjen asetukset', - 'auto_refresh' => 'Automaattipäivitys', - 'auto_refresh_description' => - 'Päivittää automaattisesti palvelimet-sivun.
    '. - ''. - 'Aika sekunteina, jos 0, sivu ei päivity automaattisesti.'. - '', - 'seconds' => 'sekuntia', - 'test' => 'Testi', - 'test_email' => 'Testisähköposti lähetetään profiilisi sähköpostiosoitteeseen.', - 'test_sms' => 'Testitekstiviesti lähetetään profiilisi numeroon.', - 'test_pushover' => 'Pushover-ilmoitus lähetetään profiilissa asetettuun laitteeseen.', - 'send' => 'Lähetä', - 'test_subject' => 'Testi', - 'test_message' => 'Testiviesti', - 'email_sent' => 'Sähköposti lähetetty', - 'email_error' => 'Virhe sähköpostin lähetyksessä', - 'sms_sent' => 'Tekstiviesti lähetetty', - 'sms_error' => 'Virhe tekstiviestin lähetyksessä. %s', - 'sms_error_nomobile' => 'Testitektiviestin lähetys epäonnistui: toimivaa numeroa ei löydetty profiilistasi.', - 'pushover_sent' => 'Pushover ilmoitus lähetetty', - 'pushover_error' => 'Virhe Pushover-ilmoitusta lähetettäessä: %s', - 'pushover_error_noapp' => 'Virhe lähetettäessä Pushover-ilmoitusta: Pushover API-avainta ei löydetty asetuksista.', - 'pushover_error_nokey' => 'Virhe lähetettäessä Pushover-ilmoitusta: Pushover avainta ei löydetty profiilistasi.', - 'log_retention_period' => 'Tapahtumien säilytysaika', - 'log_retention_period_description' => 'Kuinka monta päivää pitää palvelinten päälläoloaikoja ja muita tapahtumia. Aseta arvoksi 0 jos haluat pitää ne loputtomasti.', - 'log_retention_days' => 'päivää', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', - 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', - 'off_email_body' => "Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', - 'off_pushover_message' => "Failed to connect to the following server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is RUNNING', - 'on_email_body' => "Server '%LABEL%' is running again, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' is RUNNING', - 'on_pushover_message' => 'Server \'%LABEL%\' is running again, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Tervetuloa, %user_name%', - 'title_sign_in' => 'Ole hyvä ja kirjaudu sisään', - 'title_forgot' => 'Unohtuiko salasanasi?', - 'title_reset' => 'Resetoi salasanasi', - 'submit' => 'Lähetä', - 'remember_me' => 'Muista minut', - 'login' => 'Kirjaudu sisään', - 'logout' => 'Kirjaudu ulos', - 'username' => 'Käyttäjänimi', - 'password' => 'Salasana', - 'password_repeat' => 'Salasana uudestaan', - 'password_forgot' => 'Unohtuiko salasanasi?', - 'password_reset' => 'Resetoi salasanasi', - 'password_reset_email_subject' => 'Resetoi salasanasi PHP Server Monitoriin', - 'password_reset_email_body' => 'Ole hyvä ja käytä seuraavaa linkkiä restoidaksesi salasanasi. Huomaa että linkki vanhentuu tunnin sisällä.

    %link%', - 'error_user_incorrect' => 'Annettua käyttäjänimeä ei löydetty.', - 'error_login_incorrect' => 'Antamasi tiedot eivät ole oikein.', - 'error_login_passwords_nomatch' => 'Annetut salasanat eivät täsmää.', - 'error_reset_invalid_link' => 'Resetointilinkkisi on väärä.', - 'success_password_forgot' => 'Sähköpostiisi on lähetetty ohjeet kuinka resetoida salasanasi.', - 'success_password_reset' => 'Salasanasi on resetoitu onnistuneesti, ole hyvä ja kirjaudu sisään.', - ), - 'error' => array( - '401_unauthorized' => 'Ei käyttöoikeuksia', - '401_unauthorized_description' => 'Sinulla ei ole käyttöoikeuksia katsoa tätä sivua.', - ), + 'name' => 'Suomi - Finnish', + 'locale' => array( + '0' => 'fi_FI.UTF-8', + '1' => 'fi_FI', + '2' => 'finnish', + '3' => 'finnish-fi', + ), + 'locale_tag' => 'fi', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Asenna', + 'action' => 'Toiminta', + 'save' => 'Tallenna', + 'edit' => 'Muokkaa', + 'delete' => 'Poista', + 'date' => 'Päivä', + 'message' => 'Viesti', + 'yes' => 'Kyllä', + 'no' => 'Ei', + 'insert' => 'Asetukset', + 'add_new' => 'Lisää uusi', + 'update_available' => 'Uusi versio ({version}) on ladattavissa osoitteessa http://www.phpservermonitor.org.', + 'back_to_top' => 'Takaisin ylös', + 'go_back' => 'Takaisin', + 'ok' => 'OK', + 'cancel' => 'Peruuta', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Eilen klo %k:%M', + 'other_day_format' => '%A klo %k:%M', + 'never' => 'Ei koskaan', + 'hours_ago' => '%d tuntia sitten', + 'an_hour_ago' => 'noin tunti sitten', + 'minutes_ago' => '%d minuuttia sitten', + 'a_minute_ago' => 'noin minuutti sitten', + 'seconds_ago' => '%d sekuntia sitten', + 'a_second_ago' => 'sekunti sitten', + ), + 'menu' => array( + 'config' => 'Asetukset', + 'server' => 'Palvelimet', + 'server_log' => 'Tapahtumat', + 'server_status' => 'Tila', + 'server_update' => 'Päivitä', + 'user' => 'Käyttäjät', + 'help' => 'Apua', + ), + 'users' => array( + 'user' => 'Käyttäjä', + 'name' => 'Nimi', + 'user_name' => 'Käyttäjänimi', + 'password' => 'Salasana', + 'password_repeat' => 'Salasana uudestaan', + 'password_leave_blank' => 'Jätä tyhjäksi jos et halua vaihtaa', + 'level' => 'Taso', + 'level_10' => 'Järjestelmänvalvoja', + 'level_20' => 'Käyttäjä', + 'level_description' => 'Järjestelmänvalvojilla on täydet oikeudet: he voivat hallita palvelimia, + käyttäjiä ja muokata ohjelmiston asetuksia.
    Käyttäjät voivat vain + nähdä ja päivittää palvelimia jotka on asetettu heille.', + 'mobile' => 'Puhelin', + 'email' => 'Sähköposti', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover on palvelu jolla on helppo lähettää reaaliaikaisia tilaviestejä. Katso + verkkosivuilta lisäinfoa.', + 'pushover_key' => 'Pushover avain', + 'pushover_device' => 'Pushover laite', + 'pushover_device_description' => 'Laitteen nimi johon viesti lähetetään. Jätä tyhjäksi lähettääksesi + kaikkiin laitteisiin.', + 'delete_title' => 'Poista käyttäjä', + 'delete_message' => 'Haluatko varmasti poistaa käyttäjän \'%1\'?', + 'deleted' => 'Käyttäjä poistettu.', + 'updated' => 'Käyttäjä päivitetty.', + 'inserted' => 'Käyttäjä lisätty.', + 'profile' => 'Profiili', + 'profile_updated' => 'Profiilisi on päivitetty.', + 'error_user_name_bad_length' => 'Käyttäjänimi saa olla 2-64 merkkiä pitkä.', + 'error_user_name_invalid' => 'Käyttäjänimessä saa olla vain kirjaimia (a-z, A-Z), numeroita (0-9), + pisteitä (.) ja alaviivoja (_).', + 'error_user_name_exists' => 'Annettu käyttäjänimi on jo tietokannassa.', + 'error_user_email_bad_length' => 'Sähköpostiosoitteen täytyy olla 5-255 merkkiä pitkä.', + 'error_user_email_invalid' => 'Annettu sähköposti ei kelpaa.', + 'error_user_level_invalid' => 'Annettu käyttäjän taso ei kelpaa.', + 'error_user_no_match' => 'Käyttäjää ei löydetty tietokannasta.', + 'error_user_password_invalid' => 'Annettu salasana on väärin.', + 'error_user_password_no_match' => 'Annetut salasanat eivät täsmää.', + ), + 'log' => array( + 'title' => 'Tapahtumamerkinnät', + 'type' => 'Tyyppi', + 'status' => 'Tila', + 'email' => 'Sähköposti', + 'sms' => 'Tekstiviesti', + 'pushover' => 'Pushover', + 'no_logs' => 'Ei tapahtumia', + 'clear' => 'Tyhjennä loki', + 'delete_title' => 'Poista loki', + 'delete_message' => 'Haluatko varmasti poistaa kaikki lokit?', + ), + 'servers' => array( + 'server' => 'Palvelin', + 'status' => 'Tila', + 'label' => 'Nimi', + 'domain' => 'Isäntänimi/IP', + 'timeout' => 'Aikakatkaisu', + 'timeout_description' => 'Kuinka monta sekuntia odottaa kunnes palvelin merkitään sammuneeksi.', + 'port' => 'Portti', + 'type' => 'Tyyppi', + 'type_website' => 'Verkkosivu', + 'type_service' => 'Palvelu', + 'pattern' => 'Etsittävä sarja/kuvio', + 'pattern_description' => 'Jos määriteltyä sarjaa ei löydetä verkkosivuilta, palvelin merkitään + sammuneeksi. REGEX on sallittua.', + 'last_check' => 'Viimeisin tarkistus', + 'last_online' => 'Viimeksi nähty', + 'monitoring' => 'Valvottava', + 'no_monitoring' => 'Ei valvontaa', + 'email' => 'Sähköposti', + 'send_email' => 'Lähetä sähköposti', + 'sms' => 'Tekstiviesti', + 'send_sms' => 'Lähetä tekstiviesti', + 'pushover' => 'Pushover', + 'users' => 'Käyttäjät', + 'delete_title' => 'Poista palvelin', + 'delete_message' => 'Haluatko varmasti poistaa palvelimen \'%1\'?', + 'deleted' => 'Palvelin poistettu.', + 'updated' => 'Palvelin päivitetty.', + 'inserted' => 'Palvelin lisätty.', + 'latency' => 'Viive', + 'latency_max' => 'Viive (maksimi)', + 'latency_min' => 'Viive (minimi)', + 'latency_avg' => 'Viive (keskiarvo)', + 'uptime' => 'Päälläoloaika', + 'year' => 'Vuosi', + 'month' => 'Kuukausi', + 'week' => 'Viikko', + 'day' => 'Päivä', + 'hour' => 'Tunti', + 'warning_threshold' => 'Varoituskynnys', + 'warning_threshold_description' => 'Epäonnistuneiden tarkistuksien määrä kunnes se merkataan sammuneeksi.', + 'chart_last_week' => 'Viime viikolla', + 'chart_history' => 'Historia', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Tekstiviesti-ilmoitukset on poistettu käytöstä.', + 'warning_notifications_disabled_email' => 'Sähköposti-ilmoitukset on poistettu käytöstä.', + 'warning_notifications_disabled_pushover' => 'Pushover-ilmoitukset on poistettu käytöstä.', + 'error_server_no_match' => 'Palvelinta ei löydetty.', + 'error_server_label_bad_length' => 'Nimen pitää olla 1-255 merkkiä pitkä.', + 'error_server_ip_bad_length' => 'Isäntänimen / IP:n pitää olla 1-255 merkkiä pitkä.', + 'error_server_ip_bad_service' => 'Annettu IP osoite ei kelpaa.', + 'error_server_ip_bad_website' => 'Annettu verkkosivun osoite ei kelpaa.', + 'error_server_type_invalid' => 'Valittu palvelintyyppi ei kelpaa.', + 'error_server_warning_threshold_invalid' => 'Varoituskynnyksen arvo pitää olla suurempi kuin 0.', + ), + 'config' => array( + 'general' => 'Yleiset', + 'language' => 'Kieli', + 'show_update' => 'Tarkista päivitykset?', + 'email_status' => 'Salli sähköpostin lähettäminen', + 'email_from_email' => 'Lähettäjän osoite', + 'email_from_name' => 'Lähettäjän nimi', + 'email_smtp' => 'Käytä SMTP:tä', + 'email_smtp_host' => 'SMTP isäntä', + 'email_smtp_port' => 'SMTP portti', + 'email_smtp_security' => 'SMTP turvallisuus', + 'email_smtp_security_none' => 'Ei mitään', + 'email_smtp_username' => 'SMTP käyttäjänimi', + 'email_smtp_password' => 'SMTP salasana', + 'email_smtp_noauth' => 'Jätä tyhjäksi jos ei varmennusta', + 'sms_status' => 'Salli tekstiviestien lähetys', + 'sms_gateway' => 'Palvelu jonka kautta tekstiviestit lähetetään', + 'sms_gateway_username' => 'Palvelun käyttäjänimi', + 'sms_gateway_password' => 'Palvelun salasana', + 'sms_from' => 'Lähettäjän puhelinnumero', + 'pushover_status' => 'Salli Pushover-viestien lähetys', + 'pushover_description' => 'Pushover on palvelu jolla on helppo lähettää reaaliaikaisia tilaviestejä. Katso + verkkosivuilta lisäinfoa.', + 'pushover_clone_app' => 'Paina tästä luodaksesi Pushover-sovelluksesi', + 'pushover_api_token' => 'Pushover API-avain', + 'pushover_api_token_description' => 'Ennen kuin voit käyttää Pushoveria, sinun täytyy rekisteröidä sovellus heidän + nettisivuillaan, ja kopioida API-avain tänne.', + 'alert_type' => 'Valitse milloin haluat ilmoituksia.', + 'alert_type_description' => 'Tilan muutos: Saat ilmoituksen kun palvelimen tila vaihtuu. Eli tilasta + päällä -> sammunut tai sammunut -> päällä.

    Sammunut: Saat + yhden ilmoituksen kun palvelimen tila vaihtuu sammuneeksi, mutta *VAIN + ENSIMMÄISEN KERRAN*. Esimerkiksi, jos tarkistus tehdään joka 15 minuutti, ja + palvelin sammuu klo 1 ja pysyy sammuneena klo 6 asti. Saat vain yhden ilmoituksen + klo 1, ei muuta.

    Aina: Saat ilmoituksen joka kerta kun palvelin + tarkistetaan, vaikka palvelin olisi ollut sammuneena tunteja.', + 'alert_type_status' => 'Tilan muutos', + 'alert_type_offline' => 'Sammunut', + 'alert_type_always' => 'Aina', + 'log_status' => 'Tallenna tapahtumat', + 'log_status_description' => 'Jos arvo on tosi, palvelin tallentaa tapahtumamerkinnän jokaisesta tilan + muutoksesta.', + 'log_email' => 'Tallenna lähetetyt sähköpostitapahtumat', + 'log_sms' => 'Tallenna lähetetyt tekstiviestitapahtumat', + 'log_pushover' => 'Tallenna lähetetyt Pushover-tapahtumat', + 'updated' => 'Asetukset tallennettu ja päivitetty.', + 'tab_email' => 'Sähköposti', + 'tab_sms' => 'Tekstiviesti', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Sähköposti asetukset', + 'settings_sms' => 'Tekstiviesti asetukset', + 'settings_pushover' => 'Pushover asetukset', + 'settings_notification' => 'Ilmoitusasetukset', + 'settings_log' => 'Tapahtumamerkintöjen asetukset', + 'auto_refresh' => 'Automaattipäivitys', + 'auto_refresh_description' => 'Päivittää automaattisesti palvelimet-sivun.
    Aika + sekunteina, jos 0, sivu ei päivity automaattisesti.', + 'seconds' => 'sekuntia', + 'test' => 'Testi', + 'test_email' => 'Testisähköposti lähetetään profiilisi sähköpostiosoitteeseen.', + 'test_sms' => 'Testitekstiviesti lähetetään profiilisi numeroon.', + 'test_pushover' => 'Pushover-ilmoitus lähetetään profiilissa asetettuun laitteeseen.', + 'send' => 'Lähetä', + 'test_subject' => 'Testi', + 'test_message' => 'Testiviesti', + 'email_sent' => 'Sähköposti lähetetty', + 'email_error' => 'Virhe sähköpostin lähetyksessä', + 'sms_sent' => 'Tekstiviesti lähetetty', + 'sms_error' => 'Virhe tekstiviestin lähetyksessä. %s', + 'sms_error_nomobile' => 'Testitektiviestin lähetys epäonnistui: toimivaa numeroa ei löydetty profiilistasi.', + 'pushover_sent' => 'Pushover ilmoitus lähetetty', + 'pushover_error' => 'Virhe Pushover-ilmoitusta lähetettäessä: %s', + 'pushover_error_noapp' => 'Virhe lähetettäessä Pushover-ilmoitusta: Pushover API-avainta ei löydetty + asetuksista.', + 'pushover_error_nokey' => 'Virhe lähetettäessä Pushover-ilmoitusta: Pushover avainta ei löydetty + profiilistasi.', + 'log_retention_period' => 'Tapahtumien säilytysaika', + 'log_retention_period_description' => 'Kuinka monta päivää pitää palvelinten päälläoloaikoja ja muita + tapahtumia. Aseta arvoksi 0 jos haluat pitää ne loputtomasti.', + 'log_retention_days' => 'päivää', + ), + 'login' => array( + 'welcome_usermenu' => 'Tervetuloa, %user_name%', + 'title_sign_in' => 'Ole hyvä ja kirjaudu sisään', + 'title_forgot' => 'Unohtuiko salasanasi?', + 'title_reset' => 'Resetoi salasanasi', + 'submit' => 'Lähetä', + 'remember_me' => 'Muista minut', + 'login' => 'Kirjaudu sisään', + 'logout' => 'Kirjaudu ulos', + 'username' => 'Käyttäjänimi', + 'password' => 'Salasana', + 'password_repeat' => 'Salasana uudestaan', + 'password_forgot' => 'Unohtuiko salasanasi?', + 'password_reset' => 'Resetoi salasanasi', + 'password_reset_email_subject' => 'Resetoi salasanasi PHP Server Monitoriin', + 'password_reset_email_body' => 'Ole hyvä ja käytä seuraavaa linkkiä restoidaksesi salasanasi. Huomaa että + linkki vanhentuu tunnin sisällä.

    %link%', + 'error_user_incorrect' => 'Annettua käyttäjänimeä ei löydetty.', + 'error_login_incorrect' => 'Antamasi tiedot eivät ole oikein.', + 'error_login_passwords_nomatch' => 'Annetut salasanat eivät täsmää.', + 'error_reset_invalid_link' => 'Resetointilinkkisi on väärä.', + 'success_password_forgot' => 'Sähköpostiisi on lähetetty ohjeet kuinka resetoida salasanasi.', + 'success_password_reset' => 'Salasanasi on resetoitu onnistuneesti, ole hyvä ja kirjaudu sisään.', + ), + 'error' => array( + '401_unauthorized' => 'Ei käyttöoikeuksia', + '401_unauthorized_description' => 'Sinulla ei ole käyttöoikeuksia katsoa tätä sivua.', + ), ); diff --git a/src/lang/fr_FR.lang.php b/src/lang/fr_FR.lang.php index 1d12389a..12ca83bc 100644 --- a/src/lang/fr_FR.lang.php +++ b/src/lang/fr_FR.lang.php @@ -1,4 +1,5 @@ 'Français - French', - 'locale' => array('fr_FR.UTF-8', 'fr_FR', 'french'), - 'locale_tag' => 'fr', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installer', - 'action' => 'Action', - 'save' => 'Enregistrer', - 'edit' => 'Editer', - 'delete' => 'Supprimer', - 'view' => 'Détails', - 'date' => 'Date', - 'message' => 'Message', - 'yes' => 'Oui', - 'no' => 'Non', - 'insert' => 'Nouveau', - 'add_new' => 'Nouveau', - 'update_available' => 'Une nouvelle version ({version}) est disponible à l\'adresse http://www.phpservermonitor.org.', - 'back_to_top' => 'Haut de page', - 'go_back' => 'Retour', - 'ok' => 'OK', - 'bad' => 'mauvais', - 'cancel' => 'Annuler', - 'none' => 'Aucun', - 'activate' => 'Activer', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => 'Le %e %B', - 'long_day_format' => 'Le %e %B %Y', - 'yesterday_format' => 'Hier à %kh%M', - 'other_day_format' => '%A à %kh%M', - 'never' => 'Jamais', - 'hours_ago' => 'Il y a %d heures', - 'an_hour_ago' => 'Il y a une heure', - 'minutes_ago' => 'Il y a %d minutes', - 'a_minute_ago' => 'Il y a une minute', - 'seconds_ago' => 'Il y a %d secondes', - 'a_second_ago' => 'Il y a une seconde', - 'year' => 'année', - 'years' => 'années', - 'month' => 'mois', - 'months' => 'mois', - 'day' => 'jour', - 'days' => 'jours', - 'hour' => 'heure', - 'hours' => 'heures', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'seconde', - 'seconds' => 'secondes', - 'current' => 'actuel', - 'settings' => 'Paramètres', - 'search' => 'Recherche' - ), - 'menu' => array( - 'config' => 'Configuration', - 'server' => 'Serveurs', - 'server_log' => 'Événements', - 'server_status' => 'États', - 'server_update' => 'Mise à jour', - 'user' => 'Utilisateurs', - 'help' => 'Aide', - ), - 'users' => array( - 'user' => 'Utilisateur', - 'name' => 'Nom', - 'user_name' => 'Nom d\'utilisateur', - 'password' => 'Mot de passe', - 'password_repeat' => 'Répéter le mot de passe', - 'password_leave_blank' => 'Laisser vide pour ne pas le modifier', - 'level' => 'Rôle', - 'level_10' => 'Administrateur', - 'level_20' => 'Utilisateur', - 'level_description' => 'Les Administrateurs ont un accès total. Ils peuvent gérer les serveurs, les utilisateurs et éditer la configuration globale.
    Les Utilisateurs ne peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.', - 'mobile' => 'Téléphone', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir leur site web pour plus d\'informations.', - 'pushover_key' => 'Clé Pushover', - 'pushover_device' => 'Appareil Pushover', - 'pushover_device_description' => 'Nom de l\'appareil auquel le message doit être envoyé. Laissez vide pour l\'envoyer à tous les appareils.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram est une application de messagerie instantanée qui facilite la réception de notification en temps réel. Lisez la documentation pour obtenir plus d\'informations sur la configuration de ce service.', - 'telegram_chat_id' => 'ID de conversation (Chat ID) Telegram', - 'telegram_chat_id_description' => 'Les notifications seront envoyées à la conversation correspondante.', - 'telegram_get_chat_id' => 'Cliquez ici pour obtenir votre ID de conversation (Chat ID)', - 'activate_telegram' => 'Activer les alertes Telegram', - 'activate_telegram_description' => 'Permet aux notifications Telegram d\'être envoyée à la conversation spécifiée. Sans cette permission, Telegram ne nous autorise pas à vous envoyer des notifications.', - 'telegram_bot_username_found' => 'Le BOT a été trouvé !

    Cela va ouvrir une conversation avec le BOT. Vous devez appuyer sur \'/start\' ou le saisir.', - 'telegram_bot_username_error_token' => '401 - Unauthorized. Assuez-vous que le Token API soit valide.', - 'telegram_bot_error' => 'Une erreur s\'est produite en tentant d\'activer les notifications Telegram : %s', - 'delete_title' => 'Supprimer un utilisateur', - 'delete_message' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur \'%1\' ?', - 'deleted' => 'Utilisateur supprimé.', - 'updated' => 'Utilisateur mis à jour.', - 'inserted' => 'Utilisateur ajouté.', - 'profile' => 'Profil', - 'profile_updated' => 'Votre profil a été mis à jour.', - 'error_user_name_bad_length' => 'Le nom d\'utilisateur doit avoir entre 2 et 64 caractères.', - 'error_user_name_invalid' => 'Le nom d\'utilisateur ne peut contenir que des caractères alphabétiques (a-z, A-Z), des chiffres (0-9), points (.) ou underscore (_).', - 'error_user_name_exists' => 'Ce nom d\'utilisateur existe déjà.', - 'error_user_email_bad_length' => 'L\'adresse email doit avoir entre 5 et 255 caractères.', - 'error_user_email_invalid' => 'L\'adresse email n\'est pas valide.', - 'error_user_level_invalid' => 'Le rôle d\'utilisateur n\'est pas valide.', - 'error_user_no_match' => 'L\'utilisateur n\'a pas été trouvé dans la base de données.', - 'error_user_password_invalid' => 'Le mot de passe n\'est pas valide.', - 'error_user_password_no_match' => 'Le mot de passe est incorrect.', - ), - 'log' => array( - 'title' => 'Événements', - 'type' => 'Type', - 'status' => 'État', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'Aucun événement', - 'clear' => 'Effacer les journaux', - 'delete_title' => 'Supprimer les journaux', - 'delete_message' => 'Êtes-vous sûr de vouloir supprimer tous les journaux ?', - ), - 'servers' => array( - 'server' => 'Serveur', - 'status' => 'État', - 'label' => 'Nom', - 'domain' => 'Domaine/IP', - 'timeout' => 'Délai d\'attente', - 'timeout_description' => 'Nombre de secondes à attendre une réponse du serveur.', - 'authentication_settings' => 'Paramètres d\'authentification', - 'optional' => 'Optionnel', - 'website_username' => 'Nom d\'utilisateur', - 'website_username_description' => 'Nom d\'utilisateur pour accèder au site. (Seul l\'authentification Apache est supporté.)', - 'website_password' => 'Mot de passe', - 'website_password_description' => 'Mot de passe pour accèder au site. Le mot de passe est cryptè dans la base de donnée.', - 'fieldset_monitoring' => 'Monitoring', - 'fieldset_permissions' => 'Permissions', - 'permissions' => 'Les utilisateurs suivants pourront voir le serveur.', - 'port' => 'Port', - 'custom_port' => 'Port personnalisé', - 'popular_ports' => 'Ports courant', - 'request_method' => 'Type de requête', - 'custom_request_method' => 'Type de requête personalisée', - 'popular_request_methods' => 'Type de requête prédéfinie', - 'post_field' => 'Champ POST', - 'post_field_description' => 'Les données qui seront envoyés en utilisant le type de requête choisi.', - 'please_select' => 'Veuillez choisir', - 'type' => 'Type', - 'type_website' => 'Site Web', - 'type_service' => 'Service', - 'type_ping' => 'Ping', - 'pattern' => 'Rechercher un texte/motif', - 'pattern_description' => 'Si ce texte n\'est par retrouvé sur le site web, le serveur est marqué hors-service. Les expressions régulières sont autorisées.', - 'pattern_online' => 'Le texte indique que le site est', - 'pattern_online_description' => 'En ligne : Si ce texte n\'est pas trouvé sur le site internet, le serveur sera considéré en ligne. Hors-ligne : Si ce texte n\'est pas trouvé sur le site, le serveur sera considéré hors-ligne.', - 'redirect_check' => 'La redirection vers un autre domaine est', - 'redirect_check_description' => 'Une redirection vers un autre domaine est généralement mauvais signe.', - 'allow_http_status' => 'Autoriser les codes de status HTTP', - 'allow_http_status_description' => 'Marquer le serveur en ligne. Les codes de status HTTP inférieur à 400 sont considérés comme en ligne par défaut. Séparés les valeurs avec |.', - 'header_name' => 'Nom d\'en-têtes', - 'header_value' => 'Valeur d\'en-tête', - 'header_name_description' => 'Sensible à la casse.', - 'header_value_description' => 'Les expréssions régulières sont autorisées.', - 'last_check' => 'Dernière vérification', - 'last_online' => 'Dernière fois OK', - 'last_offline' => 'Dernière fois hors-ligne', - 'last_output' => 'Dernière sortie positive', - 'last_error' => 'Dernière erreur', - 'last_error_output' => 'Dernière erreur de sortie', - 'output' => 'Sortie', - 'monitoring' => 'Surveillé', - 'no_monitoring' => 'Non surveillé', - 'email' => 'Email', - 'send_email' => 'Envoyer un email', - 'sms' => 'SMS', - 'send_sms' => 'Envoyer un SMS', - 'pushover' => 'Pushover', - 'send_pushover' => 'Envoyer des notifications Pushover', - 'telegram' => 'Telegram', - 'send_telegram' => 'Envoyer des notifications Telegram', - 'users' => 'Utilisateurs', - 'delete_title' => 'Supprimer un serveur', - 'delete_message' => 'Êtes-vous sûr de vouloir supprimer le serveur \'%1\' ?', - 'deleted' => 'Serveur supprimé.', - 'updated' => 'Serveur mis à jour.', - 'inserted' => 'Serveur ajouté.', - 'latency' => 'Temps de réponse', - 'latency_max' => 'Temps de réponse maximum', - 'latency_min' => 'Temps de réponse minimum', - 'latency_avg' => 'Temps de réponse moyen', - 'online' => 'en ligne', - 'offline' => 'hors ligne', - 'uptime' => 'Disponibilité', - 'year' => 'Année', - 'month' => 'Mois', - 'week' => 'Semaine', - 'day' => 'Jour', - 'hour' => 'Heure', - 'warning_threshold' => 'Seuil d\'alerte', - 'warning_threshold_description' => 'Nombre d\'échecs de connexion avant que le serveur soit marqué hors-service.', - 'chart_last_week' => 'La dernière semaine', - 'chart_history' => 'Historique', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d/%m/%Y', - 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Les notifications SMS sont désactivées.', - 'warning_notifications_disabled_email' => 'Les notifications par email sont désactivées.', - 'warning_notifications_disabled_pushover' => 'Les notifications Pushover sont désactivées.', - 'warning_notifications_disabled_telegram' => 'Les notifications Telegram sont désactivées.', - 'error_server_no_match' => 'Serveur non trouvé.', - 'error_server_label_bad_length' => 'Le nom doit avoir entre 1 et 255 caractères.', - 'error_server_ip_bad_length' => 'Domaine/IP doit avoir entre 1 et 255 caractères.', - 'error_server_ip_bad_service' => 'L\'adresse IP n\'est pas valide.', - 'error_server_ip_bad_website' => 'L\'URL du site web n\'est pas valide.', - 'error_server_type_invalid' => 'Le type de service sélectionné n\'est pas valide.', - 'error_server_warning_threshold_invalid' => 'Le seuil d\'alerte doit être un nombre entier supérieur à 0.', - ), - 'config' => array( - 'general' => 'Général', - 'language' => 'Langue', - 'show_update' => 'Vérifier les nouvelles mises à jour chaque semaine', - 'password_encrypt_key' => 'Clée de cryptage des mots de passe', - 'password_encrypt_key_note' => 'Cette clée est utilisée pour crypter les mots de passe qui sont enregistrés dans la base de donnée pour les serveurs qui requiert une authentification. Si la clé est modifié, les mots de passe enregistré ne seront plus valide !', - 'proxy' => 'Activer le proxy', - 'proxy_url' => 'URL du proxy', - 'proxy_user' => 'Nom d\'utilisateur du proxy', - 'proxy_password' => 'Mot de passe du proxy', - 'email_status' => 'Autoriser l\'envoi de mail', - 'email_from_email' => 'Adresse de l\'expéditeur', - 'email_from_name' => 'Nom de l\'expéditeur', - 'email_smtp' => 'Utiliser un serveur SMTP', - 'email_smtp_host' => 'Adresse serveur SMTP', - 'email_smtp_port' => 'Port SMTP', - 'email_smtp_security' => 'Protocole de sécurité SMTP', - 'email_smtp_security_none' => 'Aucun', - 'email_smtp_username' => 'Nom utilisateur SMTP', - 'email_smtp_password' => 'Mot de passe SMTP', - 'email_smtp_noauth' => 'Laisser vide si pas d\'authentication', - 'sms_status' => 'Autoriser l\'envoi de SMS', - 'sms_gateway' => 'Passerelle à utiliser pour l\'envoi de SMS', - 'sms_gateway_username' => 'Nom utilisateur de la passerelle', - 'sms_gateway_password' => 'Mot de passe de la passerelle', - 'sms_from' => 'SMS de l\'expéditeur', - 'pushover_status' => 'Autoriser l\'envoi des messages Pushover', - 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir leur site web pour plus d\'informations.', - 'pushover_clone_app' => 'Cliquez ici pour créer votre application Pushover', - 'pushover_api_token' => 'Jeton application Pushover', - 'pushover_api_token_description' => 'Avant de pouvoir utiliser Pushover, vous devez créer une application sur leur site web et entrer ici le jeton (Token) de l\'application.', - 'telegram_status' => 'Autorise l\'envoi de message Telegram', - 'telegram_description' => 'Telegram est une application de messagerie instantanée qui facilite la réception de notification en temps réel. Lisez la documentation pour obtenir plus d\'informations sur la configuration de ce service.', - 'telegram_api_token' => 'Token API Telegram', - 'telegram_api_token_description' => 'Afin de pouvoir utiliser Telegram, il vous faut obtenir un token api. Consultez la documentation pour obtenir de l\'aide.', - 'alert_type' => 'Choisissez quand vous souhaitez être notifié', - 'alert_type_description' => 'Changement d\'état : '. - 'Vous recevez une notification chaque fois que le serveur change d\'état. C\'est-à-dire passe de l\'état OK à HORS SERVICE ou de HORS SERVICE à OK.
    '. - '
    Hors service : '. - 'Vous ne recevez une notification que quand le serveur passe de l\'état OK à HORS SERVICE. Par exemple, '. - 'Votre tâche planifiée s\'exécute toutes les 15 minutes et votre serveur passe à l\'état HORS SERVICE à 1 heure du matin et le reste jusqu\'à 6 heures du matin.'. - 'Vous ne recevez qu\'une seule notification à 1 heure du matin.
    '. - '
    Toujours : '. - 'Vous recevez une notification à chaque exécution de la tâche planifiée si le serveur est à l\'état HORS SERVICE ', - 'alert_type_status' => 'Changement d\'état', - 'alert_type_offline' => 'Hors service', - 'alert_type_always' => 'Toujours', - 'combine_notifications' => 'Combiner les notifications', - 'combine_notifications_description' => 'Réduit le nombre de notifications en les combinant toutes en une seule. (Cela ne s\'applique pas aux SMS.)', - 'alert_proxy' => 'Le serveur proxy n\'est jamais utilisé pour les services, même quand celui-ci est activé.', - 'alert_proxy_url' => 'Format : hôte:port', - 'log_status' => 'Etat des événements', - 'log_status_description' => 'Si l\'option est activée, un événement est enregistré chaque fois qu\'une notification a lieu.', - 'log_email' => 'Enregistrer tous les emails envoyés', - 'log_sms' => 'Enregistrer tous les SMS envoyés', - 'log_pushover' => 'Enregistrer tous les messages Pushover envoyés', - 'log_telegram' => 'Enregistrer tous les messages Telegram envoyés', - 'updated' => 'La configuration a été mise à jour.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Configuration email', - 'settings_sms' => 'Configuration SMS', - 'settings_pushover' => 'Configuration Pushover', - 'settings_telegram' => 'Configuration Telegram', - 'settings_notification' => 'Configuration des notifications', - 'settings_log' => 'Configuration des événements', - 'settings_proxy' => 'Configuration du proxy', - 'auto_refresh' => 'Auto-rachaîchissement', - 'auto_refresh_description' => - 'Auto-rachaîchissement de la page serveurs.
    '. - ''. - 'Temps en secondes. Si 0, la page n\'est pas rafraîchie.'. - '', - 'seconds' => 'secondes', - 'test' => 'Tester', - 'test_email' => 'Un email va vous être envoyé à l\'adresse définie dans votre profil utilisateur.', - 'test_sms' => 'Un SMS va vous être envoyé au numéro défini dans votre profil utilisateur.', - 'test_pushover' => 'Une notification Pushover va être envoyée en utilisant la clé spécifiée dans votre profil utilisateur.', - 'test_telegram' => 'Une notification Telegram sera envoyé à la conversion indiqué sur votre profil (ID de conversation).', - 'send' => 'Envoyer', - 'test_subject' => 'Test', - 'test_message' => 'Message de test', - 'email_sent' => 'Email envoyé', - 'email_error' => 'Erreur lors de l\'envoi de l\'email', - 'sms_sent' => 'SMS envoyé', - 'sms_error' => 'Erreur lors de l\'envoi du SMS. %s', - 'sms_error_nomobile' => 'Impossible d\'envoyer un SMS de test: aucun numéro de téléphone défini dans votre profil.', - 'pushover_sent' => 'Notification Pushover envoyée', - 'pushover_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification Pushover : %s', - 'pushover_error_noapp' => 'Impossible d\'envoyer une notification de test: Aucun jeton application Pushover n\'a été défini dans la configuration Pushover.', - 'pushover_error_nokey' => 'Impossible d\'envoyer une notification de test: Aucune clé Pushover n\'a été définie dans votre profil.', - 'telegram_sent' => 'Notification Telegram envoyée', - 'telegram_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification : %s', - 'telegram_error_notoken' => 'Impossible d\'envoyé la notification de test : aucun token APII token trouvé dans la configuration.', - 'telegram_error_noid' => 'Impossible d\'envoyé la notification de test : aucun ID de conversation trouvé dans votre profil utilisateur.', - 'log_retention_period' => 'Durée de conservation', - 'log_retention_period_description' => 'Nombre de jours de conservation des événements envoyés et des temps de réponse des serveurs. Entrez 0 pour les conserver indéfiniment.', - 'log_retention_days' => 'jours', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Le Serveur \'%LABEL%\' est HORS SERVICE: IP=%IP%, Port=%PORT%. Erreur=%ERROR%', - 'off_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est HORS SERVICE', - 'off_email_body' => "Impossible de se connecter au serveur suivant:

    Serveur : %LABEL%
    IP : %IP%
    Port : %PORT%
    Erreur : %ERROR%
    Date: %DATE%", - 'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE', - 'off_pushover_message' => "Impossible de se connecter au serveur suivant :

    Serveur : %LABEL%
    IP : %IP%
    Port : %PORT%
    Erreur : %ERROR%
    Date : %DATE%", - 'off_telegram_message' => "Impossible de se connecter au serveur suivant :

    Serveur : %LABEL%
    IP : %IP%
    Port : %PORT%
    Erreur : %ERROR%
    Date : %DATE%", - 'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%, il était hors-ligne pendant %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK', - 'on_email_body' => "Le Serveur '%LABEL%' est de nouveau OK, il était hors-ligne pendant %LAST_OFFLINE_DURATION%:

    Serveur: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - 'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK', - 'on_pushover_message' => "Le Serveur '%LABEL%' est de nouveau OK, il était hors-ligne pendant %LAST_OFFLINE_DURATION%:

    Serveur: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - 'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for: %LAST_OFFLINE_DURATION%

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%', - 'combi_off_email_message' => "
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : %PORT%
    • Erreur : %ERROR%
    • Date : %DATE%
    ", - 'combi_off_pushover_message' => "
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : %PORT%
    • Erreur : %ERROR%
    • Date : %DATE%
    ", - 'combi_off_telegram_message' => "- Serveur : %LABEL%
    - IP : %IP%
    - Port : %PORT%
    - Erreur : %ERROR%
    - Date : %DATE%

    ", - 'combi_on_email_message' => "
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : %PORT%
    • Durée : %LAST_OFFLINE_DURATION%
    • Date : %DATE%
    ", - 'combi_on_pushover_message' => '
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : %PORT%
    • Durée : %LAST_OFFLINE_DURATION%
    • Date : %DATE%
    ', - 'combi_on_telegram_message' => '- Serveur : %LABEL%
    - IP: %IP%
    - Port : %PORT%
    - Durée : %LAST_OFFLINE_DURATION%
    - Date : %DATE%

    ', - 'combi_email_subject' => 'IMPORTANT : \'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs hors-ligne', - 'combi_pushover_subject' => '\'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs hors-ligne', - 'combi_email_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les serveurs suivants sont en ligne :
    %UP_SERVERS%', - 'combi_pushover_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les serveurs suivants sont en ligne :
    %UP_SERVERS%', - 'combi_telegram_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les serveurs suivants sont en ligne :
    %UP_SERVERS%', - ), - 'login' => array( - 'welcome_usermenu' => 'Bonjour %user_name%', - 'title_sign_in' => 'Connectez vous SVP', - 'title_forgot' => 'Mot de passe oublié ?', - 'title_reset' => 'Réinitialisation du mot de passe', - 'submit' => 'Envoyer', - 'remember_me' => 'Se souvenir de moi', - 'login' => 'Connexion', - 'logout' => 'Déconnexion', - 'username' => 'Nom', - 'password' => 'Mot de passe', - 'password_repeat' => 'Répéter le mot de passe', - 'password_forgot' => 'Mot de passe oublié ?', - 'password_reset' => 'Réinitialiser le mot de passe', - 'password_reset_email_subject' => 'Réinitialisation du mot de passe pour PHP Server Monitor', - 'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe. Veuillez noter qu\'il expire dans une heure.

    %link%', - 'error_user_incorrect' => 'Nom d\'utilisateur invalide.', - 'error_login_incorrect' => 'Informations incorrectes.', - 'error_login_passwords_nomatch' => 'Mot de passe invalide.', - 'error_reset_invalid_link' => 'Le lien d\'initialisation du mot de passe n\'est pas valide.', - 'success_password_forgot' => 'Un email vous a été envoyé pour réinitialiser votre mot de passe.', - 'success_password_reset' => 'Votre mot de passe a été réinitialisé.', - ), - 'error' => array( - '401_unauthorized' => 'Non autorisée', - '401_unauthorized_description' => 'Vous n\'avez pas les privilèges nécessaires pour voir cette page.', - ), + 'name' => 'Français - French', + 'locale' => array( + '0' => 'fr_FR.UTF-8', + '1' => 'fr_FR', + '2' => 'french', + ), + 'locale_tag' => 'fr', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installer', + 'action' => 'Action', + 'save' => 'Enregistrer', + 'edit' => 'Editer', + 'delete' => 'Supprimer', + 'view' => 'Détails', + 'date' => 'Date', + 'message' => 'Message', + 'yes' => 'Oui', + 'no' => 'Non', + 'insert' => 'Nouveau', + 'add_new' => 'Nouveau', + 'update_available' => 'Une nouvelle version ({version}) est disponible à l\'adresse http://www.phpservermonitor.org.', + 'back_to_top' => 'Haut de page', + 'go_back' => 'Retour', + 'ok' => 'OK', + 'bad' => 'mauvais', + 'cancel' => 'Annuler', + 'none' => 'Aucun', + 'activate' => 'Activer', + 'short_day_format' => 'Le %e %B', + 'long_day_format' => 'Le %e %B %Y', + 'yesterday_format' => 'Hier à %kh%M', + 'other_day_format' => '%A à %kh%M', + 'never' => 'Jamais', + 'hours_ago' => 'Il y a %d heures', + 'an_hour_ago' => 'Il y a une heure', + 'minutes_ago' => 'Il y a %d minutes', + 'a_minute_ago' => 'Il y a une minute', + 'seconds_ago' => 'Il y a %d secondes', + 'a_second_ago' => 'Il y a une seconde', + 'year' => 'année', + 'years' => 'années', + 'month' => 'mois', + 'months' => 'mois', + 'day' => 'jour', + 'days' => 'jours', + 'hour' => 'heure', + 'hours' => 'heures', + 'minute' => 'minute', + 'minutes' => 'minutes', + 'second' => 'seconde', + 'seconds' => 'secondes', + 'current' => 'actuel', + 'settings' => 'Paramètres', + 'search' => 'Recherche', + ), + 'menu' => array( + 'config' => 'Configuration', + 'server' => 'Serveurs', + 'server_log' => 'Événements', + 'server_status' => 'États', + 'server_update' => 'Mise à jour', + 'user' => 'Utilisateurs', + 'help' => 'Aide', + ), + 'users' => array( + 'user' => 'Utilisateur', + 'name' => 'Nom', + 'user_name' => 'Nom d\'utilisateur', + 'password' => 'Mot de passe', + 'password_repeat' => 'Répéter le mot de passe', + 'password_leave_blank' => 'Laisser vide pour ne pas le modifier', + 'level' => 'Rôle', + 'level_10' => 'Administrateur', + 'level_20' => 'Utilisateur', + 'level_description' => 'Les Administrateurs ont un accès total. Ils peuvent gérer les serveurs, les + utilisateurs et éditer la configuration globale.
    Les Utilisateurs ne + peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.', + 'mobile' => 'Téléphone', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir leur site web pour plus + d\'informations.', + 'pushover_key' => 'Clé Pushover', + 'pushover_device' => 'Appareil Pushover', + 'pushover_device_description' => 'Nom de l\'appareil auquel le message doit être envoyé. Laissez vide pour + l\'envoyer à tous les appareils.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram est une application de + messagerie instantanée qui facilite la réception de notification en temps réel. + Lisez la documentation pour obtenir plus d\'informations sur la + configuration de ce service.', + 'telegram_chat_id' => 'ID de conversation (Chat ID) Telegram', + 'telegram_chat_id_description' => 'Les notifications seront envoyées à la conversation correspondante.', + 'telegram_get_chat_id' => 'Cliquez ici pour obtenir votre ID de conversation (Chat ID)', + 'activate_telegram' => 'Activer les alertes Telegram', + 'activate_telegram_description' => 'Permet aux notifications Telegram d\'être envoyée à la conversation + spécifiée. Sans cette permission, Telegram ne nous autorise pas à vous + envoyer des notifications.', + 'telegram_bot_username_found' => 'Le BOT a été trouvé !
    +
    Cela va ouvrir une conversation avec le BOT. Vous devez appuyer sur + \'/start\' ou le saisir.', + 'telegram_bot_username_error_token' => '401 - Unauthorized. Assuez-vous que le Token API soit valide.', + 'telegram_bot_error' => 'Une erreur s\'est produite en tentant d\'activer les notifications Telegram : %s', + 'delete_title' => 'Supprimer un utilisateur', + 'delete_message' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur \'%1\' ?', + 'deleted' => 'Utilisateur supprimé.', + 'updated' => 'Utilisateur mis à jour.', + 'inserted' => 'Utilisateur ajouté.', + 'profile' => 'Profil', + 'profile_updated' => 'Votre profil a été mis à jour.', + 'error_user_name_bad_length' => 'Le nom d\'utilisateur doit avoir entre 2 et 64 caractères.', + 'error_user_name_invalid' => 'Le nom d\'utilisateur ne peut contenir que des caractères alphabétiques (a-z, + A-Z), des chiffres (0-9), points (.) ou underscore (_).', + 'error_user_name_exists' => 'Ce nom d\'utilisateur existe déjà.', + 'error_user_email_bad_length' => 'L\'adresse email doit avoir entre 5 et 255 caractères.', + 'error_user_email_invalid' => 'L\'adresse email n\'est pas valide.', + 'error_user_level_invalid' => 'Le rôle d\'utilisateur n\'est pas valide.', + 'error_user_no_match' => 'L\'utilisateur n\'a pas été trouvé dans la base de données.', + 'error_user_password_invalid' => 'Le mot de passe n\'est pas valide.', + 'error_user_password_no_match' => 'Le mot de passe est incorrect.', + ), + 'log' => array( + 'title' => 'Événements', + 'type' => 'Type', + 'status' => 'État', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'Aucun événement', + 'clear' => 'Effacer les journaux', + 'delete_title' => 'Supprimer les journaux', + 'delete_message' => 'Êtes-vous sûr de vouloir supprimer tous les journaux ?', + ), + 'servers' => array( + 'server' => 'Serveur', + 'status' => 'État', + 'label' => 'Nom', + 'domain' => 'Domaine/IP', + 'timeout' => 'Délai d\'attente', + 'timeout_description' => 'Nombre de secondes à attendre une réponse du serveur.', + 'authentication_settings' => 'Paramètres d\'authentification', + 'optional' => 'Optionnel', + 'website_username' => 'Nom d\'utilisateur', + 'website_username_description' => 'Nom d\'utilisateur pour accèder au site. (Seul l\'authentification Apache + est supporté.)', + 'website_password' => 'Mot de passe', + 'website_password_description' => 'Mot de passe pour accèder au site. Le mot de passe est cryptè dans la + base de donnée.', + 'fieldset_monitoring' => 'Monitoring', + 'fieldset_permissions' => 'Permissions', + 'permissions' => 'Les utilisateurs suivants pourront voir le serveur.', + 'port' => 'Port', + 'custom_port' => 'Port personnalisé', + 'popular_ports' => 'Ports courant', + 'request_method' => 'Type de requête', + 'custom_request_method' => 'Type de requête personalisée', + 'popular_request_methods' => 'Type de requête prédéfinie', + 'post_field' => 'Champ POST', + 'post_field_description' => 'Les données qui seront envoyés en utilisant le type de requête choisi.', + 'please_select' => 'Veuillez choisir', + 'type' => 'Type', + 'type_website' => 'Site Web', + 'type_service' => 'Service', + 'type_ping' => 'Ping', + 'pattern' => 'Rechercher un texte/motif', + 'pattern_description' => 'Si ce texte n\'est par retrouvé sur le site web, le serveur est marqué + hors-service. Les expressions régulières sont autorisées.', + 'pattern_online' => 'Le texte indique que le site est', + 'pattern_online_description' => 'En ligne : Si ce texte est trouvé sur le site internet, le serveur sera + considéré en ligne. Hors-ligne : Si ce texte n\'est pas trouvé sur le + site, le serveur sera considéré hors-ligne.', + 'redirect_check' => 'La redirection vers un autre domaine est', + 'redirect_check_description' => 'Une redirection vers un autre domaine est généralement mauvais signe.', + 'allow_http_status' => 'Autoriser les codes de status HTTP', + 'allow_http_status_description' => 'Marquer le serveur en ligne. Les codes de status HTTP inférieur à 400 + sont considérés comme en ligne par défaut. Séparés les valeurs avec + |.', + 'header_name' => 'Nom d\'en-têtes', + 'header_value' => 'Valeur d\'en-tête', + 'header_name_description' => 'Sensible à la casse.', + 'header_value_description' => 'Les expréssions régulières sont autorisées.', + 'last_check' => 'Dernière vérification', + 'last_online' => 'Dernière fois OK', + 'last_offline' => 'Dernière fois hors-ligne', + 'last_output' => 'Dernière sortie positive', + 'last_error' => 'Dernière erreur', + 'last_error_output' => 'Dernière erreur de sortie', + 'output' => 'Sortie', + 'monitoring' => 'Surveillé', + 'no_monitoring' => 'Non surveillé', + 'email' => 'Email', + 'send_email' => 'Envoyer un email', + 'sms' => 'SMS', + 'send_sms' => 'Envoyer un SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Envoyer des notifications Pushover', + 'telegram' => 'Telegram', + 'send_telegram' => 'Envoyer des notifications Telegram', + 'users' => 'Utilisateurs', + 'delete_title' => 'Supprimer un serveur', + 'delete_message' => 'Êtes-vous sûr de vouloir supprimer le serveur \'%1\' ?', + 'deleted' => 'Serveur supprimé.', + 'updated' => 'Serveur mis à jour.', + 'inserted' => 'Serveur ajouté.', + 'latency' => 'Temps de réponse', + 'latency_max' => 'Temps de réponse maximum', + 'latency_min' => 'Temps de réponse minimum', + 'latency_avg' => 'Temps de réponse moyen', + 'online' => 'en ligne', + 'offline' => 'hors ligne', + 'uptime' => 'Disponibilité', + 'year' => 'Année', + 'month' => 'Mois', + 'week' => 'Semaine', + 'day' => 'Jour', + 'hour' => 'Heure', + 'warning_threshold' => 'Seuil d\'alerte', + 'warning_threshold_description' => 'Nombre d\'échecs de connexion avant que le serveur soit marqué + hors-service.', + 'chart_last_week' => 'La dernière semaine', + 'chart_history' => 'Historique', + 'chart_day_format' => '%d/%m/%Y', + 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Les notifications SMS sont désactivées.', + 'warning_notifications_disabled_email' => 'Les notifications par email sont désactivées.', + 'warning_notifications_disabled_pushover' => 'Les notifications Pushover sont désactivées.', + 'warning_notifications_disabled_telegram' => 'Les notifications Telegram sont désactivées.', + 'error_server_no_match' => 'Serveur non trouvé.', + 'error_server_label_bad_length' => 'Le nom doit avoir entre 1 et 255 caractères.', + 'error_server_ip_bad_length' => 'Domaine/IP doit avoir entre 1 et 255 caractères.', + 'error_server_ip_bad_service' => 'L\'adresse IP n\'est pas valide.', + 'error_server_ip_bad_website' => 'L\'URL du site web n\'est pas valide.', + 'error_server_type_invalid' => 'Le type de service sélectionné n\'est pas valide.', + 'error_server_warning_threshold_invalid' => 'Le seuil d\'alerte doit être un nombre entier supérieur à 0.', + ), + 'config' => array( + 'general' => 'Général', + 'language' => 'Langue', + 'show_update' => 'Vérifier les nouvelles mises à jour chaque semaine', + 'password_encrypt_key' => 'Clée de cryptage des mots de passe', + 'password_encrypt_key_note' => 'Cette clée est utilisée pour crypter les mots de passe qui sont enregistrés + dans la base de donnée pour les serveurs qui requiert une authentification. + Si la clé est modifié, les mots de passe enregistré ne seront plus + valide !', + 'proxy' => 'Activer le proxy', + 'proxy_url' => 'URL du proxy', + 'proxy_user' => 'Nom d\'utilisateur du proxy', + 'proxy_password' => 'Mot de passe du proxy', + 'email_status' => 'Autoriser l\'envoi de mail', + 'email_from_email' => 'Adresse de l\'expéditeur', + 'email_from_name' => 'Nom de l\'expéditeur', + 'email_smtp' => 'Utiliser un serveur SMTP', + 'email_smtp_host' => 'Adresse serveur SMTP', + 'email_smtp_port' => 'Port SMTP', + 'email_smtp_security' => 'Protocole de sécurité SMTP', + 'email_smtp_security_none' => 'Aucun', + 'email_smtp_username' => 'Nom utilisateur SMTP', + 'email_smtp_password' => 'Mot de passe SMTP', + 'email_smtp_noauth' => 'Laisser vide si pas d\'authentication', + 'sms_status' => 'Autoriser l\'envoi de SMS', + 'sms_gateway' => 'Passerelle à utiliser pour l\'envoi de SMS', + 'sms_gateway_username' => 'Nom utilisateur de la passerelle', + 'sms_gateway_password' => 'Mot de passe de la passerelle', + 'sms_from' => 'SMS de l\'expéditeur', + 'pushover_status' => 'Autoriser l\'envoi des messages Pushover', + 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir leur site web pour plus + d\'informations.', + 'pushover_clone_app' => 'Cliquez ici pour créer votre application Pushover', + 'pushover_api_token' => 'Jeton application Pushover', + 'pushover_api_token_description' => 'Avant de pouvoir utiliser Pushover, vous devez créer une application sur leur site + web et entrer ici le jeton (Token) de l\'application.', + 'telegram_status' => 'Autorise l\'envoi de message Telegram', + 'telegram_description' => 'Telegram est une application de + messagerie instantanée qui facilite la réception de notification en temps réel. + Lisez la documentation pour obtenir plus d\'informations sur la + configuration de ce service.', + 'telegram_api_token' => 'Token API Telegram', + 'telegram_api_token_description' => 'Afin de pouvoir utiliser Telegram, il vous faut obtenir un token api. + Consultez la documentation pour obtenir de l\'aide.', + 'alert_type' => 'Choisissez quand vous souhaitez être notifié', + 'alert_type_description' => 'Changement d\'état : Vous recevez une notification chaque fois que + le serveur change d\'état. C\'est-à-dire passe de l\'état OK à HORS SERVICE + ou de HORS SERVICE à OK.

    Hors service : Vous ne recevez une + notification que quand le serveur passe de l\'état OK à HORS SERVICE. Par + exemple, Votre tâche planifiée s\'exécute toutes les 15 minutes et votre + serveur passe à l\'état HORS SERVICE à 1 heure du matin et le reste jusqu\'à + 6 heures du matin.Vous ne recevez qu\'une seule notification à 1 heure du + matin.

    Toujours : Vous recevez une notification à chaque + exécution de la tâche planifiée si le serveur est à l\'état HORS SERVICE ', + 'alert_type_status' => 'Changement d\'état', + 'alert_type_offline' => 'Hors service', + 'alert_type_always' => 'Toujours', + 'combine_notifications' => 'Combiner les notifications', + 'combine_notifications_description' => 'Réduit le nombre de notifications en les combinant toutes en une + seule. (Cela ne s\'applique pas aux SMS.)', + 'alert_proxy' => 'Le serveur proxy n\'est jamais utilisé pour les services, même quand celui-ci est activé.', + 'alert_proxy_url' => 'Format : hôte:port', + 'log_status' => 'Etat des événements', + 'log_status_description' => 'Si l\'option est activée, un événement est enregistré chaque fois qu\'une + notification a lieu.', + 'log_email' => 'Enregistrer tous les emails envoyés', + 'log_sms' => 'Enregistrer tous les SMS envoyés', + 'log_pushover' => 'Enregistrer tous les messages Pushover envoyés', + 'log_telegram' => 'Enregistrer tous les messages Telegram envoyés', + 'updated' => 'La configuration a été mise à jour.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Configuration email', + 'settings_sms' => 'Configuration SMS', + 'settings_pushover' => 'Configuration Pushover', + 'settings_telegram' => 'Configuration Telegram', + 'settings_notification' => 'Configuration des notifications', + 'settings_log' => 'Configuration des événements', + 'settings_proxy' => 'Configuration du proxy', + 'auto_refresh' => 'Auto-rachaîchissement', + 'auto_refresh_description' => 'Auto-rachaîchissement de la page serveurs.
    Temps en + secondes. Si 0, la page n\'est pas rafraîchie.', + 'seconds' => 'secondes', + 'test' => 'Tester', + 'test_email' => 'Un email va vous être envoyé à l\'adresse définie dans votre profil utilisateur.', + 'test_sms' => 'Un SMS va vous être envoyé au numéro défini dans votre profil utilisateur.', + 'test_pushover' => 'Une notification Pushover va être envoyée en utilisant la clé spécifiée dans votre + profil utilisateur.', + 'test_telegram' => 'Une notification Telegram sera envoyé à la conversion indiqué sur votre profil (ID de + conversation).', + 'send' => 'Envoyer', + 'test_subject' => 'Test', + 'test_message' => 'Message de test', + 'email_sent' => 'Email envoyé', + 'email_error' => 'Erreur lors de l\'envoi de l\'email', + 'sms_sent' => 'SMS envoyé', + 'sms_error' => 'Erreur lors de l\'envoi du SMS. %s', + 'sms_error_nomobile' => 'Impossible d\'envoyer un SMS de test: aucun numéro de téléphone défini dans votre + profil.', + 'pushover_sent' => 'Notification Pushover envoyée', + 'pushover_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification Pushover : %s', + 'pushover_error_noapp' => 'Impossible d\'envoyer une notification de test: Aucun jeton application Pushover + n\'a été défini dans la configuration Pushover.', + 'pushover_error_nokey' => 'Impossible d\'envoyer une notification de test: Aucune clé Pushover n\'a été + définie dans votre profil.', + 'telegram_sent' => 'Notification Telegram envoyée', + 'telegram_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification : %s', + 'telegram_error_notoken' => 'Impossible d\'envoyé la notification de test : aucun token APII token + trouvé dans la configuration.', + 'telegram_error_noid' => 'Impossible d\'envoyé la notification de test : aucun ID de conversation + trouvé dans votre profil utilisateur.', + 'log_retention_period' => 'Durée de conservation', + 'log_retention_period_description' => 'Nombre de jours de conservation des événements envoyés et des temps + de réponse des serveurs. Entrez 0 pour les conserver indéfiniment.', + 'log_retention_days' => 'jours', + ), + 'notifications' => array( + 'off_sms' => 'Le Serveur \'%LABEL%\' est HORS SERVICE: IP=%IP%, Port=%PORT%. Erreur=%ERROR%', + 'off_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est HORS SERVICE', + 'off_email_body' => 'Impossible de se connecter au serveur suivant:

    Serveur : %LABEL%
    IP : + %IP%
    Port : %PORT%
    Erreur : %ERROR%
    Date: %DATE%', + 'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE', + 'off_pushover_message' => 'Impossible de se connecter au serveur suivant :

    Serveur : + %LABEL%
    IP : %IP%
    Port : %PORT%
    Erreur : + %ERROR%
    Date : %DATE%', + 'off_telegram_message' => 'Impossible de se connecter au serveur suivant :

    Serveur : + %LABEL%
    IP : %IP%
    Port : %PORT%
    Erreur : + %ERROR%
    Date : %DATE%', + 'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%, il était hors-ligne pendant + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK', + 'on_email_body' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant + %LAST_OFFLINE_DURATION%:

    Serveur: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK', + 'on_pushover_message' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant + %LAST_OFFLINE_DURATION%:

    Serveur: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Date: %DATE%', + 'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for: + %LAST_OFFLINE_DURATION%

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'combi_off_email_message' => '
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : + %PORT%
    • Erreur : %ERROR%
    • Date : %DATE%
    ', + 'combi_off_pushover_message' => '
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : + %PORT%
    • Erreur : %ERROR%
    • Date : %DATE%
    ', + 'combi_off_telegram_message' => '- Serveur : %LABEL%
    - IP : %IP%
    - Port : %PORT%
    - + Erreur : %ERROR%
    - Date : %DATE%

    ', + 'combi_on_email_message' => '
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : + %PORT%
    • Durée : %LAST_OFFLINE_DURATION%
    • Date : + %DATE%
    ', + 'combi_on_pushover_message' => '
    • Serveur : %LABEL%
    • IP : %IP%
    • Port : + %PORT%
    • Durée : %LAST_OFFLINE_DURATION%
    • Date : + %DATE%
    ', + 'combi_on_telegram_message' => '- Serveur : %LABEL%
    - IP: %IP%
    - Port : %PORT%
    - + Durée : %LAST_OFFLINE_DURATION%
    - Date : %DATE%

    ', + 'combi_email_subject' => 'IMPORTANT : \'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs + hors-ligne', + 'combi_pushover_subject' => '\'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs hors-ligne', + 'combi_email_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les + serveurs suivants sont en ligne :
    %UP_SERVERS%', + 'combi_pushover_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les + serveurs suivants sont en ligne :
    %UP_SERVERS%', + 'combi_telegram_message' => 'Les serveurs suivants sont hors-ligne :
    %DOWN_SERVERS%
    Les + serveurs suivants sont en ligne :
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => 'Bonjour %user_name%', + 'title_sign_in' => 'Connectez vous SVP', + 'title_forgot' => 'Mot de passe oublié ?', + 'title_reset' => 'Réinitialisation du mot de passe', + 'submit' => 'Envoyer', + 'remember_me' => 'Se souvenir de moi', + 'login' => 'Connexion', + 'logout' => 'Déconnexion', + 'username' => 'Nom', + 'password' => 'Mot de passe', + 'password_repeat' => 'Répéter le mot de passe', + 'password_forgot' => 'Mot de passe oublié ?', + 'password_reset' => 'Réinitialiser le mot de passe', + 'password_reset_email_subject' => 'Réinitialisation du mot de passe pour PHP Server Monitor', + 'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe. + Veuillez noter qu\'il expire dans une heure.

    %link%', + 'error_user_incorrect' => 'Nom d\'utilisateur invalide.', + 'error_login_incorrect' => 'Informations incorrectes.', + 'error_login_passwords_nomatch' => 'Mot de passe invalide.', + 'error_reset_invalid_link' => 'Le lien d\'initialisation du mot de passe n\'est pas valide.', + 'success_password_forgot' => 'Un email vous a été envoyé pour réinitialiser votre mot de passe.', + 'success_password_reset' => 'Votre mot de passe a été réinitialisé.', + ), + 'error' => array( + '401_unauthorized' => 'Non autorisée', + '401_unauthorized_description' => 'Vous n\'avez pas les privilèges nécessaires pour voir cette page.', + ), ); diff --git a/src/lang/it_IT.lang.php b/src/lang/it_IT.lang.php index 4e308fe6..80d15d76 100644 --- a/src/lang/it_IT.lang.php +++ b/src/lang/it_IT.lang.php @@ -1,4 +1,5 @@ 'Italiano - Italian', - 'locale' => array('it_IT.UTF-8', 'it_IT', 'italian', 'ita'), - 'locale_tag' => 'it', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installa', - 'action' => 'Azione', - 'save' => 'Salva', - 'edit' => 'Modifica', - 'delete' => 'Elimina', - 'date' => 'Data', - 'message' => 'Messaggio', - 'yes' => 'Sì', - 'no' => 'No', - 'insert' => 'Inserisci', - 'add_new' => 'Aggiungi Nuovo', - 'update_available' => 'Una nuova versione ({version}) è disponibile su http://www.phpservermonitor.org.', - 'back_to_top' => 'Torna su', - 'go_back' => 'Indietro', - 'ok' => 'OK', - 'cancel' => 'Annulla', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%e %B', - 'long_day_format' => '%e %B %Y', - 'yesterday_format' => 'Ieri alle %H:%M', - 'other_day_format' => '%A alle %H:%M', - 'never' => 'Mai', - 'hours_ago' => '%d ore fa', - 'an_hour_ago' => 'circa un ora fa', - 'minutes_ago' => '%d minuti fa', - 'a_minute_ago' => 'circa un minuto fa', - 'seconds_ago' => '%d secondi fa', - 'a_second_ago' => 'un secondo fa', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Configurazione', - 'server' => 'Servers', - 'server_log' => 'Log', - 'server_status' => 'Stato', - 'server_update' => 'Aggiorna', - 'user' => 'Utenti', - 'help' => 'Aiuto', - ), - 'users' => array( - 'user' => 'Utente', - 'name' => 'Nome', - 'user_name' => 'Nome utente', - 'password' => 'Password', - 'password_repeat' => 'Ripeti password', - 'password_leave_blank' => 'Lascia vuoto per non modificare', - 'level' => 'Livello', - 'level_10' => 'Amministratore', - 'level_20' => 'Utente', - 'level_description' => 'Gli Amministratori hanno pieno accesso: possono gestire server, utenti e modificare la configurazione globale.
    Gli Utenti possono solo visualizzare ed eseguire l\'aggiornamento per i server a cui sono assegnati.', - 'mobile' => 'Cellulare', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover è un servizio che rende semplice ottenere notifiche in tempo reale. Vedi il loro sito web per maggiori informazioni.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Dispositivo Pushover', - 'pushover_device_description' => 'Nome del dispositivo a cui inviare il messaggio. Lascia vuoto per inviarlo a tutti i dispositivi.', - 'delete_title' => 'Elimina Utente', - 'delete_message' => 'Sei sicuro di voler eliminare l\'utente \'%1\'?', - 'deleted' => 'Utente eliminato.', - 'updated' => 'Utente aggiornato.', - 'inserted' => 'Utente aggiunto.', - 'profile' => 'Profilo', - 'profile_updated' => 'Il tuo profilo è stato aggiornato.', - 'error_user_name_bad_length' => 'Il nome utente deve essere composto da almeno 2 caratteri (massimo 64).', - 'error_user_name_invalid' => 'Lo username può contenere solo caratteri alfabetici (a-z, A-Z), numeri (0-9), il punto (.) ed la sottolineatura (_).', - 'error_user_name_exists' => 'Nome utente già in uso.', - 'error_user_email_bad_length' => 'L\'indirizzo Email deve essere composto da 5 a 255 caratteri.', - 'error_user_email_invalid' => 'Indirizzo Email non valido.', - 'error_user_level_invalid' => 'Livello utente non valido.', - 'error_user_no_match' => 'L\'utente non è stato trovato nel database.', - 'error_user_password_invalid' => 'La password inserita non è valida.', - 'error_user_password_no_match' => 'Le password inserite non corrispondono.', - ), - 'log' => array( - 'title' => 'Righe log', - 'type' => 'Tipo', - 'status' => 'Stato', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Nessun log', - 'clear' => 'Pulisci il registro', - 'delete_title' => 'Elimina log', - 'delete_message' => 'Sei sicuro di voler eliminare tutti i registri?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Stato', - 'label' => 'Nome', - 'domain' => 'Dominio/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Numero di secondi da attendere per la risposta del server.', - 'port' => 'Porta', - 'type' => 'Tipo', - 'type_website' => 'Sito web', - 'type_service' => 'Servizio', - 'pattern' => 'Cerca stringa/pattern', - 'pattern_description' => 'Se questo pattern non è trovato nel sito web, il server verrà contrassegnato come fuori linea. Le espressioni regolari sono consentite.', - 'last_check' => 'Ultimo Controllo', - 'last_online' => 'Ultima volta Online', - 'last_offline' => 'Ultima volta offline', - 'monitoring' => 'Monitoraggio', - 'no_monitoring' => 'Non monitorato', - 'email' => 'Email', - 'send_email' => 'Invia Email', - 'sms' => 'SMS', - 'send_sms' => 'Invia SMS', - 'pushover' => 'Pushover', - 'users' => 'Utenti', - 'delete_title' => 'Elimina Server', - 'delete_message' => 'Sei sicuro di voler eliminare il server \'%1\'?', - 'deleted' => 'Server eliminato.', - 'updated' => 'Server aggiornato.', - 'inserted' => 'Server aggiunto.', - 'latency' => 'Tempo di risposta', - 'latency_max' => 'Tempo di risposta (massimo)', - 'latency_min' => 'Tempo di risposta (minimo)', - 'latency_avg' => 'Tempo di risposta (medio)', - 'uptime' => 'Uptime', - 'year' => 'Anno', - 'month' => 'Mese', - 'week' => 'Settimana', - 'day' => 'Giorno', - 'hour' => 'Ora', - 'warning_threshold' => 'Soglia di allarme', - 'warning_threshold_description' => 'Numero richiesto di verifiche fallite prima di ritenerlo fuori linea.', - 'chart_last_week' => 'Ultima settimana', - 'chart_history' => 'Cronologia', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d-%m-%Y', - 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Le notifiche SMS sono disabilitate.', - 'warning_notifications_disabled_email' => 'Le notifiche Email sono disabilitate.', - 'warning_notifications_disabled_pushover' => 'Le notifiche Pushover sono disabilitate.', - 'error_server_no_match' => 'Server non trovato.', - 'error_server_label_bad_length' => 'L\'etichetta deve contenere da 1 a 255 caratteri.', - 'error_server_ip_bad_length' => 'Il dominio / IP deve contenere da 1 a 255 caratteri.', - 'error_server_ip_bad_service' => 'L\'indirizzo IP non è valido.', - 'error_server_ip_bad_website' => 'L\'indirizzo URL del sito web non è valido.', - 'error_server_type_invalid' => 'Tipologia di server selezionata non valida.', - 'error_server_warning_threshold_invalid' => 'La soglia d\'allarme deve essere un numero intero valido, superiore a zero.', - ), - 'config' => array( - 'general' => 'Generale', - 'language' => 'Linguaggio', - 'show_update' => 'Controllare per nuovi aggiornamenti?', - 'email_status' => 'Permetti invio email', - 'email_from_email' => 'Indirizzo Email mittente', - 'email_from_name' => 'Nome Email mittente', - 'email_smtp' => 'Abilita SMTP', - 'email_smtp_host' => 'Server SMTP', - 'email_smtp_port' => 'Porta SMTP', - 'email_smtp_security' => 'Sicurezza SMTP', - 'email_smtp_security_none' => 'Nessuna', - 'email_smtp_username' => 'Nome utente SMTP', - 'email_smtp_password' => 'Password SMTP', - 'email_smtp_noauth' => 'Lasciare vuoto per nessuna autentificazione', - 'sms_status' => 'Permetti invio SMS', - 'sms_gateway' => 'Gateway da usare per inviare SMS', - 'sms_gateway_username' => 'Nome Utente Gateway', - 'sms_gateway_password' => 'Password Gateway', - 'sms_from' => 'Numero di telefono del mittente', - 'pushover_status' => 'Permetti invio messaggi da Pushover', - 'pushover_description' => 'Pushover è un servizio che rende semplice ottenere notifiche in tempo reale. Vedi il loro sito web per maggiori informazioni.', - 'pushover_clone_app' => 'Clicca qui per creare la tua Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Prima di poter usare Pushover, devi registrare un\'App nel loro sito web ed inserire la \'App API Token\' qui.', - 'alert_type' => 'Seleziona quando vuoi essere notificato', - 'alert_type_description' => 'Cambio di Stato: '. - 'Riceverai una notifica solo quando un server cambierà stato. Quindi da online -> offline oppure da offline -> online.
    '. - '
    Fuori linea: '. - 'Riceverai una notifica solo quando un server andrà offline *SOLO LA PRIMA VOLTA*. Per esempio, '. - 'Se il tuo cronjob è impostato per controllare ogni 15 min e il tuo server andrà offline dalle 2AM alle 6AM. '. - 'Riceverai una sola notifica alle 2AM e nient\'altro.
    '. - '
    Sempre: '. - 'Riceverai una notifica ogni volta che lo script troverà un server down anche se è stato offline per ore.', - 'alert_type_status' => 'Cambio di Stato', - 'alert_type_offline' => 'Fuori linea', - 'alert_type_always' => 'Sempre', - 'log_status' => 'Stato Log', - 'log_status_description' => 'Se lo Stato Log è impostato su VERO, il monitor registrerà nel log gli eventi appena le notifiche verranno inviate.', - 'log_email' => 'Registra email inviate dal sistema.', - 'log_sms' => 'Registra SMS inviati dal sistema.', - 'log_pushover' => 'Registra messaggi Pushover inviati dal sistema', - 'updated' => 'La configurazione è stato aggiornata.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Impostazioni Email', - 'settings_sms' => 'Impostazioni SMS', - 'settings_pushover' => 'Impostazioni Pushover', - 'settings_notification' => 'Impostazioni Notifiche', - 'settings_log' => 'Impostazioni Log', - 'auto_refresh' => 'Auto-Aggiornamento', - 'auto_refresh_description' => - 'Auto-Aggiornamento pagina servers.
    '. - ''. - 'Tempo in secondi, se impostato a 0 la pagina non si aggiornerà.'. - '', - 'seconds' => 'secondi', - 'test' => 'Test', - 'test_email' => 'Un Email verrà inviata all\'indirizzo specificato nel tuo profilo.', - 'test_sms' => 'Un SMS verrà inviato al numero di telefono specificato nel tuo profilo.', - 'test_pushover' => 'Una notifica Pushover verrà inviata al dispositivo specificato nel tuo profilo.', - 'send' => 'Invia', - 'test_subject' => 'Test', - 'test_message' => 'Messaggio di test', - 'email_sent' => 'Email inviata', - 'email_error' => 'Errore in invio Email', - 'sms_sent' => 'SMS inviato', - 'sms_error' => 'Errore in invio SMS. %s', - 'sms_error_nomobile' => 'Impossibile inviare SMS: nessun numero di telefono valido inserito nel tuo profilo.', - 'pushover_sent' => 'Notifica Pushover inviata', - 'pushover_error' => 'Riscontrato un errore durante l\'invio della notifica Pushover: %s', - 'pushover_error_noapp' => 'Impossibile inviare la notifica: nessun \'Pushover App API Token\' inserito nella configurazione globale.', - 'pushover_error_nokey' => 'Impossibile inviare la notifica: nessuna \'Pushover Key\' inserita nel tuo profilo.', - 'log_retention_period' => 'Periodo conservazione Log', - 'log_retention_period_description' => 'Numero di giorni per la conservazione dei log delle notifiche e risultati monitoraggio. Inserire 0 (zero) per disabilitare la cancellazione dei log.', - 'log_retention_days' => 'giorni', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' INATTIVO: ip=%IP%, porta=%PORT%. Errore=%ERROR%', - 'off_email_subject' => 'IMPORTANTE: Il Server \'%LABEL%\' è INATTIVO', - 'off_email_body' => "Impossibile connettersi al seguente server:

    Server: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Errore: %ERROR%
    Data: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' INATTIVO', - 'off_pushover_message' => "Impossibile connettersi al seguente server:

    Server: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Errore: %ERROR%
    Data: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' ATTIVO: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANTE: Server \'%LABEL%\' è ATTIVO', - 'on_email_body' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' ATTIVO', - 'on_pushover_message' => "Server '%LABEL%' è di nuovo attivo, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => 'Benvenuto, %user_name%', - 'title_sign_in' => 'Registrati', - 'title_forgot' => 'Password dimenticata?', - 'title_reset' => 'Reimposta la tua password', - 'submit' => 'Invia', - 'remember_me' => 'Ricordami', - 'login' => 'Accedi', - 'logout' => 'Uscita', - 'username' => 'Nome utente', - 'password' => 'Password', - 'password_repeat' => 'Ripeti password', - 'password_forgot' => 'Password dimenticata?', - 'password_reset' => 'Reimposta password', - 'password_reset_email_subject' => 'Reimpossta la tua password per PHP Server Monitor', - 'password_reset_email_body' => 'Usa il seguente link per reimpostare la tua password. Ricordati che scade tra un ora.

    %link%', - 'error_user_incorrect' => 'Il nome utente inserito non è staot trovato.', - 'error_login_incorrect' => 'Le informazioni sono errate.', - 'error_login_passwords_nomatch' => 'Le password inserite non sono valide.', - 'error_reset_invalid_link' => 'Il link di reimpostazione password non è valido.', - 'success_password_forgot' => 'Ti è stata inviata un\'Email con le istruzioni da seguire per reimpostare la tua password.', - 'success_password_reset' => 'La tua password è stata correttamente reimpostata. Ora puoi effettuare l\'accesso.', - ), - 'error' => array( - '401_unauthorized' => 'Non autorizzato', - '401_unauthorized_description' => 'Non hai i permessi necessari per visualizzare questa pagina.', - ), + 'name' => 'Italiano - Italian', + 'locale' => array( + '0' => 'it_IT.UTF-8', + '1' => 'it_IT', + '2' => 'italian', + '3' => 'ita', + ), + 'locale_tag' => 'it', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installa', + 'action' => 'Azione', + 'save' => 'Salva', + 'edit' => 'Modifica', + 'delete' => 'Elimina', + 'date' => 'Data', + 'message' => 'Messaggio', + 'yes' => 'Sì', + 'no' => 'No', + 'insert' => 'Inserisci', + 'add_new' => 'Aggiungi Nuovo', + 'update_available' => 'Una nuova versione ({version}) è disponibile su http://www.phpservermonitor.org.', + 'back_to_top' => 'Torna su', + 'go_back' => 'Indietro', + 'ok' => 'OK', + 'cancel' => 'Annulla', + 'short_day_format' => '%e %B', + 'long_day_format' => '%e %B %Y', + 'yesterday_format' => 'Ieri alle %H:%M', + 'other_day_format' => '%A alle %H:%M', + 'never' => 'Mai', + 'hours_ago' => '%d ore fa', + 'an_hour_ago' => 'circa un ora fa', + 'minutes_ago' => '%d minuti fa', + 'a_minute_ago' => 'circa un minuto fa', + 'seconds_ago' => '%d secondi fa', + 'a_second_ago' => 'un secondo fa', + ), + 'menu' => array( + 'config' => 'Configurazione', + 'server' => 'Servers', + 'server_log' => 'Log', + 'server_status' => 'Stato', + 'server_update' => 'Aggiorna', + 'user' => 'Utenti', + 'help' => 'Aiuto', + ), + 'users' => array( + 'user' => 'Utente', + 'name' => 'Nome', + 'user_name' => 'Nome utente', + 'password' => 'Password', + 'password_repeat' => 'Ripeti password', + 'password_leave_blank' => 'Lascia vuoto per non modificare', + 'level' => 'Livello', + 'level_10' => 'Amministratore', + 'level_20' => 'Utente', + 'level_description' => 'Gli Amministratori hanno pieno accesso: possono gestire server, utenti e + modificare la configurazione globale.
    Gli Utenti possono solo visualizzare + ed eseguire l\'aggiornamento per i server a cui sono assegnati.', + 'mobile' => 'Cellulare', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover è un servizio che rende semplice ottenere notifiche in tempo reale. Vedi + il loro sito web per maggiori informazioni.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Dispositivo Pushover', + 'pushover_device_description' => 'Nome del dispositivo a cui inviare il messaggio. Lascia vuoto per inviarlo a + tutti i dispositivi.', + 'delete_title' => 'Elimina Utente', + 'delete_message' => 'Sei sicuro di voler eliminare l\'utente \'%1\'?', + 'deleted' => 'Utente eliminato.', + 'updated' => 'Utente aggiornato.', + 'inserted' => 'Utente aggiunto.', + 'profile' => 'Profilo', + 'profile_updated' => 'Il tuo profilo è stato aggiornato.', + 'error_user_name_bad_length' => 'Il nome utente deve essere composto da almeno 2 caratteri (massimo 64).', + 'error_user_name_invalid' => 'Lo username può contenere solo caratteri alfabetici (a-z, A-Z), numeri (0-9), + il punto (.) ed la sottolineatura (_).', + 'error_user_name_exists' => 'Nome utente già in uso.', + 'error_user_email_bad_length' => 'L\'indirizzo Email deve essere composto da 5 a 255 caratteri.', + 'error_user_email_invalid' => 'Indirizzo Email non valido.', + 'error_user_level_invalid' => 'Livello utente non valido.', + 'error_user_no_match' => 'L\'utente non è stato trovato nel database.', + 'error_user_password_invalid' => 'La password inserita non è valida.', + 'error_user_password_no_match' => 'Le password inserite non corrispondono.', + ), + 'log' => array( + 'title' => 'Righe log', + 'type' => 'Tipo', + 'status' => 'Stato', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Nessun log', + 'clear' => 'Pulisci il registro', + 'delete_title' => 'Elimina log', + 'delete_message' => 'Sei sicuro di voler eliminare tutti i registri?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Stato', + 'label' => 'Nome', + 'domain' => 'Dominio/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Numero di secondi da attendere per la risposta del server.', + 'port' => 'Porta', + 'type' => 'Tipo', + 'type_website' => 'Sito web', + 'type_service' => 'Servizio', + 'pattern' => 'Cerca stringa/pattern', + 'pattern_description' => 'Se questo pattern non è trovato nel sito web, il server verrà contrassegnato come + fuori linea. Le espressioni regolari sono consentite.', + 'last_check' => 'Ultimo Controllo', + 'last_online' => 'Ultima volta Online', + 'last_offline' => 'Ultima volta offline', + 'monitoring' => 'Monitoraggio', + 'no_monitoring' => 'Non monitorato', + 'email' => 'Email', + 'send_email' => 'Invia Email', + 'sms' => 'SMS', + 'send_sms' => 'Invia SMS', + 'pushover' => 'Pushover', + 'users' => 'Utenti', + 'delete_title' => 'Elimina Server', + 'delete_message' => 'Sei sicuro di voler eliminare il server \'%1\'?', + 'deleted' => 'Server eliminato.', + 'updated' => 'Server aggiornato.', + 'inserted' => 'Server aggiunto.', + 'latency' => 'Tempo di risposta', + 'latency_max' => 'Tempo di risposta (massimo)', + 'latency_min' => 'Tempo di risposta (minimo)', + 'latency_avg' => 'Tempo di risposta (medio)', + 'uptime' => 'Uptime', + 'year' => 'Anno', + 'month' => 'Mese', + 'week' => 'Settimana', + 'day' => 'Giorno', + 'hour' => 'Ora', + 'warning_threshold' => 'Soglia di allarme', + 'warning_threshold_description' => 'Numero richiesto di verifiche fallite prima di ritenerlo fuori linea.', + 'chart_last_week' => 'Ultima settimana', + 'chart_history' => 'Cronologia', + 'chart_day_format' => '%d-%m-%Y', + 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Le notifiche SMS sono disabilitate.', + 'warning_notifications_disabled_email' => 'Le notifiche Email sono disabilitate.', + 'warning_notifications_disabled_pushover' => 'Le notifiche Pushover sono disabilitate.', + 'error_server_no_match' => 'Server non trovato.', + 'error_server_label_bad_length' => 'L\'etichetta deve contenere da 1 a 255 caratteri.', + 'error_server_ip_bad_length' => 'Il dominio / IP deve contenere da 1 a 255 caratteri.', + 'error_server_ip_bad_service' => 'L\'indirizzo IP non è valido.', + 'error_server_ip_bad_website' => 'L\'indirizzo URL del sito web non è valido.', + 'error_server_type_invalid' => 'Tipologia di server selezionata non valida.', + 'error_server_warning_threshold_invalid' => 'La soglia d\'allarme deve essere un numero intero valido, + superiore a zero.', + ), + 'config' => array( + 'general' => 'Generale', + 'language' => 'Linguaggio', + 'show_update' => 'Controllare per nuovi aggiornamenti?', + 'email_status' => 'Permetti invio email', + 'email_from_email' => 'Indirizzo Email mittente', + 'email_from_name' => 'Nome Email mittente', + 'email_smtp' => 'Abilita SMTP', + 'email_smtp_host' => 'Server SMTP', + 'email_smtp_port' => 'Porta SMTP', + 'email_smtp_security' => 'Sicurezza SMTP', + 'email_smtp_security_none' => 'Nessuna', + 'email_smtp_username' => 'Nome utente SMTP', + 'email_smtp_password' => 'Password SMTP', + 'email_smtp_noauth' => 'Lasciare vuoto per nessuna autentificazione', + 'sms_status' => 'Permetti invio SMS', + 'sms_gateway' => 'Gateway da usare per inviare SMS', + 'sms_gateway_username' => 'Nome Utente Gateway', + 'sms_gateway_password' => 'Password Gateway', + 'sms_from' => 'Numero di telefono del mittente', + 'pushover_status' => 'Permetti invio messaggi da Pushover', + 'pushover_description' => 'Pushover è un servizio che rende semplice ottenere notifiche in tempo reale. Vedi + il loro sito web per maggiori informazioni.', + 'pushover_clone_app' => 'Clicca qui per creare la tua Pushover app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Prima di poter usare Pushover, devi registrare un\'App nel loro sito web ed inserire la + \'App API Token\' qui.', + 'alert_type' => 'Seleziona quando vuoi essere notificato', + 'alert_type_description' => 'Cambio di Stato: Riceverai una notifica solo quando un server cambierà + stato. Quindi da online -> offline oppure da offline -> online.

    Fuori + linea: Riceverai una notifica solo quando un server andrà offline *SOLO LA + PRIMA VOLTA*. Per esempio, Se il tuo cronjob è impostato per controllare ogni 15 + min e il tuo server andrà offline dalle 2AM alle 6AM. Riceverai una sola + notifica alle 2AM e nient\'altro.

    Sempre: Riceverai una notifica + ogni volta che lo script troverà un server down anche se è stato offline per + ore.', + 'alert_type_status' => 'Cambio di Stato', + 'alert_type_offline' => 'Fuori linea', + 'alert_type_always' => 'Sempre', + 'log_status' => 'Stato Log', + 'log_status_description' => 'Se lo Stato Log è impostato su VERO, il monitor registrerà nel log gli eventi + appena le notifiche verranno inviate.', + 'log_email' => 'Registra email inviate dal sistema.', + 'log_sms' => 'Registra SMS inviati dal sistema.', + 'log_pushover' => 'Registra messaggi Pushover inviati dal sistema', + 'updated' => 'La configurazione è stato aggiornata.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Impostazioni Email', + 'settings_sms' => 'Impostazioni SMS', + 'settings_pushover' => 'Impostazioni Pushover', + 'settings_notification' => 'Impostazioni Notifiche', + 'settings_log' => 'Impostazioni Log', + 'auto_refresh' => 'Auto-Aggiornamento', + 'auto_refresh_description' => 'Auto-Aggiornamento pagina servers.
    Tempo in secondi, se + impostato a 0 la pagina non si aggiornerà.', + 'seconds' => 'secondi', + 'test' => 'Test', + 'test_email' => 'Un Email verrà inviata all\'indirizzo specificato nel tuo profilo.', + 'test_sms' => 'Un SMS verrà inviato al numero di telefono specificato nel tuo profilo.', + 'test_pushover' => 'Una notifica Pushover verrà inviata al dispositivo specificato nel tuo profilo.', + 'send' => 'Invia', + 'test_subject' => 'Test', + 'test_message' => 'Messaggio di test', + 'email_sent' => 'Email inviata', + 'email_error' => 'Errore in invio Email', + 'sms_sent' => 'SMS inviato', + 'sms_error' => 'Errore in invio SMS. %s', + 'sms_error_nomobile' => 'Impossibile inviare SMS: nessun numero di telefono valido inserito nel tuo profilo.', + 'pushover_sent' => 'Notifica Pushover inviata', + 'pushover_error' => 'Riscontrato un errore durante l\'invio della notifica Pushover: %s', + 'pushover_error_noapp' => 'Impossibile inviare la notifica: nessun \'Pushover App API Token\' inserito nella + configurazione globale.', + 'pushover_error_nokey' => 'Impossibile inviare la notifica: nessuna \'Pushover Key\' inserita nel tuo profilo.', + 'log_retention_period' => 'Periodo conservazione Log', + 'log_retention_period_description' => 'Numero di giorni per la conservazione dei log delle notifiche e + risultati monitoraggio. Inserire 0 (zero) per disabilitare la + cancellazione dei log.', + 'log_retention_days' => 'giorni', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' INATTIVO: ip=%IP%, porta=%PORT%. Errore=%ERROR%', + 'off_email_subject' => 'IMPORTANTE: Il Server \'%LABEL%\' è INATTIVO', + 'off_email_body' => 'Impossibile connettersi al seguente server:

    Server: %LABEL%
    IP: %IP%
    Porta: + %PORT%
    Errore: %ERROR%
    Data: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' INATTIVO', + 'off_pushover_message' => 'Impossibile connettersi al seguente server:

    Server: %LABEL%
    IP: + %IP%
    Porta: %PORT%
    Errore: %ERROR%
    Data: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' ATTIVO: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANTE: Server \'%LABEL%\' è ATTIVO', + 'on_email_body' => 'Server \'%LABEL%\' è di nuovo attivo, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: + %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' ATTIVO', + 'on_pushover_message' => 'Server \'%LABEL%\' è di nuovo attivo, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Porta: + %PORT%
    Data: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Benvenuto, %user_name%', + 'title_sign_in' => 'Registrati', + 'title_forgot' => 'Password dimenticata?', + 'title_reset' => 'Reimposta la tua password', + 'submit' => 'Invia', + 'remember_me' => 'Ricordami', + 'login' => 'Accedi', + 'logout' => 'Uscita', + 'username' => 'Nome utente', + 'password' => 'Password', + 'password_repeat' => 'Ripeti password', + 'password_forgot' => 'Password dimenticata?', + 'password_reset' => 'Reimposta password', + 'password_reset_email_subject' => 'Reimpossta la tua password per PHP Server Monitor', + 'password_reset_email_body' => 'Usa il seguente link per reimpostare la tua password. Ricordati che scade tra + un ora.

    %link%', + 'error_user_incorrect' => 'Il nome utente inserito non è staot trovato.', + 'error_login_incorrect' => 'Le informazioni sono errate.', + 'error_login_passwords_nomatch' => 'Le password inserite non sono valide.', + 'error_reset_invalid_link' => 'Il link di reimpostazione password non è valido.', + 'success_password_forgot' => 'Ti è stata inviata un\'Email con le istruzioni da seguire per reimpostare la + tua password.', + 'success_password_reset' => 'La tua password è stata correttamente reimpostata. Ora puoi effettuare + l\'accesso.', + ), + 'error' => array( + '401_unauthorized' => 'Non autorizzato', + '401_unauthorized_description' => 'Non hai i permessi necessari per visualizzare questa pagina.', + ), ); diff --git a/src/lang/ja_JP.lang.php b/src/lang/ja_JP.lang.php index 3b55a46c..3b6831f1 100644 --- a/src/lang/ja_JP.lang.php +++ b/src/lang/ja_JP.lang.php @@ -1,4 +1,5 @@ '日本語 - Japanese', - 'locale' => array('ja_JP.UTF-8', 'ja_JP', 'Japan', 'Japanese'), - 'locale_tag' => 'ja', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'サーバーモニター', - 'install' => 'インストール', - 'action' => 'アクション', - 'save' => 'セーブ', - 'edit' => '編集', - 'delete' => '削除', - 'date' => '日時', - 'message' => 'メッセージ', - 'yes' => 'はい', - 'no' => 'いいえ', - 'insert' => '挿入', - 'add_new' => '新規に追加', - 'update_available' => '新しいバージョン({version}) がリリースされています。ここから入手可能です: http://www.phpservermonitor.org.', - 'back_to_top' => 'トップに戻る', - 'go_back' => '戻る', - 'ok' => 'OK', - 'bad' => 'よくない', - 'cancel' => 'キャンセル', - 'none' => 'なし', - 'activate' => '有効化', - 'advanced' => '高度な設定', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => '昨日の %k:%M', - 'other_day_format' => '%A の %k:%M', - 'never' => 'なし', - 'hours_ago' => '%d 時間前', - 'an_hour_ago' => '1時間くらい前', - 'minutes_ago' => '%d 分前', - 'a_minute_ago' => '1分くらい前', - 'seconds_ago' => '%d 秒前', - 'a_second_ago' => '<1秒', - 'year' => '年', - 'years' => '年', - 'month' => '月', - 'months' => '月', - 'day' => '日', - 'days' => '日', - 'hour' => '時間', - 'hours' => '時間', - 'minute' => '分', - 'minutes' => '分', - 'second' => '秒', - 'seconds' => '秒', - 'online' => 'オンライン', - 'offline' => 'オフライン', - ), - 'menu' => array( - 'config' => '設定', - 'server' => 'サーバー', - 'server_log' => 'ログ', - 'server_status' => 'ステータス', - 'server_update' => 'アップデート', - 'user' => 'ユーザー', - 'help' => 'ヘルプ', - ), - 'users' => array( - 'user' => 'ユーザー', - 'name' => '名前', - 'user_name' => 'ユーザーネーム', - 'password' => 'パスワード', - 'password_repeat' => 'パスワードを繰り返す', - 'password_leave_blank' => '空白のままにしておく', - 'level' => 'レベル', - 'level_10' => '管理者(Administrator)', - 'level_20' => 'ユーザー(User)', - 'level_description' => '管理者(Administrator) はフルアクセス権があります:サーバーの管理、 ユーザーとグローバル設定を変更できます。
    ユーザー(Users)は、割り当てられたサーバーのアップデータのみを表示して実行できます。', - 'mobile' => 'モバイル', - 'email' => 'メールアドレス', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushoverサービスは、リアルタイムで通知を受け取るのが簡単にできます。詳細についてはこちらをご覧ください: https://pushover.net/', - 'pushover_key' => 'Pushoverキー', - 'pushover_device' => 'Pushoverデバイス', - 'pushover_device_description' => '指定したデバイスに送信します。空欄ですべてのデバイスに送信できます。', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram はチャットアプリで、簡単にリアルタイム通知を受け取ることができます。 ドキュメント で詳しい情報、インストールの方法を知りましょう。', - 'telegram_chat_id' => 'Telegram チャットID', - 'telegram_chat_id_description' => 'メッセージは対応するチャットへ送信されます。', - 'telegram_get_chat_id' => 'ここをクリックしてあなたのチャットIDを取得します。', - 'activate_telegram' => 'Telegramの通知を有効化', - 'activate_telegram_description' => '指定されたチャットIDにTelegram通知を送信できるようにします。 この許可がなければ、Telegramはあなたに通知を送信することができません。', - 'telegram_bot_username_found' => 'ボットが見つかりました!

    これにより、ボットとあなたのチャットが開かれます。ここであなたは、 /start を入力する必要があります。', - 'telegram_bot_username_error_token' => '401 - 未認証。 APIトークンが有効であることを確認してください。', - 'telegram_bot_error' => 'Telegram通知を有効化中にエラーが発生: %s', - 'delete_title' => 'ユーザーを削除', - 'delete_message' => '本当にユーザーを削除しますか?: \'%1\'?', - 'deleted' => 'ユーザーを削除しました。', - 'updated' => 'ユーザー情報を更新しました。', - 'inserted' => 'ユーザーを追加しました。', - 'profile' => 'プロフィール', - 'profile_updated' => 'あなたのプロフィールは更新されました。', - 'error_user_name_bad_length' => 'ユーザーネームは2~64文字以内で入力してください。', - 'error_user_name_invalid' => 'ユーザー名は、アルファベット、数字とアンダーバーのみを含むことができます ドット(.)。', - 'error_user_name_exists' => '登録しようとしたユーザー名は既にデータベースに登録されています。', - 'error_user_email_bad_length' => 'メールアドレスは5~255文字以内で入力してください。', - 'error_user_email_invalid' => 'メールアドレスが無効です。', - 'error_user_level_invalid' => '指定したレベルが無効です。', - 'error_user_no_match' => 'このユーザー名は存在しません。', - 'error_user_password_invalid' => 'パスワードが無効です。', - 'error_user_password_no_match' => '確認のパスワードが一致しません。', - ), - 'log' => array( - 'title' => 'ログエントリー', - 'type' => 'タイプ', - 'status' => 'ステータス', - 'email' => 'メール', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'ログがありません', - 'clear' => 'ログをクリアする', - 'delete_title' => 'ログを削除する', - 'delete_message' => 'すべてのログを削除してもよろしいですか?', - ), - 'servers' => array( - 'server' => 'サーバー', - 'status' => 'ステータス', - 'label' => 'ラベル', - 'domain' => 'ドメイン/IP', - 'timeout' => 'タイムアウト', - 'timeout_description' => '指定した秒数、サーバーのレスポンスを待ちます。', - 'authentication_settings' => '認証設定', - 'optional' => 'オプション', - 'website_username' => 'ユーザー名', - 'website_username_description' => 'ユーザー名でウェブサイトにアクセスします。 (サポートはApache認証のみです。)', - 'website_password' => 'パスワード', - 'website_password_description' => 'パスワードはサイトのアクセスに使用します。パスワードは暗号化されてデータベースへ保存されます。', - 'fieldset_monitoring' => 'モニター', - 'fieldset_permissions' => '権限', - 'port' => 'ポート', - 'custom_port' => 'カスタムポート', - 'popular_ports' => '主要なポート', - 'request_method' => 'リクエストメソッド', - 'custom_request_method' => 'カスタムリクエストメソッド', - 'popular_request_methods' => '主要なリクエストメソッド', - 'post_field' => 'Postフィールド', - 'post_field_description' => 'このデータは上記のリクエストメソッドを使用する際に使用されます。 例: param1=val1&param2=val2&...', - 'please_select' => '選択してください', - 'type' => 'タイプ', - 'type_website' => 'ウェブサイト', - 'type_service' => 'サービス', - 'type_ping' => 'Ping', - 'pattern' => '文字列/パターンを検索', - 'pattern_description' => '指定した文字列/パターンが存在しない場合は、「オフライン」としてマークされます。また、標準的な計算式は許可されています。', - 'pattern_online' => 'パターンがウェブサイトであることを示すパターン: ', - 'pattern_online_description' => 'オンライン: このパターンがウェブサイトにない場合は、オンラインとしてマークされます。 Offline: このパターンがウェブサイトにない場合は、オフラインとしてマークされます。', - 'redirect_check' => '別のドメインへのリダイレクト: ', - 'redirect_check_description' => '別のドメインにリダイレクトするのは通常は悪い兆候です。', - 'allow_http_status' => 'HTTPステータスコードを許可する', - 'allow_http_status_description' => 'ウェブサイトをオンラインにマークします。 400未満のステータスコードはデフォルトでオンラインとマークされます。 | で区切ります。 例: 401|403.', - 'header' => 'ヘッダー', - 'header_name_description' => 'ヘッダー名(大文字小文字を区別します)', - 'header_value_description' => 'ヘッダーの値。正規表現が利用可能です。', - 'last_check' => '最後の確認', - 'last_offline' => '最後のオフライン', - 'last_online' => '最後のオンライン', - 'last_output' => '最後のポジティブの出力', - 'last_error' => '最後のエラー', - 'last_error_output' => '最後のエラー出力', - 'monitoring' => 'モニタリング', - 'no_monitoring' => 'モニタリングなし', - 'email' => 'メール', - 'send_email' => 'メールを送信', - 'sms' => 'SMS', - 'send_sms' => 'SMSを送信', - 'pushover' => 'Pushover', - 'send_pushover' => 'Pushover通知を送信', - 'telegram' => 'Telegram', - 'send_telegram' => 'Telegram通知を送信', - 'users' => 'ユーザー', - 'delete_title' => 'サーバーを削除', - 'delete_message' => '本当にこのサーバーを削除しますか?: \'%1\'?', - 'deleted' => 'サーバーを削除しました。', - 'updated' => 'サーバーを更新しました。', - 'inserted' => 'サーバーを追加しました。', - 'latency' => 'レイテンシ', - 'latency_max' => 'レイテンシ(最大)', - 'latency_min' => 'レイテンシ(最小)', - 'latency_avg' => 'レイテンシ(アベレージ)', - 'uptime' => '稼働時間', - 'year' => '年', - 'month' => '月', - 'week' => '週間', - 'day' => '日', - 'hour' => '時間', - 'warning_threshold' => '警告閾値', - 'warning_threshold_description' => 'オフラインとしてマークされる前に失敗したチェックの数', - 'chart_last_week' => '最後の週間', - 'chart_history' => '履歴', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS 通知は無効です。', - 'warning_notifications_disabled_email' => 'メール通知は無効です。', - 'warning_notifications_disabled_pushover' => 'Pushover通知は無効です。', - 'warning_notifications_disabled_telegram' => 'Telegram通知は無効です。', - 'error_server_no_match' => 'サーバーが見つかりません', - 'error_server_label_bad_length' => 'ラベルは1~255文字以内で入力してください。', - 'error_server_ip_bad_length' => 'ドメイン/IPは1~255文字以内で入力してください。', - 'error_server_ip_bad_service' => '無効なIPです。', - 'error_server_ip_bad_website' => 'ウェブサイトのURLが無効です。', - 'error_server_type_invalid' => '選択されたサーバータイプが無効です。', - 'error_server_warning_threshold_invalid' => '警告のしきい値は、0より大きい有効な整数でなければなりません。', - ), - 'config' => array( - 'general' => '基本', - 'language' => '言語', - 'show_update' => 'アップデートをチェックしますか?', - 'password_encrypt_key' => '暗号鍵パスワード', - 'password_encrypt_key_note' => 'このキーは、Webサイトにアクセスするためにサーバーに保存されているパスワードを暗号化するために使用されます。 キーが変更された場合、保存されたパスワードは無効です!', - 'proxy' => 'プロキシを有効化する', - 'proxy_url' => 'プロキシのURL', - 'proxy_user' => 'プロキシのユーザー名', - 'proxy_password' => 'プロキシのパスワード', - 'email_status' => 'メールの送信を許可', - 'email_from_email' => 'アドレスからのメール', - 'email_from_name' => '名前からのメール', - 'email_smtp' => 'SMTPを有効にしますか?', - 'email_smtp_host' => 'SMTPホスト', - 'email_smtp_port' => 'SMTPポート', - 'email_smtp_security' => 'SMTPセキュリティ', - 'email_smtp_security_none' => 'なし', - 'email_smtp_username' => 'SMTPのユーザー名', - 'email_smtp_password' => 'SMTPのパスワード', - 'email_smtp_noauth' => '空白で認証なしになります', - 'sms_status' => 'テキストメッセージの送信を許可する', - 'sms_gateway' => 'このゲートウェイは、メッセージの送信に使用されます。', - 'sms_gateway_username' => 'ゲートウェイのユーザー名', - 'sms_gateway_password' => 'ゲートウェイのパスワード', - 'sms_from' => '送信者の電話番号:', - 'pushover_status' => 'Pushoverのメッセージを送信することを許可する', - 'pushover_description' => 'Pushoverは、リアルタイムの通知を簡単に取得できるサービスです。 詳細については、 - href="https://pushover.net/">ウェブサイトをご覧ください。', - 'pushover_clone_app' => 'クリックでPushoverアプリケーションを作成できます。', - 'pushover_api_token' => 'PushoverアプリケーションのAPIトークン', - 'pushover_api_token_description' => 'Pushoverを使用するには、事前にウェブサイトでアプリを登録してApp APIトークンを入力する必要があります。', - 'telegram_status' => 'Telegramメッセージの送信を許可する', - 'telegram_description' => 'Telegram はチャットアプリで、簡単にリアルタイム通知を受け取ることができます。 documentation で詳しい情報、インストールの方法を知りましょう。', - 'telegram_api_token' => 'Telegram APIトークン', - 'telegram_api_token_description' => 'Telegramを使用する前に、APIトークンを取得する必要があります。 documentation でヘルプを参照してください。', - 'alert_type' => '通知するタイミングを選択', - 'alert_type_description' => '状態の変化: '. - 'サーバーのステータスが変更されたときに通知を受け取ります。 だからオンライン -> オフラインまたはオフライン -> オンライン。
    '. - '
    オフライン: '. - 'サーバーが*初めての間*オフラインになったときに通知を受け取ります。 例えば、'. - 'あなたのcronの仕事は15分ごとです。あなたのサーバーは午前1時にダウンし、午前6時まで停止します。 '. - '午前1時に1つの通知が届きます。
    '. - '
    常に: '. - 'サイトが数時間にわたってオフラインになっていても、スクリプトが実行され、サイトが停止するたびに通知を受け取ります。', - 'alert_type_status' => '状況の変化', - 'alert_type_offline' => 'オフライン', - 'alert_type_always' => '常に', + 'name' => '日本語 - Japanese', + 'locale' => array( + '0' => 'ja_JP.UTF-8', + '1' => 'ja_JP', + '2' => 'Japan', + '3' => 'Japanese', + ), + 'locale_tag' => 'ja', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'サーバーモニター', + 'install' => 'インストール', + 'action' => 'アクション', + 'save' => 'セーブ', + 'edit' => '編集', + 'delete' => '削除', + 'date' => '日時', + 'message' => 'メッセージ', + 'yes' => 'はい', + 'no' => 'いいえ', + 'insert' => '挿入', + 'add_new' => '新規に追加', + 'update_available' => '新しいバージョン({version}) + がリリースされています。ここから入手可能です: http://www.phpservermonitor.org.', + 'back_to_top' => 'トップに戻る', + 'go_back' => '戻る', + 'ok' => 'OK', + 'bad' => 'よくない', + 'cancel' => 'キャンセル', + 'none' => 'なし', + 'activate' => '有効化', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => '昨日の %k:%M', + 'other_day_format' => '%A の %k:%M', + 'never' => 'なし', + 'hours_ago' => '%d 時間前', + 'an_hour_ago' => '1時間くらい前', + 'minutes_ago' => '%d 分前', + 'a_minute_ago' => '1分くらい前', + 'seconds_ago' => '%d 秒前', + 'a_second_ago' => '<1秒', + 'year' => '年', + 'years' => '年', + 'month' => '月', + 'months' => '月', + 'day' => '日', + 'days' => '日', + 'hour' => '時間', + 'hours' => '時間', + 'minute' => '分', + 'minutes' => '分', + 'second' => '秒', + 'seconds' => '秒', + ), + 'menu' => array( + 'config' => '設定', + 'server' => 'サーバー', + 'server_log' => 'ログ', + 'server_status' => 'ステータス', + 'server_update' => 'アップデート', + 'user' => 'ユーザー', + 'help' => 'ヘルプ', + ), + 'users' => array( + 'user' => 'ユーザー', + 'name' => '名前', + 'user_name' => 'ユーザーネーム', + 'password' => 'パスワード', + 'password_repeat' => 'パスワードを繰り返す', + 'password_leave_blank' => '空白のままにしておく', + 'level' => 'レベル', + 'level_10' => '管理者(Administrator)', + 'level_20' => 'ユーザー(User)', + 'level_description' => '管理者(Administrator) + はフルアクセス権があります:サーバーの管理、 + ユーザーとグローバル設定を変更できます。
    ユーザー(Users)は、割り当てられたサーバーのアップデータのみを表示して実行できます。', + 'mobile' => 'モバイル', + 'email' => 'メールアドレス', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushoverサービスは、リアルタイムで通知を受け取るのが簡単にできます。詳細についてはこちらをご覧ください: + https://pushover.net/', + 'pushover_key' => 'Pushoverキー', + 'pushover_device' => 'Pushoverデバイス', + 'pushover_device_description' => '指定したデバイスに送信します。空欄ですべてのデバイスに送信できます。', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram + はチャットアプリで、簡単にリアルタイム通知を受け取ることができます。 + ドキュメント + で詳しい情報、インストールの方法を知りましょう。', + 'telegram_chat_id' => 'Telegram チャットID', + 'telegram_chat_id_description' => 'メッセージは対応するチャットへ送信されます。', + 'telegram_get_chat_id' => 'ここをクリックしてあなたのチャットIDを取得します。', + 'activate_telegram' => 'Telegramの通知を有効化', + 'activate_telegram_description' => '指定されたチャットIDにTelegram通知を送信できるようにします。 + この許可がなければ、Telegramはあなたに通知を送信することができません。', + 'telegram_bot_username_found' => 'ボットが見つかりました!
    +
    これにより、ボットとあなたのチャットが開かれます。ここであなたは、 + /start を入力する必要があります。', + 'telegram_bot_username_error_token' => '401 - 未認証。 + APIトークンが有効であることを確認してください。', + 'telegram_bot_error' => 'Telegram通知を有効化中にエラーが発生: %s', + 'delete_title' => 'ユーザーを削除', + 'delete_message' => '本当にユーザーを削除しますか?: \'%1\'?', + 'deleted' => 'ユーザーを削除しました。', + 'updated' => 'ユーザー情報を更新しました。', + 'inserted' => 'ユーザーを追加しました。', + 'profile' => 'プロフィール', + 'profile_updated' => 'あなたのプロフィールは更新されました。', + 'error_user_name_bad_length' => 'ユーザーネームは2~64文字以内で入力してください。', + 'error_user_name_invalid' => 'ユーザー名は、アルファベット、数字とアンダーバーのみを含むことができます + ドット(.)。', + 'error_user_name_exists' => '登録しようとしたユーザー名は既にデータベースに登録されています。', + 'error_user_email_bad_length' => 'メールアドレスは5~255文字以内で入力してください。', + 'error_user_email_invalid' => 'メールアドレスが無効です。', + 'error_user_level_invalid' => '指定したレベルが無効です。', + 'error_user_no_match' => 'このユーザー名は存在しません。', + 'error_user_password_invalid' => 'パスワードが無効です。', + 'error_user_password_no_match' => '確認のパスワードが一致しません。', + ), + 'log' => array( + 'title' => 'ログエントリー', + 'type' => 'タイプ', + 'status' => 'ステータス', + 'email' => 'メール', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'ログがありません', + 'clear' => 'ログをクリアする', + 'delete_title' => 'ログを削除する', + 'delete_message' => 'すべてのログを削除してもよろしいですか?', + ), + 'servers' => array( + 'server' => 'サーバー', + 'status' => 'ステータス', + 'label' => 'ラベル', + 'domain' => 'ドメイン/IP', + 'timeout' => 'タイムアウト', + 'timeout_description' => '指定した秒数、サーバーのレスポンスを待ちます。', + 'authentication_settings' => '認証設定', + 'optional' => 'オプション', + 'website_username' => 'ユーザー名', + 'website_username_description' => 'ユーザー名でウェブサイトにアクセスします。 + (サポートはApache認証のみです。)', + 'website_password' => 'パスワード', + 'website_password_description' => 'パスワードはサイトのアクセスに使用します。パスワードは暗号化されてデータベースへ保存されます。', + 'fieldset_monitoring' => 'モニター', + 'fieldset_permissions' => '権限', + 'port' => 'ポート', + 'custom_port' => 'カスタムポート', + 'popular_ports' => '主要なポート', + 'request_method' => 'リクエストメソッド', + 'custom_request_method' => 'カスタムリクエストメソッド', + 'popular_request_methods' => '主要なリクエストメソッド', + 'post_field' => 'Postフィールド', + 'post_field_description' => 'このデータは上記のリクエストメソッドを使用する際に使用されます。 + 例: param1=val1&param2=val2&...', + 'please_select' => '選択してください', + 'type' => 'タイプ', + 'type_website' => 'ウェブサイト', + 'type_service' => 'サービス', + 'type_ping' => 'Ping', + 'pattern' => '文字列/パターンを検索', + 'pattern_description' => '指定した文字列/パターンが存在しない場合は、「オフライン」としてマークされます。また、標準的な計算式は許可されています。', + 'pattern_online' => 'パターンがウェブサイトであることを示すパターン: ', + 'pattern_online_description' => 'オンライン:このパターンがWebサイトにある場合、オンラインとしてマークされます。 + オフライン:このパターンがWebサイトにない場合、オフラインとしてマークされます。', + 'redirect_check' => '別のドメインへのリダイレクト: ', + 'redirect_check_description' => '別のドメインにリダイレクトするのは通常は悪い兆候です。', + 'allow_http_status' => 'HTTPステータスコードを許可する', + 'allow_http_status_description' => 'ウェブサイトをオンラインにマークします。 + 400未満のステータスコードはデフォルトでオンラインとマークされます。 + | で区切ります。 例: 401|403.', + 'header_name_description' => 'ヘッダー名(大文字小文字を区別します)', + 'header_value_description' => 'ヘッダーの値。正規表現が利用可能です。', + 'last_check' => '最後の確認', + 'last_online' => '最後のオンライン', + 'last_offline' => '最後のオフライン', + 'last_output' => '最後のポジティブの出力', + 'last_error' => '最後のエラー', + 'last_error_output' => '最後のエラー出力', + 'monitoring' => 'モニタリング', + 'no_monitoring' => 'モニタリングなし', + 'email' => 'メール', + 'send_email' => 'メールを送信', + 'sms' => 'SMS', + 'send_sms' => 'SMSを送信', + 'pushover' => 'Pushover', + 'send_pushover' => 'Pushover通知を送信', + 'telegram' => 'Telegram', + 'send_telegram' => 'Telegram通知を送信', + 'users' => 'ユーザー', + 'delete_title' => 'サーバーを削除', + 'delete_message' => '本当にこのサーバーを削除しますか?: \'%1\'?', + 'deleted' => 'サーバーを削除しました。', + 'updated' => 'サーバーを更新しました。', + 'inserted' => 'サーバーを追加しました。', + 'latency' => 'レイテンシ', + 'latency_max' => 'レイテンシ(最大)', + 'latency_min' => 'レイテンシ(最小)', + 'latency_avg' => 'レイテンシ(アベレージ)', + 'uptime' => '稼働時間', + 'year' => '年', + 'month' => '月', + 'week' => '週間', + 'day' => '日', + 'hour' => '時間', + 'warning_threshold' => '警告閾値', + 'warning_threshold_description' => 'オフラインとしてマークされる前に失敗したチェックの数', + 'chart_last_week' => '最後の週間', + 'chart_history' => '履歴', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS 通知は無効です。', + 'warning_notifications_disabled_email' => 'メール通知は無効です。', + 'warning_notifications_disabled_pushover' => 'Pushover通知は無効です。', + 'warning_notifications_disabled_telegram' => 'Telegram通知は無効です。', + 'error_server_no_match' => 'サーバーが見つかりません', + 'error_server_label_bad_length' => 'ラベルは1~255文字以内で入力してください。', + 'error_server_ip_bad_length' => 'ドメイン/IPは1~255文字以内で入力してください。', + 'error_server_ip_bad_service' => '無効なIPです。', + 'error_server_ip_bad_website' => 'ウェブサイトのURLが無効です。', + 'error_server_type_invalid' => '選択されたサーバータイプが無効です。', + 'error_server_warning_threshold_invalid' => '警告のしきい値は、0より大きい有効な整数でなければなりません。', + ), + 'config' => array( + 'general' => '基本', + 'language' => '言語', + 'show_update' => 'アップデートをチェックしますか?', + 'password_encrypt_key' => '暗号鍵パスワード', + 'password_encrypt_key_note' => 'このキーは、Webサイトにアクセスするためにサーバーに保存されているパスワードを暗号化するために使用されます。 + キーが変更された場合、保存されたパスワードは無効です!', + 'proxy' => 'プロキシを有効化する', + 'proxy_url' => 'プロキシのURL', + 'proxy_user' => 'プロキシのユーザー名', + 'proxy_password' => 'プロキシのパスワード', + 'email_status' => 'メールの送信を許可', + 'email_from_email' => 'アドレスからのメール', + 'email_from_name' => '名前からのメール', + 'email_smtp' => 'SMTPを有効にしますか?', + 'email_smtp_host' => 'SMTPホスト', + 'email_smtp_port' => 'SMTPポート', + 'email_smtp_security' => 'SMTPセキュリティ', + 'email_smtp_security_none' => 'なし', + 'email_smtp_username' => 'SMTPのユーザー名', + 'email_smtp_password' => 'SMTPのパスワード', + 'email_smtp_noauth' => '空白で認証なしになります', + 'sms_status' => 'テキストメッセージの送信を許可する', + 'sms_gateway' => 'このゲートウェイは、メッセージの送信に使用されます。', + 'sms_gateway_username' => 'ゲートウェイのユーザー名', + 'sms_gateway_password' => 'ゲートウェイのパスワード', + 'sms_from' => '送信者の電話番号:', + 'pushover_status' => 'Pushoverのメッセージを送信することを許可する', + 'pushover_description' => 'Pushoverは、リアルタイムの通知を簡単に取得できるサービスです。 + 詳細については、 + href="https://pushover.net/">ウェブサイトをご覧ください。', + 'pushover_clone_app' => 'クリックでPushoverアプリケーションを作成できます。', + 'pushover_api_token' => 'PushoverアプリケーションのAPIトークン', + 'pushover_api_token_description' => 'Pushoverを使用するには、事前にウェブサイトでアプリを登録してApp + APIトークンを入力する必要があります。', + 'telegram_status' => 'Telegramメッセージの送信を許可する', + 'telegram_description' => 'Telegram + はチャットアプリで、簡単にリアルタイム通知を受け取ることができます。 + documentation + で詳しい情報、インストールの方法を知りましょう。', + 'telegram_api_token' => 'Telegram APIトークン', + 'telegram_api_token_description' => 'Telegramを使用する前に、APIトークンを取得する必要があります。 + documentation + でヘルプを参照してください。', + 'alert_type' => '通知するタイミングを選択', + 'alert_type_description' => '状態の変化: + サーバーのステータスが変更されたときに通知を受け取ります。 + だからオンライン -> オフラインまたはオフライン -> + オンライン。

    オフライン: + サーバーが*初めての間*オフラインになったときに通知を受け取ります。 + 例えば、あなたのcronの仕事は15分ごとです。あなたのサーバーは午前1時にダウンし、午前6時まで停止します。 + 午前1時に1つの通知が届きます。

    常に: + サイトが数時間にわたってオフラインになっていても、スクリプトが実行され、サイトが停止するたびに通知を受け取ります。', + 'alert_type_status' => '状況の変化', + 'alert_type_offline' => 'オフライン', + 'alert_type_always' => '常に', 'combine_notifications' => '通知の結合', 'combine_notifications_description' => '通知を1つの通知にまとめて通知の量を削減します。(これはSMS通知には影響しません。)', - 'alert_proxy' => '有効にしても、プロキシはサービスに使用されません', - 'alert_proxy_url' => 'フォーマット: ホスト:ポート', - 'log_status' => 'ログステータス', - 'log_status_description' => 'ログステータスがTRUEに設定されている場合、モニターは通知設定が渡されるたびにイベントを記録します。', - 'log_email' => 'スクリプトによって送信された電子メールを記録する', - 'log_sms' => 'スクリプトによって送信されたテキストメッセージを記録する', - 'log_pushover' => 'スクリプトによって送信されたPushoverメッセージを記録する', - 'log_telegram' => 'スクリプトによって送信されたTelegramメッセージを記録する', - 'updated' => '設定は更新されました。', - 'tab_email' => 'メール', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'メール設定', - 'settings_sms' => 'テキストメッセージ設定', - 'settings_pushover' => 'Pushover設定', - 'settings_telegram' => 'Telegram設定', - 'settings_notification' => '通知設定', - 'settings_log' => 'ログ設定', - 'settings_proxy' => 'プロキシ設定', - 'auto_refresh' => '自動更新', - 'auto_refresh_description' => - 'サーバーページを自動更新します。
    '. - ''. - '時間を秒で指定し、0に設定すると更新しません。'. - '', - 'seconds' => '秒', - 'test' => 'テスト', - 'test_email' => 'あなたのユーザープロフィールで指定されたアドレスに電子メールが送信されます。', - 'test_sms' => 'あなたのユーザープロフィールで指定された電話番号にSMSが送信されます。', - 'test_pushover' => 'あなたのユーザープロフィールで指定されたユーザー キー/デバイスにPushover通知が送信されます。', - 'test_telegram' => 'あなたのユーザープロフィールで指定されたチャットIDにTelegram通知が送信されます。', - 'send' => '送信', - 'test_subject' => 'テスト', - 'test_message' => 'これはテストメッセージです', - 'email_sent' => 'メールが送信されました', - 'email_error' => 'メールを送信中にエラーが発生しました', - 'sms_sent' => 'SMSが送信されました', - 'sms_error' => 'SMSを送信中にエラーが発生しました %s', - 'sms_error_nomobile' => 'テストSMSの送信に失敗: あなたのプロフィールに有効な電話番号がありません', - 'pushover_sent' => 'Pushover通知が送信されました', - 'pushover_error' => 'Pushover通知を送信中にエラーが発生しました: %s', - 'pushover_error_noapp' => 'テスト通知の送信に失敗しました:グローバル設定にAPIトークンがありません', - 'pushover_error_nokey' => 'テスト通知の送信に失敗しました:あなたのプロフィールに有効なPushoverキーがありません', - 'telegram_sent' => 'Telegram通知が送信されました', - 'telegram_error' => 'Telegram通知を送信中にエラーが発生しました: %s', - 'telegram_error_notoken' => 'テスト通知の送信に失敗しました:グローバル設定にTelegram APIトークンがありません', - 'telegram_error_noid' => 'テスト通知の送信に失敗しました:あなたのプロフィールに有効なチャットIDがありません', - 'log_retention_period' => 'ログ保持期間', - 'log_retention_period_description' => '通知のログおよびサーバー稼働時間のアーカイブを保持する日数。 ログのクリーンアップを無効にするには、0を入力します。', - 'log_retention_days' => '日', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'サーバー \'%LABEL%\' はダウンしています: ip=%IP%, ポート=%PORT%. エラー=%ERROR%', - 'off_email_subject' => '重要: サーバー \'%LABEL%\' がダウンしています!', - 'off_email_body' => "サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%", - 'off_pushover_title' => 'サーバー \'%LABEL%\' がダウンしています!', - 'off_pushover_message' => "サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%", - 'off_telegram_message' => "サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%", - 'on_sms' => 'サーバー \'%LABEL%\' は動作しています: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => '重要: サーバー \'%LABEL%\' は動作しています', - 'on_email_body' => "サーバー '%LABEL%' は動作中です。 この期間の間ダウンしていました: %LAST_OFFLINE_DURATION%:

    サーバー: %LABEL%
    IP: %IP%
    ポート: %PORT%
    日時: %DATE%", - 'on_pushover_title' => 'サーバー \'%LABEL%\' は動作しています', - 'on_pushover_message' => "サーバー '%LABEL%' は動作中です。 この期間の間ダウンしていました: %LAST_OFFLINE_DURATION%:

    サーバー: %LABEL%
    IP: %IP%
    ポート: %PORT%
    日時: %DATE%", - 'on_telegram_message' => 'サーバー \'%LABEL%\' は動作中です。 この期間の間ダウンしていました:

    サーバー: %LABEL%
    IP: %IP%
    ポート: %PORT%
    ダウンタイム: %LAST_OFFLINE_DURATION%
    日時: %DATE%', - 'combi_off_email_message' => "
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: %PORT%
    • エラー: %ERROR%
    • 日時: %DATE%
    ", - 'combi_off_pushover_message' => "
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: %PORT%
    • エラー: %ERROR%
    • 日時: %DATE%
    ", - 'combi_off_telegram_message' => "- サーバー: %LABEL%
    - IP: %IP%
    - ポート: %PORT%
    - エラー: %ERROR%
    - 日時: %DATE%

    ", - 'combi_on_email_message' => "
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: %PORT%
    • ダウンタイム: %LAST_OFFLINE_DURATION%
    • 日時: %DATE%
    ", - 'combi_on_pushover_message' => '
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: %PORT%
    • ダウンタイム: %LAST_OFFLINE_DURATION%
    • 日時: %DATE%
    ', - 'combi_on_telegram_message' => '- サーバー: %LABEL%
    - IP: %IP%
    - ポート: %PORT%
    - ダウンタイム: %LAST_OFFLINE_DURATION%
    - 日時: %DATE%

    ', - 'combi_email_subject' => '重要: \'%UP%\' サーバーは動作を再開しました。 \'%DOWN%\' サーバーはダウンしています。', - 'combi_pushover_subject' => '\'%UP%\' サーバーは動作を再開しました。 \'%DOWN%\' サーバーはダウンしています。', - 'combi_email_message' => '以下のサーバーはダウンしています:
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', - 'combi_pushover_message' => '以下のサーバーはダウンしています:
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', - 'combi_telegram_message' => '以下のサーバーはダウンしています:
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', - ), - 'login' => array( - 'welcome_usermenu' => 'ようこそ、 %user_name%', - 'title_sign_in' => 'サインインしてください。', - 'title_forgot' => 'パスワードを忘れましたか?', - 'title_reset' => 'パスワードをリセットする', - 'submit' => '送信', - 'remember_me' => 'ログイン状態を保持する', - 'login' => 'ログイン', - 'logout' => 'ログアウト', - 'username' => 'ユーザー名', - 'password' => 'パスワード', - 'password_repeat' => 'パスワードを繰り返してください', - 'password_forgot' => 'パスワードを忘れましたか?', - 'password_reset' => 'パスワードをリセットする', - 'password_reset_email_subject' => 'PHP Server Monitorのパスワードをリセットする', - 'password_reset_email_body' => 'パスワードをリセットするには、次のリンクを使用してください。 1時間で期限切れになりますのでご注意ください。

    %link%', - 'error_user_incorrect' => '指定されたユーザー名が見つかりませんでした。', - 'error_login_incorrect' => '情報が間違っています。', - 'error_login_passwords_nomatch' => '指定されたパスワードが一致しません。', - 'error_reset_invalid_link' => '指定したリセットリンクは無効です。', - 'success_password_forgot' => 'パスワードをリセットする方法に関する情報が電子メールで送信されました。', - 'success_password_reset' => 'パスワードは正常にリセットされました。ログインしてください。', - ), - 'error' => array( - '401_unauthorized' => '未認証', - '401_unauthorized_description' => 'このページを表示する権限がありません。', - ), + 'alert_proxy' => '有効にしても、プロキシはサービスに使用されません', + 'alert_proxy_url' => 'フォーマット: ホスト:ポート', + 'log_status' => 'ログステータス', + 'log_status_description' => 'ログステータスがTRUEに設定されている場合、モニターは通知設定が渡されるたびにイベントを記録します。', + 'log_email' => 'スクリプトによって送信された電子メールを記録する', + 'log_sms' => 'スクリプトによって送信されたテキストメッセージを記録する', + 'log_pushover' => 'スクリプトによって送信されたPushoverメッセージを記録する', + 'log_telegram' => 'スクリプトによって送信されたTelegramメッセージを記録する', + 'updated' => '設定は更新されました。', + 'tab_email' => 'メール', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'メール設定', + 'settings_sms' => 'テキストメッセージ設定', + 'settings_pushover' => 'Pushover設定', + 'settings_telegram' => 'Telegram設定', + 'settings_notification' => '通知設定', + 'settings_log' => 'ログ設定', + 'settings_proxy' => 'プロキシ設定', + 'auto_refresh' => '自動更新', + 'auto_refresh_description' => 'サーバーページを自動更新します。
    時間を秒で指定し、0に設定すると更新しません。', + 'seconds' => '秒', + 'test' => 'テスト', + 'test_email' => 'あなたのユーザープロフィールで指定されたアドレスに電子メールが送信されます。', + 'test_sms' => 'あなたのユーザープロフィールで指定された電話番号にSMSが送信されます。', + 'test_pushover' => 'あなたのユーザープロフィールで指定されたユーザー + キー/デバイスにPushover通知が送信されます。', + 'test_telegram' => 'あなたのユーザープロフィールで指定されたチャットIDにTelegram通知が送信されます。', + 'send' => '送信', + 'test_subject' => 'テスト', + 'test_message' => 'これはテストメッセージです', + 'email_sent' => 'メールが送信されました', + 'email_error' => 'メールを送信中にエラーが発生しました', + 'sms_sent' => 'SMSが送信されました', + 'sms_error' => 'SMSを送信中にエラーが発生しました %s', + 'sms_error_nomobile' => 'テストSMSの送信に失敗: + あなたのプロフィールに有効な電話番号がありません', + 'pushover_sent' => 'Pushover通知が送信されました', + 'pushover_error' => 'Pushover通知を送信中にエラーが発生しました: %s', + 'pushover_error_noapp' => 'テスト通知の送信に失敗しました:グローバル設定にAPIトークンがありません', + 'pushover_error_nokey' => 'テスト通知の送信に失敗しました:あなたのプロフィールに有効なPushoverキーがありません', + 'telegram_sent' => 'Telegram通知が送信されました', + 'telegram_error' => 'Telegram通知を送信中にエラーが発生しました: %s', + 'telegram_error_notoken' => 'テスト通知の送信に失敗しました:グローバル設定にTelegram + APIトークンがありません', + 'telegram_error_noid' => 'テスト通知の送信に失敗しました:あなたのプロフィールに有効なチャットIDがありません', + 'log_retention_period' => 'ログ保持期間', + 'log_retention_period_description' => '通知のログおよびサーバー稼働時間のアーカイブを保持する日数。 + ログのクリーンアップを無効にするには、0を入力します。', + 'log_retention_days' => '日', + ), + 'notifications' => array( + 'off_sms' => 'サーバー \'%LABEL%\' はダウンしています: ip=%IP%, ポート=%PORT%. + エラー=%ERROR%', + 'off_email_subject' => '重要: サーバー \'%LABEL%\' がダウンしています!', + 'off_email_body' => 'サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: + %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%', + 'off_pushover_title' => 'サーバー \'%LABEL%\' がダウンしています!', + 'off_pushover_message' => 'サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: + %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%', + 'off_telegram_message' => 'サーバーへの接続に失敗しました:

    Server: %LABEL%
    IP: + %IP%
    ポート: %PORT%
    エラー: %ERROR%
    日時: %DATE%', + 'on_sms' => 'サーバー \'%LABEL%\' は動作しています: ip=%IP%, port=%PORT%, it was down for + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => '重要: サーバー \'%LABEL%\' は動作しています', + 'on_email_body' => 'サーバー \'%LABEL%\' は動作中です。 + この期間の間ダウンしていました: + %LAST_OFFLINE_DURATION%:

    サーバー: %LABEL%
    IP: %IP%
    ポート: + %PORT%
    日時: %DATE%', + 'on_pushover_title' => 'サーバー \'%LABEL%\' は動作しています', + 'on_pushover_message' => 'サーバー \'%LABEL%\' は動作中です。 + この期間の間ダウンしていました: + %LAST_OFFLINE_DURATION%:

    サーバー: %LABEL%
    IP: %IP%
    ポート: + %PORT%
    日時: %DATE%', + 'on_telegram_message' => 'サーバー \'%LABEL%\' は動作中です。 + この期間の間ダウンしていました:

    サーバー: + %LABEL%
    IP: %IP%
    ポート: %PORT%
    ダウンタイム: + %LAST_OFFLINE_DURATION%
    日時: %DATE%', + 'combi_off_email_message' => '
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: + %PORT%
    • エラー: %ERROR%
    • 日時: %DATE%
    ', + 'combi_off_pushover_message' => '
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: + %PORT%
    • エラー: %ERROR%
    • 日時: %DATE%
    ', + 'combi_off_telegram_message' => '- サーバー: %LABEL%
    - IP: %IP%
    - ポート: %PORT%
    - + エラー: %ERROR%
    - 日時: %DATE%

    ', + 'combi_on_email_message' => '
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: + %PORT%
    • ダウンタイム: %LAST_OFFLINE_DURATION%
    • 日時: + %DATE%
    ', + 'combi_on_pushover_message' => '
    • サーバー: %LABEL%
    • IP: %IP%
    • ポート: + %PORT%
    • ダウンタイム: %LAST_OFFLINE_DURATION%
    • 日時: + %DATE%
    ', + 'combi_on_telegram_message' => '- サーバー: %LABEL%
    - IP: %IP%
    - ポート: %PORT%
    - + ダウンタイム: %LAST_OFFLINE_DURATION%
    - 日時: %DATE%

    ', + 'combi_email_subject' => '重要: \'%UP%\' サーバーは動作を再開しました。 \'%DOWN%\' + サーバーはダウンしています。', + 'combi_pushover_subject' => '\'%UP%\' サーバーは動作を再開しました。 \'%DOWN%\' + サーバーはダウンしています。', + 'combi_email_message' => '以下のサーバーはダウンしています: +
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', + 'combi_pushover_message' => '以下のサーバーはダウンしています: +
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', + 'combi_telegram_message' => '以下のサーバーはダウンしています: +
    %DOWN_SERVERS%
    以下のサーバーは動作を再開しました:
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => 'ようこそ、 %user_name%', + 'title_sign_in' => 'サインインしてください。', + 'title_forgot' => 'パスワードを忘れましたか?', + 'title_reset' => 'パスワードをリセットする', + 'submit' => '送信', + 'remember_me' => 'ログイン状態を保持する', + 'login' => 'ログイン', + 'logout' => 'ログアウト', + 'username' => 'ユーザー名', + 'password' => 'パスワード', + 'password_repeat' => 'パスワードを繰り返してください', + 'password_forgot' => 'パスワードを忘れましたか?', + 'password_reset' => 'パスワードをリセットする', + 'password_reset_email_subject' => 'PHP Server Monitorのパスワードをリセットする', + 'password_reset_email_body' => 'パスワードをリセットするには、次のリンクを使用してください。 + 1時間で期限切れになりますのでご注意ください。

    %link%', + 'error_user_incorrect' => '指定されたユーザー名が見つかりませんでした。', + 'error_login_incorrect' => '情報が間違っています。', + 'error_login_passwords_nomatch' => '指定されたパスワードが一致しません。', + 'error_reset_invalid_link' => '指定したリセットリンクは無効です。', + 'success_password_forgot' => 'パスワードをリセットする方法に関する情報が電子メールで送信されました。', + 'success_password_reset' => 'パスワードは正常にリセットされました。ログインしてください。', + ), + 'error' => array( + '401_unauthorized' => '未認証', + '401_unauthorized_description' => 'このページを表示する権限がありません。', + ), ); diff --git a/src/lang/ko_KR.lang.php b/src/lang/ko_KR.lang.php index 480642dd..0ffb226e 100644 --- a/src/lang/ko_KR.lang.php +++ b/src/lang/ko_KR.lang.php @@ -1,4 +1,5 @@ '한국 - Korean', - 'locale' => array('ko_KR.UTF-8', 'ko_KR', 'korean'), - 'locale_tag' => 'ko', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Install', - 'action' => 'Action', - 'save' => '저장', - 'edit' => '수정', - 'delete' => '삭제', - 'date' => '날짜', - 'message' => '메세지', - 'yes' => '예', - 'no' => '아니오', - 'insert' => '삽입', - 'add_new' => '새계정 추가', - 'update_available' => '새로운 업데이트가 있습니다 ({version}). 다음사이트를 방문 해 주십시오. http://www.phpservermonitor.org.', - 'back_to_top' => 'Back to top', - 'go_back' => 'Go back', - 'ok' => 'OK', - 'cancel' => 'Cancel', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Yesterday at %X', - 'other_day_format' => '%A at %X', - 'never' => 'Never', - 'hours_ago' => '%d hours ago', - 'an_hour_ago' => 'about an hour ago', - 'minutes_ago' => '%d minutes ago', - 'a_minute_ago' => 'about a minute ago', - 'seconds_ago' => '%d seconds ago', - 'a_second_ago' => 'a second ago', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => '설정', - 'server' => '서버목록', - 'server_log' => '로그', - 'server_status' => 'Status', - 'server_update' => '업데이트', - 'user' => '사용자', - 'help' => '도움말', - ), - 'users' => array( - 'user' => '사용자', - 'name' => '이름', - 'user_name' => 'Username', - 'password' => 'Password', - 'password_repeat' => 'Password repeat', - 'password_leave_blank' => 'Leave blank to keep unchanged', - 'level' => 'Level', - 'level_10' => 'Administrator', - 'level_20' => 'User', - 'level_description' => 'Administrators have full access: they can manage servers, users and edit the global configuration.
    Users can only view and run the updater for the servers that have been assigned to them.', - 'mobile' => '휴대폰', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Device name to send the message to. Leave empty to send it to all devices.', - 'delete_title' => 'Delete User', - 'delete_message' => 'Are you sure you want to delete user \'%1\'?', - 'deleted' => 'User deleted.', - 'updated' => '수정되었습니다.', - 'inserted' => '추가되었습니다.', - 'profile' => 'Profile', - 'profile_updated' => 'Your profile has been updated.', - 'error_user_name_bad_length' => 'Usernames must be between 2 and 64 characters.', - 'error_user_name_invalid' => 'It may only contain alphabetic characters (a-z, A-Z), digits (0-9), dots (.) and underscores (_).', - 'error_user_name_exists' => 'The given username already exists in the database.', - 'error_user_email_bad_length' => 'Email addresses must be between 5 and 255 characters.', - 'error_user_email_invalid' => 'The email address is invalid.', - 'error_user_level_invalid' => 'The given user level is invalid.', - 'error_user_no_match' => 'The user could not be found in the database.', - 'error_user_password_invalid' => 'The entered password is invalid.', - 'error_user_password_no_match' => 'The entered passwords do not match.', - ), - 'log' => array( - 'title' => 'Log entries', - 'type' => '속성', - 'status' => '상태', - 'email' => 'email', - 'sms' => 'sms', - 'pushover' => 'Pushover', - 'no_logs' => 'No logs', - 'clear' => 'Clear log', - 'delete_title' => 'Delete log', - 'delete_message' => 'Are you sure you want to delete all logs?', - ), - 'servers' => array( - 'server' => '서버', - 'status' => 'Status', - 'label' => 'Label', - 'domain' => 'Domain/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Number of seconds to wait for the server to respond.', - 'port' => 'Port', - 'type' => 'Type', - 'type_website' => 'Website', - 'type_service' => 'Service', - 'pattern' => 'Search string/regex', - 'pattern_description' => 'If this pattern is not found on the website, the server will be marked offline. Regular expressions are allowed.', - 'last_check' => '최근체크', - 'last_online' => '최근접속', - 'last_offline' => 'Last offline', - 'monitoring' => '확인중', - 'no_monitoring' => 'No monitoring', - 'email' => '메일 전송', - 'send_email' => '메일 전송', - 'sms' => 'SMS 전송', - 'send_sms' => 'SMS 전송', - 'pushover' => 'Pushover', - 'users' => 'Users', - 'delete_title' => 'Delete Server', - 'delete_message' => 'Are you sure you want to delete server \'%1\'?', - 'deleted' => 'Server deleted.', - 'updated' => '서버가 수정되었습니다.', - 'inserted' => '서버가 추가되었습니다.', - 'latency' => '응답', - 'latency_max' => 'Latency (maximum)', - 'latency_min' => 'Latency (minimum)', - 'latency_avg' => 'Latency (average)', - 'uptime' => 'Uptime', - 'year' => 'Year', - 'month' => 'Month', - 'week' => 'Week', - 'day' => 'Day', - 'hour' => 'Hour', - 'warning_threshold' => 'Warning threshold', - 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', - 'chart_last_week' => 'Last week', - 'chart_history' => 'History', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS notifications are disabled.', - 'warning_notifications_disabled_email' => 'Email notifications are disabled.', - 'warning_notifications_disabled_pushover' => 'Pushover notifications are disabled.', - 'error_server_no_match' => 'Server not found.', - 'error_server_label_bad_length' => 'The label must be between 1 and 255 characters.', - 'error_server_ip_bad_length' => 'The domain / IP must be between 1 and 255 characters.', - 'error_server_ip_bad_service' => 'The IP address is not valid.', - 'error_server_ip_bad_website' => 'The website URL is not valid.', - 'error_server_type_invalid' => 'The selected server type is invalid.', - 'error_server_warning_threshold_invalid' => 'The warning threshold must be a valid integer greater than 0.', - ), - 'config' => array( - 'general' => '일반', - 'language' => '언어', - 'show_update' => '매주 업데이트를 확인하시겠습니까?', - 'email_status' => '메일전송 허용', - 'email_from_email' => 'Email 주소', - 'email_from_name' => 'Email 사용자', - 'email_smtp' => 'Enable SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP username', - 'email_smtp_password' => 'SMTP password', - 'email_smtp_noauth' => 'Leave blank for no authentication', - 'sms_status' => 'SMS전송 허용', - 'sms_gateway' => '메세지 전송을 위한 게이트웨이 허용', - 'sms_gateway_username' => 'Gateway username', - 'sms_gateway_password' => 'Gateway password', - 'sms_from' => 'Sender\'s phone number', - 'pushover_status' => 'Allow sending Pushover messages', - 'pushover_description' => 'Pushover is a service that makes it easy to get real-time notifications. See their website for more info.', - 'pushover_clone_app' => 'Click here to create your Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Before you can use Pushover, you need to register an App at their website and enter the App API Token here.', - 'alert_type' => '알림을 원하면 다음과 같이 변경하십시오.', - 'alert_type_description' => '상태 변경:
    '. - '서버 상태가 변경이되면 알림을 받습니다. online -> offline -> online.
    '. - '
    오프라인:
    '. - '서버가 첫번째로 오프라인이 되었을 때 알림을 받습니다. 예를들어, '. - 'cron이 매 15분이고 오전1시 부터 오전6시까지 다운되었을때 오전1시에 한번 알림을 받습니다.
    '. - '
    항상:
    '. - '사이트가 다운되었을 때 매시간 알림을 받습니다.', - - 'alert_type_status' => '상태 변경', - 'alert_type_offline' => '오프라인', - 'alert_type_always' => '항상', - 'log_status' => '로그 상태', - 'log_status_description' => '로그상태가 TRUE이면 알림설정이 통과할때마다 이벤트를 기록합니다.', - 'log_email' => '이메일로 로그를 전송하시겠습니까?', - 'log_sms' => 'SMS로 로그를 전송하시겠습니까?', - 'log_pushover' => 'Log pushover messages sent by the script', - 'updated' => '설정이 수정되었습니다.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Email 설정', - 'settings_sms' => 'SMS 설정', - 'settings_pushover' => 'Pushover settings', - 'settings_notification' => '알림 설정', - 'settings_log' => '로그 설정', - 'auto_refresh' => 'Auto-refresh', - 'auto_refresh_description' => - '서버페이지를 자동으로 새로고침.
    '. - ''. - '시간은 초(sec)로 설정을 하고, 0은 새로고침을 하지 않습니다.'. - '', - 'seconds' => 'seconds', - 'test' => 'Test', - 'test_email' => 'An email will be sent to the address specified in your user profile.', - 'test_sms' => 'An SMS will be sent to the phone number specified in your user profile.', - 'test_pushover' => 'A Pushover notification will be sent to the user key/device specified in your user profile.', - 'send' => 'Send', - 'test_subject' => 'Test', - 'test_message' => 'Test message', - 'email_sent' => 'Email sent', - 'email_error' => 'Error in email sending', - 'sms_sent' => 'Sms sent', - 'sms_error' => 'Error in sms sending. %s', - 'sms_error_nomobile' => 'Unable to send test SMS: no valid phone number found in your profile.', - 'pushover_sent' => 'Pushover notification sent', - 'pushover_error' => 'An error has occurred while sending the Pushover notification: %s', - 'pushover_error_noapp' => 'Unable to send test notification: no Pushover App API token found in the global configuration.', - 'pushover_error_nokey' => 'Unable to send test notification: no Pushover key found in your profile.', - 'log_retention_period' => 'Log retention period', - 'log_retention_period_description' => 'Number of days to keep logs of notifications and archives of server uptime. Enter 0 to disable log cleanup.', - 'log_retention_days' => 'days', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => '서버(\'%LABEL%\')가 다운되었습니다. : ip=%IP%, port=%PORT%. Error=%ERROR%', - 'off_email_subject' => '중요: 서버(\'%LABEL%\')가 다운되었습니다.', - 'off_email_body' => "서버 접속을 실패하였습니다.

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'off_pushover_title' => '서버(\'%LABEL%\')가 다운되었습니다.', - 'off_pushover_message' => "서버 접속을 실패하였습니다.

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Error: %ERROR%
    Date: %DATE%", - 'on_sms' => '서버(\'%LABEL%\') 가동중: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => '중요: 서버(\'%LABEL%\')가 가동중입니다.', - 'on_email_body' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - 'on_pushover_title' => '서버(\'%LABEL%\')가 가동중입니다.', - 'on_pushover_message' => "서버('%LABEL%')가 재가동됩니다., it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => 'Welcome, %user_name%', - 'title_sign_in' => 'Please sign in', - 'title_forgot' => 'Forgot your password?', - 'title_reset' => 'Reset your password', - 'submit' => 'Submit', - 'remember_me' => 'Remember me', - 'login' => 'Login', - 'logout' => 'Logout', - 'username' => 'Username', - 'password' => 'Password', - 'password_repeat' => 'Repeat password', - 'password_forgot' => 'Forgot password?', - 'password_reset' => 'Reset password', - 'password_reset_email_subject' => 'Reset your password for PHP Server Monitor', - 'password_reset_email_body' => 'Please use the following link to reset your password. Please note it expires in 1 hour.

    %link%', - 'error_user_incorrect' => 'The provided username could not be found.', - 'error_login_incorrect' => 'The information is incorrect.', - 'error_login_passwords_nomatch' => 'The provided passwords do not match.', - 'error_reset_invalid_link' => 'The reset link you provided is invalid.', - 'success_password_forgot' => 'An email has been sent to you with information how to reset your password.', - 'success_password_reset' => 'Your password has been reset successfully. Please login.', - ), - 'error' => array( - '401_unauthorized' => 'Unauthorized', - '401_unauthorized_description' => 'You do not have the privileges to view this page.', - ), + 'name' => '한국 - Korean', + 'locale' => array( + '0' => 'ko_KR.UTF-8', + '1' => 'ko_KR', + '2' => 'korean', + ), + 'locale_tag' => 'ko', + 'locale_dir' => 'ltr', + 'system' => array( + 'save' => '저장', + 'edit' => '수정', + 'delete' => '삭제', + 'date' => '날짜', + 'message' => '메세지', + 'yes' => '예', + 'no' => '아니오', + 'insert' => '삽입', + 'add_new' => '새계정 추가', + 'update_available' => '새로운 업데이트가 있습니다 ({version}). 다음사이트를 방문 해 + 주십시오. http://www.phpservermonitor.org.', + ), + 'menu' => array( + 'config' => '설정', + 'server' => '서버목록', + 'server_log' => '로그', + 'server_update' => '업데이트', + 'user' => '사용자', + 'help' => '도움말', + ), + 'users' => array( + 'user' => '사용자', + 'name' => '이름', + 'mobile' => '휴대폰', + 'updated' => '수정되었습니다.', + 'inserted' => '추가되었습니다.', + ), + 'log' => array( + 'type' => '속성', + 'status' => '상태', + 'email' => 'email', + 'sms' => 'sms', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + ), + 'servers' => array( + 'server' => '서버', + 'last_check' => '최근체크', + 'last_online' => '최근접속', + 'monitoring' => '확인중', + 'email' => '메일 전송', + 'send_email' => '메일 전송', + 'sms' => 'SMS 전송', + 'send_sms' => 'SMS 전송', + 'updated' => '서버가 수정되었습니다.', + 'inserted' => '서버가 추가되었습니다.', + 'latency' => '응답', + ), + 'config' => array( + 'general' => '일반', + 'language' => '언어', + 'show_update' => '매주 업데이트를 확인하시겠습니까?', + 'email_status' => '메일전송 허용', + 'email_from_email' => 'Email 주소', + 'email_from_name' => 'Email 사용자', + 'sms_status' => 'SMS전송 허용', + 'sms_gateway' => '메세지 전송을 위한 게이트웨이 허용', + 'alert_type' => '알림을 원하면 다음과 같이 변경하십시오.', + 'alert_type_description' => '상태 변경:
    서버 상태가 변경이되면 알림을 + 받습니다. online -> offline -> online.

    오프라인: +
    서버가 첫번째로 오프라인이 되었을 때 알림을 + 받습니다. 예를들어, cron이 매 15분이고 오전1시 부터 + 오전6시까지 다운되었을때 오전1시에 한번 알림을 + 받습니다.

    항상:
    사이트가 다운되었을 때 + 매시간 알림을 받습니다.', + 'alert_type_status' => '상태 변경', + 'alert_type_offline' => '오프라인', + 'alert_type_always' => '항상', + 'log_status' => '로그 상태', + 'log_status_description' => '로그상태가 TRUE이면 알림설정이 통과할때마다 이벤트를 + 기록합니다.', + 'log_email' => '이메일로 로그를 전송하시겠습니까?', + 'log_sms' => 'SMS로 로그를 전송하시겠습니까?', + 'updated' => '설정이 수정되었습니다.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Email 설정', + 'settings_sms' => 'SMS 설정', + 'settings_notification' => '알림 설정', + 'settings_log' => '로그 설정', + 'auto_refresh_description' => '서버페이지를 자동으로 새로고침.
    시간은 + 초(sec)로 설정을 하고, 0은 새로고침을 하지 않습니다.', + ), + 'notifications' => array( + 'off_sms' => '서버(\'%LABEL%\')가 다운되었습니다. : ip=%IP%, port=%PORT%. Error=%ERROR%', + 'off_email_subject' => '중요: 서버(\'%LABEL%\')가 다운되었습니다.', + 'off_email_body' => '서버 접속을 실패하였습니다.

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'off_pushover_title' => '서버(\'%LABEL%\')가 다운되었습니다.', + 'off_pushover_message' => '서버 접속을 실패하였습니다.

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Error: %ERROR%
    Date: %DATE%', + 'on_sms' => '서버(\'%LABEL%\') 가동중: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => '중요: 서버(\'%LABEL%\')가 가동중입니다.', + 'on_email_body' => '서버(\'%LABEL%\')가 재가동됩니다., it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + 'on_pushover_title' => '서버(\'%LABEL%\')가 가동중입니다.', + 'on_pushover_message' => '서버(\'%LABEL%\')가 재가동됩니다., it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Date: + %DATE%', + ), ); diff --git a/src/lang/nl_NL.lang.php b/src/lang/nl_NL.lang.php index e87d420f..7ca106a4 100644 --- a/src/lang/nl_NL.lang.php +++ b/src/lang/nl_NL.lang.php @@ -1,4 +1,5 @@ 'Nederlands - Dutch', - 'locale' => array( - '0' => 'nl_NL.UTF-8', - '1' => 'nl_NL', - '2' => 'dutch', - ), - 'locale_tag' => 'nl', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installeren', - 'action' => 'Actie', - 'save' => 'Opslaan', - 'edit' => 'Wijzig', - 'delete' => 'Verwijder', - 'date' => 'Datum', - 'message' => 'Bericht', - 'yes' => 'Ja', - 'no' => 'Nee', - 'insert' => 'Voeg toe', - 'add_new' => 'Voeg toe', - 'update_available' => 'Een nieuwe update ({version}) is beschikbaar op http://www.phpservermonitor.org.', - 'back_to_top' => 'Terug naar boven', - 'go_back' => 'Terug', - 'ok' => 'OK', - 'bad' => 'niet goed', - 'cancel' => 'Cancel', - 'none' => 'Geen', - 'activate' => 'Activeer', - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Gisteren om %k:%M', - 'other_day_format' => '%A om %k:%M', - 'never' => 'Nooit', - 'hours_ago' => '%d uren geleden', - 'an_hour_ago' => 'een uur geleden', - 'minutes_ago' => '%d minuten geleden', - 'a_minute_ago' => 'een minuut geleden', - 'seconds_ago' => '%d seconden geleden', - 'a_second_ago' => 'een seconde geleden', - 'year' => 'jaar', - 'years' => 'jaren', - 'month' => 'maand', - 'months' => 'maanden', - 'day' => 'dag', - 'days' => 'dagen', - 'hour' => 'uur', - 'hours' => 'uren', - 'minute' => 'minuut', - 'minutes' => 'minuten', - 'second' => 'seconde', - 'seconds' => 'seconden', - 'current' => 'huidig', - 'settings' => 'Instellingen', - ), - 'menu' => array( - 'config' => 'Configuratie', - 'server' => 'Servers', - 'server_log' => 'Log', - 'server_status' => 'Status', - 'server_update' => 'Update', - 'user' => 'Gebruikers', - 'help' => 'Help', - ), - 'users' => array( - 'user' => 'Gebruiker', - 'name' => 'Naam', - 'user_name' => 'Gebruikersnaam', - 'password' => 'Wachtwoord', - 'password_repeat' => 'Herhaal wachtwoord', - 'password_leave_blank' => 'Laat leeg om niet te wijzigen', - 'level' => 'Level', - 'level_10' => 'Beheerder', - 'level_20' => 'Gebruiker', - 'level_description' => 'Beheerders hebben volledige toegang: ze kunnen servers en gebruiker beheren en de globale configuratie aanpassen.
    Gebruikers kunnen alleen de servers bekijken en op fouten testen die aan hun zijn toegewezen.', - 'mobile' => 'Mobiel', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te ontvangen. Zie hun website voor meer informatie.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Apparaat waar de berichten naar toe gaan. Laat leeg voor alle apparaten.', - 'telegram' => 'Telegram', - 'telegram_chat_id' => 'Telegram chat id', - 'telegram_get_chat_id' => 'Klik hier om je chat id te vinden', - 'activate_telegram' => 'Activeer Telegram notificaties', - 'telegram_bot_username_found' => 'De Telegram bot is gevonden!

    Dit zal een chat met de bot openen. Klik vervolgens op start of typ /start.', - 'telegram_bot_error' => 'Er is een error voorgekomen tijdens de activatie van Telegram notificaties: %s', - 'delete_title' => 'Verwijder gebruiker', - 'delete_message' => 'Weet je zeker dat je deze gebruiker wilt verwijderen: \'%1\'?', - 'deleted' => 'Gebruiker verwijderd.', - 'updated' => 'Gebruiker gewijzigd.', - 'inserted' => 'Gebruiker toegevoegd.', - 'profile' => 'Profiel', - 'profile_updated' => 'Je profiel is bijgewerkt.', - 'error_user_name_bad_length' => 'Een gebruikersnaam moet tussen de 2 en 64 tekens zijn.', - 'error_user_name_invalid' => 'Een gebruikersnaam mag alleen alfabetische tekens (a-z, A-Z), cijfers (0-9), punten (.) en underscores (_) bevatten.', - 'error_user_name_exists' => 'De opgegeven gebruikersnaam bestaat al.', - 'error_user_email_bad_length' => 'Een email adres moet tussen de 5 en 255 tekens zijn.', - 'error_user_email_invalid' => 'Het email adres is ongeldig.', - 'error_user_level_invalid' => 'Het gebruikersniveau is ongeldig.', - 'error_user_no_match' => 'De gebruiker kon niet worden toegevoegd aan de database.', - 'error_user_password_invalid' => 'Het ingevulde wachtwoord is ongeldig.', - 'error_user_password_no_match' => 'De ingevulde wachtwoorden komen niet overeen.', - ), - 'log' => array( - 'title' => 'Log entries', - 'type' => 'Type', - 'status' => 'Status', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'Geen logs', - 'clear' => 'Logboek opschonen', - 'delete_title' => 'Logboek opschonen', - 'delete_message' => 'Weet je zeker dat je alle logs wilt opschonen?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Label', - 'domain' => 'Domein/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Aantal seconden te wachten op een reactie van de server.', - 'authentication_settings' => 'Authenticatie instellingen', - 'optional' => 'Optioneel', - 'website_username' => 'Gebruikersnaam', - 'website_password' => 'Wachtwoord', - 'port' => 'Poort', - 'custom_port' => 'Aangepaste poort', - 'popular_ports' => 'Populaire poorten', - 'post_field' => 'POST veld', - 'please_select' => 'Selecteer', - 'type' => 'Type', - 'type_website' => 'Website', - 'type_service' => 'Service', - 'type_ping' => 'Ping', - 'pattern' => 'Zoek voor tekst/regex', - 'pattern_description' => 'Als dit patroon niet gevonden wordt op de website, zal de server als offline gemarkeerd worden. Regular expressions zijn toegestaan.', - 'redirect_check' => 'Omleiden naar een ander domein is', - 'redirect_check_description' => 'Een omleiding naar een ander domein is meestal een slecht teken.', - 'allow_http_status' => 'Sta HTTP status code toe', - 'allow_http_status_description' => 'Markeer website als online. HTTP status code lager dan 400 worden standaard als online gemarkeerd. Scheiden met |.', - 'header_name' => 'Header naam', - 'header_value' => 'Header waarde', - 'header_name_description' => 'Hoofdlettergevoelig', - 'last_check' => 'Laatst gecontroleerd', - 'last_online' => 'Laatst online', - 'last_offline' => 'Laatst offline', - 'last_output' => 'Laatste succesvole uitvoer', - 'last_error' => 'Laatste error', - 'last_error_output' => 'Laatste error uitvoer', - 'output' => 'Uitvoer', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'Geen monitoring', - 'email' => 'Email', - 'send_email' => 'Stuur email', - 'sms' => 'SMS', - 'send_sms' => 'Stuur SMS', - 'pushover' => 'Pushover', - 'send_pushover' => 'Stuur Pushover notificatie', - 'telegram' => 'Telegram', - 'send_telegram' => 'Stuur Telegram notificatie', - 'users' => 'Gebruikers', - 'delete_title' => 'Verwijder server', - 'delete_message' => 'Weet je zeker dat je deze server wilt verwijderen: \'%1\'?', - 'deleted' => 'Server verwijderd.', - 'updated' => 'Server gewijzigd.', - 'inserted' => 'Server toegevoegd.', - 'latency' => 'Response tijd', - 'latency_max' => 'Latency (maximum)', - 'latency_min' => 'Latency (minimum)', - 'latency_avg' => 'Latency (gemiddeld)', - 'online' => 'online', - 'offline' => 'offline', - 'uptime' => 'Uptime', - 'year' => 'Jaar', - 'month' => 'Maand', - 'week' => 'Week', - 'day' => 'Dag', - 'hour' => 'Uur', - 'warning_threshold' => 'Waarschuwingsdrempel', - 'warning_threshold_description' => 'Aantal mislukte pogingen voordat de server als offline gemarkeerd wordt.', - 'chart_last_week' => 'Afgelopen week', - 'chart_history' => 'Geschiedenis', - 'chart_day_format' => '%d-%m-%Y', - 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', - 'chart_short_date_format' => '%d-%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS notificaties zijn uitgeschakeld.', - 'warning_notifications_disabled_email' => 'Email notificaties zijn uitgeschakeld.', - 'warning_notifications_disabled_pushover' => 'Pushover notificaties zijn uitgeschakeld.', - 'warning_notifications_disabled_telegram' => 'Telegram notificaties zijn uitgeschakeld.', - 'error_server_no_match' => 'Server niet gevonden.', - 'error_server_label_bad_length' => 'Het label moet tussen de 1 en 255 karakters lang zijn.', - 'error_server_ip_bad_length' => 'Het domein / IP moet tussen de 1 en 255 karakters lang zijn.', - 'error_server_ip_bad_service' => 'Het IP adres is ongeldig.', - 'error_server_ip_bad_website' => 'De website URL is ongeldig.', - 'error_server_type_invalid' => 'Het geselecteerde server type is ongeldig.', - 'error_server_warning_threshold_invalid' => 'De warning threshold moet een numerieke waarde zijn groter dan 0.', - ), - 'config' => array( - 'general' => 'Algemeen', - 'language' => 'Taal', - 'show_update' => 'Controleer wekelijks voor updates?', - 'email_status' => 'Sta email berichten toe?', - 'email_from_email' => 'Email van adres', - 'email_from_name' => 'Email van naam', - 'email_smtp' => 'SMTP gebruiken', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP poort', - 'email_smtp_security' => 'SMTP beveiliging', - 'email_smtp_security_none' => 'Geen', - 'email_smtp_username' => 'SMTP gebruikersnaam', - 'email_smtp_password' => 'SMTP wachtwoord', - 'email_smtp_noauth' => 'Laat leeg voor geen authenticatie', - 'sms_status' => 'Sta SMS berichten toe?', - 'sms_gateway' => 'Gateway voor het sturen van SMS', - 'sms_gateway_username' => 'Gateway gebruikersnaam', - 'sms_gateway_password' => 'Gateway wachtwoord', - 'sms_from' => 'Telefoonnummer afzender', - 'pushover_status' => 'Sta Pushover berichten toe?', - 'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te ontvangen. Zie hun website voor meer informatie.', - 'pushover_clone_app' => 'Klik hier om je Pushover app te maken', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Voordat je Pushover kunt gebruiken moet je een App registreren via hun website, en daarvan de App API Token hier invullen.', - 'telegram_status' => 'Sta Telegram berichten toe?', - 'telegram_api_token' => 'Telegram API Token', - 'alert_type' => 'Selecteer wanneer je een notificatie wilt', - 'alert_type_description' => 'Status verandert: Je ontvangt alleen bericht wanneer een server van status verandert. Dus van online -> offline of offline -> online.

    Offline: Je ontvangt bericht wanneer een server offline gaat voor de *EERSTE KEER*. Bijvoorbeeld, je cronjob draait iedere 15 min en je server gaat down om 01:00 en blijft offline tot 06:00. Je krijgt 1 bericht om 01:00 en dat is het.

    Altijd: Je krijgt een bericht elke keer dat het script draait en een website is down, ook al is de site al een paar uur offline.', - 'alert_type_status' => 'Status verandering', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Altijd', - 'combine_notifications' => 'Combineer notificaties', - 'alert_proxy_url' => 'Formaat: host:poort', - 'log_status' => 'Log status', - 'log_status_description' => 'Als de log status aan staat, zal de monitor een log aanmaken elke keer dat hij door de notificatie instellingen komt.', - 'log_email' => 'Log emails verstuurd bij het script?', - 'log_sms' => 'Log sms berichten verstuurd bij het script?', - 'log_pushover' => 'Log Pushover berichten verstuurd bij het script?', - 'log_telegram' => 'Log Telegram berichten verstuurd bij het script?', - 'updated' => 'De configuratie is gewijzigd.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Email instellingen', - 'settings_sms' => 'SMS instellingen', - 'settings_pushover' => 'Pushover instellingen', - 'settings_telegram' => 'Telegram instellingen', - 'settings_notification' => 'Notificatie instellingen', - 'settings_log' => 'Log instellingen', - 'settings_proxy' => 'Proxy instellingen', - 'auto_refresh' => 'Herlaad automatisch', - 'auto_refresh_description' => 'Auto-herladen servers pagina.
    Tijd in seconden, als de tijd 0 is wordt de pagina niet ververst.', - 'seconds' => 'seconden', - 'test' => 'Test', - 'test_email' => 'Er zal een email verstuurd worden naar het email adres in je profiel.', - 'test_sms' => 'Er zal een SMS verstuurd worden naar het telefoonnummer in je profiel.', - 'test_pushover' => 'Er zal een Pushover notificatie verstuurd worden naar de user key/device in je profiel.', - 'send' => 'Verstuur', - 'test_subject' => 'Test', - 'test_message' => 'Test bericht', - 'email_sent' => 'Email verzonden', - 'email_error' => 'Er is een fout opgetreden tijdens het verzenden', - 'sms_sent' => 'SMS verzonden', - 'sms_error' => 'Er is een fout opgetreden tijdens het verzenden. %s', - 'sms_error_nomobile' => 'Kan test SMS niet verzenden: er is geen telefoonnummer ingevuld in je profiel.', - 'pushover_sent' => 'Pushover notificatie verzonden', - 'pushover_error' => 'De volgende fout is opgetreden bij het versturen van de Pushover notificatie: %s', - 'pushover_error_noapp' => 'Kan test notificatie niet verzenden: er is geen Pushover App API token gevonden in de algemene configuratie.', - 'pushover_error_nokey' => 'Kan test notificatie niet verzenden: er is geen Pushover key gevonden in je profiel.', - 'telegram_sent' => 'Telegram notificatie verstuurd', - 'telegram_error' => 'Er is een error voorgekomen tijdens het versturen van de Telegram notificatie: %s', - 'telegram_error_notoken' => 'Niet mogelijk on test notificatie te versturen: Telegram API token niet gevonden in globale instellingen.', - 'telegram_error_noid' => 'Niet mogelijk on test notificatie te versturen: chat id niet gevonden op profiel.', - 'log_retention_period' => 'Log retentie periode', - 'log_retention_period_description' => 'Aantal dagen dat logs van notificaties en archieven van server uptime worden bewaard. Vul 0 in om log opruiming uit te zetten.', - 'log_retention_days' => 'dagen', - ), - 'notifications' => array( - 'off_sms' => 'Server %LABEL% is DOWN: ip=%IP%, poort=%PORT%. Fout=%ERROR%', - 'off_email_subject' => 'BELANGRIJK: Server %LABEL% is DOWN', - 'off_email_body' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: %PORT%
    Fout: %ERROR%
    Datum: %DATE%', - 'off_pushover_title' => 'Server %LABEL% is DOWN', - 'off_pushover_message' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: %PORT%
    Fout: %ERROR%
    Datum: %DATE%', - 'off_telegram_message' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: %PORT%
    Fout: %ERROR%
    Datum: %DATE%', - 'on_sms' => 'Server %LABEL% is RUNNING: ip=%IP%, poort=%PORT%, tijd offline=%LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'BELANGRIJK: Server %LABEL% is RUNNING', - 'on_email_body' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:

    Server: %LABEL%
    IP: %IP%
    Poort: %PORT%
    Datum: %DATE%', - 'on_pushover_title' => 'Server %LABEL% is RUNNING', - 'on_pushover_message' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:

    Server: %LABEL%
    IP: %IP%
    Poort: %PORT%
    Datum: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Welkom, %user_name%', - 'title_sign_in' => 'Log in', - 'title_forgot' => 'Wachtwoord vergeten?', - 'title_reset' => 'Herstel wachtwoord', - 'submit' => 'Sla op', - 'remember_me' => 'Onthoud mij', - 'login' => 'Login', - 'logout' => 'Uitloggen', - 'username' => 'Gebruikersnaam', - 'password' => 'Wachtwoord', - 'password_repeat' => 'Herhaal wachtwoord', - 'password_forgot' => 'Wachtwoord vergeten?', - 'password_reset' => 'Wachtwoord herstellen', - 'password_reset_email_subject' => 'Wijzig je wachtwoord voor PHP Server Monitor', - 'password_reset_email_body' => 'Gebruik de onderstaande link om je wachtwoord te wijzigen. Let op, deze link verloopt na 1 uur.

    %link%', - 'error_user_incorrect' => 'De opgegeven gebruikersnaam is onjuist.', - 'error_login_incorrect' => 'De informatie is niet juist.', - 'error_login_passwords_nomatch' => 'De ingevulde wachtwoorden komen niet overeen.', - 'error_reset_invalid_link' => 'De reset link is ongeldig.', - 'success_password_forgot' => 'Er is een mail verstuurd met informatie om je wachtwoord aan te passen.', - 'success_password_reset' => 'Je wachtwoord is aangepast. Je kunt nu inloggen.', - ), - 'error' => array( - '401_unauthorized' => 'Unauthorized', - '401_unauthorized_description' => 'Je hebt niet de juiste bevoegdheden om deze pagina te bekijken.', - ), -); \ No newline at end of file + 'name' => 'Nederlands - Dutch', + 'locale' => array( + '0' => 'nl_NL.UTF-8', + '1' => 'nl_NL', + '2' => 'dutch', + ), + 'locale_tag' => 'nl', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installeren', + 'action' => 'Actie', + 'save' => 'Opslaan', + 'edit' => 'Wijzig', + 'delete' => 'Verwijder', + 'date' => 'Datum', + 'message' => 'Bericht', + 'yes' => 'Ja', + 'no' => 'Nee', + 'insert' => 'Voeg toe', + 'add_new' => 'Voeg toe', + 'update_available' => 'Een nieuwe update ({version}) is beschikbaar op http://www.phpservermonitor.org.', + 'back_to_top' => 'Terug naar boven', + 'go_back' => 'Terug', + 'ok' => 'OK', + 'bad' => 'niet goed', + 'cancel' => 'Cancel', + 'none' => 'Geen', + 'activate' => 'Activeer', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Gisteren om %k:%M', + 'other_day_format' => '%A om %k:%M', + 'never' => 'Nooit', + 'hours_ago' => '%d uren geleden', + 'an_hour_ago' => 'een uur geleden', + 'minutes_ago' => '%d minuten geleden', + 'a_minute_ago' => 'een minuut geleden', + 'seconds_ago' => '%d seconden geleden', + 'a_second_ago' => 'een seconde geleden', + 'year' => 'jaar', + 'years' => 'jaren', + 'month' => 'maand', + 'months' => 'maanden', + 'day' => 'dag', + 'days' => 'dagen', + 'hour' => 'uur', + 'hours' => 'uren', + 'minute' => 'minuut', + 'minutes' => 'minuten', + 'second' => 'seconde', + 'seconds' => 'seconden', + 'current' => 'huidig', + 'settings' => 'Instellingen', + ), + 'menu' => array( + 'config' => 'Configuratie', + 'server' => 'Servers', + 'server_log' => 'Log', + 'server_status' => 'Status', + 'server_update' => 'Update', + 'user' => 'Gebruikers', + 'help' => 'Help', + ), + 'users' => array( + 'user' => 'Gebruiker', + 'name' => 'Naam', + 'user_name' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'password_repeat' => 'Herhaal wachtwoord', + 'password_leave_blank' => 'Laat leeg om niet te wijzigen', + 'level' => 'Level', + 'level_10' => 'Beheerder', + 'level_20' => 'Gebruiker', + 'level_description' => 'Beheerders hebben volledige toegang: ze kunnen servers en gebruiker beheren en + de globale configuratie aanpassen.
    Gebruikers kunnen alleen de servers + bekijken en op fouten testen die aan hun zijn toegewezen.', + 'mobile' => 'Mobiel', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te + ontvangen. Zie hun website voor meer + informatie.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Apparaat waar de berichten naar toe gaan. Laat leeg voor alle apparaten.', + 'telegram' => 'Telegram', + 'telegram_chat_id' => 'Telegram chat id', + 'telegram_get_chat_id' => 'Klik hier om je chat id te vinden', + 'activate_telegram' => 'Activeer Telegram notificaties', + 'telegram_bot_username_found' => 'De Telegram bot is gevonden!
    +
    Dit zal een chat met de bot openen. Klik vervolgens op start of typ + /start.', + 'telegram_bot_error' => 'Er is een error voorgekomen tijdens de activatie van Telegram notificaties: %s', + 'delete_title' => 'Verwijder gebruiker', + 'delete_message' => 'Weet je zeker dat je deze gebruiker wilt verwijderen: \'%1\'?', + 'deleted' => 'Gebruiker verwijderd.', + 'updated' => 'Gebruiker gewijzigd.', + 'inserted' => 'Gebruiker toegevoegd.', + 'profile' => 'Profiel', + 'profile_updated' => 'Je profiel is bijgewerkt.', + 'error_user_name_bad_length' => 'Een gebruikersnaam moet tussen de 2 en 64 tekens zijn.', + 'error_user_name_invalid' => 'Een gebruikersnaam mag alleen alfabetische tekens (a-z, A-Z), cijfers (0-9), + punten (.) en underscores (_) bevatten.', + 'error_user_name_exists' => 'De opgegeven gebruikersnaam bestaat al.', + 'error_user_email_bad_length' => 'Een email adres moet tussen de 5 en 255 tekens zijn.', + 'error_user_email_invalid' => 'Het email adres is ongeldig.', + 'error_user_level_invalid' => 'Het gebruikersniveau is ongeldig.', + 'error_user_no_match' => 'De gebruiker kon niet worden toegevoegd aan de database.', + 'error_user_password_invalid' => 'Het ingevulde wachtwoord is ongeldig.', + 'error_user_password_no_match' => 'De ingevulde wachtwoorden komen niet overeen.', + 'error_user_admin_cant_be_deleted' => 'Je kan de laatste administrator niet verwijderen.', + ), + 'log' => array( + 'title' => 'Log entries', + 'type' => 'Type', + 'status' => 'Status', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'Geen logs', + 'clear' => 'Logboek opschonen', + 'delete_title' => 'Logboek opschonen', + 'delete_message' => 'Weet je zeker dat je alle logs wilt opschonen?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Label', + 'domain' => 'Domein/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Aantal seconden te wachten op een reactie van de server.', + 'authentication_settings' => 'Authenticatie instellingen', + 'optional' => 'Optioneel', + 'website_username' => 'Gebruikersnaam', + 'website_password' => 'Wachtwoord', + 'port' => 'Poort', + 'custom_port' => 'Aangepaste poort', + 'popular_ports' => 'Populaire poorten', + 'post_field' => 'POST veld', + 'please_select' => 'Selecteer', + 'type' => 'Type', + 'type_website' => 'Website', + 'type_service' => 'Service', + 'type_ping' => 'Ping', + 'pattern' => 'Zoek voor tekst/regex', + 'pattern_description' => 'Als dit patroon niet gevonden wordt op de website, zal de server als offline + gemarkeerd worden. Regular expressions zijn toegestaan.', + 'redirect_check' => 'Omleiden naar een ander domein is', + 'redirect_check_description' => 'Een omleiding naar een ander domein is meestal een slecht teken.', + 'allow_http_status' => 'Sta HTTP status code toe', + 'allow_http_status_description' => 'Markeer website als online. HTTP status code lager dan 400 worden + standaard als online gemarkeerd. Scheiden met |.', + 'header_name' => 'Header naam', + 'header_value' => 'Header waarde', + 'header_name_description' => 'Hoofdlettergevoelig', + 'last_check' => 'Laatst gecontroleerd', + 'last_online' => 'Laatst online', + 'last_offline' => 'Laatst offline', + 'last_output' => 'Laatste succesvole uitvoer', + 'last_error' => 'Laatste error', + 'last_error_output' => 'Laatste error uitvoer', + 'output' => 'Uitvoer', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'Geen monitoring', + 'email' => 'Email', + 'send_email' => 'Stuur email', + 'sms' => 'SMS', + 'send_sms' => 'Stuur SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Stuur Pushover notificatie', + 'telegram' => 'Telegram', + 'send_telegram' => 'Stuur Telegram notificatie', + 'users' => 'Gebruikers', + 'delete_title' => 'Verwijder server', + 'delete_message' => 'Weet je zeker dat je deze server wilt verwijderen: \'%1\'?', + 'deleted' => 'Server verwijderd.', + 'updated' => 'Server gewijzigd.', + 'inserted' => 'Server toegevoegd.', + 'latency' => 'Response tijd', + 'latency_max' => 'Latency (maximum)', + 'latency_min' => 'Latency (minimum)', + 'latency_avg' => 'Latency (gemiddeld)', + 'online' => 'online', + 'offline' => 'offline', + 'uptime' => 'Uptime', + 'year' => 'Jaar', + 'month' => 'Maand', + 'week' => 'Week', + 'day' => 'Dag', + 'hour' => 'Uur', + 'warning_threshold' => 'Waarschuwingsdrempel', + 'warning_threshold_description' => 'Aantal mislukte pogingen voordat de server als offline gemarkeerd wordt.', + 'chart_last_week' => 'Afgelopen week', + 'chart_history' => 'Geschiedenis', + 'chart_day_format' => '%d-%m-%Y', + 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', + 'chart_short_date_format' => '%d-%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS notificaties zijn uitgeschakeld.', + 'warning_notifications_disabled_email' => 'Email notificaties zijn uitgeschakeld.', + 'warning_notifications_disabled_pushover' => 'Pushover notificaties zijn uitgeschakeld.', + 'warning_notifications_disabled_telegram' => 'Telegram notificaties zijn uitgeschakeld.', + 'error_server_no_match' => 'Server niet gevonden.', + 'error_server_label_bad_length' => 'Het label moet tussen de 1 en 255 karakters lang zijn.', + 'error_server_ip_bad_length' => 'Het domein / IP moet tussen de 1 en 255 karakters lang zijn.', + 'error_server_ip_bad_service' => 'Het IP adres is ongeldig.', + 'error_server_ip_bad_website' => 'De website URL is ongeldig.', + 'error_server_type_invalid' => 'Het geselecteerde server type is ongeldig.', + 'error_server_warning_threshold_invalid' => 'De warning threshold moet een numerieke waarde zijn groter dan 0.', + ), + 'config' => array( + 'general' => 'Algemeen', + 'language' => 'Taal', + 'show_update' => 'Controleer wekelijks voor updates?', + 'email_status' => 'Sta email berichten toe?', + 'email_from_email' => 'Email van adres', + 'email_from_name' => 'Email van naam', + 'email_smtp' => 'SMTP gebruiken', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP poort', + 'email_smtp_security' => 'SMTP beveiliging', + 'email_smtp_security_none' => 'Geen', + 'email_smtp_username' => 'SMTP gebruikersnaam', + 'email_smtp_password' => 'SMTP wachtwoord', + 'email_smtp_noauth' => 'Laat leeg voor geen authenticatie', + 'sms_status' => 'Sta SMS berichten toe?', + 'sms_gateway' => 'Gateway voor het sturen van SMS', + 'sms_gateway_username' => 'Gateway gebruikersnaam', + 'sms_gateway_password' => 'Gateway wachtwoord', + 'sms_from' => 'Telefoonnummer afzender', + 'pushover_status' => 'Sta Pushover berichten toe?', + 'pushover_description' => 'Pushover is een dienst die het gemakkelijk maakt om real-time notificaties te + ontvangen. Zie hun website voor meer + informatie.', + 'pushover_clone_app' => 'Klik hier om je Pushover app te maken', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Voordat je Pushover kunt gebruiken moet je een App registreren via hun website, en + daarvan de App API Token hier invullen.', + 'telegram_status' => 'Sta Telegram berichten toe?', + 'telegram_api_token' => 'Telegram API Token', + 'alert_type' => 'Selecteer wanneer je een notificatie wilt', + 'alert_type_description' => 'Status verandert: Je ontvangt alleen bericht wanneer een server van status + verandert. Dus van online -> offline of offline -> online.

    Offline: Je ontvangt bericht wanneer een server offline gaat voor de + *EERSTE KEER*. Bijvoorbeeld, je cronjob draait iedere 15 min en je server gaat + down om 01:00 en blijft offline tot 06:00. Je krijgt 1 bericht om 01:00 en dat is + het.

    Altijd: Je krijgt een bericht elke keer dat het script draait + en een website is down, ook al is de site al een paar uur offline.', + 'alert_type_status' => 'Status verandering', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Altijd', + 'combine_notifications' => 'Combineer notificaties', + 'alert_proxy_url' => 'Formaat: host:poort', + 'log_status' => 'Log status', + 'log_status_description' => 'Als de log status aan staat, zal de monitor een log aanmaken elke keer dat hij + door de notificatie instellingen komt.', + 'log_email' => 'Log emails verstuurd bij het script?', + 'log_sms' => 'Log sms berichten verstuurd bij het script?', + 'log_pushover' => 'Log Pushover berichten verstuurd bij het script?', + 'log_telegram' => 'Log Telegram berichten verstuurd bij het script?', + 'updated' => 'De configuratie is gewijzigd.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Email instellingen', + 'settings_sms' => 'SMS instellingen', + 'settings_pushover' => 'Pushover instellingen', + 'settings_telegram' => 'Telegram instellingen', + 'settings_notification' => 'Notificatie instellingen', + 'settings_log' => 'Log instellingen', + 'settings_proxy' => 'Proxy instellingen', + 'auto_refresh' => 'Herlaad automatisch', + 'auto_refresh_description' => 'Auto-herladen servers pagina.
    Tijd in seconden, als de + tijd 0 is wordt de pagina niet ververst.', + 'seconds' => 'seconden', + 'test' => 'Test', + 'test_email' => 'Er zal een email verstuurd worden naar het email adres in je profiel.', + 'test_sms' => 'Er zal een SMS verstuurd worden naar het telefoonnummer in je profiel.', + 'test_pushover' => 'Er zal een Pushover notificatie verstuurd worden naar de user key/device in je profiel.', + 'send' => 'Verstuur', + 'test_subject' => 'Test', + 'test_message' => 'Test bericht', + 'email_sent' => 'Email verzonden', + 'email_error' => 'Er is een fout opgetreden tijdens het verzenden', + 'sms_sent' => 'SMS verzonden', + 'sms_error' => 'Er is een fout opgetreden tijdens het verzenden. %s', + 'sms_error_nomobile' => 'Kan test SMS niet verzenden: er is geen telefoonnummer ingevuld in je profiel.', + 'pushover_sent' => 'Pushover notificatie verzonden', + 'pushover_error' => 'De volgende fout is opgetreden bij het versturen van de Pushover notificatie: %s', + 'pushover_error_noapp' => 'Kan test notificatie niet verzenden: er is geen Pushover App API token gevonden in + de algemene configuratie.', + 'pushover_error_nokey' => 'Kan test notificatie niet verzenden: er is geen Pushover key gevonden in je + profiel.', + 'telegram_sent' => 'Telegram notificatie verstuurd', + 'telegram_error' => 'Er is een error voorgekomen tijdens het versturen van de Telegram notificatie: %s', + 'telegram_error_notoken' => 'Niet mogelijk on test notificatie te versturen: Telegram API token niet gevonden + in globale instellingen.', + 'telegram_error_noid' => 'Niet mogelijk on test notificatie te versturen: chat id niet gevonden op profiel.', + 'log_retention_period' => 'Log retentie periode', + 'log_retention_period_description' => 'Aantal dagen dat logs van notificaties en archieven van server uptime + worden bewaard. Vul 0 in om log opruiming uit te zetten.', + 'log_retention_days' => 'dagen', + ), + 'notifications' => array( + 'off_sms' => 'Server %LABEL% is DOWN: ip=%IP%, poort=%PORT%. Fout=%ERROR%', + 'off_email_subject' => 'BELANGRIJK: Server %LABEL% is DOWN', + 'off_email_body' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: + %PORT%
    Fout: %ERROR%
    Datum: %DATE%', + 'off_pushover_title' => 'Server %LABEL% is DOWN', + 'off_pushover_message' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: + %PORT%
    Fout: %ERROR%
    Datum: %DATE%', + 'off_telegram_message' => 'De server kon niet worden bereikt:

    Server: %LABEL%
    IP: %IP%
    Poort: + %PORT%
    Fout: %ERROR%
    Datum: %DATE%', + 'on_sms' => 'Server %LABEL% is RUNNING: ip=%IP%, poort=%PORT%, tijd offline=%LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'BELANGRIJK: Server %LABEL% is RUNNING', + 'on_email_body' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:

    Server: %LABEL%
    IP: + %IP%
    Poort: %PORT%
    Datum: %DATE%', + 'on_pushover_title' => 'Server %LABEL% is RUNNING', + 'on_pushover_message' => 'Server %LABEL% is na %LAST_OFFLINE_DURATION% weer online:

    Server: + %LABEL%
    IP: %IP%
    Poort: %PORT%
    Datum: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Welkom, %user_name%', + 'title_sign_in' => 'Log in', + 'title_forgot' => 'Wachtwoord vergeten?', + 'title_reset' => 'Herstel wachtwoord', + 'submit' => 'Sla op', + 'remember_me' => 'Onthoud mij', + 'login' => 'Login', + 'logout' => 'Uitloggen', + 'username' => 'Gebruikersnaam', + 'password' => 'Wachtwoord', + 'password_repeat' => 'Herhaal wachtwoord', + 'password_forgot' => 'Wachtwoord vergeten?', + 'password_reset' => 'Wachtwoord herstellen', + 'password_reset_email_subject' => 'Wijzig je wachtwoord voor PHP Server Monitor', + 'password_reset_email_body' => 'Gebruik de onderstaande link om je wachtwoord te wijzigen. Let op, deze link + verloopt na 1 uur.

    %link%', + 'error_user_incorrect' => 'De opgegeven gebruikersnaam is onjuist.', + 'error_login_incorrect' => 'De informatie is niet juist.', + 'error_login_passwords_nomatch' => 'De ingevulde wachtwoorden komen niet overeen.', + 'error_reset_invalid_link' => 'De reset link is ongeldig.', + 'success_password_forgot' => 'Er is een mail verstuurd met informatie om je wachtwoord aan te passen.', + 'success_password_reset' => 'Je wachtwoord is aangepast. Je kunt nu inloggen.', + ), + 'error' => array( + '401_unauthorized' => 'Unauthorized', + '401_unauthorized_description' => 'Je hebt niet de juiste bevoegdheden om deze pagina te bekijken.', + ), +); diff --git a/src/lang/no_NB.lang.php b/src/lang/no_NB.lang.php index 9c3f2025..4e57b36f 100644 --- a/src/lang/no_NB.lang.php +++ b/src/lang/no_NB.lang.php @@ -1,4 +1,5 @@ 'Norsk - Norwegian', - 'locale' => array('no_NB.UTF-8', 'no_NB', 'norwegian', 'norwegian-no'), - 'locale_tag' => 'no', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Overvåking', - 'install' => 'Installer', - 'action' => 'Handling', - 'save' => 'Lagre', - 'edit' => 'Endre', - 'delete' => 'Slett', - 'date' => 'Dato', - 'message' => 'Melding', - 'yes' => 'Ja', - 'no' => 'Nei', - 'insert' => 'Sett inn', - 'add_new' => 'Legg til ny', - 'update_available' => 'En ny versjon ({versjon}) er tilgjengelig på http://www.phpservermonitor.org.', - 'back_to_top' => 'Tilbake til toppen', - 'go_back' => 'Gå tilbake', - 'ok' => 'OK', - 'cancel' => 'Avbryt', - 'activate' => 'Aktiver', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%e. %B', - 'long_day_format' => '%e. %B, %Y', - 'yesterday_format' => 'Yesterday at %H:%M', - 'other_day_format' => '%A at %H:%M', - 'never' => 'Aldri', - 'hours_ago' => '%d timer siden', - 'an_hour_ago' => 'omtrent et time siden', - 'minutes_ago' => '%d minutter siden', - 'a_minute_ago' => 'omtrent et minutt siden', - 'seconds_ago' => '%d sekunder siden', - 'a_second_ago' => 'et sekund siden', - 'year' => 'år', - 'years' => 'år', - 'month' => 'måned', - 'months' => 'måneder', - 'day' => 'dag', - 'days' => 'dager', - 'hour' => 'time', - 'hours' => 'timer', - 'minute' => 'minutt', - 'minutes' => 'minutter', - 'second' => 'sekund', - 'seconds' => 'sekunder', - ), - 'menu' => array( - 'config' => 'Konfig', - 'server' => 'Servere', - 'server_log' => 'Logg', - 'server_status' => 'Status', - 'server_update' => 'Oppdater', - 'user' => 'Brukere', - 'help' => 'Hjelp', - ), - 'users' => array( - 'user' => 'Bruker', - 'name' => 'Navn', - 'user_name' => 'Brukernavn', - 'password' => 'Passord', - 'password_repeat' => 'Gjenta passord', - 'password_leave_blank' => 'La være tom for å forbli uendret', - 'level' => 'Level', - 'level_10' => 'Administrator', - 'level_20' => 'Bruker', - 'level_description' => 'Administratorer har full tilgang: de kan administrere servere, brukere og redigere den globale konfigurasjonen.
    Brukere kan bare vise og kjøre oppdatering for serverne som er tildelt dem.', - 'mobile' => 'Mobil', - 'email' => 'E-post', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover er en tjeneste som gjør det enkelt å få meldinger i sanntid. Se deres nettside for mer info.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Enhetsnavn for å sende meldingen til. La det være tomt for å sende det til alle enheter.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram er en chat-app som gjør det enkelt å få meldinger i sanntid. Gå til dokumentasjonen for mer informasjon og en installasjonsguide. ', - 'telegram_chat_id' => 'Telegram chat-ID', - 'telegram_chat_id_description' => 'Meldingen vil bli sendt til tilhørende chat.', - 'telegram_get_chat_id' => 'Klikk her for å få chat-ID', - 'activate_telegram' => 'Aktiver Telegram notifications', - 'activate_telegram_description' => 'Tillat Telegram varsler som skal sendes til det angitte chat-IDet. Uten denne tillatelsen tillater Telegram oss ikke å sende varsler til deg.', - 'telegram_bot_username_found' => 'The bot was found!

    Dette åpner en chat med bot. Her må du trykke på start ved å skrive: /start.', - 'telegram_bot_username_error_token' => '401 - Unauthorized. Pass på at API-token er gyldig.', - 'telegram_bot_error' => 'Det har oppstått en feil under aktivering av Telegram varsling: %s', - 'delete_title' => 'Slett bruker', - 'delete_message' => 'Er du sikker på at du vil slette brukeren \'%1\'?', - 'deleted' => 'Bruker slettet.', - 'updated' => 'Bruker oppdatert.', - 'inserted' => 'Bruker lagt til.', - 'profile' => 'Profil', - 'profile_updated' => 'Din profil har blitt oppdatert.', - 'error_user_name_bad_length' => 'Brukernavn må være mellom 2 og 64 tegn.', - 'error_user_name_invalid' => 'Brukernavnet kan bare inneholde alfabetiske tegn (a-z, A-Z), sifre (0-9), punktum (.) and understrek (_).', - 'error_user_name_exists' => 'Det oppgitte brukernavnet eksisterer allerede i databasen.', - 'error_user_email_bad_length' => 'E-postadresser må være mellom 5 og 255 tegn.', - 'error_user_email_invalid' => 'E-postadressen er ugyldig.', - 'error_user_level_invalid' => 'Det oppgitte brukernivået er ugyldig.', - 'error_user_no_match' => 'Brukeren kunne ikke bli funnet i databasen.', - 'error_user_password_invalid' => 'Det oppgitte passordet er ugyldig.', - 'error_user_password_no_match' => 'De oppgitte passordene stemmer ikke overens.', - ), - 'log' => array( - 'title' => 'Logg oppføringer', - 'type' => 'Type', - 'status' => 'Status', - 'email' => 'E-post', - 'sms' => 'Tekstmelding', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'Ingen logger', - 'clear' => 'Tøm logg', - 'delete_title' => 'Slett logg', - 'delete_message' => 'Er du sikker på at du vil slette alle logger?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Label', - 'domain' => 'Domene/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Antall sekunder å vente på at serveren skal svare.', - 'authentication_settings' => 'Autentiseringsinnstillinger', - 'optional' => 'ValgfrittF', - 'website_username' => 'Brukernavn', - 'website_username_description' => 'Brukernavn for å få tilgang til nettstedet. (Kun Apache-godkjenning støttes.)', - 'website_password' => 'Password', - 'website_password_description' => 'Passord for å få tilgang til nettstedet. Passordet er kryptert i databasen.', - 'fieldset_monitoring' => 'Overvåkning', - 'fieldset_permissions' => 'Tilganger', - 'port' => 'Port', - 'custom_port' => 'Tilpasset Port', - 'popular_ports' => 'Populære Ports', - 'please_select' => 'Vennligst vent', - 'type' => 'Type', - 'type_website' => 'Nettside', - 'type_service' => 'Tjeneste', - 'type_ping' => 'Ping', - 'pattern' => 'Søke streng/mønster', - 'pattern_description' => 'Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket online/offline. Vanlige uttrykk er tillatt.', - 'pattern_online' => 'Mønster indikerer at nettstedet er', - 'pattern_online_description' => 'Online: Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket online. Offline: Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket offline.', - 'header_name' => 'Overskriftnavn', - 'header_value' => 'Overskriftsverdi', - 'header_name_description' => 'Versalsensitivt.', - 'header_value_description' => 'Vanlige uttrykk er tillatt.', - 'last_check' => 'Siste sjekk', - 'last_online' => 'Sist online', - 'last_offline' => 'Sist offline', - 'monitoring' => 'Overvåking', - 'no_monitoring' => 'Ingen overvåking', - 'email' => 'E-post', - 'send_email' => 'Send e-post', - 'sms' => 'Tekstmelding', - 'send_sms' => 'Send tekstmelding', - 'pushover' => 'Pushover', - 'send_pushover' => 'Send Pushover melding', - 'telegram' => 'Telegram', - 'send_telegram' => 'Send Telegram melding', - 'users' => 'Brukere', - 'delete_title' => 'Slett server', - 'delete_message' => 'Er du sikker på at du vil slette serveren \'%1\'?', - 'deleted' => 'Server slettet.', - 'updated' => 'Server oppdatert.', - 'inserted' => 'Server lagt til.', - 'latency' => 'Ventetid', - 'latency_max' => 'Ventetid (maximum)', - 'latency_min' => 'Ventetid (minimum)', - 'latency_avg' => 'Ventetid (gjennomsnitt)', - 'online' => 'online', - 'offline' => 'offline', - 'uptime' => 'Oppetid', - 'year' => 'År', - 'month' => 'Måned', - 'week' => 'Uke', - 'day' => 'Dag', - 'hour' => 'Time', - 'warning_threshold' => 'Advarselsgrense', - 'warning_threshold_description' => 'Antall mislykkede sjekker kreves før den er merket frakoblet.', - 'chart_last_week' => 'Forrige uke', - 'chart_history' => 'Historie', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d-%m-%Y', - 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Tekstmelding varsling er deaktivert.', - 'warning_notifications_disabled_email' => 'E-post varsling er deaktivert.', - 'warning_notifications_disabled_pushover' => 'Pushover varsling er deaktivert.', - 'warning_notifications_disabled_telegram' => 'Telegram varsling er deaktivert.', - 'error_server_no_match' => 'Server ikke funnet.', - 'error_server_label_bad_length' => 'Etiketten må være mellom 1 og 255 tegn.', - 'error_server_ip_bad_length' => 'Domenet / IP må være mellom 1 og 255 tegn.', - 'error_server_ip_bad_service' => 'IP-adressen er ikke gyldig.', - 'error_server_ip_bad_website' => 'Nettstedets URL er ikke gyldig.', - 'error_server_type_invalid' => 'Den valgte servertypen er ugyldig.', - 'error_server_warning_threshold_invalid' => 'Advarselsgrensen må være et gyldig heltall større enn 0.', - ), - 'config' => array( - 'general' => 'General', - 'language' => 'Språk', - 'show_update' => 'Se etter oppdateringer?', - 'password_encrypt_key' => 'Krypteringsnøkkelpassordet', - 'password_encrypt_key_note' => 'Denne nøkkelen brukes til å kryptere passord som er lagret på servere for tilgang til nettsteder. Hvis nøkkelen endres, er det lagrede passordet ugyldig!', - 'proxy' => 'Aktiver proxy', - 'proxy_url' => 'Proxy URL', - 'proxy_user' => 'Proxy brukernavn', - 'proxy_password' => 'Proxy passord', - 'email_status' => 'Tillat sending av e-post', - 'email_from_email' => 'E-post fra adresse', - 'email_from_name' => 'E-post from navn', - 'email_smtp' => 'Aktiver SMTP', - 'email_smtp_host' => 'SMTP-vert', - 'email_smtp_port' => 'SMTP-port', - 'email_smtp_security' => 'SMTP-sikkerhet', - 'email_smtp_security_none' => 'Ingen', - 'email_smtp_username' => 'SMTP brukernavn', - 'email_smtp_password' => 'SMTP passord', - 'email_smtp_noauth' => 'La være tom for ingen godkjenning', - 'sms_status' => 'Tillat sending av tekstmeldinger', - 'sms_gateway' => 'Gateway for bruk for sending av meldinger', - 'sms_gateway_username' => 'Gateway brukernavn', - 'sms_gateway_password' => 'Gateway passord', - 'sms_from' => 'Avsenderens telefonnummer', - 'pushover_status' => 'Tillat sending av Pushover-meldinger', - 'pushover_description' => 'Pushover er en tjeneste som gjør det enkelt å få meldinger i sanntid. Se deres nettside for mer info.', - 'pushover_clone_app' => 'Klikk her for å lage din Pushover-app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Før du kan bruke Pushover, må du registrere en app på deres nettside og angi App API Token her.', - 'telegram_status' => 'Tillat sending av Telegram-meldinger', - 'telegram_description' => 'Telegram er en chat-app som gjør det enkelt å få meldinger i sanntid. Gå til dokumentasjonen for mer informasjon og en installasjonsveiledning.', - 'telegram_api_token' => 'Telegram API Token', - 'telegram_api_token_description' => 'Før du kan bruke Telegram, må du få en API-token. Gå til dokumentasjonen for å få hjelp.', - 'alert_type' => 'Velg når du vil bli varslet.', - 'alert_type_description' => 'Statusendring: '. - 'Du vil motta et varsel når en server har endret status. Så fra online -> offline eller offline -> online.
    '. - '
    Offline: '. - 'Du vil motta et varsel når en server går offline for *FØRSTE GANG BARE*. For eksempel,'. - 'din cronjob er hver 15 minutter og serveren din går ned klokken 01:00 og holder seg ned til 06:00. '. - 'Du får 1 melding klokken 01:00 og det er det.
    '. - '
    Alltid: '. - 'Du vil motta et varsel hver gang scriptet kjører, og et nettsted er nede, selv om nettstedet har vært offline i flere timer.', - 'alert_type_status' => 'Statusendring', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Alltid', - 'alert_proxy' => 'Selv om aktivert, blir proxy aldri brukt for tjenester', - 'alert_proxy_url' => 'Format: Vert:Port', - 'log_status' => 'Logg status', - 'log_status_description' => 'Hvis loggstatus er satt til SANT, logger monitoren på hendelsen når meldingsinnstillingene er bestått.', - 'log_email' => 'Logg e-post sendt av skriptet', - 'log_sms' => 'Logg tekstmeldinger sendt av skriptet', - 'log_pushover' => 'Logg pushover-meldinger sendt av skriptet', - 'log_telegram' => 'Logg Telegram-meldinger sendt av skriptet', - 'updated' => 'Konfigurasjonen er oppdatert.', - 'tab_email' => 'E-post', - 'tab_sms' => 'Tekstmelding', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'E-post innstillinger', - 'settings_sms' => 'Tekstmelding innstillinger', - 'settings_pushover' => 'Pushover innstillinger', - 'settings_telegram' => 'Telegram innstillinger', - 'settings_notification' => 'Varsling innstillinger', - 'settings_log' => 'Logg innstillinger', - 'settings_proxy' => 'Proxy innstillinger', - 'auto_refresh' => 'Auto-refresh', - 'auto_refresh_description' => - 'Auto-refresh server side.
    '. - ''. - 'Tid i sekunder, hvis 0 siden ikke blir oppdatert.'. - '', - 'seconds' => 'sekunder', - 'test' => 'Test', - 'test_email' => 'En e-post vil bli sendt til adressen spesifisert i brukerprofilen din.', - 'test_sms' => 'En tekstmelding vil bli sendt til telefonnummeret som er angitt i brukerprofilen din.', - 'test_pushover' => 'En Pushover varsling vil bli sendt til brukernøkkelen/enheten som er angitt i brukerprofilen din.', - 'test_telegram' => 'Et telegramvarsling vil bli sendt til chat-ID-en spesifisert i brukerprofilen din.', - 'send' => 'Send', - 'test_subject' => 'Test', - 'test_message' => 'Test melding', - 'email_sent' => 'E-post sent', - 'email_error' => 'Feil ved sending av e-post', - 'sms_sent' => 'Tekstmelding sendt', - 'sms_error' => 'Det har oppstått en feil under sending av tekstmelding: %s', - 'sms_error_nomobile' => 'Kan ikke sende test tekstmelding: ingen gyldig telefonnummer funnet i profilen din.', - 'pushover_sent' => 'Pushover varsling sendt', - 'pushover_error' => 'Det har oppstått en feil under sending av Pushover-varslingen: %s', - 'pushover_error_noapp' => 'Kan ikke sende testvarsling: Ingen Pushover App API-token funnet i den globale konfigurasjonen.', - 'pushover_error_nokey' => 'Kan ikke sende testvarsling: Ingen Pushover-nøkkel funnet i profilen din.', - 'telegram_sent' => 'Telegram varsling sent', - 'telegram_error' => 'Det har oppstått en feil under sending av telegrammeldingen: %s', - 'telegram_error_notoken' => 'Kan ikke sende testvarsling: Ingen Telegram API-token funnet i den globale konfigurasjonen.', - 'telegram_error_noid' => 'Kan ikke sende testvarsling: Ingen chat-ID funnet i profilen din.', - 'log_retention_period' => 'Oppbevaringsperiode for logg', - 'log_retention_period_description' => 'Antall dager for å holde logger over varsler og arkiver av serveroppetid. Skriv 0 for å deaktivere loggopprydding.', - 'log_retention_days' => 'dager', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Feil=%ERROR%', - 'off_email_subject' => 'VIKTIG: Serveren \'%LABEL%\' er NEDE', - 'off_email_body' => "Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Feil: %ERROR%
    Dato: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' er NEDE', - 'off_pushover_message' => "Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Feil: %ERROR%
    Dato: %DATE%", - 'off_telegram_message' => "Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Feil: %ERROR%
    Dato: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' er OPPE igjen: ip=%IP%, port=%PORT%, det var nede i %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'VIKTIG: Server \'%LABEL%\' er OPPE', - 'on_email_body' => "Server '%LABEL%' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' er OPPE', - 'on_pushover_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%', - 'on_telegram_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Velkommen, %user_name%', - 'title_sign_in' => 'Vennligst logg inn', - 'title_forgot' => 'Glemt passordet?', - 'title_reset' => 'Tilbakestill passordet ditt', - 'submit' => 'Send inn', - 'remember_me' => 'Husk meg', - 'login' => 'Logg inn', - 'logout' => 'Logg ut', - 'username' => 'Brukernavn', - 'password' => 'Passord', - 'password_repeat' => 'Gjenta passord', - 'password_forgot' => 'Glemt passordet?', - 'password_reset' => 'Tilbakestille passord', - 'password_reset_email_subject' => 'Tilbakestill passordet ditt for PHP Server Monitor', - 'password_reset_email_body' => 'Vennligst bruk følgende link for å tilbakestille passordet ditt. Vær oppmerksom på at det utløper om 1 time.

    %link%', - 'error_user_incorrect' => 'Det oppgitte brukernavnet ble ikke funnet.', - 'error_login_incorrect' => 'Informasjonen er feil.', - 'error_login_passwords_nomatch' => 'De oppgitte passordene stemmer ikke overens.', - 'error_reset_invalid_link' => 'Tilbakestill lenken du oppgav er ugyldig.', - 'success_password_forgot' => 'En epost er sendt til deg med informasjon om hvordan du tilbakestiller passordet ditt.', - 'success_password_reset' => 'Ditt passord er tilbakestilt. Vennligst logg inn.', - ), - 'error' => array( - '401_unauthorized' => 'Uautorisert', - '401_unauthorized_description' => 'Du har ikke rettighetene til å se denne siden.', - ), + 'name' => 'Norsk - Norwegian', + 'locale' => array( + '0' => 'no_NB.UTF-8', + '1' => 'no_NB', + '2' => 'norwegian', + '3' => 'norwegian-no', + ), + 'locale_tag' => 'no', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Overvåking', + 'install' => 'Installer', + 'action' => 'Handling', + 'save' => 'Lagre', + 'edit' => 'Endre', + 'delete' => 'Slett', + 'date' => 'Dato', + 'message' => 'Melding', + 'yes' => 'Ja', + 'no' => 'Nei', + 'insert' => 'Sett inn', + 'add_new' => 'Legg til ny', + 'update_available' => 'En ny versjon ({versjon}) er tilgjengelig på http://www.phpservermonitor.org.', + 'back_to_top' => 'Tilbake til toppen', + 'go_back' => 'Gå tilbake', + 'ok' => 'OK', + 'cancel' => 'Avbryt', + 'activate' => 'Aktiver', + 'short_day_format' => '%e. %B', + 'long_day_format' => '%e. %B, %Y', + 'yesterday_format' => 'Yesterday at %H:%M', + 'other_day_format' => '%A at %H:%M', + 'never' => 'Aldri', + 'hours_ago' => '%d timer siden', + 'an_hour_ago' => 'omtrent et time siden', + 'minutes_ago' => '%d minutter siden', + 'a_minute_ago' => 'omtrent et minutt siden', + 'seconds_ago' => '%d sekunder siden', + 'a_second_ago' => 'et sekund siden', + 'year' => 'år', + 'years' => 'år', + 'month' => 'måned', + 'months' => 'måneder', + 'day' => 'dag', + 'days' => 'dager', + 'hour' => 'time', + 'hours' => 'timer', + 'minute' => 'minutt', + 'minutes' => 'minutter', + 'second' => 'sekund', + 'seconds' => 'sekunder', + ), + 'menu' => array( + 'config' => 'Konfig', + 'server' => 'Servere', + 'server_log' => 'Logg', + 'server_status' => 'Status', + 'server_update' => 'Oppdater', + 'user' => 'Brukere', + 'help' => 'Hjelp', + ), + 'users' => array( + 'user' => 'Bruker', + 'name' => 'Navn', + 'user_name' => 'Brukernavn', + 'password' => 'Passord', + 'password_repeat' => 'Gjenta passord', + 'password_leave_blank' => 'La være tom for å forbli uendret', + 'level' => 'Level', + 'level_10' => 'Administrator', + 'level_20' => 'Bruker', + 'level_description' => 'Administratorer har full tilgang: de kan administrere servere, brukere og + redigere den globale konfigurasjonen.
    Brukere kan bare vise og kjøre + oppdatering for serverne som er tildelt dem.', + 'mobile' => 'Mobil', + 'email' => 'E-post', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover er en tjeneste som gjør det enkelt å få meldinger i sanntid. Se deres nettside for mer info.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Enhetsnavn for å sende meldingen til. La det være tomt for å sende det + til alle enheter.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram er en chat-app som + gjør det enkelt å få meldinger i sanntid. Gå til dokumentasjonen for + mer informasjon og en installasjonsguide. ', + 'telegram_chat_id' => 'Telegram chat-ID', + 'telegram_chat_id_description' => 'Meldingen vil bli sendt til tilhørende chat.', + 'telegram_get_chat_id' => 'Klikk her for å få chat-ID', + 'activate_telegram' => 'Aktiver Telegram notifications', + 'activate_telegram_description' => 'Tillat Telegram varsler som skal sendes til det angitte chat-IDet. Uten + denne tillatelsen tillater Telegram oss ikke å sende varsler til deg.', + 'telegram_bot_username_found' => 'The bot was found!

    Dette åpner en chat med + bot. Her må du trykke på start ved å skrive: /start.', + 'telegram_bot_username_error_token' => '401 - Unauthorized. Pass på at API-token er gyldig.', + 'telegram_bot_error' => 'Det har oppstått en feil under aktivering av Telegram varsling: %s', + 'delete_title' => 'Slett bruker', + 'delete_message' => 'Er du sikker på at du vil slette brukeren \'%1\'?', + 'deleted' => 'Bruker slettet.', + 'updated' => 'Bruker oppdatert.', + 'inserted' => 'Bruker lagt til.', + 'profile' => 'Profil', + 'profile_updated' => 'Din profil har blitt oppdatert.', + 'error_user_name_bad_length' => 'Brukernavn må være mellom 2 og 64 tegn.', + 'error_user_name_invalid' => 'Brukernavnet kan bare inneholde alfabetiske tegn (a-z, A-Z), sifre (0-9), + punktum (.) and understrek (_).', + 'error_user_name_exists' => 'Det oppgitte brukernavnet eksisterer allerede i databasen.', + 'error_user_email_bad_length' => 'E-postadresser må være mellom 5 og 255 tegn.', + 'error_user_email_invalid' => 'E-postadressen er ugyldig.', + 'error_user_level_invalid' => 'Det oppgitte brukernivået er ugyldig.', + 'error_user_no_match' => 'Brukeren kunne ikke bli funnet i databasen.', + 'error_user_password_invalid' => 'Det oppgitte passordet er ugyldig.', + 'error_user_password_no_match' => 'De oppgitte passordene stemmer ikke overens.', + ), + 'log' => array( + 'title' => 'Logg oppføringer', + 'type' => 'Type', + 'status' => 'Status', + 'email' => 'E-post', + 'sms' => 'Tekstmelding', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'Ingen logger', + 'clear' => 'Tøm logg', + 'delete_title' => 'Slett logg', + 'delete_message' => 'Er du sikker på at du vil slette alle logger?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Label', + 'domain' => 'Domene/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Antall sekunder å vente på at serveren skal svare.', + 'authentication_settings' => 'Autentiseringsinnstillinger', + 'optional' => 'ValgfrittF', + 'website_username' => 'Brukernavn', + 'website_username_description' => 'Brukernavn for å få tilgang til nettstedet. (Kun Apache-godkjenning + støttes.)', + 'website_password' => 'Password', + 'website_password_description' => 'Passord for å få tilgang til nettstedet. Passordet er kryptert i + databasen.', + 'fieldset_monitoring' => 'Overvåkning', + 'fieldset_permissions' => 'Tilganger', + 'port' => 'Port', + 'custom_port' => 'Tilpasset Port', + 'popular_ports' => 'Populære Ports', + 'please_select' => 'Vennligst vent', + 'type' => 'Type', + 'type_website' => 'Nettside', + 'type_service' => 'Tjeneste', + 'type_ping' => 'Ping', + 'pattern' => 'Søke streng/mønster', + 'pattern_description' => 'Hvis dette mønsteret ikke er funnet på nettstedet, blir serveren merket + online/offline. Vanlige uttrykk er tillatt.', + 'pattern_online' => 'Mønster indikerer at nettstedet er', + 'pattern_online_description' => 'Online: Hvis dette mønsteret blir funnet på nettstedet, er serverens merke + online. Frakoblet: Hvis dette mønsteret ikke blir funnet på nettstedet, + flagges serveren offline.', + 'header_name' => 'Overskriftnavn', + 'header_value' => 'Overskriftsverdi', + 'header_name_description' => 'Versalsensitivt.', + 'header_value_description' => 'Vanlige uttrykk er tillatt.', + 'last_check' => 'Siste sjekk', + 'last_online' => 'Sist online', + 'last_offline' => 'Sist offline', + 'monitoring' => 'Overvåking', + 'no_monitoring' => 'Ingen overvåking', + 'email' => 'E-post', + 'send_email' => 'Send e-post', + 'sms' => 'Tekstmelding', + 'send_sms' => 'Send tekstmelding', + 'pushover' => 'Pushover', + 'send_pushover' => 'Send Pushover melding', + 'telegram' => 'Telegram', + 'send_telegram' => 'Send Telegram melding', + 'users' => 'Brukere', + 'delete_title' => 'Slett server', + 'delete_message' => 'Er du sikker på at du vil slette serveren \'%1\'?', + 'deleted' => 'Server slettet.', + 'updated' => 'Server oppdatert.', + 'inserted' => 'Server lagt til.', + 'latency' => 'Ventetid', + 'latency_max' => 'Ventetid (maximum)', + 'latency_min' => 'Ventetid (minimum)', + 'latency_avg' => 'Ventetid (gjennomsnitt)', + 'online' => 'online', + 'offline' => 'offline', + 'uptime' => 'Oppetid', + 'year' => 'År', + 'month' => 'Måned', + 'week' => 'Uke', + 'day' => 'Dag', + 'hour' => 'Time', + 'warning_threshold' => 'Advarselsgrense', + 'warning_threshold_description' => 'Antall mislykkede sjekker kreves før den er merket frakoblet.', + 'chart_last_week' => 'Forrige uke', + 'chart_history' => 'Historie', + 'chart_day_format' => '%d-%m-%Y', + 'chart_long_date_format' => '%d-%m-%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Tekstmelding varsling er deaktivert.', + 'warning_notifications_disabled_email' => 'E-post varsling er deaktivert.', + 'warning_notifications_disabled_pushover' => 'Pushover varsling er deaktivert.', + 'warning_notifications_disabled_telegram' => 'Telegram varsling er deaktivert.', + 'error_server_no_match' => 'Server ikke funnet.', + 'error_server_label_bad_length' => 'Etiketten må være mellom 1 og 255 tegn.', + 'error_server_ip_bad_length' => 'Domenet / IP må være mellom 1 og 255 tegn.', + 'error_server_ip_bad_service' => 'IP-adressen er ikke gyldig.', + 'error_server_ip_bad_website' => 'Nettstedets URL er ikke gyldig.', + 'error_server_type_invalid' => 'Den valgte servertypen er ugyldig.', + 'error_server_warning_threshold_invalid' => 'Advarselsgrensen må være et gyldig heltall større enn 0.', + ), + 'config' => array( + 'general' => 'General', + 'language' => 'Språk', + 'show_update' => 'Se etter oppdateringer?', + 'password_encrypt_key' => 'Krypteringsnøkkelpassordet', + 'password_encrypt_key_note' => 'Denne nøkkelen brukes til å kryptere passord som er lagret på servere for + tilgang til nettsteder. Hvis nøkkelen endres, er det lagrede passordet + ugyldig!', + 'proxy' => 'Aktiver proxy', + 'proxy_url' => 'Proxy URL', + 'proxy_user' => 'Proxy brukernavn', + 'proxy_password' => 'Proxy passord', + 'email_status' => 'Tillat sending av e-post', + 'email_from_email' => 'E-post fra adresse', + 'email_from_name' => 'E-post from navn', + 'email_smtp' => 'Aktiver SMTP', + 'email_smtp_host' => 'SMTP-vert', + 'email_smtp_port' => 'SMTP-port', + 'email_smtp_security' => 'SMTP-sikkerhet', + 'email_smtp_security_none' => 'Ingen', + 'email_smtp_username' => 'SMTP brukernavn', + 'email_smtp_password' => 'SMTP passord', + 'email_smtp_noauth' => 'La være tom for ingen godkjenning', + 'sms_status' => 'Tillat sending av tekstmeldinger', + 'sms_gateway' => 'Gateway for bruk for sending av meldinger', + 'sms_gateway_username' => 'Gateway brukernavn', + 'sms_gateway_password' => 'Gateway passord', + 'sms_from' => 'Avsenderens telefonnummer', + 'pushover_status' => 'Tillat sending av Pushover-meldinger', + 'pushover_description' => 'Pushover er en tjeneste som gjør det enkelt å få meldinger i sanntid. Se deres nettside for mer info.', + 'pushover_clone_app' => 'Klikk her for å lage din Pushover-app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Før du kan bruke Pushover, må du registrere en app på deres nettside og angi App API + Token her.', + 'telegram_status' => 'Tillat sending av Telegram-meldinger', + 'telegram_description' => 'Telegram er en chat-app som + gjør det enkelt å få meldinger i sanntid. Gå til dokumentasjonen for + mer informasjon og en installasjonsveiledning.', + 'telegram_api_token' => 'Telegram API Token', + 'telegram_api_token_description' => 'Før du kan bruke Telegram, må du få en API-token. Gå til dokumentasjonen for å få hjelp.', + 'alert_type' => 'Velg når du vil bli varslet.', + 'alert_type_description' => 'Statusendring: Du vil motta et varsel når en server har endret status. + Så fra online -> offline eller offline -> online.

    Offline: Du + vil motta et varsel når en server går offline for *FØRSTE GANG BARE*. For + eksempel,din cronjob er hver 15 minutter og serveren din går ned klokken 01:00 + og holder seg ned til 06:00. Du får 1 melding klokken 01:00 og det er + det.

    Alltid: Du vil motta et varsel hver gang scriptet kjører, og + et nettsted er nede, selv om nettstedet har vært offline i flere timer.', + 'alert_type_status' => 'Statusendring', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Alltid', + 'alert_proxy' => 'Selv om aktivert, blir proxy aldri brukt for tjenester', + 'alert_proxy_url' => 'Format: Vert:Port', + 'log_status' => 'Logg status', + 'log_status_description' => 'Hvis loggstatus er satt til SANT, logger monitoren på hendelsen når + meldingsinnstillingene er bestått.', + 'log_email' => 'Logg e-post sendt av skriptet', + 'log_sms' => 'Logg tekstmeldinger sendt av skriptet', + 'log_pushover' => 'Logg pushover-meldinger sendt av skriptet', + 'log_telegram' => 'Logg Telegram-meldinger sendt av skriptet', + 'updated' => 'Konfigurasjonen er oppdatert.', + 'tab_email' => 'E-post', + 'tab_sms' => 'Tekstmelding', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'E-post innstillinger', + 'settings_sms' => 'Tekstmelding innstillinger', + 'settings_pushover' => 'Pushover innstillinger', + 'settings_telegram' => 'Telegram innstillinger', + 'settings_notification' => 'Varsling innstillinger', + 'settings_log' => 'Logg innstillinger', + 'settings_proxy' => 'Proxy innstillinger', + 'auto_refresh' => 'Auto-refresh', + 'auto_refresh_description' => 'Auto-refresh server side.
    Tid i sekunder, hvis 0 siden + ikke blir oppdatert.', + 'seconds' => 'sekunder', + 'test' => 'Test', + 'test_email' => 'En e-post vil bli sendt til adressen spesifisert i brukerprofilen din.', + 'test_sms' => 'En tekstmelding vil bli sendt til telefonnummeret som er angitt i brukerprofilen din.', + 'test_pushover' => 'En Pushover varsling vil bli sendt til brukernøkkelen/enheten som er angitt i + brukerprofilen din.', + 'test_telegram' => 'Et telegramvarsling vil bli sendt til chat-ID-en spesifisert i brukerprofilen din.', + 'send' => 'Send', + 'test_subject' => 'Test', + 'test_message' => 'Test melding', + 'email_sent' => 'E-post sent', + 'email_error' => 'Feil ved sending av e-post', + 'sms_sent' => 'Tekstmelding sendt', + 'sms_error' => 'Det har oppstått en feil under sending av tekstmelding: %s', + 'sms_error_nomobile' => 'Kan ikke sende test tekstmelding: ingen gyldig telefonnummer funnet i profilen din.', + 'pushover_sent' => 'Pushover varsling sendt', + 'pushover_error' => 'Det har oppstått en feil under sending av Pushover-varslingen: %s', + 'pushover_error_noapp' => 'Kan ikke sende testvarsling: Ingen Pushover App API-token funnet i den globale + konfigurasjonen.', + 'pushover_error_nokey' => 'Kan ikke sende testvarsling: Ingen Pushover-nøkkel funnet i profilen din.', + 'telegram_sent' => 'Telegram varsling sent', + 'telegram_error' => 'Det har oppstått en feil under sending av telegrammeldingen: %s', + 'telegram_error_notoken' => 'Kan ikke sende testvarsling: Ingen Telegram API-token funnet i den globale + konfigurasjonen.', + 'telegram_error_noid' => 'Kan ikke sende testvarsling: Ingen chat-ID funnet i profilen din.', + 'log_retention_period' => 'Oppbevaringsperiode for logg', + 'log_retention_period_description' => 'Antall dager for å holde logger over varsler og arkiver av + serveroppetid. Skriv 0 for å deaktivere loggopprydding.', + 'log_retention_days' => 'dager', + ), + 'notifications' => array( + 'off_sms' => 'Serveren \'%LABEL%\' er NEDE: ip=%IP%, port=%PORT%. Feil=%ERROR%', + 'off_email_subject' => 'VIKTIG: Serveren \'%LABEL%\' er NEDE', + 'off_email_body' => 'Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Feil: %ERROR%
    Dato: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' er NEDE', + 'off_pushover_message' => 'Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Feil: %ERROR%
    Dato: %DATE%', + 'off_telegram_message' => 'Kunne ikke koble til følgende server:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Feil: %ERROR%
    Dato: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' er OPPE igjen: ip=%IP%, port=%PORT%, det var nede i %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'VIKTIG: Server \'%LABEL%\' er OPPE', + 'on_email_body' => 'Server \'%LABEL%\' er oppe igjen, det var nede i %LAST_OFFLINE_DURATION%:

    Server: + %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' er OPPE', + 'on_pushover_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: + %DATE%', + 'on_telegram_message' => 'Server \'%LABEL%\' er oppe igjen, det var nede i + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dato: + %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Velkommen, %user_name%', + 'title_sign_in' => 'Vennligst logg inn', + 'title_forgot' => 'Glemt passordet?', + 'title_reset' => 'Tilbakestill passordet ditt', + 'submit' => 'Send inn', + 'remember_me' => 'Husk meg', + 'login' => 'Logg inn', + 'logout' => 'Logg ut', + 'username' => 'Brukernavn', + 'password' => 'Passord', + 'password_repeat' => 'Gjenta passord', + 'password_forgot' => 'Glemt passordet?', + 'password_reset' => 'Tilbakestille passord', + 'password_reset_email_subject' => 'Tilbakestill passordet ditt for PHP Server Monitor', + 'password_reset_email_body' => 'Vennligst bruk følgende link for å tilbakestille passordet ditt. Vær + oppmerksom på at det utløper om 1 time.

    %link%', + 'error_user_incorrect' => 'Det oppgitte brukernavnet ble ikke funnet.', + 'error_login_incorrect' => 'Informasjonen er feil.', + 'error_login_passwords_nomatch' => 'De oppgitte passordene stemmer ikke overens.', + 'error_reset_invalid_link' => 'Tilbakestill lenken du oppgav er ugyldig.', + 'success_password_forgot' => 'En epost er sendt til deg med informasjon om hvordan du tilbakestiller passordet + ditt.', + 'success_password_reset' => 'Ditt passord er tilbakestilt. Vennligst logg inn.', + ), + 'error' => array( + '401_unauthorized' => 'Uautorisert', + '401_unauthorized_description' => 'Du har ikke rettighetene til å se denne siden.', + ), ); diff --git a/src/lang/pl_PL.lang.php b/src/lang/pl_PL.lang.php index ae4706a6..d5061f0d 100644 --- a/src/lang/pl_PL.lang.php +++ b/src/lang/pl_PL.lang.php @@ -1,4 +1,5 @@ 'Polski - Polish', - 'locale' => array('pl_PL.UTF-8', 'pl_PL', 'polski', 'polski'), - 'locale_tag' => 'pl', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Instalacja', - 'action' => 'Akcja', - 'save' => 'Zapisz', - 'edit' => 'Edycja', - 'delete' => 'Usuń', - 'date' => 'Data', - 'message' => 'Wiadomość', - 'yes' => 'Tak', - 'no' => 'Nie', - 'insert' => 'Wstaw', - 'add_new' => 'Dodaj', - 'update_available' => 'Nowa wersja ({version}) jest dostępna do pobrania z http://www.phpservermonitor.org.', - 'back_to_top' => 'Do góry', - 'go_back' => 'Wstecz', - 'ok' => 'OK', - 'cancel' => 'Anuluj', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Wczoraj o %k:%M', - 'other_day_format' => '%A o %k:%M', - 'never' => 'Nigdy', - 'hours_ago' => '%d godzin temu', - 'an_hour_ago' => 'godzinę temu', - 'minutes_ago' => '%d minut temu', - 'a_minute_ago' => 'minutę temu', - 'seconds_ago' => '%d sekund temu', - 'a_second_ago' => 'sekundę temu', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Konfiguracja', - 'server' => 'Serwery', - 'server_log' => 'Logi', - 'server_status' => 'Status', - 'server_update' => 'Aktualizuj', - 'user' => 'Użytkownicy', - 'help' => 'Pomoc', - ), - 'users' => array( - 'user' => 'Użytkownik', - 'name' => 'Nazwa', - 'user_name' => 'Login', - 'password' => 'Hasło', - 'password_repeat' => 'Powtórz hasło', - 'password_leave_blank' => 'Pozostaw puste aby zaniechać zmian', - 'level' => 'Poziom', - 'level_10' => 'Administrator', - 'level_20' => 'Użytkownik', - 'level_description' => 'Administratorzy posiadają pełny dostęp: mogą zarządzać serwerami, użytkownikami oraz edytować konfigurację globalną.
    Użytkownicy mogą podejrzeć serwer oraz uruchomić aktualizację statusu dla serwerów do nich przypisanych.', - 'mobile' => 'Telefon', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover jest usługą szybkich notyfikacji. Sprawdź ich stronę po więcej informacji.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Urządzenie dla Pushover', - 'pushover_device_description' => 'Nazwa urządzenia do którego wysłać powiadomienie. Pozostaw puste aby wysłać do wszystkich urządzeń.', - 'delete_title' => 'Usuń użytkownika', - 'delete_message' => 'Czy jesteś pewny że chcesz usunąć użytkownika \'%1\'?', - 'deleted' => 'Użytkownik usunięty.', - 'updated' => 'Użytkownik zaktualizowany.', - 'inserted' => 'Użytkownik dodany.', - 'profile' => 'Profil', - 'profile_updated' => 'Twój profil został zaktualizowany.', - 'error_user_name_bad_length' => 'Login musi mieć od 2 do 64 znaków.', - 'error_user_name_invalid' => 'Login może zawierać tylko litery (a-z, A-Z), cyfry (0-9), kropki (.) oraz znak podkreślenia (_).', - 'error_user_name_exists' => 'Wybrana nazwa użytkownika jest już używana.', - 'error_user_email_bad_length' => 'Email powinien mieć od 5 do 255 znaków.', - 'error_user_email_invalid' => 'Wprowadzony adres email jest nieprawidłowy.', - 'error_user_level_invalid' => 'Wybrany poziom uprawnień użytkownika jest nieprawidłowy.', - 'error_user_no_match' => 'Użytkownik nie został odnaleziony.', - 'error_user_password_invalid' => 'Wprowadzone hasło jest nieprawidłowe.', - 'error_user_password_no_match' => 'Wprowadzone hasła są różne.', - ), - 'log' => array( - 'title' => 'Logi', - 'type' => 'Typ', - 'status' => 'Status', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Brak logów', - 'clear' => 'Wyczyść log', - 'delete_title' => 'Wyczyść log', - 'delete_message' => 'Czy na pewno chcesz usunąć wszystkie dzienniki?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Etykieta', - 'domain' => 'Domena/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Liczba sekund do odczekania na odpowiedź serwera.', - 'port' => 'Port', - 'type' => 'Typ', - 'type_website' => 'Strona', - 'type_service' => 'Usługa', - 'pattern' => 'Wyszukiwane wyrażenie/wzorzec', - 'pattern_description' => 'Jeśli wzorzec nie zostanie odnaleziony, status zostanie ustawiony na offline. Wyrażenia regularne są dozwolone.', - 'last_check' => 'Ostatnie sprawdzenie', - 'last_online' => 'Ostatnio online', - 'last_offline' => 'Ostatnio offline', - 'monitoring' => 'Monitorowany', - 'no_monitoring' => 'Brak monitoringu', - 'email' => 'Email', - 'send_email' => 'Wyślij Email', - 'sms' => 'SMS', - 'send_sms' => 'Wyślij SMS', - 'pushover' => 'Pushover', - 'users' => 'Użytkownicy', - 'delete_title' => 'Usuń serwer', - 'delete_message' => 'Czy jesteś pewny że chcesz usunąć serwer \'%1\'?', - 'deleted' => 'Serwer usunięty.', - 'updated' => 'Serwer zaktualizowany.', - 'inserted' => 'Server dodany.', - 'latency' => 'Opóźnienie', - 'latency_max' => 'Opóźnienie (maksymalne)', - 'latency_min' => 'Opóźnienie (minimalne)', - 'latency_avg' => 'Opóźnienie (średnie)', - 'uptime' => 'Czas dostępności', - 'year' => 'Rok', - 'month' => 'Miesiąc', - 'week' => 'Tydzień', - 'day' => 'Dzień', - 'hour' => 'Godzina', - 'warning_threshold' => 'Próg ostrzeżeń', - 'warning_threshold_description' => 'Ilość wymaganych niepowodzeń przed oznaczeniem serwera jako offline.', - 'chart_last_week' => 'Ostatni tydzień', - 'chart_history' => 'Historia', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Powiadomienia SMS są wyłączone.', - 'warning_notifications_disabled_email' => 'Powiadomienia Email są wyłączone.', - 'warning_notifications_disabled_pushover' => 'Powiadomienia Pushover są wyłączone.', - 'error_server_no_match' => 'Nie odnaleziono serwera.', - 'error_server_label_bad_length' => 'Etykieta musi mieć pomiędzy 1 a 255 znaków.', - 'error_server_ip_bad_length' => 'Domena/IP musi mieć pomiędzy 1 a 255 znaków.', - 'error_server_ip_bad_service' => 'Adres IP jest nieprawidłowy.', - 'error_server_ip_bad_website' => 'Adres URL jest nieprawidłowy.', - 'error_server_type_invalid' => 'Wybrany typ serwera jest nieprawidłowy.', - 'error_server_warning_threshold_invalid' => 'Próg ostrzeżeń musi być liczbą całkowitą większą od 0.', - ), - 'config' => array( - 'general' => 'Ogólne', - 'language' => 'Język', - 'show_update' => 'Sprawdzić aktualizacje?', - 'email_status' => 'Pozwól na wysyłkę email', - 'email_from_email' => 'Email z adresu', - 'email_from_name' => 'Email od(nazwa)', - 'email_smtp' => 'Włącz SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP login', - 'email_smtp_password' => 'SMTP hasło', - 'email_smtp_noauth' => 'Pozostaw puste dla braku autentykacji', - 'sms_status' => 'Pozwól na wysyłkę SMS', - 'sms_gateway' => 'Bramka SMS', - 'sms_gateway_username' => 'Login do bramki', - 'sms_gateway_password' => 'Hasło do bramki', - 'sms_from' => 'Numer nadawcy', - 'pushover_status' => 'Pozwól na wysyłkę notyfikacji Pushover', - 'pushover_description' => 'Pushover jest usługą ułatwiającą otrzymywanie powiadomień w czasie rzeczywistym. Sprawdź ich stronę aby uzyskać więcej informacji.', - 'pushover_clone_app' => 'Kliknij tutaj aby stworzyć aplikację korzystającą z Pushover', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Zanim zaczniesz używać Pushover, musisz zarejestrować aplikację na ich stronie internetowej i wpisać tutaj App API Token.', - 'alert_type' => 'Wybierz kiedy chcesz być powiadomiony.', - 'alert_type_description' => 'Zmiana statusu: '. - 'Otrzymasz powiadomienie gdy serwer zmieni status. Z online -> offline lub offline -> online.
    '. - '
    Offline: '. - 'Otrzymasz powiadomienie gdy serwer zmieni status na offline po raz pierwszy. Na przykład, '. - 'Twój cronjob uruchamia się co 15 minut, a Twój serwer przestaje odpowiadać o 13 i nie działa do 18. '. - 'Otrzymasz *TYLKO* jedno powiadomienie o 13.
    '. - '
    Zawsze: '. - 'Otrzymasz powiadomienie za każdym razem gdy skrypt zostanie uruchomiony a strona będzie niedostępna.', - 'alert_type_status' => 'Zmiana statusu', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Zawsze', - 'log_status' => 'Status logowania', - 'log_status_description' => 'Jeśli status logowania ustawiony jest na TRUE, monitor będzie logował wydarzenia.', - 'log_email' => 'Emaile wysłane przez skrypt', - 'log_sms' => 'SMS wysłane przez skrypt', - 'log_pushover' => 'Notyfikacje Pushover wysłane przez skrypt', - 'updated' => 'Konfiguracja została zaktualizowana.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Ustawienia Email', - 'settings_sms' => 'Ustawienia SMS', - 'settings_pushover' => 'Ustawienia Pushover', - 'settings_notification' => 'Ustawienia powiadomień', - 'settings_log' => 'Ustawienia Logowania', - 'auto_refresh' => 'Auto-odświeżanie', - 'auto_refresh_description' => - 'Auto-odświeżanie strony serwera.
    '. - ''. - 'Czas w sekundach, dla czasu 0 strona nie będzie odświeżana.'. - '', - 'seconds' => 'sekund', - 'test' => 'Test', - 'test_email' => 'Email zostanie wysłany na adres podany w Twoim profilu.', - 'test_sms' => 'SMS zostanie wysłany na numer podany w Twoim profilu.', - 'test_pushover' => 'Powiadomienie Pushover zostanie wysłany na klucz użytkownika/urządzenie podane w Twoim profilu..', - 'send' => 'Wyślij', - 'test_subject' => 'Test', - 'test_message' => 'Testowa wiadomość', - 'email_sent' => 'Email wysłany', - 'email_error' => 'Błąd podczas wysyłania emaila', - 'sms_sent' => 'Sms wysłany', - 'sms_error' => 'Błąd podczas wysyłania sms. %s', - 'sms_error_nomobile' => 'Nie udało się wysłać testowego SMS: brak poprawnego telefonu w Twoim profilu.', - 'pushover_sent' => 'Powiadomienie Pushover wysłane.', - 'pushover_error' => 'Błąd podczas wysyłania powiadomienia Pushover: %s', - 'pushover_error_noapp' => 'Błąd podczas wysyłania testowego powiadomienia: brak Pushover App API token w konfuguracji globalnej.', - 'pushover_error_nokey' => 'Błąd podczas wysyłania testowego powiadomienia: brak Pushover key na Twoim profilu.', - 'log_retention_period' => 'Czas rotacji logów', - 'log_retention_period_description' => 'Liczba dni przez którą należy przetrzymywać logi powiadomień i archiwizować uptime serwera. Wpisz 0 aby wyłączyć czyszczenie logów.', - 'log_retention_days' => 'dni', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Serwer \'%LABEL%\' przestał odpowiadać: ip=%IP%, port=%PORT%. Błąd=%ERROR%', - 'off_email_subject' => 'Uwaga: Serwer \'%LABEL%\' nie odpowiada', - 'off_email_body' => "Błąd połączenia do serwera:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Błąd: %ERROR%
    Data: %DATE%", - 'off_pushover_title' => 'Serwer \'%LABEL%\' nie odpowiada', - 'off_pushover_message' => "Błąd połączenia do serwera:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Błąd: %ERROR%
    Data: %DATE%", - 'on_sms' => 'Serwer \'%LABEL%\' działa poprawnie: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'Uwaga: Serwer \'%LABEL%\' działa poprawnie', - 'on_email_body' => "Serwer '%LABEL%' znów odpowiada, it was down for %LAST_OFFLINE_DURATION%:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: %DATE%", - 'on_pushover_title' => 'Serwer \'%LABEL%\' działa poprawnie', - 'on_pushover_message' => 'Serwer \'%LABEL%\' znów działa poprawnie, it was down for %LAST_OFFLINE_DURATION%:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Witaj, %user_name%', - 'title_sign_in' => 'Zaloguj się', - 'title_forgot' => 'Zapomniałeś hasła?', - 'title_reset' => 'Zresetuj hasło', - 'submit' => 'Zapisz', - 'remember_me' => 'Zapamiętaj mnie', - 'login' => 'Zaloguj', - 'logout' => 'Wyloguj', - 'username' => 'Login', - 'password' => 'Hasło', - 'password_repeat' => 'Powtórz hasło', - 'password_forgot' => 'Zapomniałeś hasła?', - 'password_reset' => 'Zresetuj hasło', - 'password_reset_email_subject' => 'Zresetuj hasło do monitoringu', - 'password_reset_email_body' => 'Aby zresetować hasło użyj tego linku. Ważność linku to jedna godzina.

    %link%', - 'error_user_incorrect' => 'Brak użytkownika o takim loginie.', - 'error_login_incorrect' => 'Login lub hasło jest błędne.', - 'error_login_passwords_nomatch' => 'Podane hasła nie pasują do siebie.', - 'error_reset_invalid_link' => 'Podany link do zmiany hasła jest nieprawidłowy.', - 'success_password_forgot' => 'Email został wysłany do Ciebie z informacjami dotyczącymi zresetowania hasła.', - 'success_password_reset' => 'Twoje hasło zostało pomyślnie zmienione. Zaloguj się.', - ), - 'error' => array( - '401_unauthorized' => 'Brak autoryzacji', - '401_unauthorized_description' => 'Nie masz odpowiednich praw dostępu by przeglądać tę stronę.', - ), + 'name' => 'Polski - Polish', + 'locale' => array( + '0' => 'pl_PL.UTF-8', + '1' => 'pl_PL', + '2' => 'polski', + '3' => 'polski', + ), + 'locale_tag' => 'pl', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Instalacja', + 'action' => 'Akcja', + 'save' => 'Zapisz', + 'edit' => 'Edycja', + 'delete' => 'Usuń', + 'date' => 'Data', + 'message' => 'Wiadomość', + 'yes' => 'Tak', + 'no' => 'Nie', + 'insert' => 'Wstaw', + 'add_new' => 'Dodaj', + 'update_available' => 'Nowa wersja ({version}) jest dostępna do pobrania z http://www.phpservermonitor.org.', + 'back_to_top' => 'Do góry', + 'go_back' => 'Wstecz', + 'ok' => 'OK', + 'cancel' => 'Anuluj', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Wczoraj o %k:%M', + 'other_day_format' => '%A o %k:%M', + 'never' => 'Nigdy', + 'hours_ago' => '%d godzin temu', + 'an_hour_ago' => 'godzinę temu', + 'minutes_ago' => '%d minut temu', + 'a_minute_ago' => 'minutę temu', + 'seconds_ago' => '%d sekund temu', + 'a_second_ago' => 'sekundę temu', + ), + 'menu' => array( + 'config' => 'Konfiguracja', + 'server' => 'Serwery', + 'server_log' => 'Logi', + 'server_status' => 'Status', + 'server_update' => 'Aktualizuj', + 'user' => 'Użytkownicy', + 'help' => 'Pomoc', + ), + 'users' => array( + 'user' => 'Użytkownik', + 'name' => 'Nazwa', + 'user_name' => 'Login', + 'password' => 'Hasło', + 'password_repeat' => 'Powtórz hasło', + 'password_leave_blank' => 'Pozostaw puste aby zaniechać zmian', + 'level' => 'Poziom', + 'level_10' => 'Administrator', + 'level_20' => 'Użytkownik', + 'level_description' => 'Administratorzy posiadają pełny dostęp: mogą zarządzać serwerami, + użytkownikami oraz edytować konfigurację globalną.
    Użytkownicy mogą + podejrzeć serwer oraz uruchomić aktualizację statusu dla serwerów do nich + przypisanych.', + 'mobile' => 'Telefon', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover jest usługą szybkich notyfikacji. Sprawdź ich stronę po więcej informacji.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Urządzenie dla Pushover', + 'pushover_device_description' => 'Nazwa urządzenia do którego wysłać powiadomienie. Pozostaw puste aby + wysłać do wszystkich urządzeń.', + 'delete_title' => 'Usuń użytkownika', + 'delete_message' => 'Czy jesteś pewny że chcesz usunąć użytkownika \'%1\'?', + 'deleted' => 'Użytkownik usunięty.', + 'updated' => 'Użytkownik zaktualizowany.', + 'inserted' => 'Użytkownik dodany.', + 'profile' => 'Profil', + 'profile_updated' => 'Twój profil został zaktualizowany.', + 'error_user_name_bad_length' => 'Login musi mieć od 2 do 64 znaków.', + 'error_user_name_invalid' => 'Login może zawierać tylko litery (a-z, A-Z), cyfry (0-9), kropki (.) oraz znak + podkreślenia (_).', + 'error_user_name_exists' => 'Wybrana nazwa użytkownika jest już używana.', + 'error_user_email_bad_length' => 'Email powinien mieć od 5 do 255 znaków.', + 'error_user_email_invalid' => 'Wprowadzony adres email jest nieprawidłowy.', + 'error_user_level_invalid' => 'Wybrany poziom uprawnień użytkownika jest nieprawidłowy.', + 'error_user_no_match' => 'Użytkownik nie został odnaleziony.', + 'error_user_password_invalid' => 'Wprowadzone hasło jest nieprawidłowe.', + 'error_user_password_no_match' => 'Wprowadzone hasła są różne.', + ), + 'log' => array( + 'title' => 'Logi', + 'type' => 'Typ', + 'status' => 'Status', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Brak logów', + 'clear' => 'Wyczyść log', + 'delete_title' => 'Wyczyść log', + 'delete_message' => 'Czy na pewno chcesz usunąć wszystkie dzienniki?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Etykieta', + 'domain' => 'Domena/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Liczba sekund do odczekania na odpowiedź serwera.', + 'port' => 'Port', + 'type' => 'Typ', + 'type_website' => 'Strona', + 'type_service' => 'Usługa', + 'pattern' => 'Wyszukiwane wyrażenie/wzorzec', + 'pattern_description' => 'Jeśli wzorzec nie zostanie odnaleziony, status zostanie ustawiony na offline. + Wyrażenia regularne są dozwolone.', + 'last_check' => 'Ostatnie sprawdzenie', + 'last_online' => 'Ostatnio online', + 'last_offline' => 'Ostatnio offline', + 'monitoring' => 'Monitorowany', + 'no_monitoring' => 'Brak monitoringu', + 'email' => 'Email', + 'send_email' => 'Wyślij Email', + 'sms' => 'SMS', + 'send_sms' => 'Wyślij SMS', + 'pushover' => 'Pushover', + 'users' => 'Użytkownicy', + 'delete_title' => 'Usuń serwer', + 'delete_message' => 'Czy jesteś pewny że chcesz usunąć serwer \'%1\'?', + 'deleted' => 'Serwer usunięty.', + 'updated' => 'Serwer zaktualizowany.', + 'inserted' => 'Server dodany.', + 'latency' => 'Opóźnienie', + 'latency_max' => 'Opóźnienie (maksymalne)', + 'latency_min' => 'Opóźnienie (minimalne)', + 'latency_avg' => 'Opóźnienie (średnie)', + 'uptime' => 'Czas dostępności', + 'year' => 'Rok', + 'month' => 'Miesiąc', + 'week' => 'Tydzień', + 'day' => 'Dzień', + 'hour' => 'Godzina', + 'warning_threshold' => 'Próg ostrzeżeń', + 'warning_threshold_description' => 'Ilość wymaganych niepowodzeń przed oznaczeniem serwera jako offline.', + 'chart_last_week' => 'Ostatni tydzień', + 'chart_history' => 'Historia', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Powiadomienia SMS są wyłączone.', + 'warning_notifications_disabled_email' => 'Powiadomienia Email są wyłączone.', + 'warning_notifications_disabled_pushover' => 'Powiadomienia Pushover są wyłączone.', + 'error_server_no_match' => 'Nie odnaleziono serwera.', + 'error_server_label_bad_length' => 'Etykieta musi mieć pomiędzy 1 a 255 znaków.', + 'error_server_ip_bad_length' => 'Domena/IP musi mieć pomiędzy 1 a 255 znaków.', + 'error_server_ip_bad_service' => 'Adres IP jest nieprawidłowy.', + 'error_server_ip_bad_website' => 'Adres URL jest nieprawidłowy.', + 'error_server_type_invalid' => 'Wybrany typ serwera jest nieprawidłowy.', + 'error_server_warning_threshold_invalid' => 'Próg ostrzeżeń musi być liczbą całkowitą większą od 0.', + ), + 'config' => array( + 'general' => 'Ogólne', + 'language' => 'Język', + 'show_update' => 'Sprawdzić aktualizacje?', + 'email_status' => 'Pozwól na wysyłkę email', + 'email_from_email' => 'Email z adresu', + 'email_from_name' => 'Email od(nazwa)', + 'email_smtp' => 'Włącz SMTP', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP login', + 'email_smtp_password' => 'SMTP hasło', + 'email_smtp_noauth' => 'Pozostaw puste dla braku autentykacji', + 'sms_status' => 'Pozwól na wysyłkę SMS', + 'sms_gateway' => 'Bramka SMS', + 'sms_gateway_username' => 'Login do bramki', + 'sms_gateway_password' => 'Hasło do bramki', + 'sms_from' => 'Numer nadawcy', + 'pushover_status' => 'Pozwól na wysyłkę notyfikacji Pushover', + 'pushover_description' => 'Pushover jest usługą ułatwiającą otrzymywanie powiadomień w czasie + rzeczywistym. Sprawdź ich stronę aby uzyskać + więcej informacji.', + 'pushover_clone_app' => 'Kliknij tutaj aby stworzyć aplikację korzystającą z Pushover', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Zanim zaczniesz używać Pushover, musisz zarejestrować aplikację na ich stronie internetowej + i wpisać tutaj App API Token.', + 'alert_type' => 'Wybierz kiedy chcesz być powiadomiony.', + 'alert_type_description' => 'Zmiana statusu: Otrzymasz powiadomienie gdy serwer zmieni status. Z online + -> offline lub offline -> online.

    Offline: Otrzymasz + powiadomienie gdy serwer zmieni status na offline po raz pierwszy. Na przykład, + Twój cronjob uruchamia się co 15 minut, a Twój serwer przestaje odpowiadać o + 13 i nie działa do 18. Otrzymasz *TYLKO* jedno powiadomienie o + 13.

    Zawsze: Otrzymasz powiadomienie za każdym razem gdy skrypt + zostanie uruchomiony a strona będzie niedostępna.', + 'alert_type_status' => 'Zmiana statusu', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Zawsze', + 'log_status' => 'Status logowania', + 'log_status_description' => 'Jeśli status logowania ustawiony jest na TRUE, monitor będzie logował + wydarzenia.', + 'log_email' => 'Emaile wysłane przez skrypt', + 'log_sms' => 'SMS wysłane przez skrypt', + 'log_pushover' => 'Notyfikacje Pushover wysłane przez skrypt', + 'updated' => 'Konfiguracja została zaktualizowana.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Ustawienia Email', + 'settings_sms' => 'Ustawienia SMS', + 'settings_pushover' => 'Ustawienia Pushover', + 'settings_notification' => 'Ustawienia powiadomień', + 'settings_log' => 'Ustawienia Logowania', + 'auto_refresh' => 'Auto-odświeżanie', + 'auto_refresh_description' => 'Auto-odświeżanie strony serwera.
    Czas w sekundach, dla + czasu 0 strona nie będzie odświeżana.', + 'seconds' => 'sekund', + 'test' => 'Test', + 'test_email' => 'Email zostanie wysłany na adres podany w Twoim profilu.', + 'test_sms' => 'SMS zostanie wysłany na numer podany w Twoim profilu.', + 'test_pushover' => 'Powiadomienie Pushover zostanie wysłany na klucz użytkownika/urządzenie podane w Twoim + profilu..', + 'send' => 'Wyślij', + 'test_subject' => 'Test', + 'test_message' => 'Testowa wiadomość', + 'email_sent' => 'Email wysłany', + 'email_error' => 'Błąd podczas wysyłania emaila', + 'sms_sent' => 'Sms wysłany', + 'sms_error' => 'Błąd podczas wysyłania sms. %s', + 'sms_error_nomobile' => 'Nie udało się wysłać testowego SMS: brak poprawnego telefonu w Twoim profilu.', + 'pushover_sent' => 'Powiadomienie Pushover wysłane.', + 'pushover_error' => 'Błąd podczas wysyłania powiadomienia Pushover: %s', + 'pushover_error_noapp' => 'Błąd podczas wysyłania testowego powiadomienia: brak Pushover App API token w + konfuguracji globalnej.', + 'pushover_error_nokey' => 'Błąd podczas wysyłania testowego powiadomienia: brak Pushover key na Twoim + profilu.', + 'log_retention_period' => 'Czas rotacji logów', + 'log_retention_period_description' => 'Liczba dni przez którą należy przetrzymywać logi powiadomień i + archiwizować uptime serwera. Wpisz 0 aby wyłączyć czyszczenie + logów.', + 'log_retention_days' => 'dni', + ), + 'notifications' => array( + 'off_sms' => 'Serwer \'%LABEL%\' przestał odpowiadać: ip=%IP%, port=%PORT%. Błąd=%ERROR%', + 'off_email_subject' => 'Uwaga: Serwer \'%LABEL%\' nie odpowiada', + 'off_email_body' => 'Błąd połączenia do serwera:

    Serwer: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Błąd: %ERROR%
    Data: %DATE%', + 'off_pushover_title' => 'Serwer \'%LABEL%\' nie odpowiada', + 'off_pushover_message' => 'Błąd połączenia do serwera:

    Serwer: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Błąd: %ERROR%
    Data: %DATE%', + 'on_sms' => 'Serwer \'%LABEL%\' działa poprawnie: ip=%IP%, port=%PORT%, it was down for + %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'Uwaga: Serwer \'%LABEL%\' działa poprawnie', + 'on_email_body' => 'Serwer \'%LABEL%\' znów odpowiada, it was down for + %LAST_OFFLINE_DURATION%:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: + %DATE%', + 'on_pushover_title' => 'Serwer \'%LABEL%\' działa poprawnie', + 'on_pushover_message' => 'Serwer \'%LABEL%\' znów działa poprawnie, it was down for + %LAST_OFFLINE_DURATION%:

    Serwer: %LABEL%
    IP: %IP%
    Port: %PORT%
    Data: + %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Witaj, %user_name%', + 'title_sign_in' => 'Zaloguj się', + 'title_forgot' => 'Zapomniałeś hasła?', + 'title_reset' => 'Zresetuj hasło', + 'submit' => 'Zapisz', + 'remember_me' => 'Zapamiętaj mnie', + 'login' => 'Zaloguj', + 'logout' => 'Wyloguj', + 'username' => 'Login', + 'password' => 'Hasło', + 'password_repeat' => 'Powtórz hasło', + 'password_forgot' => 'Zapomniałeś hasła?', + 'password_reset' => 'Zresetuj hasło', + 'password_reset_email_subject' => 'Zresetuj hasło do monitoringu', + 'password_reset_email_body' => 'Aby zresetować hasło użyj tego linku. Ważność linku to jedna + godzina.

    %link%', + 'error_user_incorrect' => 'Brak użytkownika o takim loginie.', + 'error_login_incorrect' => 'Login lub hasło jest błędne.', + 'error_login_passwords_nomatch' => 'Podane hasła nie pasują do siebie.', + 'error_reset_invalid_link' => 'Podany link do zmiany hasła jest nieprawidłowy.', + 'success_password_forgot' => 'Email został wysłany do Ciebie z informacjami dotyczącymi zresetowania + hasła.', + 'success_password_reset' => 'Twoje hasło zostało pomyślnie zmienione. Zaloguj się.', + ), + 'error' => array( + '401_unauthorized' => 'Brak autoryzacji', + '401_unauthorized_description' => 'Nie masz odpowiednich praw dostępu by przeglądać tę stronę.', + ), ); diff --git a/src/lang/pt_BR.lang.php b/src/lang/pt_BR.lang.php index c40f7f74..1b48c183 100644 --- a/src/lang/pt_BR.lang.php +++ b/src/lang/pt_BR.lang.php @@ -1,4 +1,5 @@ 'Português - Brazilian Portuguese', - 'locale' => array('pt_BR.UTF-8', 'pt_BR', 'portuguese-brazilian'), - 'locale_tag' => 'BR', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Instalar', - 'action' => 'Ação', - 'save' => 'Salvar', - 'edit' => 'Editar', - 'delete' => 'Excluir', - 'date' => 'Data', - 'message' => 'Mensagem', - 'yes' => 'Sim', - 'no' => 'Não', - 'insert' => 'Inserir', - 'add_new' => 'Adicionar novo', - 'update_available' => 'Uma atualização ({version}) disponível em http://www.phpservermonitor.org.', - 'back_to_top' => 'Voltar ao topo', - 'go_back' => 'Voltar', - 'ok' => 'OK', - 'cancel' => 'Cancel', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%e %m', - 'long_day_format' => '%e/%m/%Y', - 'yesterday_format' => 'Ontem as %k:%M', - 'other_day_format' => '%A at %k:%M', - 'never' => 'Nunca', - 'hours_ago' => '%d horas atrás', - 'an_hour_ago' => 'cerca de uma hora atrás', - 'minutes_ago' => '%d minutos atrás', - 'a_minute_ago' => 'cerca de um minuto atrás', - 'seconds_ago' => '%d segundos atrás', - 'a_second_ago' => 'um segundo atrás', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Configuração', - 'server' => 'Servidores', - 'server_log' => 'Log', - 'server_status' => 'Status', - 'server_update' => 'Atualização', - 'user' => 'Usuários', - 'help' => 'Ajuda', - ), - 'users' => array( - 'user' => 'Usuário', - 'name' => 'Nome', - 'user_name' => 'Username', - 'password' => 'Senha', - 'password_repeat' => 'Repetir senha', - 'password_leave_blank' => 'Deixe em branco para não modificar', - 'level' => 'Nível', - 'level_10' => 'Administrador', - 'level_20' => 'Usuário', - 'level_description' => 'Administradores Tem total acesso: podem gerenciar servidores, usuários e configurações globais.
    Usuários só podem executar atualizações para servidores que lhe foram atribuídos.', - 'mobile' => 'Celular', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover para enviar notificações em real-tome. Veja o website para mais informações.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Nome do Device para enviar a mensagem. Deixe em branco para enviar a todos os Devices.', - 'delete_title' => 'Excluir Usuário', - 'delete_message' => 'Tem certeza que deseja excluir o usuário \'%1\'?', - 'deleted' => 'Usuário excluído.', - 'updated' => 'Usuário atualizado.', - 'inserted' => 'Usuário adicionado.', - 'profile' => 'Perfil', - 'profile_updated' => 'Seu perfil foi atualizado.', - 'error_user_name_bad_length' => 'Usernames deve conter entre 2 e 64 caracteres.', - 'error_user_name_invalid' => 'Só pode conter caracteres alfabéticos (a-z, A-Z), dígitos (0-9), pontos (.) e underscores (_).', - 'error_user_name_exists' => 'O nome de usuário(username) já existe no banco de dados', - 'error_user_email_bad_length' => 'Email deve conter entre 5 e 255 caracteres.', - 'error_user_email_invalid' => 'O endereço de email é inválido.', - 'error_user_level_invalid' => 'O Nível de usuário é inválido.', - 'error_user_no_match' => 'O usuário não pode ser encontrado no banco de dados.', - 'error_user_password_invalid' => 'A senha informada é inválida.', - 'error_user_password_no_match' => 'A senha informada não combina.', - ), - 'log' => array( - 'title' => 'Entradas do Log', - 'type' => 'Tipo', - 'status' => 'Status', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Sem logs', - 'clear' => 'Log clara', - 'delete_title' => 'Log clara', - 'delete_message' => 'Tem certeza de que deseja excluir todos os logs?', - ), - 'servers' => array( - 'server' => 'Servidor', - 'status' => 'Status', - 'label' => 'Etiqueta', - 'domain' => 'Domínio/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Segundos para aguardar a resposta do servidor.', - 'port' => 'Porta', - 'type' => 'Tipo', - 'type_website' => 'Website', - 'type_service' => 'Service', - 'pattern' => 'Pesquisa palavra/padrão', - 'pattern_description' => 'Se esse padrão não for encontrado no site, o servidor será marcado offline. As expressões regulares são permitidas.', - 'last_check' => 'Última verificação', - 'last_online' => 'Última vez online', - 'last_offline' => 'Última vez offline', - 'monitoring' => 'Monitoramento', - 'no_monitoring' => 'Sem monitoring', - 'email' => 'Email', - 'send_email' => 'Enviar Email', - 'sms' => 'SMS', - 'send_sms' => 'Enviar SMS', - 'pushover' => 'Pushover', - 'users' => 'Usuários', - 'delete_title' => 'Exluir Servidor', - 'delete_message' => 'Tem certeza que deseja excluir o servidor \'%1\'?', - 'deleted' => 'Servidor excluído.', - 'updated' => 'Servidor atualizado.', - 'inserted' => 'Servidor adicionar.', - 'latency' => 'Tempo de resposta', - 'latency_max' => 'Latência (máxima)', - 'latency_min' => 'Latência (minima)', - 'latency_avg' => 'Latência (média)', - 'uptime' => 'Uptime', - 'year' => 'Ano', - 'month' => 'Mês', - 'week' => 'Semana', - 'day' => 'Dia', - 'hour' => 'Hora', - 'warning_threshold' => 'Limite de Aviso', - 'warning_threshold_description' => 'Número de verificações que falharam antes de ser marcado offline.', - 'chart_last_week' => 'Última semana', - 'chart_history' => 'Histórico', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d/%m/%Y', - 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', - 'chart_short_date_format' => '%d/%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'Notificações SMS estão desabilitadas.', - 'warning_notifications_disabled_email' => 'Notificações por email estão desabilitadas.', - 'warning_notifications_disabled_pushover' => 'Notificações por Pushover estão desabilitadas.', - 'error_server_no_match' => 'Servidor não encontrado.', - 'error_server_label_bad_length' => 'A etiqueta deve ter entre 1 e 255 caracteres.', - 'error_server_ip_bad_length' => 'O domínio / IP deve ter entre 1 e 255 caracteres.', - 'error_server_ip_bad_service' => 'O IP não é válido.', - 'error_server_ip_bad_website' => 'A URL não é válida.', - 'error_server_type_invalid' => 'O tipo de servidor selecionado não é valido.', - 'error_server_warning_threshold_invalid' => 'O limite de aviso deve ser um número inteiro maior que 0.', - ), - 'config' => array( - 'general' => 'Geral', - 'language' => 'Idioma', - 'show_update' => 'verificar atualizações semanalmente?', - 'email_status' => 'Habilitar envio de email?', - 'email_from_email' => 'Endereço do envio de email', - 'email_from_name' => 'Nome do envio de email', - 'email_smtp' => 'Enable SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP username', - 'email_smtp_password' => 'SMTP password', - 'email_smtp_noauth' => 'Deixe em branco para nenhuma autenticação', - 'sms_status' => 'Habilitar o envio de mensagem de texto?', - 'sms_gateway' => 'Gateway para o uso de envio de mensagens', - 'sms_gateway_username' => 'Usuário do Gateway', - 'sms_gateway_password' => 'Senha do Gateway', - 'sms_from' => 'Número de telefone de envio', - 'pushover_status' => 'Habilitar envio de mensagens Pushover', - 'pushover_description' => 'Pushover é um serviço de notificações em tempo real. Veja o website para mais informações.', - 'pushover_clone_app' => 'Clique aqui para criar sua app Pushover', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Before you can use Pushover, you need to register an App at their website and enter the App API Token here.', - 'alert_type' => 'Selecione como você gostaria de ser notificado.', - 'alert_type_description' => 'Mudança de Status: '. - 'Você receberá uma notificação quando o seridor tive uma mudança de status. De online -> offline ou offline -> online.
    '. - '
    Offline: '. - 'Você receberá uma notificação quando o servidor fica OFFLINE (Pela primeira vez). Por exemplo, '. - 'A cronjob é a cada 15 minutos e seu servidor caiu em 1:00 e permanece offline até 6 am. '. - 'Você receberá uma notificação a 1:00 apenas
    '. - '
    Sempre: '. - 'Você receberá uma notificação toda vez que o script é executado e um site esta offline, mesmo se o site tenha ficado offline por horas.', - 'alert_type_status' => 'Mudança de Status', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Sempre', - 'log_status' => 'Log status', - 'log_status_description' => 'Se o status de registro é definido como TRUE, o monitor irá registrar o evento sempre que as configurações de notificação forem passadas.', - 'log_email' => 'Registrar no Log os envios de email feitos pelo script?', - 'log_sms' => 'Registrar no Log os envios de mensagens de texto feitos pelo script?', - 'log_pushover' => 'Log pushover messages sent by the script', - 'updated' => 'A configuração foi atualizada.', - 'tab_email' => 'Email', - 'tab_sms' => 'Texto', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Configuração de email', - 'settings_sms' => 'Configuração de mensagens de texto', - 'settings_pushover' => 'Pushover settings', - 'settings_notification' => 'Configuração de notificações', - 'settings_log' => 'Configuração de Logs', - 'auto_refresh' => 'Atualizar automaticamente', - 'auto_refresh_description' => - 'Atualizar automaticamente a página de servidores.
    '. - ''. - 'Tempo em segundos, Se 0 a página não será atualizada.'. - '', - 'seconds' => 'segundos', - 'test' => 'Teste', - 'test_email' => 'Um e-mail será enviado para o endereço especificado em seu perfil de usuário.', - 'test_sms' => 'Um SMS será enviado para o número de telefone especificado em seu perfil de usuário.', - 'test_pushover' => 'A notificação Pushover será enviado para a chave de usuário / dispositivo especificado em seu perfil de usuário.', - 'send' => 'Enviar', - 'test_subject' => 'Teste', - 'test_message' => 'Mensagem de Teste', - 'email_sent' => 'Email enviado', - 'email_error' => 'Erro no envio do email', - 'sms_sent' => 'Sms enviado', - 'sms_error' => 'Error no envio do SMS. %s', - 'sms_error_nomobile' => 'Não foi possível enviar SMS de teste: nenhum número de telefone válido encontrado em seu perfil.', - 'pushover_sent' => 'Notificação Pushover enviada', - 'pushover_error' => 'Um erro foi encontrado ao enviar a notificação Pushover: %s', - 'pushover_error_noapp' => 'Não foi possível enviar a notificação de teste: não foi encontrada a APP API token do Pushover na configuração global.', - 'pushover_error_nokey' => 'Não foi possível enviar a notificação de teste: não foi encontrada a Pushover Key no seu perfil.', - 'log_retention_period' => 'Período de retenção do Log', - 'log_retention_period_description' => 'Número de dias para manter os registros de notificações e arquivos de tempo de atividade do servidor. Digite 0 para desativar a limpeza de registro.', - 'log_retention_days' => 'dias', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Servidor \'%LABEL%\' está OFFLINE: ip=%IP%, porta=%PORT%. Erro=%ERROR%', - 'off_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' está OFFLINE', - 'off_email_body' => "Falha ao conectar ao servidor:

    Servidor: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Erro: %ERROR%
    Data: %DATE%", - 'off_pushover_title' => 'Servidor \'%LABEL%\' está OFFLINE', - 'off_pushover_message' => "Falha ao conectar ao servidor:

    Servidor: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Erro: %ERROR%
    Data: %DATE%", - 'on_sms' => 'Servidor \'%LABEL%\' esta ONLINE: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' esta ONLINE', - 'on_email_body' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: %DATE%", - 'on_pushover_title' => 'Servidor \'%LABEL%\' esta ONLINE', - 'on_pushover_message' => "Servidor '%LABEL%' esta ONLINE novamente, it was down for %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => 'Bem vindo, %user_name%', - 'title_sign_in' => 'Por favor efetue login', - 'title_forgot' => 'Perdeu sua senha?', - 'title_reset' => 'Redefinir senha', - 'submit' => 'Enviar', - 'remember_me' => 'Lembrar', - 'login' => 'Login', - 'logout' => 'Logout', - 'username' => 'Username', - 'password' => 'Senha', - 'password_repeat' => 'Repetir Senha', - 'password_forgot' => 'Perdeu a senha?', - 'password_reset' => 'Redefinir senha', - 'password_reset_email_subject' => 'Redefinir sua senha para PHP Server Monitor', - 'password_reset_email_body' => 'Por favor use o link para redefinir sua senha. Este link irá expirar em 1 hora.

    %link%', - 'error_user_incorrect' => 'O username não pode ser encontrado.', - 'error_login_incorrect' => 'As informações são incorretas.', - 'error_login_passwords_nomatch' => 'A senha informada não é válida.', - 'error_reset_invalid_link' => 'O link para redefinição de senha é inválido.', - 'success_password_forgot' => 'Um email foi enviado para você com as instruções de redefinição de senha.', - 'success_password_reset' => 'Sua senha foi redefinida com sucesso. Por favor faça login.', - ), - 'error' => array( - '401_unauthorized' => 'Não autorizado', - '401_unauthorized_description' => 'Você não tem autorização para ver esta página.', - ), + 'name' => 'Português - Brazilian Portuguese', + 'locale' => array( + '0' => 'pt_BR.UTF-8', + '1' => 'pt_BR', + '2' => 'portuguese-brazilian', + ), + 'locale_tag' => 'BR', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Instalar', + 'action' => 'Ação', + 'save' => 'Salvar', + 'edit' => 'Editar', + 'delete' => 'Excluir', + 'date' => 'Data', + 'message' => 'Mensagem', + 'yes' => 'Sim', + 'no' => 'Não', + 'insert' => 'Inserir', + 'add_new' => 'Adicionar novo', + 'update_available' => 'Uma atualização ({version}) disponível em http://www.phpservermonitor.org.', + 'back_to_top' => 'Voltar ao topo', + 'go_back' => 'Voltar', + 'ok' => 'OK', + 'cancel' => 'Cancel', + 'short_day_format' => '%e %m', + 'long_day_format' => '%e/%m/%Y', + 'yesterday_format' => 'Ontem as %k:%M', + 'other_day_format' => '%A at %k:%M', + 'never' => 'Nunca', + 'hours_ago' => '%d horas atrás', + 'an_hour_ago' => 'cerca de uma hora atrás', + 'minutes_ago' => '%d minutos atrás', + 'a_minute_ago' => 'cerca de um minuto atrás', + 'seconds_ago' => '%d segundos atrás', + 'a_second_ago' => 'um segundo atrás', + ), + 'menu' => array( + 'config' => 'Configuração', + 'server' => 'Servidores', + 'server_log' => 'Log', + 'server_status' => 'Status', + 'server_update' => 'Atualização', + 'user' => 'Usuários', + 'help' => 'Ajuda', + ), + 'users' => array( + 'user' => 'Usuário', + 'name' => 'Nome', + 'user_name' => 'Username', + 'password' => 'Senha', + 'password_repeat' => 'Repetir senha', + 'password_leave_blank' => 'Deixe em branco para não modificar', + 'level' => 'Nível', + 'level_10' => 'Administrador', + 'level_20' => 'Usuário', + 'level_description' => 'Administradores Tem total acesso: podem gerenciar servidores, usuários e + configurações globais.
    Usuários só podem executar atualizações para + servidores que lhe foram atribuídos.', + 'mobile' => 'Celular', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover para enviar notificações em real-tome. Veja o website para mais informações.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Nome do Device para enviar a mensagem. Deixe em branco para enviar a todos + os Devices.', + 'delete_title' => 'Excluir Usuário', + 'delete_message' => 'Tem certeza que deseja excluir o usuário \'%1\'?', + 'deleted' => 'Usuário excluído.', + 'updated' => 'Usuário atualizado.', + 'inserted' => 'Usuário adicionado.', + 'profile' => 'Perfil', + 'profile_updated' => 'Seu perfil foi atualizado.', + 'error_user_name_bad_length' => 'Usernames deve conter entre 2 e 64 caracteres.', + 'error_user_name_invalid' => 'Só pode conter caracteres alfabéticos (a-z, A-Z), dígitos (0-9), pontos (.) e + underscores (_).', + 'error_user_name_exists' => 'O nome de usuário(username) já existe no banco de dados', + 'error_user_email_bad_length' => 'Email deve conter entre 5 e 255 caracteres.', + 'error_user_email_invalid' => 'O endereço de email é inválido.', + 'error_user_level_invalid' => 'O Nível de usuário é inválido.', + 'error_user_no_match' => 'O usuário não pode ser encontrado no banco de dados.', + 'error_user_password_invalid' => 'A senha informada é inválida.', + 'error_user_password_no_match' => 'A senha informada não combina.', + ), + 'log' => array( + 'title' => 'Entradas do Log', + 'type' => 'Tipo', + 'status' => 'Status', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Sem logs', + 'clear' => 'Log clara', + 'delete_title' => 'Log clara', + 'delete_message' => 'Tem certeza de que deseja excluir todos os logs?', + ), + 'servers' => array( + 'server' => 'Servidor', + 'status' => 'Status', + 'label' => 'Etiqueta', + 'domain' => 'Domínio/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Segundos para aguardar a resposta do servidor.', + 'port' => 'Porta', + 'type' => 'Tipo', + 'type_website' => 'Website', + 'type_service' => 'Service', + 'pattern' => 'Pesquisa palavra/padrão', + 'pattern_description' => 'Se esse padrão não for encontrado no site, o servidor será marcado offline. As + expressões regulares são permitidas.', + 'last_check' => 'Última verificação', + 'last_online' => 'Última vez online', + 'last_offline' => 'Última vez offline', + 'monitoring' => 'Monitoramento', + 'no_monitoring' => 'Sem monitoring', + 'email' => 'Email', + 'send_email' => 'Enviar Email', + 'sms' => 'SMS', + 'send_sms' => 'Enviar SMS', + 'pushover' => 'Pushover', + 'users' => 'Usuários', + 'delete_title' => 'Exluir Servidor', + 'delete_message' => 'Tem certeza que deseja excluir o servidor \'%1\'?', + 'deleted' => 'Servidor excluído.', + 'updated' => 'Servidor atualizado.', + 'inserted' => 'Servidor adicionar.', + 'latency' => 'Tempo de resposta', + 'latency_max' => 'Latência (máxima)', + 'latency_min' => 'Latência (minima)', + 'latency_avg' => 'Latência (média)', + 'uptime' => 'Uptime', + 'year' => 'Ano', + 'month' => 'Mês', + 'week' => 'Semana', + 'day' => 'Dia', + 'hour' => 'Hora', + 'warning_threshold' => 'Limite de Aviso', + 'warning_threshold_description' => 'Número de verificações que falharam antes de ser marcado offline.', + 'chart_last_week' => 'Última semana', + 'chart_history' => 'Histórico', + 'chart_day_format' => '%d/%m/%Y', + 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'Notificações SMS estão desabilitadas.', + 'warning_notifications_disabled_email' => 'Notificações por email estão desabilitadas.', + 'warning_notifications_disabled_pushover' => 'Notificações por Pushover estão desabilitadas.', + 'error_server_no_match' => 'Servidor não encontrado.', + 'error_server_label_bad_length' => 'A etiqueta deve ter entre 1 e 255 caracteres.', + 'error_server_ip_bad_length' => 'O domínio / IP deve ter entre 1 e 255 caracteres.', + 'error_server_ip_bad_service' => 'O IP não é válido.', + 'error_server_ip_bad_website' => 'A URL não é válida.', + 'error_server_type_invalid' => 'O tipo de servidor selecionado não é valido.', + 'error_server_warning_threshold_invalid' => 'O limite de aviso deve ser um número inteiro maior que 0.', + ), + 'config' => array( + 'general' => 'Geral', + 'language' => 'Idioma', + 'show_update' => 'verificar atualizações semanalmente?', + 'email_status' => 'Habilitar envio de email?', + 'email_from_email' => 'Endereço do envio de email', + 'email_from_name' => 'Nome do envio de email', + 'email_smtp' => 'Enable SMTP', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP username', + 'email_smtp_password' => 'SMTP password', + 'email_smtp_noauth' => 'Deixe em branco para nenhuma autenticação', + 'sms_status' => 'Habilitar o envio de mensagem de texto?', + 'sms_gateway' => 'Gateway para o uso de envio de mensagens', + 'sms_gateway_username' => 'Usuário do Gateway', + 'sms_gateway_password' => 'Senha do Gateway', + 'sms_from' => 'Número de telefone de envio', + 'pushover_status' => 'Habilitar envio de mensagens Pushover', + 'pushover_description' => 'Pushover é um serviço de notificações em tempo real. Veja o website para mais informações.', + 'pushover_clone_app' => 'Clique aqui para criar sua app Pushover', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Before you can use Pushover, you need to register an App at their website and enter the App API + Token here.', + 'alert_type' => 'Selecione como você gostaria de ser notificado.', + 'alert_type_description' => 'Mudança de Status: Você receberá uma notificação quando o seridor + tive uma mudança de status. De online -> offline ou offline -> online.

    Offline: Você receberá uma notificação quando o servidor fica + OFFLINE (Pela primeira vez). Por exemplo, A cronjob é a cada 15 minutos e seu + servidor caiu em 1:00 e permanece offline até 6 am. Você receberá uma + notificação a 1:00 apenas

    Sempre: Você receberá uma + notificação toda vez que o script é executado e um site esta offline, mesmo se + o site tenha ficado offline por horas.', + 'alert_type_status' => 'Mudança de Status', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Sempre', + 'log_status' => 'Log status', + 'log_status_description' => 'Se o status de registro é definido como TRUE, o monitor irá registrar o evento + sempre que as configurações de notificação forem passadas.', + 'log_email' => 'Registrar no Log os envios de email feitos pelo script?', + 'log_sms' => 'Registrar no Log os envios de mensagens de texto feitos pelo script?', + 'log_pushover' => 'Log pushover messages sent by the script', + 'updated' => 'A configuração foi atualizada.', + 'tab_email' => 'Email', + 'tab_sms' => 'Texto', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Configuração de email', + 'settings_sms' => 'Configuração de mensagens de texto', + 'settings_pushover' => 'Pushover settings', + 'settings_notification' => 'Configuração de notificações', + 'settings_log' => 'Configuração de Logs', + 'auto_refresh' => 'Atualizar automaticamente', + 'auto_refresh_description' => 'Atualizar automaticamente a página de servidores.
    Tempo + em segundos, Se 0 a página não será atualizada.', + 'seconds' => 'segundos', + 'test' => 'Teste', + 'test_email' => 'Um e-mail será enviado para o endereço especificado em seu perfil de usuário.', + 'test_sms' => 'Um SMS será enviado para o número de telefone especificado em seu perfil de usuário.', + 'test_pushover' => 'A notificação Pushover será enviado para a chave de usuário / dispositivo especificado + em seu perfil de usuário.', + 'send' => 'Enviar', + 'test_subject' => 'Teste', + 'test_message' => 'Mensagem de Teste', + 'email_sent' => 'Email enviado', + 'email_error' => 'Erro no envio do email', + 'sms_sent' => 'Sms enviado', + 'sms_error' => 'Error no envio do SMS. %s', + 'sms_error_nomobile' => 'Não foi possível enviar SMS de teste: nenhum número de telefone válido encontrado + em seu perfil.', + 'pushover_sent' => 'Notificação Pushover enviada', + 'pushover_error' => 'Um erro foi encontrado ao enviar a notificação Pushover: %s', + 'pushover_error_noapp' => 'Não foi possível enviar a notificação de teste: não foi encontrada a APP API + token do Pushover na configuração global.', + 'pushover_error_nokey' => 'Não foi possível enviar a notificação de teste: não foi encontrada a Pushover + Key no seu perfil.', + 'log_retention_period' => 'Período de retenção do Log', + 'log_retention_period_description' => 'Número de dias para manter os registros de notificações e arquivos + de tempo de atividade do servidor. Digite 0 para desativar a limpeza de + registro.', + 'log_retention_days' => 'dias', + ), + 'notifications' => array( + 'off_sms' => 'Servidor \'%LABEL%\' está OFFLINE: ip=%IP%, porta=%PORT%. Erro=%ERROR%', + 'off_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' está OFFLINE', + 'off_email_body' => 'Falha ao conectar ao servidor:

    Servidor: %LABEL%
    IP: %IP%
    Porta: + %PORT%
    Erro: %ERROR%
    Data: %DATE%', + 'off_pushover_title' => 'Servidor \'%LABEL%\' está OFFLINE', + 'off_pushover_message' => 'Falha ao conectar ao servidor:

    Servidor: %LABEL%
    IP: %IP%
    Porta: + %PORT%
    Erro: %ERROR%
    Data: %DATE%', + 'on_sms' => 'Servidor \'%LABEL%\' esta ONLINE: ip=%IP%, porta=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANTE: Servidor \'%LABEL%\' esta ONLINE', + 'on_email_body' => 'Servidor \'%LABEL%\' esta ONLINE novamente, it was down for + %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Porta: %PORT%
    Data: + %DATE%', + 'on_pushover_title' => 'Servidor \'%LABEL%\' esta ONLINE', + 'on_pushover_message' => 'Servidor \'%LABEL%\' esta ONLINE novamente, it was down for + %LAST_OFFLINE_DURATION%:

    Servidor: %LABEL%
    IP: %IP%
    Porta: + %PORT%
    Data: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Bem vindo, %user_name%', + 'title_sign_in' => 'Por favor efetue login', + 'title_forgot' => 'Perdeu sua senha?', + 'title_reset' => 'Redefinir senha', + 'submit' => 'Enviar', + 'remember_me' => 'Lembrar', + 'login' => 'Login', + 'logout' => 'Logout', + 'username' => 'Username', + 'password' => 'Senha', + 'password_repeat' => 'Repetir Senha', + 'password_forgot' => 'Perdeu a senha?', + 'password_reset' => 'Redefinir senha', + 'password_reset_email_subject' => 'Redefinir sua senha para PHP Server Monitor', + 'password_reset_email_body' => 'Por favor use o link para redefinir sua senha. Este link irá expirar em 1 + hora.

    %link%', + 'error_user_incorrect' => 'O username não pode ser encontrado.', + 'error_login_incorrect' => 'As informações são incorretas.', + 'error_login_passwords_nomatch' => 'A senha informada não é válida.', + 'error_reset_invalid_link' => 'O link para redefinição de senha é inválido.', + 'success_password_forgot' => 'Um email foi enviado para você com as instruções de redefinição de senha.', + 'success_password_reset' => 'Sua senha foi redefinida com sucesso. Por favor faça login.', + ), + 'error' => array( + '401_unauthorized' => 'Não autorizado', + '401_unauthorized_description' => 'Você não tem autorização para ver esta página.', + ), ); diff --git a/src/lang/ru_RU.lang.php b/src/lang/ru_RU.lang.php index 82fd11ea..fc5cfddd 100644 --- a/src/lang/ru_RU.lang.php +++ b/src/lang/ru_RU.lang.php @@ -1,4 +1,5 @@ 'Русский - Russian', - 'locale' => array('ru_RU.UTF-8', 'ru_RU', 'russian', 'russian'), - 'locale_tag' => 'ru', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Сервер Мониторинг', - 'install' => 'Установка', - 'action' => 'Действие', - 'save' => 'Сохранить', - 'edit' => 'Редактировать', - 'delete' => 'Удалить', - 'date' => 'Дата', - 'message' => 'Сообщение', - 'yes' => 'Да', - 'no' => 'Нет', - 'insert' => 'Добавить', - 'add_new' => 'Добавить новый', - 'update_available' => 'Новая версия ({version}) доступна по адресу http://www.phpservermonitor.org.', - 'back_to_top' => 'Наверх', - 'go_back' => 'Вернуться', - 'ok' => 'OK', - 'cancel' => 'Отмена', - 'activate' => 'Активировать', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%e %B', - 'long_day_format' => '%e %B %Y', - 'yesterday_format' => 'Вчера в %k:%M', - 'other_day_format' => '%A в %k:%M', - 'never' => 'Никогда', - 'hours_ago' => '%d часов назад', - 'an_hour_ago' => 'час назад', - 'minutes_ago' => '%d минут назад', - 'a_minute_ago' => 'минуту назад', - 'seconds_ago' => '%d секунд назад', - 'a_second_ago' => 'секунду назад', - 'year' => 'год', - 'years' => 'лет', - 'month' => 'месяц', - 'months' => 'месяцев', - 'day' => 'день', - 'days' => 'дней', - 'hour' => 'час', - 'hours' => 'часов', - 'minute' => 'минута', - 'minutes' => 'минут', - 'second' => 'секунда', - 'seconds' => 'секунд', - ), - 'menu' => array( - 'config' => 'Параметры', - 'server' => 'Серверы', - 'server_log' => 'Лог', - 'server_status' => 'Статус', - 'server_update' => 'Обновить', - 'user' => 'Пользователи', - 'help' => 'Помощь', - ), - 'users' => array( - 'user' => 'Пользователь', - 'name' => 'Имя пользователя', - 'user_name' => 'Логин', - 'password' => 'Пароль', - 'password_repeat' => 'Повтор пароля', - 'password_leave_blank' => 'Оставить пустым, если не меняется', - 'level' => 'Уровень', - 'level_10' => 'Администратор', - 'level_20' => 'Пользователь', - 'level_description' => 'Администраторы имеют полный доступ: они могут управлять серверами, пользователями и изменять общую конфигурацию.
    Пользователи могут только просматривать и запускать проверку для серверов, которые были к ним прикреплены.', - 'mobile' => 'Телефон', - 'email' => 'E-mail', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover - это сервис, который позволяет легко получать уведомления в режиме реального времени. Больше информации на их веб-сайте.', - 'pushover_key' => 'Pushover ключ', - 'pushover_device' => 'Pushover устройство', - 'pushover_device_description' => 'Имя устройства, на которое будут отправляться уведомления. Оставьте пустым, что бы отправлять уведомления на все устройства.', - 'telegram' => 'Telegram', - 'telegram_description' => 'Telegram удобный мессенджер для получения уведомлений в реальном времени. Посетите раздел документации для получения доп. информации и инструкций по установке.', - 'telegram_chat_id' => 'Telegram chat id', - 'telegram_chat_id_description' => 'Сообщения будут отправляться на указанный идентификатор чата.', - 'telegram_get_chat_id' => 'Нажмите здесь чтобы получить ваш chat id', - 'activate_telegram' => 'Активировать уведомления в Telegram', - 'activate_telegram_description' => 'Разрешить отправку уведомлений на указанный идентификатор чата. Без этого разрешения Telegram не позволит нам отправлять вам уведомления.', - 'telegram_bot_username_found' => 'Бот обнаружен!

    Откроется чат с ботом. Здесь вам нужно нажать кнопку Start или отправить команду /start.', - 'telegram_bot_username_error_token' => '401 - Unauthorized. Пожалуйста укажите действительный API токен..', - 'telegram_bot_error' => 'Произошла ошибка при активации уведомления Telegram: %s', - 'delete_title' => 'Удалить пользователя', - 'delete_message' => 'Вы уверены что хотите удалить пользователя \'%1\'?', - 'deleted' => 'Пользователь удален.', - 'updated' => 'Пользователь обновлен.', - 'inserted' => 'Пользователь добавлен.', - 'profile' => 'Профиль', - 'profile_updated' => 'Ваш профиль был обновлен.', - 'error_user_name_bad_length' => 'Логин должен содержать от 2 до 64 знаков.', - 'error_user_name_invalid' => 'Имя пользователя может содержать только латинские символы (a-z, A-Z), цифры (0-9), точки (.) и подчеркивание (_).', - 'error_user_name_exists' => 'Данный логин уже существует.', - 'error_user_email_bad_length' => 'E-mail может содержать от 5 до 255 знаков.', - 'error_user_email_invalid' => 'E-mail указан неверно.', - 'error_user_level_invalid' => 'Данный уровень пользователя недействителен.', - 'error_user_no_match' => 'Данного пользователя нет в базе данных.', - 'error_user_password_invalid' => 'Пароль указан неверно.', - 'error_user_password_no_match' => 'Введенные пароли не совпадают.', - ), - 'log' => array( - 'title' => 'Запись', - 'type' => 'Тип', - 'status' => 'Статус', - 'email' => 'E-mail', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'telegram' => 'Telegram', - 'no_logs' => 'Записей нет', - 'clear' => 'Очистить логи', - 'delete_title' => 'Удаление логов', - 'delete_message' => 'Вы уверены что хотите удалить все логи?', - ), - 'servers' => array( - 'server' => 'Сервер', - 'status' => 'Состояние', - 'label' => 'Название', - 'domain' => 'Домен/IP', - 'timeout' => 'Тайм-аут', - 'timeout_description' => 'Количество секунд ожидания ответа сервера.', - 'authentication_settings' => 'Настройки аутентификации', - 'optional' => 'необязательно', - 'website_username' => 'Имя пользователя', - 'website_username_description' => 'Имя пользователя для доступа к сайту. (Поддерживается только Apache authentication.)', - 'website_password' => 'Пароль', - 'website_password_description' => 'пароль для доступа к сайту. Пароль будет храниться в зашифрованном виде.', - 'fieldset_monitoring' => 'Мониторинг', - 'fieldset_permissions' => 'Права доступа', - 'port' => 'Порт', - 'custom_port' => 'Указать порт', - 'popular_ports' => 'Популярные порты', - 'please_select' => 'Выберите', - 'type' => 'Тип', - 'type_website' => 'Веб-сайт', - 'type_service' => 'Сервис', - 'type_ping' => 'Пинг', - 'pattern' => 'Искать текст/шаблон', - 'pattern_description' => 'Если текст по шаблону не найден на сайте, сервер будет помечен как Оффлайн. Регулярные выражения допустимы.', - 'pattern_online' => 'Шаблон указывает что вебсайт:', - 'pattern_online_description' => 'Online: Если этот шаблон не найден на веб-сайте, сервер будет отмечен Онлайн. Offline: Если этот шаблон не найден на веб-сайте, сервер будет отмечен как Оффлайн.', - 'header_name' => 'Название заголовка', - 'header_value' => 'Значение заголовка', - 'header_name_description' => 'с учетом регистра.', - 'header_value_description' => 'Разрешены регулярные выражения.', - 'last_check' => 'Последняя проверка', - 'last_online' => 'Был онлайн', - 'last_offline' => 'Был оффлайн', - 'monitoring' => 'Мониторинг', - 'no_monitoring' => 'Нет мониторинга', - 'email' => 'E-mail', - 'send_email' => 'Отправить E-mail', - 'sms' => 'CMC', - 'send_sms' => 'Отправить CMC', - 'pushover' => 'Pushover', - 'send_pushover' => 'Отправлять уведомления в Pushover', - 'telegram' => 'Telegram', - 'send_telegram' => 'Отправлять уведомления в Telegram', - 'users' => 'Пользователи', - 'delete_title' => 'Удалить сервер', - 'delete_message' => 'Вы уверены что хотите удалить сервер \'%1\'?', - 'deleted' => 'Сервер удален.', - 'updated' => 'Сервер обновлен.', - 'inserted' => 'Сервер добавлен.', - 'latency' => 'Задержка', - 'latency_max' => 'Задержка (максимальная)', - 'latency_min' => 'Задержка (минимальная)', - 'latency_avg' => 'Задержка (средняя)', - 'online' => 'онлайн', - 'offline' => 'оффлайн', - 'uptime' => 'Аптайм', - 'year' => 'Год', - 'month' => 'Месяц', - 'week' => 'Неделя', - 'day' => 'День', - 'hour' => 'Час', - 'warning_threshold' => 'Порог предупреждения', - 'warning_threshold_description' => 'Количество неудачных проверок, требуемых чтобы сервер был помечен как Оффлайн.', - 'chart_last_week' => 'Прошлая неделя', - 'chart_history' => 'История', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%d.%m.%Y', - 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S', - 'chart_short_date_format' => '%d.%m %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS уведомления отключены.', - 'warning_notifications_disabled_email' => 'E-mail уведомления отключены.', - 'warning_notifications_disabled_pushover' => 'Pushover уведомления отключены.', - 'warning_notifications_disabled_telegram' => 'Уведомления в Telegram отключены.', - 'error_server_no_match' => 'Сервер не найден.', - 'error_server_label_bad_length' => 'Название должно содержать от 1 до 255 знаков.', - 'error_server_ip_bad_length' => 'Домен/IP должен содержать от 1 до 255 знаков', - 'error_server_ip_bad_service' => 'IP-адрес недействителен.', - 'error_server_ip_bad_website' => 'Ссылка веб-страницы недействительна.', - 'error_server_type_invalid' => 'Выбраный тип сервера недействителен.', - 'error_server_warning_threshold_invalid' => 'Порог предупреждения должен иметь значение больше 0', - ), - 'config' => array( - 'general' => 'Основные', - 'language' => 'Язык', - 'show_update' => 'Проверять обновления?', - 'password_encrypt_key' => 'Ключ шифрования пароля', - 'password_encrypt_key_note' => 'Этот ключ используется для шифрования паролей, которые указаны на серверах (для доступа к веб-сайтам). Если ключ изменится, сохраненный пароль будет недействителен!', - 'proxy' => 'Использовать прокси', - 'proxy_url' => 'Адрес прокси', - 'proxy_user' => 'Имя пользователя прокси', - 'proxy_password' => 'Пароль прокси', - 'email_status' => 'Разрешить отправку email', - 'email_from_email' => 'Отправлять от адреса', - 'email_from_name' => 'Отправлять от имени', - 'email_smtp' => 'Использовать SMTP', - 'email_smtp_host' => 'SMTP адрес', - 'email_smtp_port' => 'SMTP порт', - 'email_smtp_security' => 'SMTP защита', - 'email_smtp_security_none' => 'нет', - 'email_smtp_username' => 'SMTP пользователь', - 'email_smtp_password' => 'SMTP пароль', - 'email_smtp_noauth' => 'Оставить пустым, если без аутентификации', - 'sms_status' => 'Разрешить отправку SMS', - 'sms_gateway' => 'Шлюз для отправки SMS', - 'sms_gateway_username' => 'Пользователь', - 'sms_gateway_password' => 'Пароль', - 'sms_from' => 'Номер отправителя', - 'pushover_status' => 'Разрешить отправку Pushover сообщений', - 'pushover_description' => 'Pushover - это сервис, который позволяет легко получать уведомления в режиме реального времени. Больше информации на их веб-сайте.', - 'pushover_clone_app' => 'Нажмите здесь чтобы создать ваш Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Прежде чем вы сможете начать пользоваться Pushover, вам необходимо зарегистрировать "App" на их веб-сайте и ввести "App API Token" сюда.', - 'telegram_status' => 'Разрешить отправку уведомлений в Telegram', - 'telegram_description' => 'Telegram удобный мессенджер для получения уведомлений в реальном времени. Посетите раздел документации для получения доп. информации и инструкций по установке.', - 'telegram_api_token' => 'Telegram API Token', - 'telegram_api_token_description' => 'Прежде чем вы сможете начать пользоваться Telegram, вам необходимо получить API Token. Посетите раздел документации для получения помощи.', - 'alert_type' => 'Тип уведомлений', - 'alert_type_description' => 'Изменение статуса: '. - 'Вы получите уведомление об изменение статуса. Для онлайн -> оффлайн или офлайн -> онлайн.
    '. - '
    Оффлайн: '. - 'Вы получите уведомление только когда сервер перейдет в статус оффлайн. Например, '. - 'задание Cron выставлено на каждые 15 минут. Сервер перейдет в статус оффлайн в 1:00 и не измениться до 6:00. '. - 'Вы получите 1 уведомление только в 1:00
    '. - '
    Всегда: '. - 'Вы будете получать уведомление при каждом запуске скрипта проверки, как только сервер перейдет в статус оффлайн, даже если сервер находится в этом статусе несколько часов.', - 'alert_type_status' => 'Изменение статуса', - 'alert_type_offline' => 'Оффлайн', - 'alert_type_always' => 'Всегда', - 'alert_proxy' => 'Даже если включено, прокси никогда не используется для сервисов', - 'alert_proxy_url' => 'Формат: адрес:порт', - 'log_status' => 'Лог статусов', - 'log_status_description' => 'Если лог статусов включен, монитор будет логировать все события выбранные в типе уведомлений.', - 'log_email' => 'Логировать уведомления отправленые по E-mail', - 'log_sms' => 'Логировать уведомления отправленые по SMS', - 'log_pushover' => 'Логировать Pushover уведомления', - 'log_telegram' => 'Логировать Telegram уведомления', - 'updated' => 'Настройки успешно сохранены.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'tab_telegram' => 'Telegram', - 'settings_email' => 'Настройка E-mail', - 'settings_sms' => 'Настройка SMS', - 'settings_pushover' => 'Настройка Pushover', - 'settings_telegram' => 'Настройка Telegram', - 'settings_notification' => 'Настройка уведомлений', - 'settings_log' => 'Настройка логирования', - 'settings_proxy' => 'Настройка прокси', - 'auto_refresh' => 'Авто-обновление', - 'auto_refresh_description' => - 'Авто-обновление страницы статуса серверов.
    '. - ''. - 'Время в секундах. Если указано 0, то страница не будет обновляться.'. - '', - 'seconds' => 'секунд', - 'test' => 'Проверка', - 'test_email' => 'Сообщение будет отправлено на адрес указаный в профиле пользователя.', - 'test_sms' => 'SMS будет отправлено на номер телефона указаный в профиле пользователя.', - 'test_pushover' => 'Pushover уведомление будет отправленно на устройство указанное в профиле пользователя.', - 'test_telegram' => 'Уведомление Telegram будет отправлено на идентификатор чата, указанный в профиле пользователя.', - 'send' => 'Отправить', - 'test_subject' => 'Проверка', - 'test_message' => 'Тестовое сообщение', - 'email_sent' => 'Email отправлен', - 'email_error' => 'Ошибка отправки email', - 'sms_sent' => 'SMS отправлено', - 'sms_error' => 'При отправке SMS произошла ошибка: %s', - 'sms_error_nomobile' => 'Не удалось отправить тестовое SMS: действительный номер телефона не найден в вашем профиле.', - 'pushover_sent' => 'Pushover уведомление отправлено', - 'pushover_error' => 'Произошла ошибка во время отправки Pushover уведомления: %s', - 'pushover_error_noapp' => 'Не удалось отправить тестовое уведомление: Pushover "App API token" не найден в основных настройках.', - 'pushover_error_nokey' => 'Не удалось отправить тестовое уведомление: Pushover ключ не найден в вашем профиле.', - 'telegram_sent' => 'Уведомление в Telegram отправлено', - 'telegram_error' => 'Произошла ошибка при отправке уведомления в Telegram: %s', - 'telegram_error_notoken' => 'Не удалось отправить тестовое уведомление: Telegram API token не найден в основных настройках.', - 'telegram_error_noid' => 'Не удалось отправить тестовое уведомление: идентификатор чата не найден в вашем профиле.', - 'log_retention_period' => 'Период хранения логов', - 'log_retention_period_description' => 'Количество дней хранения логов уведомлений и архива аптайма серверов. Введите 0 для выключения очистки логов.', - 'log_retention_days' => 'дней', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: IP=%IP%, Порт=%PORT%. Ошибка=%ERROR%', - 'off_email_subject' => 'ВАЖНО: сервер \'%LABEL%\' сейчас НЕДОСТУПЕН', - 'off_email_body' => "Невозможно подключиться к следующему серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%", - 'off_pushover_title' => 'Cервер \'%LABEL%\' сейчас НЕДОСТУПЕН', - 'off_pushover_message' => "Невозможно подключиться к следующему серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%", - 'off_telegram_message' => "Невозможно подключиться к следующему серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%", - 'on_sms' => 'Сервер \'%LABEL%\' снова ДОСТУПЕН: IP=%IP%, Порт=%PORT%. Был недоступен: %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'ВАЖНО: Сервер \'%LABEL%\' сейчас ДОСТУПЕН', - 'on_email_body' => "Сервер '%LABEL%' снова доступен.
    Был недоступен: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Дата: %DATE%", - 'on_pushover_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН', - 'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.
    Был недоступен: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Дата: %DATE%', - 'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.
    Был недоступен: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: %IP%
    Порт: %PORT%
    Дата: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Здравствуйте, %user_name%', - 'title_sign_in' => 'Пожалуйста, авторизуйтесь', - 'title_forgot' => 'Забыли пароль?', - 'title_reset' => 'Сбросить пароль', - 'submit' => 'Подтвердить', - 'remember_me' => 'Запомнить меня', - 'login' => 'Войти', - 'logout' => 'Выйти', - 'username' => 'Логин', - 'password' => 'Пароль', - 'password_repeat' => 'Повторить пароль', - 'password_forgot' => 'Забыли пароль?', - 'password_reset' => 'Сбросить пароль', - 'password_reset_email_subject' => 'Сброс пароля для PHP Server Monitor', - 'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку для сброса пароля. Ссылка действительна 1 час.

    %link%', - 'error_user_incorrect' => 'Пользователь с указаными данными не найден.', - 'error_login_incorrect' => 'Информация указана неверно.', - 'error_login_passwords_nomatch' => 'Пароль указан неверно.', - 'error_reset_invalid_link' => 'Ссылка для сброса пароля недействительна.', - 'success_password_forgot' => 'Вам был отправлен email, с инструкциями по сбросу пароля.', - 'success_password_reset' => 'Ваш пароль был сброшен. Пожалуйста авторизуйтесь.', - ), - 'error' => array( - '401_unauthorized' => 'Доступ закрыт', - '401_unauthorized_description' => 'У вас нет прав доступа к этой странице.', - ), + 'name' => 'Русский - Russian', + 'locale' => array( + '0' => 'ru_RU.UTF-8', + '1' => 'ru_RU', + '2' => 'russian', + '3' => 'russian', + ), + 'locale_tag' => 'ru', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Сервер Мониторинг', + 'install' => 'Установка', + 'action' => 'Действие', + 'save' => 'Сохранить', + 'edit' => 'Редактировать', + 'delete' => 'Удалить', + 'date' => 'Дата', + 'message' => 'Сообщение', + 'yes' => 'Да', + 'no' => 'Нет', + 'insert' => 'Добавить', + 'add_new' => 'Добавить новый', + 'update_available' => 'Новая версия ({version}) доступна по адресу http://www.phpservermonitor.org.', + 'back_to_top' => 'Наверх', + 'go_back' => 'Вернуться', + 'ok' => 'OK', + 'cancel' => 'Отмена', + 'activate' => 'Активировать', + 'short_day_format' => '%e %B', + 'long_day_format' => '%e %B %Y', + 'yesterday_format' => 'Вчера в %k:%M', + 'other_day_format' => '%A в %k:%M', + 'never' => 'Никогда', + 'hours_ago' => '%d часов назад', + 'an_hour_ago' => 'час назад', + 'minutes_ago' => '%d минут назад', + 'a_minute_ago' => 'минуту назад', + 'seconds_ago' => '%d секунд назад', + 'a_second_ago' => 'секунду назад', + 'year' => 'год', + 'years' => 'лет', + 'month' => 'месяц', + 'months' => 'месяцев', + 'day' => 'день', + 'days' => 'дней', + 'hour' => 'час', + 'hours' => 'часов', + 'minute' => 'минута', + 'minutes' => 'минут', + 'second' => 'секунда', + 'seconds' => 'секунд', + ), + 'menu' => array( + 'config' => 'Параметры', + 'server' => 'Серверы', + 'server_log' => 'Лог', + 'server_status' => 'Статус', + 'server_update' => 'Обновить', + 'user' => 'Пользователи', + 'help' => 'Помощь', + ), + 'users' => array( + 'user' => 'Пользователь', + 'name' => 'Имя пользователя', + 'user_name' => 'Логин', + 'password' => 'Пароль', + 'password_repeat' => 'Повтор пароля', + 'password_leave_blank' => 'Оставить пустым, если не меняется', + 'level' => 'Уровень', + 'level_10' => 'Администратор', + 'level_20' => 'Пользователь', + 'level_description' => 'Администраторы имеют полный доступ: они + могут управлять серверами, пользователями и + изменять общую + конфигурацию.
    Пользователи могут только + просматривать и запускать проверку для + серверов, которые были к ним прикреплены.', + 'mobile' => 'Телефон', + 'email' => 'E-mail', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover - это сервис, который позволяет легко + получать уведомления в режиме реального + времени. Больше информации на их веб-сайте.', + 'pushover_key' => 'Pushover ключ', + 'pushover_device' => 'Pushover устройство', + 'pushover_device_description' => 'Имя устройства, на которое будут + отправляться уведомления. Оставьте + пустым, что бы отправлять уведомления на + все устройства.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram удобный мессенджер + для получения уведомлений в реальном + времени. Посетите раздел документации + для получения доп. информации и инструкций по + установке.', + 'telegram_chat_id' => 'Telegram chat id', + 'telegram_chat_id_description' => 'Сообщения будут отправляться на + указанный идентификатор чата.', + 'telegram_get_chat_id' => 'Нажмите здесь чтобы получить ваш chat id', + 'activate_telegram' => 'Активировать уведомления в Telegram', + 'activate_telegram_description' => 'Разрешить отправку уведомлений на + указанный идентификатор чата. Без этого + разрешения Telegram не позволит нам + отправлять вам уведомления.', + 'telegram_bot_username_found' => 'Бот обнаружен!

    Откроется чат с ботом. Здесь + вам нужно нажать кнопку Start или отправить + команду /start.', + 'telegram_bot_username_error_token' => '401 - Unauthorized. Пожалуйста укажите + действительный API токен..', + 'telegram_bot_error' => 'Произошла ошибка при активации уведомления + Telegram: %s', + 'delete_title' => 'Удалить пользователя', + 'delete_message' => 'Вы уверены что хотите удалить пользователя \'%1\'?', + 'deleted' => 'Пользователь удален.', + 'updated' => 'Пользователь обновлен.', + 'inserted' => 'Пользователь добавлен.', + 'profile' => 'Профиль', + 'profile_updated' => 'Ваш профиль был обновлен.', + 'error_user_name_bad_length' => 'Логин должен содержать от 2 до 64 знаков.', + 'error_user_name_invalid' => 'Имя пользователя может содержать только + латинские символы (a-z, A-Z), цифры (0-9), точки (.) + и подчеркивание (_).', + 'error_user_name_exists' => 'Данный логин уже существует.', + 'error_user_email_bad_length' => 'E-mail может содержать от 5 до 255 знаков.', + 'error_user_email_invalid' => 'E-mail указан неверно.', + 'error_user_level_invalid' => 'Данный уровень пользователя + недействителен.', + 'error_user_no_match' => 'Данного пользователя нет в базе данных.', + 'error_user_password_invalid' => 'Пароль указан неверно.', + 'error_user_password_no_match' => 'Введенные пароли не совпадают.', + ), + 'log' => array( + 'title' => 'Запись', + 'type' => 'Тип', + 'status' => 'Статус', + 'email' => 'E-mail', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'Записей нет', + 'clear' => 'Очистить логи', + 'delete_title' => 'Удаление логов', + 'delete_message' => 'Вы уверены что хотите удалить все логи?', + ), + 'servers' => array( + 'server' => 'Сервер', + 'status' => 'Состояние', + 'label' => 'Название', + 'domain' => 'Домен/IP', + 'timeout' => 'Тайм-аут', + 'timeout_description' => 'Количество секунд ожидания ответа сервера.', + 'authentication_settings' => 'Настройки аутентификации', + 'optional' => 'необязательно', + 'website_username' => 'Имя пользователя', + 'website_username_description' => 'Имя пользователя для доступа к сайту. + (Поддерживается только Apache authentication.)', + 'website_password' => 'Пароль', + 'website_password_description' => 'пароль для доступа к сайту. Пароль будет + храниться в зашифрованном виде.', + 'fieldset_monitoring' => 'Мониторинг', + 'fieldset_permissions' => 'Права доступа', + 'port' => 'Порт', + 'custom_port' => 'Указать порт', + 'popular_ports' => 'Популярные порты', + 'please_select' => 'Выберите', + 'type' => 'Тип', + 'type_website' => 'Веб-сайт', + 'type_service' => 'Сервис', + 'type_ping' => 'Пинг', + 'pattern' => 'Искать текст/шаблон', + 'pattern_description' => 'Если текст по шаблону не найден на сайте, + сервер будет помечен как Оффлайн. Регулярные + выражения допустимы.', + 'pattern_online' => 'Шаблон указывает что вебсайт:', + 'pattern_online_description' => 'Online: Если этот шаблон найден на веб-сайте, + сервер будет отмечен Онлайн. Offline: Если + этот шаблон не найден на веб-сайте, сервер + будет отмечен как Оффлайн.', + 'header_name' => 'Название заголовка', + 'header_value' => 'Значение заголовка', + 'header_name_description' => 'с учетом регистра.', + 'header_value_description' => 'Разрешены регулярные выражения.', + 'last_check' => 'Последняя проверка', + 'last_online' => 'Был онлайн', + 'last_offline' => 'Был оффлайн', + 'monitoring' => 'Мониторинг', + 'no_monitoring' => 'Нет мониторинга', + 'email' => 'E-mail', + 'send_email' => 'Отправить E-mail', + 'sms' => 'CMC', + 'send_sms' => 'Отправить CMC', + 'pushover' => 'Pushover', + 'send_pushover' => 'Отправлять уведомления в Pushover', + 'telegram' => 'Telegram', + 'send_telegram' => 'Отправлять уведомления в Telegram', + 'users' => 'Пользователи', + 'delete_title' => 'Удалить сервер', + 'delete_message' => 'Вы уверены что хотите удалить сервер \'%1\'?', + 'deleted' => 'Сервер удален.', + 'updated' => 'Сервер обновлен.', + 'inserted' => 'Сервер добавлен.', + 'latency' => 'Задержка', + 'latency_max' => 'Задержка (максимальная)', + 'latency_min' => 'Задержка (минимальная)', + 'latency_avg' => 'Задержка (средняя)', + 'online' => 'онлайн', + 'offline' => 'оффлайн', + 'uptime' => 'Аптайм', + 'year' => 'Год', + 'month' => 'Месяц', + 'week' => 'Неделя', + 'day' => 'День', + 'hour' => 'Час', + 'warning_threshold' => 'Порог предупреждения', + 'warning_threshold_description' => 'Количество неудачных проверок, + требуемых чтобы сервер был помечен как + Оффлайн.', + 'chart_last_week' => 'Прошлая неделя', + 'chart_history' => 'История', + 'chart_day_format' => '%d.%m.%Y', + 'chart_long_date_format' => '%d.%m.%Y %H:%M:%S', + 'chart_short_date_format' => '%d.%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS уведомления отключены.', + 'warning_notifications_disabled_email' => 'E-mail уведомления отключены.', + 'warning_notifications_disabled_pushover' => 'Pushover уведомления отключены.', + 'warning_notifications_disabled_telegram' => 'Уведомления в Telegram отключены.', + 'error_server_no_match' => 'Сервер не найден.', + 'error_server_label_bad_length' => 'Название должно содержать от 1 до 255 + знаков.', + 'error_server_ip_bad_length' => 'Домен/IP должен содержать от 1 до 255 знаков', + 'error_server_ip_bad_service' => 'IP-адрес недействителен.', + 'error_server_ip_bad_website' => 'Ссылка веб-страницы недействительна.', + 'error_server_type_invalid' => 'Выбраный тип сервера недействителен.', + 'error_server_warning_threshold_invalid' => 'Порог предупреждения должен иметь + значение больше 0', + ), + 'config' => array( + 'general' => 'Основные', + 'language' => 'Язык', + 'show_update' => 'Проверять обновления?', + 'password_encrypt_key' => 'Ключ шифрования пароля', + 'password_encrypt_key_note' => 'Этот ключ используется для шифрования + паролей, которые указаны на серверах (для + доступа к веб-сайтам). Если ключ изменится, + сохраненный пароль будет недействителен!', + 'proxy' => 'Использовать прокси', + 'proxy_url' => 'Адрес прокси', + 'proxy_user' => 'Имя пользователя прокси', + 'proxy_password' => 'Пароль прокси', + 'email_status' => 'Разрешить отправку email', + 'email_from_email' => 'Отправлять от адреса', + 'email_from_name' => 'Отправлять от имени', + 'email_smtp' => 'Использовать SMTP', + 'email_smtp_host' => 'SMTP адрес', + 'email_smtp_port' => 'SMTP порт', + 'email_smtp_security' => 'SMTP защита', + 'email_smtp_security_none' => 'нет', + 'email_smtp_username' => 'SMTP пользователь', + 'email_smtp_password' => 'SMTP пароль', + 'email_smtp_noauth' => 'Оставить пустым, если без аутентификации', + 'sms_status' => 'Разрешить отправку SMS', + 'sms_gateway' => 'Шлюз для отправки SMS', + 'sms_gateway_username' => 'Пользователь', + 'sms_gateway_password' => 'Пароль', + 'sms_from' => 'Номер отправителя', + 'pushover_status' => 'Разрешить отправку Pushover сообщений', + 'pushover_description' => 'Pushover - это сервис, который позволяет легко + получать уведомления в режиме реального + времени. Больше информации на их веб-сайте.', + 'pushover_clone_app' => 'Нажмите здесь чтобы создать ваш Pushover app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Прежде чем вы сможете начать + пользоваться Pushover, вам необходимо + зарегистрировать "App" на их веб-сайте и ввести "App + API Token" сюда.', + 'telegram_status' => 'Разрешить отправку уведомлений в Telegram', + 'telegram_description' => 'Telegram удобный мессенджер + для получения уведомлений в реальном + времени. Посетите раздел документации + для получения доп. информации и инструкций по + установке.', + 'telegram_api_token' => 'Telegram API Token', + 'telegram_api_token_description' => 'Прежде чем вы сможете начать + пользоваться Telegram, вам необходимо + получить API Token. Посетите раздел + документации для получения помощи.', + 'alert_type' => 'Тип уведомлений', + 'alert_type_description' => 'Изменение статуса: Вы получите + уведомление об изменение статуса. Для + онлайн -> оффлайн или офлайн -> онлайн.

    Оффлайн: Вы получите уведомление + только когда сервер перейдет в статус + оффлайн. Например, задание Cron выставлено на + каждые 15 минут. Сервер перейдет в статус + оффлайн в 1:00 и не измениться до 6:00. Вы + получите 1 уведомление только в + 1:00

    Всегда: Вы будете получать + уведомление при каждом запуске скрипта + проверки, как только сервер перейдет в + статус оффлайн, даже если сервер находится в + этом статусе несколько часов.', + 'alert_type_status' => 'Изменение статуса', + 'alert_type_offline' => 'Оффлайн', + 'alert_type_always' => 'Всегда', + 'alert_proxy' => 'Даже если включено, прокси никогда не + используется для сервисов', + 'alert_proxy_url' => 'Формат: адрес:порт', + 'log_status' => 'Лог статусов', + 'log_status_description' => 'Если лог статусов включен, монитор будет + логировать все события выбранные в типе + уведомлений.', + 'log_email' => 'Логировать уведомления отправленые по E-mail', + 'log_sms' => 'Логировать уведомления отправленые по SMS', + 'log_pushover' => 'Логировать Pushover уведомления', + 'log_telegram' => 'Логировать Telegram уведомления', + 'updated' => 'Настройки успешно сохранены.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Настройка E-mail', + 'settings_sms' => 'Настройка SMS', + 'settings_pushover' => 'Настройка Pushover', + 'settings_telegram' => 'Настройка Telegram', + 'settings_notification' => 'Настройка уведомлений', + 'settings_log' => 'Настройка логирования', + 'settings_proxy' => 'Настройка прокси', + 'auto_refresh' => 'Авто-обновление', + 'auto_refresh_description' => 'Авто-обновление страницы статуса + серверов.
    Время в секундах. + Если указано 0, то страница не будет + обновляться.', + 'seconds' => 'секунд', + 'test' => 'Проверка', + 'test_email' => 'Сообщение будет отправлено на адрес указаный в + профиле пользователя.', + 'test_sms' => 'SMS будет отправлено на номер телефона указаный в + профиле пользователя.', + 'test_pushover' => 'Pushover уведомление будет отправленно на + устройство указанное в профиле пользователя.', + 'test_telegram' => 'Уведомление Telegram будет отправлено на + идентификатор чата, указанный в профиле + пользователя.', + 'send' => 'Отправить', + 'test_subject' => 'Проверка', + 'test_message' => 'Тестовое сообщение', + 'email_sent' => 'Email отправлен', + 'email_error' => 'Ошибка отправки email', + 'sms_sent' => 'SMS отправлено', + 'sms_error' => 'При отправке SMS произошла ошибка: %s', + 'sms_error_nomobile' => 'Не удалось отправить тестовое SMS: + действительный номер телефона не найден в + вашем профиле.', + 'pushover_sent' => 'Pushover уведомление отправлено', + 'pushover_error' => 'Произошла ошибка во время отправки Pushover + уведомления: %s', + 'pushover_error_noapp' => 'Не удалось отправить тестовое уведомление: + Pushover "App API token" не найден в основных + настройках.', + 'pushover_error_nokey' => 'Не удалось отправить тестовое уведомление: + Pushover ключ не найден в вашем профиле.', + 'telegram_sent' => 'Уведомление в Telegram отправлено', + 'telegram_error' => 'Произошла ошибка при отправке уведомления в + Telegram: %s', + 'telegram_error_notoken' => 'Не удалось отправить тестовое уведомление: + Telegram API token не найден в основных настройках.', + 'telegram_error_noid' => 'Не удалось отправить тестовое уведомление: + идентификатор чата не найден в вашем профиле.', + 'log_retention_period' => 'Период хранения логов', + 'log_retention_period_description' => 'Количество дней хранения логов + уведомлений и архива аптайма серверов. + Введите 0 для выключения очистки логов.', + 'log_retention_days' => 'дней', + ), + 'notifications' => array( + 'off_sms' => 'Сервер \'%LABEL%\' сейчас НЕДОСТУПЕН: IP=%IP%, Порт=%PORT%. + Ошибка=%ERROR%', + 'off_email_subject' => 'ВАЖНО: сервер \'%LABEL%\' сейчас НЕДОСТУПЕН', + 'off_email_body' => 'Невозможно подключиться к следующему + серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%', + 'off_pushover_title' => 'Cервер \'%LABEL%\' сейчас НЕДОСТУПЕН', + 'off_pushover_message' => 'Невозможно подключиться к следующему + серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%', + 'off_telegram_message' => 'Невозможно подключиться к следующему + серверу:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Ошибка: %ERROR%
    Дата: %DATE%', + 'on_sms' => 'Сервер \'%LABEL%\' снова ДОСТУПЕН: IP=%IP%, Порт=%PORT%. Был + недоступен: %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'ВАЖНО: Сервер \'%LABEL%\' сейчас ДОСТУПЕН', + 'on_email_body' => 'Сервер \'%LABEL%\' снова доступен.
    Был недоступен: + %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Дата: %DATE%', + 'on_pushover_title' => 'Сервер \'%LABEL%\' сейчас ДОСТУПЕН', + 'on_pushover_message' => 'Сервер \'%LABEL%\' снова доступен.
    Был + недоступен: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: + %IP%
    Порт: %PORT%
    Дата: %DATE%', + 'on_telegram_message' => 'Сервер \'%LABEL%\' снова доступен.
    Был + недоступен: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: + %IP%
    Порт: %PORT%
    Дата: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Здравствуйте, %user_name%', + 'title_sign_in' => 'Пожалуйста, авторизуйтесь', + 'title_forgot' => 'Забыли пароль?', + 'title_reset' => 'Сбросить пароль', + 'submit' => 'Подтвердить', + 'remember_me' => 'Запомнить меня', + 'login' => 'Войти', + 'logout' => 'Выйти', + 'username' => 'Логин', + 'password' => 'Пароль', + 'password_repeat' => 'Повторить пароль', + 'password_forgot' => 'Забыли пароль?', + 'password_reset' => 'Сбросить пароль', + 'password_reset_email_subject' => 'Сброс пароля для PHP Server Monitor', + 'password_reset_email_body' => 'Пожалуйста, используйте следующую ссылку + для сброса пароля. Ссылка действительна 1 + час.

    %link%', + 'error_user_incorrect' => 'Пользователь с указаными данными не найден.', + 'error_login_incorrect' => 'Информация указана неверно.', + 'error_login_passwords_nomatch' => 'Пароль указан неверно.', + 'error_reset_invalid_link' => 'Ссылка для сброса пароля недействительна.', + 'success_password_forgot' => 'Вам был отправлен email, с инструкциями по + сбросу пароля.', + 'success_password_reset' => 'Ваш пароль был сброшен. Пожалуйста + авторизуйтесь.', + ), + 'error' => array( + '401_unauthorized' => 'Доступ закрыт', + '401_unauthorized_description' => 'У вас нет прав доступа к этой странице.', + ), ); diff --git a/src/lang/sk_SK.lang.php b/src/lang/sk_SK.lang.php index f97fbcd4..f40379b0 100644 --- a/src/lang/sk_SK.lang.php +++ b/src/lang/sk_SK.lang.php @@ -1,4 +1,5 @@ 'Slovensky - Slovak', - 'locale' => array('sk_SK.UTF-8', 'sk_SK', 'slovak', 'slovak'), - 'locale_tag' => 'sk', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Inštalácia', - 'action' => 'Akcia', - 'save' => 'Uložiť', - 'edit' => 'Upraviť', - 'delete' => 'Zmazať', - 'date' => 'Dátum', - 'message' => 'Správa', - 'yes' => 'Áno', - 'no' => 'Nie', - 'insert' => 'Vložiť', - 'add_new' => 'Pridať', - 'update_available' => 'Nová verzia - ({version}) je dostupná na http://www.phpservermonitor.org.', - 'back_to_top' => 'Späť na začiatok', - 'go_back' => 'Späť', - 'ok' => 'OK', - 'cancel' => 'Zrušiť', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Včera v %k:%M', - 'other_day_format' => '%A v %k:%M', - 'never' => 'Nikdy', - 'hours_ago' => 'pred %d hodinami', - 'an_hour_ago' => 'cca pred hodinou', - 'minutes_ago' => 'pred %d minútami', - 'a_minute_ago' => 'cca pred minútou', - 'seconds_ago' => 'pred %d sekundami', - 'a_second_ago' => 'pred chvíľou', - ), - 'menu' => array( - 'config' => 'Konfigurácia', - 'server' => 'Servery', - 'server_log' => 'Log', - 'server_status' => 'Stav', - 'server_update' => 'Aktualizácia', - 'user' => 'Užívateľ', - 'help' => 'Nápoveda', - ), - 'users' => array( - 'user' => 'Užívateľ', - 'name' => 'Meno', - 'user_name' => 'Užívateľské meno', - 'password' => 'Heslo', - 'password_repeat' => 'Rovnaké heslo (pre kontrolu)', - 'password_leave_blank' => 'Nevyplňujte ak nechcete zmeniť.', - 'level' => 'Oprávnenie', - 'level_10' => 'Administrátor', - 'level_20' => 'Užívateľ', - 'level_description' => 'Administrátor má plný prístup: môže spravovať servery, užívateľov a upraviť globálnu konfiguráciu.
    Uživatel má práva len na čítanie a spustiť aktualizáciu serverov, ktoré má priradené.', - 'mobile' => 'Mobil', - 'email' => 'E-mail', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover je služba umožňujúca jednoducho zasielať real-time upozornenia. Viac na webe Pushover', - 'pushover_key' => 'Pushover Token', - 'pushover_device' => 'Pushover Zariadenie', - 'pushover_device_description' => 'Název zariadenia, na ktoré má byť správa odoslaná. Ponechajte prázdne pre odoslanie na všetky zariadenia.', - 'delete_title' => 'Zmazať užívateľa', - 'delete_message' => 'Naozaj zmazať užívateľa \'%1\'?', - 'deleted' => 'Užívateľ zmazaný.', - 'updated' => 'Užívateľ aktualizovaný.', - 'inserted' => 'Užívateľ pridaný.', - 'profile' => 'Profil', - 'profile_updated' => 'Váš užívateľský profil bol upravený.', - 'error_user_name_bad_length' => 'Užívateľské meno musí obsahovať 2 až 64 znakov.', - 'error_user_name_invalid' => 'Užívateľské meno môže obsahovať iba písmena (a-z, A-Z), čísla (0-9), bodky (.) a podtržítka (_).', - 'error_user_name_exists' => 'Zadané uživatelské jméno již existuje v databázi.', - 'error_user_email_bad_length' => 'E-mailová adresa musí obsahovat 5 až 255 znaků .', - 'error_user_email_invalid' => 'E-mailová adresa je neplatná', - 'error_user_level_invalid' => 'Zadané oprávnenie je neplatné.', - 'error_user_no_match' => 'Užívateľ nebol najdený.', - 'error_user_password_invalid' => 'Zadané heslo je neplatné.', - 'error_user_password_no_match' => 'Zadaná heslá sa nezhodujú.', - ), - 'log' => array( - 'title' => 'Záznamy logu', - 'type' => 'Typ', - 'status' => 'Stav', - 'email' => 'E-mail', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Žiadne záznamy', - 'clear' => 'Jasný protokol', - 'delete_title' => 'Jasný protokol', - 'delete_message' => 'Naozaj chcete odstrániť všetky záznamy?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Stav', - 'label' => 'Popis', - 'domain' => 'Doména/IP', - 'timeout' => 'Časový limit', - 'timeout_description' => 'Počet sekúnd čakania na odpoveď serveru.', - 'authentication_settings' => 'Nastavenie autentizacie', - 'optional' => 'voliteľný', - 'website_username' => 'Užívateľské meno', - 'website_username_description' => 'Užívateľské meno pre prístup na stránku. (Len Apache autorizácia je podporovaná.)', - 'website_password' => 'Heslo', - 'website_password_description' => 'Heslo pre prístup na stránku. Heslo je v databázi šifrované.', - 'fieldset_monitoring' => 'Monitoring', - 'fieldset_permissions' => 'Oprávnenie', - 'port' => 'Port', - 'custom_port' => 'Užívateľský Port', - 'popular_ports' => 'Populárne Porty', - 'please_select' => 'Prosím vyberte', - 'type' => 'Typ', - 'type_website' => 'Web', - 'type_service' => 'Služba', - 'pattern' => 'Vyhledat reťazec/vzor', - 'pattern_description' => 'Pokiaľ reťazec nebude na webe nájdený, bude server označený ako offline. Regulárne výrazy sú povolené.', - 'last_check' => 'Posledná kontrola', - 'last_online' => 'Naposledy online', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'Žiadne monitorované služby', - 'email' => 'E-mail', - 'send_email' => 'Odoslať e-mail', - 'sms' => 'SMS', - 'send_sms' => 'Odoslať SMS', - 'pushover' => 'Pushover', - 'users' => 'Užívatelia', - 'delete_title' => 'Zmazať server', - 'delete_message' => 'Naozaj si prajete zmazať \'%1\'?', - 'deleted' => 'Server zmazaný.', - 'updated' => 'Server aktualizovaný.', - 'inserted' => 'Server pridaný.', - 'latency' => 'Latencia', - 'latency_max' => 'Latencia (maximum)', - 'latency_min' => 'Latencia (minimum)', - 'latency_avg' => 'Latencia (priemer)', - 'uptime' => 'Uptime', - 'year' => 'Rok', - 'month' => 'Mesiac', - 'week' => 'Týždeň', - 'day' => 'Deň', - 'hour' => 'Hodina', - 'warning_threshold' => 'Stropná hranica varovania', - 'warning_threshold_description' => 'Počet neúspešných pokusov pred označením serveru ako offline.', - 'chart_last_week' => 'Minulý týždeň', - 'chart_history' => 'História', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS upozornenia sú vypnuté.', - 'warning_notifications_disabled_email' => 'E-mailové upozornenia sú vypnuté.', - 'warning_notifications_disabled_pushover' => 'Pushover upozornenia sú vypnuté.', - 'error_server_no_match' => 'Server nenájdený.', - 'error_server_label_bad_length' => 'Popisok musí obsahovať 1 až 255 znakov.', - 'error_server_ip_bad_length' => 'Doména/IP adresa musí obsahovať 1 až 255 znakov.', - 'error_server_ip_bad_service' => 'IP adresa nie je platná.', - 'error_server_ip_bad_website' => 'URL webu nie je platná.', - 'error_server_type_invalid' => 'Zvolený typ serveru nie je platný', - 'error_server_warning_threshold_invalid' => 'Hranica varovania musí byť číslo väčšie ako 0.', - ), - 'config' => array( - 'general' => 'Všeobecné', - 'language' => 'Jazyk', - 'show_update' => 'Kontrolovať aktualizácie?', - 'password_encrypt_key' => 'Šifrovací kľúč pre heslá', - 'password_encrypt_key_note' => 'Týmto klúčom sa šifrujú heslá, ktoré sa ukladajú na serveroch pre prístup na webové stránky. Ak kľúč zmeníte, budú uložené heslá neplatné!', - 'email_status' => 'Povoliť odosielanie e-mailu', - 'email_from_email' => 'E-mailová adresa odosielateľa', - 'email_from_name' => 'Jméno odosielateľa', - 'email_smtp' => 'Zapnúť SMTP', - 'email_smtp_host' => 'SMTP adresa', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP zabezpečenie', - 'email_smtp_security_none' => 'žiadne', - 'email_smtp_username' => 'SMTP užívateľské meno', - 'email_smtp_password' => 'SMTP heslo', - 'email_smtp_noauth' => 'Nechajte prázdne pre použitie SMTP bez hesla', - 'sms_status' => 'Povoliť odosielanie textových správ', - 'sms_gateway' => 'Brána použitá pro odosielanie správ', - 'sms_gateway_username' => 'Užívateľské meno brány', - 'sms_gateway_password' => 'Heslo brány', - 'sms_from' => 'Telefónne číslo odosielateľa', - 'pushover_status' => 'Povoliť zasielanie Pushover správ', - 'pushover_description' => 'Pushover je služba umožňujúca jednoducho zasielať real-time upozornenia. Viac na webe Pushover', - 'pushover_clone_app' => 'Kliknite pre vytvorenie Pushover aplikácie', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Pred použitím Pushoveru sa musíte registrovať a získať API Token.', - 'alert_type' => 'Zvoľte kedy si prajete byť upozornení.', - 'alert_type_description' => 'Zmena stavu: '. - 'Obdržíte upozornenie pri zmene stavu, teda: online -> offline alebo offline -> online.
    '. - '
    Offline: '. - 'Obdržíte upozornenie, keď server prejde *PO PRVÝ KRÁT* do offline stavu. Napríklad, '. - 'pokiaľ je cron nastavený na 15 minút a sledovaný server bude offline mezi 01:00 a 06:00, '. - 'tak obdržíte upozornenie iba o 01:00.
    '. - '
    Vždy: '. - 'Obdržíte upozornenie pri každom spustení kontroly, teda aj pokiaľ bude server offline niekoľko hodín.', - 'alert_type_status' => 'Zmena stavu', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Vždy', - 'log_status' => 'Log', - 'log_status_description' => 'Pokiaľ je Log nastavený na hodnotu TRUE, systém do neho zapíše všetky upozornenia.', - 'log_email' => 'Logovať odoslané e-maily', - 'log_sms' => 'Logovať odoslané textové správy', - 'log_pushover' => 'Logovať odoslané Pushover správy', - 'updated' => 'Nastavenie bolo aktualizované.', - 'tab_email' => 'E-mail', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Nastavenie e-mailov', - 'settings_sms' => 'Nastavenie textových správ', - 'settings_pushover' => 'Nastavenie Pushover', - 'settings_notification' => 'Nastavenie upozornení', - 'settings_log' => 'Nastavenie logu', - 'auto_refresh' => 'Automaticky obnoviť', - 'auto_refresh_description' => - 'Automaticky obnoviť stránku Servery.
    '. - ''. - 'Čas v sekundách, 0 pre vypnutie automatického obnovenia.'. - '', - 'seconds' => 'sekúnd', - 'test' => 'Test', - 'test_email' => 'E-mail bude odoslaný na adresu uvedenú v užívateľskom profile.', - 'test_sms' => 'SMS bude odoslaná na telefónne číslo uvedené v užívateľskom profile.', - 'test_pushover' => 'Pushover upozornenie bude odoslané užívateľovi/zariadeniu podľa nastavení v užívateľskom profile.', - 'send' => 'Odoslať', - 'test_subject' => 'Test', - 'test_message' => 'Testovacia správa', - 'email_sent' => 'E-mail odoslaný', - 'email_error' => 'Chyba pri odosielaní e-mailu', - 'sms_sent' => 'SMS odoslaná', - 'sms_error' => 'Chyba pri odosielaní SMS. %s', - 'sms_error_nomobile' => 'Nebolo možné odoslať SMS: v užívateľskom profile nebylo nájdené platné telefónne číslo.', - 'pushover_sent' => 'Pushover upozornenie odoslané.', - 'pushover_error' => 'Nastala chyba pri odosielaní Pushover upozornenia: %s', - 'pushover_error_noapp' => 'Nebolo možné odoslať testovacie upozornenie: v globálnom nastavení nebol nájdený žiaden API token.', - 'pushover_error_nokey' => 'Nebylo možné odoslať testovacie upozornenie: ve vašom profile nie je definovaný Pushover key.', - 'log_retention_period' => 'Rotácia logu', - 'log_retention_period_description' => 'Počet dní po které budú uchované logy upozornení. Vložte 0 pre vypnutie autorotáce.', - 'log_retention_days' => 'dní', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%', - 'off_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je offline', - 'off_email_body' => 'Nebolo možné spojiť sa so serverom:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Chyba: %ERROR%
    Dátum: %DATE%', - 'off_pushover_title' => 'Server \'%LABEL%\' je offline', - 'off_pushover_message' => 'Nebolo možné spojiť sa so serverom:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Chyba: %ERROR%
    Dátum: %DATE%', - 'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je online', - 'on_email_body' => "Server '%LABEL%' je opäť online, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dátum: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' je online', - 'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dátum: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Vitajte, %user_name%', - 'title_sign_in' => 'Prosím prihláste sa', - 'title_forgot' => 'Zabudnuté heslo?', - 'title_reset' => 'Obnova hesla', - 'submit' => 'Odoslať', - 'remember_me' => 'Zapamätať údaje', - 'login' => 'Prihlásiť', - 'logout' => 'Odhlásiť', - 'username' => 'Užívateľské meno', - 'password' => 'Heslo', - 'password_repeat' => 'Opakujte heslo', - 'password_forgot' => 'Zabudnuté heslo?', - 'password_reset' => 'Obnoviť heslo', - 'password_reset_email_subject' => 'Obnoviť heslo pre PHP Server Monitor', - 'password_reset_email_body' => 'Použite následujúci odkaz pre obnovenie hesla. Odkaz je platný jednu hodinu.

    %link%', - 'error_user_incorrect' => 'Zadané užívateľské meno nebolo nájdené.', - 'error_login_incorrect' => 'Prihlásenie nebolo úspešné.', - 'error_login_passwords_nomatch' => 'Zadané heslá sa nezhodujú.', - 'error_reset_invalid_link' => 'Odkaz je neplatný.', - 'success_password_forgot' => 'Na vašu e-mailovú adresu bol zaslaný e-mail s informáciami pre obnovu hesla.', - 'success_password_reset' => 'Vaše heslo bolo úspešne obnovené. Prosím prihláste sa.', - ), - 'error' => array( - '401_unauthorized' => 'Nedostatočné oprávnenia', - '401_unauthorized_description' => 'Nemáte oprávnenie zobraziť túto stránku.', - ), + 'name' => 'Slovensky - Slovak', + 'locale' => array( + '0' => 'sk_SK.UTF-8', + '1' => 'sk_SK', + '2' => 'slovak', + '3' => 'slovak', + ), + 'locale_tag' => 'sk', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Inštalácia', + 'action' => 'Akcia', + 'save' => 'Uložiť', + 'edit' => 'Upraviť', + 'delete' => 'Zmazať', + 'date' => 'Dátum', + 'message' => 'Správa', + 'yes' => 'Áno', + 'no' => 'Nie', + 'insert' => 'Vložiť', + 'add_new' => 'Pridať', + 'update_available' => 'Nová verzia - ({version}) je dostupná na http://www.phpservermonitor.org.', + 'back_to_top' => 'Späť na začiatok', + 'go_back' => 'Späť', + 'ok' => 'OK', + 'cancel' => 'Zrušiť', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Včera v %k:%M', + 'other_day_format' => '%A v %k:%M', + 'never' => 'Nikdy', + 'hours_ago' => 'pred %d hodinami', + 'an_hour_ago' => 'cca pred hodinou', + 'minutes_ago' => 'pred %d minútami', + 'a_minute_ago' => 'cca pred minútou', + 'seconds_ago' => 'pred %d sekundami', + 'a_second_ago' => 'pred chvíľou', + ), + 'menu' => array( + 'config' => 'Konfigurácia', + 'server' => 'Servery', + 'server_log' => 'Log', + 'server_status' => 'Stav', + 'server_update' => 'Aktualizácia', + 'user' => 'Užívateľ', + 'help' => 'Nápoveda', + ), + 'users' => array( + 'user' => 'Užívateľ', + 'name' => 'Meno', + 'user_name' => 'Užívateľské meno', + 'password' => 'Heslo', + 'password_repeat' => 'Rovnaké heslo (pre kontrolu)', + 'password_leave_blank' => 'Nevyplňujte ak nechcete zmeniť.', + 'level' => 'Oprávnenie', + 'level_10' => 'Administrátor', + 'level_20' => 'Užívateľ', + 'level_description' => 'Administrátor má plný prístup: môže spravovať servery, užívateľov a + upraviť globálnu konfiguráciu.
    Uživatel má práva len na čítanie a + spustiť aktualizáciu serverov, ktoré má priradené.', + 'mobile' => 'Mobil', + 'email' => 'E-mail', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover je služba umožňujúca jednoducho zasielať real-time upozornenia. Viac + na webe Pushover', + 'pushover_key' => 'Pushover Token', + 'pushover_device' => 'Pushover Zariadenie', + 'pushover_device_description' => 'Název zariadenia, na ktoré má byť správa odoslaná. Ponechajte prázdne + pre odoslanie na všetky zariadenia.', + 'delete_title' => 'Zmazať užívateľa', + 'delete_message' => 'Naozaj zmazať užívateľa \'%1\'?', + 'deleted' => 'Užívateľ zmazaný.', + 'updated' => 'Užívateľ aktualizovaný.', + 'inserted' => 'Užívateľ pridaný.', + 'profile' => 'Profil', + 'profile_updated' => 'Váš užívateľský profil bol upravený.', + 'error_user_name_bad_length' => 'Užívateľské meno musí obsahovať 2 až 64 znakov.', + 'error_user_name_invalid' => 'Užívateľské meno môže obsahovať iba písmena (a-z, A-Z), čísla (0-9), + bodky (.) a podtržítka (_).', + 'error_user_name_exists' => 'Zadané uživatelské jméno již existuje v databázi.', + 'error_user_email_bad_length' => 'E-mailová adresa musí obsahovat 5 až 255 znaků .', + 'error_user_email_invalid' => 'E-mailová adresa je neplatná', + 'error_user_level_invalid' => 'Zadané oprávnenie je neplatné.', + 'error_user_no_match' => 'Užívateľ nebol najdený.', + 'error_user_password_invalid' => 'Zadané heslo je neplatné.', + 'error_user_password_no_match' => 'Zadaná heslá sa nezhodujú.', + ), + 'log' => array( + 'title' => 'Záznamy logu', + 'type' => 'Typ', + 'status' => 'Stav', + 'email' => 'E-mail', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Žiadne záznamy', + 'clear' => 'Jasný protokol', + 'delete_title' => 'Jasný protokol', + 'delete_message' => 'Naozaj chcete odstrániť všetky záznamy?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Stav', + 'label' => 'Popis', + 'domain' => 'Doména/IP', + 'timeout' => 'Časový limit', + 'timeout_description' => 'Počet sekúnd čakania na odpoveď serveru.', + 'authentication_settings' => 'Nastavenie autentizacie', + 'optional' => 'voliteľný', + 'website_username' => 'Užívateľské meno', + 'website_username_description' => 'Užívateľské meno pre prístup na stránku. (Len Apache autorizácia je + podporovaná.)', + 'website_password' => 'Heslo', + 'website_password_description' => 'Heslo pre prístup na stránku. Heslo je v databázi šifrované.', + 'fieldset_monitoring' => 'Monitoring', + 'fieldset_permissions' => 'Oprávnenie', + 'port' => 'Port', + 'custom_port' => 'Užívateľský Port', + 'popular_ports' => 'Populárne Porty', + 'please_select' => 'Prosím vyberte', + 'type' => 'Typ', + 'type_website' => 'Web', + 'type_service' => 'Služba', + 'pattern' => 'Vyhledat reťazec/vzor', + 'pattern_description' => 'Pokiaľ reťazec nebude na webe nájdený, bude server označený ako offline. + Regulárne výrazy sú povolené.', + 'last_check' => 'Posledná kontrola', + 'last_online' => 'Naposledy online', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'Žiadne monitorované služby', + 'email' => 'E-mail', + 'send_email' => 'Odoslať e-mail', + 'sms' => 'SMS', + 'send_sms' => 'Odoslať SMS', + 'pushover' => 'Pushover', + 'users' => 'Užívatelia', + 'delete_title' => 'Zmazať server', + 'delete_message' => 'Naozaj si prajete zmazať \'%1\'?', + 'deleted' => 'Server zmazaný.', + 'updated' => 'Server aktualizovaný.', + 'inserted' => 'Server pridaný.', + 'latency' => 'Latencia', + 'latency_max' => 'Latencia (maximum)', + 'latency_min' => 'Latencia (minimum)', + 'latency_avg' => 'Latencia (priemer)', + 'uptime' => 'Uptime', + 'year' => 'Rok', + 'month' => 'Mesiac', + 'week' => 'Týždeň', + 'day' => 'Deň', + 'hour' => 'Hodina', + 'warning_threshold' => 'Stropná hranica varovania', + 'warning_threshold_description' => 'Počet neúspešných pokusov pred označením serveru ako offline.', + 'chart_last_week' => 'Minulý týždeň', + 'chart_history' => 'História', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS upozornenia sú vypnuté.', + 'warning_notifications_disabled_email' => 'E-mailové upozornenia sú vypnuté.', + 'warning_notifications_disabled_pushover' => 'Pushover upozornenia sú vypnuté.', + 'error_server_no_match' => 'Server nenájdený.', + 'error_server_label_bad_length' => 'Popisok musí obsahovať 1 až 255 znakov.', + 'error_server_ip_bad_length' => 'Doména/IP adresa musí obsahovať 1 až 255 znakov.', + 'error_server_ip_bad_service' => 'IP adresa nie je platná.', + 'error_server_ip_bad_website' => 'URL webu nie je platná.', + 'error_server_type_invalid' => 'Zvolený typ serveru nie je platný', + 'error_server_warning_threshold_invalid' => 'Hranica varovania musí byť číslo väčšie ako 0.', + ), + 'config' => array( + 'general' => 'Všeobecné', + 'language' => 'Jazyk', + 'show_update' => 'Kontrolovať aktualizácie?', + 'password_encrypt_key' => 'Šifrovací kľúč pre heslá', + 'password_encrypt_key_note' => 'Týmto klúčom sa šifrujú heslá, ktoré sa ukladajú na serveroch pre + prístup na webové stránky. Ak kľúč zmeníte, budú uložené heslá + neplatné!', + 'email_status' => 'Povoliť odosielanie e-mailu', + 'email_from_email' => 'E-mailová adresa odosielateľa', + 'email_from_name' => 'Jméno odosielateľa', + 'email_smtp' => 'Zapnúť SMTP', + 'email_smtp_host' => 'SMTP adresa', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP zabezpečenie', + 'email_smtp_security_none' => 'žiadne', + 'email_smtp_username' => 'SMTP užívateľské meno', + 'email_smtp_password' => 'SMTP heslo', + 'email_smtp_noauth' => 'Nechajte prázdne pre použitie SMTP bez hesla', + 'sms_status' => 'Povoliť odosielanie textových správ', + 'sms_gateway' => 'Brána použitá pro odosielanie správ', + 'sms_gateway_username' => 'Užívateľské meno brány', + 'sms_gateway_password' => 'Heslo brány', + 'sms_from' => 'Telefónne číslo odosielateľa', + 'pushover_status' => 'Povoliť zasielanie Pushover správ', + 'pushover_description' => 'Pushover je služba umožňujúca jednoducho zasielať real-time upozornenia. Viac + na webe Pushover', + 'pushover_clone_app' => 'Kliknite pre vytvorenie Pushover aplikácie', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Pred použitím Pushoveru sa musíte registrovať a získať API Token.', + 'alert_type' => 'Zvoľte kedy si prajete byť upozornení.', + 'alert_type_description' => 'Zmena stavu: Obdržíte upozornenie pri zmene stavu, teda: online -> + offline alebo offline -> online.

    Offline: Obdržíte upozornenie, + keď server prejde *PO PRVÝ KRÁT* do offline stavu. Napríklad, pokiaľ je cron + nastavený na 15 minút a sledovaný server bude offline mezi 01:00 a 06:00, tak + obdržíte upozornenie iba o 01:00.

    Vždy: Obdržíte upozornenie + pri každom spustení kontroly, teda aj pokiaľ bude server offline niekoľko + hodín.', + 'alert_type_status' => 'Zmena stavu', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Vždy', + 'log_status' => 'Log', + 'log_status_description' => 'Pokiaľ je Log nastavený na hodnotu TRUE, systém do neho zapíše všetky + upozornenia.', + 'log_email' => 'Logovať odoslané e-maily', + 'log_sms' => 'Logovať odoslané textové správy', + 'log_pushover' => 'Logovať odoslané Pushover správy', + 'updated' => 'Nastavenie bolo aktualizované.', + 'tab_email' => 'E-mail', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Nastavenie e-mailov', + 'settings_sms' => 'Nastavenie textových správ', + 'settings_pushover' => 'Nastavenie Pushover', + 'settings_notification' => 'Nastavenie upozornení', + 'settings_log' => 'Nastavenie logu', + 'auto_refresh' => 'Automaticky obnoviť', + 'auto_refresh_description' => 'Automaticky obnoviť stránku Servery.
    Čas v + sekundách, 0 pre vypnutie automatického obnovenia.', + 'seconds' => 'sekúnd', + 'test' => 'Test', + 'test_email' => 'E-mail bude odoslaný na adresu uvedenú v užívateľskom profile.', + 'test_sms' => 'SMS bude odoslaná na telefónne číslo uvedené v užívateľskom profile.', + 'test_pushover' => 'Pushover upozornenie bude odoslané užívateľovi/zariadeniu podľa nastavení v + užívateľskom profile.', + 'send' => 'Odoslať', + 'test_subject' => 'Test', + 'test_message' => 'Testovacia správa', + 'email_sent' => 'E-mail odoslaný', + 'email_error' => 'Chyba pri odosielaní e-mailu', + 'sms_sent' => 'SMS odoslaná', + 'sms_error' => 'Chyba pri odosielaní SMS. %s', + 'sms_error_nomobile' => 'Nebolo možné odoslať SMS: v užívateľskom profile nebylo nájdené platné + telefónne číslo.', + 'pushover_sent' => 'Pushover upozornenie odoslané.', + 'pushover_error' => 'Nastala chyba pri odosielaní Pushover upozornenia: %s', + 'pushover_error_noapp' => 'Nebolo možné odoslať testovacie upozornenie: v globálnom nastavení nebol + nájdený žiaden API token.', + 'pushover_error_nokey' => 'Nebylo možné odoslať testovacie upozornenie: ve vašom profile nie je + definovaný Pushover key.', + 'log_retention_period' => 'Rotácia logu', + 'log_retention_period_description' => 'Počet dní po které budú uchované logy upozornení. Vložte 0 pre + vypnutie autorotáce.', + 'log_retention_days' => 'dní', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' je offline: ip=%IP%, port=%PORT%. Chyba=%ERROR%', + 'off_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je offline', + 'off_email_body' => 'Nebolo možné spojiť sa so serverom:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Chyba: %ERROR%
    Dátum: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' je offline', + 'off_pushover_message' => 'Nebolo možné spojiť sa so serverom:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Chyba: %ERROR%
    Dátum: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' je online: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'DÔLEŽITÉ: Server \'%LABEL%\' je online', + 'on_email_body' => 'Server \'%LABEL%\' je opäť online, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Dátum: + %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' je online', + 'on_pushover_message' => 'Server \'%LABEL%\' je znovu online, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Dátum: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Vitajte, %user_name%', + 'title_sign_in' => 'Prosím prihláste sa', + 'title_forgot' => 'Zabudnuté heslo?', + 'title_reset' => 'Obnova hesla', + 'submit' => 'Odoslať', + 'remember_me' => 'Zapamätať údaje', + 'login' => 'Prihlásiť', + 'logout' => 'Odhlásiť', + 'username' => 'Užívateľské meno', + 'password' => 'Heslo', + 'password_repeat' => 'Opakujte heslo', + 'password_forgot' => 'Zabudnuté heslo?', + 'password_reset' => 'Obnoviť heslo', + 'password_reset_email_subject' => 'Obnoviť heslo pre PHP Server Monitor', + 'password_reset_email_body' => 'Použite následujúci odkaz pre obnovenie hesla. Odkaz je platný jednu + hodinu.

    %link%', + 'error_user_incorrect' => 'Zadané užívateľské meno nebolo nájdené.', + 'error_login_incorrect' => 'Prihlásenie nebolo úspešné.', + 'error_login_passwords_nomatch' => 'Zadané heslá sa nezhodujú.', + 'error_reset_invalid_link' => 'Odkaz je neplatný.', + 'success_password_forgot' => 'Na vašu e-mailovú adresu bol zaslaný e-mail s informáciami pre obnovu hesla.', + 'success_password_reset' => 'Vaše heslo bolo úspešne obnovené. Prosím prihláste sa.', + ), + 'error' => array( + '401_unauthorized' => 'Nedostatočné oprávnenia', + '401_unauthorized_description' => 'Nemáte oprávnenie zobraziť túto stránku.', + ), ); diff --git a/src/lang/sl_SI.lang.php b/src/lang/sl_SI.lang.php index 423f0ab6..16695895 100644 --- a/src/lang/sl_SI.lang.php +++ b/src/lang/sl_SI.lang.php @@ -1,4 +1,5 @@ 'Slovenščina - Slovenian', - 'locale' => array('sl_SI.UTF-8', 'sl_SI', 'slovenščina', 'slovenščina'), - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Install', - 'action' => 'Action', - 'save' => 'Shrani', - 'edit' => 'Uredi', - 'delete' => 'Izbriši', - 'date' => 'Datum', - 'message' => 'Sporočilo', - 'yes' => 'da', - 'no' => 'ne', - 'insert' => 'Vstavi', - 'add_new' => 'Dodaj novega', - 'update_available' => 'Na voljo je nova različica ({version}); prenesti jo je mogoče iz http://www.phpservermonitor.org.', - 'back_to_top' => 'Nazaj na vrh', - 'go_back' => 'Nazaj', - 'ok' => 'OK', - 'cancel' => 'Prekini', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'včeraj ob %k:%M', - 'other_day_format' => '%A at %k:%M', - 'never' => 'nikoli', - 'hours_ago' => 'pred %d urami', - 'an_hour_ago' => 'pred približno uro', - 'minutes_ago' => 'pred %d minutami', - 'a_minute_ago' => 'pred približno minuto', - 'seconds_ago' => 'pred %d sekundami', - 'a_second_ago' => 'pred sekundo', - ), - 'menu' => array( - 'config' => 'Nastavitve', - 'server' => 'Strežniki', - 'server_log' => 'Dnevnik', - 'server_status' => 'Status', - 'server_update' => 'Posodobitev statusa', - 'user' => 'Uporabniki', - 'help' => 'Pomoč', - ), - 'users' => array( - 'user' => 'Uporabnik', - 'name' => 'Ime', - 'user_name' => 'Uporabniško ime', - 'password' => 'Geslo', - 'password_repeat' => 'Geslo (ponovno)', - 'password_leave_blank' => 'Če ne želite spremeniti pustite prazno', - 'level' => 'Nivo dostopa', - 'level_10' => 'Administrator', - 'level_20' => 'Uporabnik', - 'level_description' => 'Administratorji imajo poln dostop: lahko upravljajo strežnike, uporabnike in urejajo globalne nastavitve.
    Uporabniki lahko samo vidijo status in poganjajo posodobitev statusa za strežnike, ki so jim bili dodeljeni.', - 'mobile' => 'Mobilni telefon', - 'email' => 'E-pošta', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času. Več informacij je na voljo na njihovi spletni strani.', - 'pushover_key' => 'Pushover ključ', - 'pushover_device' => 'Pushover naprava', - 'pushover_device_description' => 'Ime naprave na katero naj se pošlje obvestilo. Če želite obvestilo poslati na vse naprave, pustite prazno.', - 'delete_title' => 'Izbriši uporabnika', - 'delete_message' => 'Ste prepričani, da želite izbrisati uporabnika \'%1\'?', - 'deleted' => 'Uporabnik izbrisan.', - 'updated' => 'Podatki uporabnika posodobljeni.', - 'inserted' => 'Uporabnik dodan.', - 'profile' => 'Profil', - 'profile_updated' => 'Vaš profil je bil posodobljen.', - 'error_user_name_bad_length' => 'Uporabniško ime mora biti dolgo med 2 in 64 znakov.', - 'error_user_name_invalid' => 'Uporabniško ime lahko vsebuje samo črke (a-z, A-Z), številke (0-9), pike (.) in podčrtaje (_).', - 'error_user_name_exists' => 'Uporabniško ime v bazi podatkov že obstaja.', - 'error_user_email_bad_length' => 'E-naslov mora biti med 5 in 255 znaki.', - 'error_user_email_invalid' => 'E-naslov ni veljaven.', - 'error_user_level_invalid' => 'Izbrani nivo dostopa za uporabnika ni veljaven.', - 'error_user_no_match' => 'Uporabnika ne najdem v bazi podatkov.', - 'error_user_password_invalid' => 'Vneseno geslo ni veljavno.', - 'error_user_password_no_match' => 'Gesli se ne ujemata.', - ), - 'log' => array( - 'title' => 'Dnevniški zapisi', - 'type' => 'Tip', - 'status' => 'Status', - 'email' => 'E-pošta', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'ni dnevniških zapisov', - 'clear' => 'Počisti dnevnik', - 'delete_title' => 'Brisanje dnevnika', - 'delete_message' => 'Ali ste prepričani, da želite izbrisati vse dnevnike?', - ), - 'servers' => array( - 'server' => 'Strežnik', - 'status' => 'Status', - 'label' => 'Ime', - 'domain' => 'Domena / IP naslov', - 'timeout' => 'Časovna omejitev', - 'timeout_description' => 'Koliko sekund naj čakam na odgovor strežnika.', - 'port' => 'Vrata', - 'type' => 'Tip', - 'type_website' => 'Spletna stran (website)', - 'type_service' => 'Storitev (service)', - 'pattern' => 'Iskani niz oz. vzorec', - 'pattern_description' => 'Če ta vzorec ne bo najden na spletni strani, bo strežnik označen kot nedelujoč. Dovoljeni so regularni izrazi.', - 'last_check' => 'Zadnje preverjanje', - 'last_online' => 'Nazadnje dostopen', - 'monitoring' => 'Spremljanje', - 'no_monitoring' => 'Se ne spremlja', - 'email' => 'E-pošta', - 'send_email' => 'Pošlji e-pošto', - 'sms' => 'SMS', - 'send_sms' => 'Pošlji SMS', - 'pushover' => 'Pushover', - 'users' => 'Uporabniki', - 'delete_title' => 'Izbriši strežnik', - 'delete_message' => 'Ste prepričani, da želite izbrisati strežnik \'%1\'?', - 'deleted' => 'Strežnik izbrisan.', - 'updated' => 'Podatki o strežniku posodobljeni.', - 'inserted' => 'Strežnik dodan.', - 'latency' => 'Zakasnitev', - 'latency_max' => 'Zakasnitev (največja)', - 'latency_min' => 'Zakasnitev (najmanjša)', - 'latency_avg' => 'Zakasnitev (povprečna)', - 'uptime' => 'Neprekinjeno delovanje', - 'year' => 'leto', - 'month' => 'mesec', - 'week' => 'teden', - 'day' => 'dan', - 'hour' => 'ura', - 'warning_threshold' => 'Prag za opozorilo', - 'warning_threshold_description' => 'Število neuspešnih preverjanj preden je strežnik označen kot nedelujoč.', - 'chart_last_week' => 'prejšnji teden', - 'chart_history' => 'Zgodovina', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%m. %d. %Y', - 'chart_long_date_format' => '%m. %d. %Y %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS obvestila so onemogočena.', - 'warning_notifications_disabled_email' => 'Obvestila po e-pošti so onemogočena.', - 'warning_notifications_disabled_pushover' => 'Pushover obvestila so onemogočena.', - 'error_server_no_match' => 'Strežnik ni najden.', - 'error_server_label_bad_length' => 'Ime mora biti med 1 in 255 znaki.', - 'error_server_ip_bad_length' => 'Domena / IP naslov mora biti med 1 in 255 znaki.', - 'error_server_ip_bad_service' => 'IP naslov ni veljaven.', - 'error_server_ip_bad_website' => 'URL naslov spletne strani ni veljaven.', - 'error_server_type_invalid' => 'Izbrani tip strežnika ni veljaven.', - 'error_server_warning_threshold_invalid' => 'Prag za opozorilo mora biti število večje od 0.', - ), - 'config' => array( - 'general' => 'Splošno', - 'language' => 'Jezik', - 'show_update' => 'Preverim za posodobitve?', - 'email_status' => 'Dovolim pošiljanje e-pošte', - 'email_from_email' => 'E-poštni naslov pošiljatelja', - 'email_from_name' => 'Ime pošiljatelja', - 'email_smtp' => 'Enable SMTP', - 'email_smtp_host' => 'SMTP strežnik', - 'email_smtp_port' => 'SMTP vrata', - 'email_smtp_security' => 'SMTP varnost', - 'email_smtp_security_none' => 'brez', - 'email_smtp_username' => 'SMTP uporabniško ime', - 'email_smtp_password' => 'SMTP geslo', - 'email_smtp_noauth' => 'Če ni potrebna overovitev, pustite prazno', - 'sms_status' => 'Dovolim pošiljanje SMS sporočil?', - 'sms_gateway' => 'Prehod za pošiljanje SMS sporočil', - 'sms_gateway_username' => 'Uporabniško ime SMS prehoda', - 'sms_gateway_password' => 'Geslo SMS prehoda', - 'sms_from' => 'Telefonska številka pošiljatelja', - 'pushover_status' => 'Dovolim pošiljanje Pushover sporočil', - 'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času. Več informacij je na voljo na njihovi spletni strani.', - 'pushover_clone_app' => 'Kliknite za ustvarjanje vaše Pushover aplikacije', - 'pushover_api_token' => 'Pushover API žeton', - 'pushover_api_token_description' => 'Pred uporabo storitve Pushover, morate na njihovi spletni strani registrirati aplikacijo, tukaj pa vnesti API žeton.', - 'alert_type' => 'Izberite kdaj naj se vam pošljejo obvestila.', - 'alert_type_description' => 'Sprememba statusa: '. - 'Obvestilo boste dobili ob vsaki spremembi statusa, torej iz delujoč -> nedelujoč ter nedelujoč -> delujoč.
    '. - '
    Nedelujoč: '. - 'Obvestilo boste dobili samo, ko se bo strežnik PRVIKRAT prenehal odzivati. Na primer:'. - 'nastavljeno imate preverjanje strežnikov vsakih 15 minut. Strežnik preneha delovati ob 13h in ostane nedelujoč do 18h. '. - 'Dobili boste obvestilo samo ob 13h.
    '. - '
    Vedno: '. - 'Obvestilo boste dobili vedno, ko se izvede skripta za preverjanje in strežnik ne deluje, pa čeprav bo strežnik nedelujoč več ur.', - 'alert_type_status' => 'Sprememba statusa', - 'alert_type_offline' => 'Nedelujoč', - 'alert_type_always' => 'Vedno', - 'log_status' => 'Beleženje statusa', - 'log_status_description' => 'Če je beleženje statusa vključeno, se bodo beležili vsi dogodki povezani s pošiljanjem obvestil.', - 'log_email' => 'Beleži e-pošto, ki jo pošilja aplikacija', - 'log_sms' => 'Beleži SMS sporočila, ki jih pošilja aplikacija', - 'log_pushover' => 'Beleži Pushover sporočila, ki jih pošilja aplikacija', - 'updated' => 'Nastavitve so bile posodobljene.', - 'tab_email' => 'E-pošta', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Nastavitve e-pošte', - 'settings_sms' => 'Nastavitve SMS sporočil', - 'settings_pushover' => 'Nastavitve Pushover sporočil', - 'settings_notification' => 'Nastavitve obvestil', - 'settings_log' => 'Hramba dnevniških zapisov', - 'auto_refresh' => 'Samodejno posodabljanje', - 'auto_refresh_description' => - 'Samodejno posodabljanje pregleda statusa strežnikov.
    '. - ''. - 'Čas v sekundah. Če je vrednost 0 se stran ne bo samodejno posodabljala.'. - '', - 'seconds' => 'sekund', - 'test' => 'Test', - 'test_email' => 'Na naslov, ki ste ga določili v vašem profilu, bo poslano e-sporočilo.', - 'test_sms' => 'Na telefonsko številko, ki ste jo določili v vašem profilu, bo poslan SMS.', - 'test_pushover' => 'Na uporabniški ključ/napravo, ki ste ju določili v vašem profilu, bo poslano Pushover sporočilo.', - 'send' => 'Pošlji', - 'test_subject' => 'Test', - 'test_message' => 'Testno sporočilo', - 'email_sent' => 'E-pošta poslana', - 'email_error' => 'Napaka pri pošiljanju e-pošte', - 'sms_sent' => 'SMS sporočilo poslano', - 'sms_error' => 'Napaka pri pošiljanju SMS sporočila. %s', - 'sms_error_nomobile' => 'Ni mogoče poslati testnega SMS sporočila: v vašem profilu ni vpisana veljavna telefonska številka.', - 'pushover_sent' => 'Pushover obvestilo poslano', - 'pushover_error' => 'Napaka pri pošiljanju Pushover sporočila: %s', - 'pushover_error_noapp' => 'Ni mogoče poslati testnega sporočila: med globalnimi nastavitvami ne najdem Pushover API žetona.', - 'pushover_error_nokey' => 'Ni mogoče poslati testnega sporočila: med vašimi nastavitvami ne najdem Pushover ključa.', - 'log_retention_period' => 'Čas hrambe podatov', - 'log_retention_period_description' => 'Število dni, ko naj se hranijo podatki o obvestilih in statusu strežnikov. Če želite podatke hraniti trajno, vnesite 0.', - 'log_retention_days' => 'dni', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Streznik \'%LABEL%\' NE deluje: IP=%IP%, vrata=%PORT%. Napaka=%ERROR%', - 'off_email_subject' => 'POMEMBNO: Strežnik \'%LABEL%\' NE deluje', - 'off_email_body' => "Pri povezovanju na streznik je prislo do napake:

    Streznik: %LABEL%
    IP: %IP%
    vrata: %PORT%
    Napaka: %ERROR%
    Datum: %DATE%", - 'off_pushover_title' => 'Streznik \'%LABEL%\' NE deluje', - 'off_pushover_message' => "Ni se mogoče povezati na naslednji streznik:

    Streznik: %LABEL%
    IP: %IP%
    Vrata: %PORT%
    Error: %ERROR%
    Datum: %DATE%", - 'on_sms' => 'Streznik \'%LABEL%\' deluje: IP=%IP%, vrata=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'OBVESTILO: Streznik \'%LABEL%\' ponovno deluje', - 'on_email_body' => "Streznik '%LABEL%' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:

    Strežnik: %LABEL%
    IP: %IP%
    Vrata: %PORT%
    Datum: %DATE%", - 'on_pushover_title' => 'Streznik \'%LABEL%\' deluje', - 'on_pushover_message' => 'Streznik \'%LABEL%\' ponovno deluje, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Vrata: %PORT%
    Datum: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Pozdravljeni, %user_name%', - 'title_sign_in' => 'Prosimo, prijavite se', - 'title_forgot' => 'Ali ste pozabili geslo?', - 'title_reset' => 'Ponastavitev gesla', - 'submit' => 'Pošlji', - 'remember_me' => 'Zapomni si me', - 'login' => 'Prijava', - 'logout' => 'Odjava', - 'username' => 'Uporabniško ime', - 'password' => 'Geslo', - 'password_repeat' => 'Geslo (ponovno)', - 'password_forgot' => 'Pozabljeno geslo?', - 'password_reset' => 'Ponastavitev gesla', - 'password_reset_email_subject' => 'Ponastavite svoje geslo za PHP Server Monitor', - 'password_reset_email_body' => 'Za ponastavitev gesla uporabite spodnjo povezavo. Pomembno: povezava poteče v 1 uri.

    %link%', - 'error_user_incorrect' => 'Vpisanega uporabniškega imena ne najdem.', - 'error_login_incorrect' => 'Podatki so napačni.', - 'error_login_passwords_nomatch' => 'Vneseno geslo ni pravilno.', - 'error_reset_invalid_link' => 'Povezava za ponastavitev gesla, ki ste jo vnesli, ni pravilna.', - 'success_password_forgot' => 'Poslano vam je bilo sporočilo z navodili za ponastavitev vašega gesla.', - 'success_password_reset' => 'Vaše geslo je bilo uspešno ponastavljeno. Prijavite se prosim.', - ), - 'error' => array( - '401_unauthorized' => 'Nepooblaščen dostop', - '401_unauthorized_description' => 'Nimate dovoljenja za ogled te strani.', - ), + 'name' => 'Slovenščina - Slovenian', + 'locale' => array( + '0' => 'sl_SI.UTF-8', + '1' => 'sl_SI', + '2' => 'slovenščina', + '3' => 'slovenščina', + ), + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Install', + 'action' => 'Action', + 'save' => 'Shrani', + 'edit' => 'Uredi', + 'delete' => 'Izbriši', + 'date' => 'Datum', + 'message' => 'Sporočilo', + 'yes' => 'da', + 'no' => 'ne', + 'insert' => 'Vstavi', + 'add_new' => 'Dodaj novega', + 'update_available' => 'Na voljo je nova različica ({version}); prenesti jo je mogoče iz http://www.phpservermonitor.org.', + 'back_to_top' => 'Nazaj na vrh', + 'go_back' => 'Nazaj', + 'ok' => 'OK', + 'cancel' => 'Prekini', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'včeraj ob %k:%M', + 'other_day_format' => '%A at %k:%M', + 'never' => 'nikoli', + 'hours_ago' => 'pred %d urami', + 'an_hour_ago' => 'pred približno uro', + 'minutes_ago' => 'pred %d minutami', + 'a_minute_ago' => 'pred približno minuto', + 'seconds_ago' => 'pred %d sekundami', + 'a_second_ago' => 'pred sekundo', + ), + 'menu' => array( + 'config' => 'Nastavitve', + 'server' => 'Strežniki', + 'server_log' => 'Dnevnik', + 'server_status' => 'Status', + 'server_update' => 'Posodobitev statusa', + 'user' => 'Uporabniki', + 'help' => 'Pomoč', + ), + 'users' => array( + 'user' => 'Uporabnik', + 'name' => 'Ime', + 'user_name' => 'Uporabniško ime', + 'password' => 'Geslo', + 'password_repeat' => 'Geslo (ponovno)', + 'password_leave_blank' => 'Če ne želite spremeniti pustite prazno', + 'level' => 'Nivo dostopa', + 'level_10' => 'Administrator', + 'level_20' => 'Uporabnik', + 'level_description' => 'Administratorji imajo poln dostop: lahko upravljajo strežnike, uporabnike in + urejajo globalne nastavitve.
    Uporabniki lahko samo vidijo status in + poganjajo posodobitev statusa za strežnike, ki so jim bili dodeljeni.', + 'mobile' => 'Mobilni telefon', + 'email' => 'E-pošta', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času. + Več informacij je na voljo na njihovi spletni + strani.', + 'pushover_key' => 'Pushover ključ', + 'pushover_device' => 'Pushover naprava', + 'pushover_device_description' => 'Ime naprave na katero naj se pošlje obvestilo. Če želite obvestilo + poslati na vse naprave, pustite prazno.', + 'delete_title' => 'Izbriši uporabnika', + 'delete_message' => 'Ste prepričani, da želite izbrisati uporabnika \'%1\'?', + 'deleted' => 'Uporabnik izbrisan.', + 'updated' => 'Podatki uporabnika posodobljeni.', + 'inserted' => 'Uporabnik dodan.', + 'profile' => 'Profil', + 'profile_updated' => 'Vaš profil je bil posodobljen.', + 'error_user_name_bad_length' => 'Uporabniško ime mora biti dolgo med 2 in 64 znakov.', + 'error_user_name_invalid' => 'Uporabniško ime lahko vsebuje samo črke (a-z, A-Z), številke (0-9), pike (.) + in podčrtaje (_).', + 'error_user_name_exists' => 'Uporabniško ime v bazi podatkov že obstaja.', + 'error_user_email_bad_length' => 'E-naslov mora biti med 5 in 255 znaki.', + 'error_user_email_invalid' => 'E-naslov ni veljaven.', + 'error_user_level_invalid' => 'Izbrani nivo dostopa za uporabnika ni veljaven.', + 'error_user_no_match' => 'Uporabnika ne najdem v bazi podatkov.', + 'error_user_password_invalid' => 'Vneseno geslo ni veljavno.', + 'error_user_password_no_match' => 'Gesli se ne ujemata.', + ), + 'log' => array( + 'title' => 'Dnevniški zapisi', + 'type' => 'Tip', + 'status' => 'Status', + 'email' => 'E-pošta', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'ni dnevniških zapisov', + 'clear' => 'Počisti dnevnik', + 'delete_title' => 'Brisanje dnevnika', + 'delete_message' => 'Ali ste prepričani, da želite izbrisati vse dnevnike?', + ), + 'servers' => array( + 'server' => 'Strežnik', + 'status' => 'Status', + 'label' => 'Ime', + 'domain' => 'Domena / IP naslov', + 'timeout' => 'Časovna omejitev', + 'timeout_description' => 'Koliko sekund naj čakam na odgovor strežnika.', + 'port' => 'Vrata', + 'type' => 'Tip', + 'type_website' => 'Spletna stran (website)', + 'type_service' => 'Storitev (service)', + 'pattern' => 'Iskani niz oz. vzorec', + 'pattern_description' => 'Če ta vzorec ne bo najden na spletni strani, bo strežnik označen kot nedelujoč. + Dovoljeni so regularni izrazi.', + 'last_check' => 'Zadnje preverjanje', + 'last_online' => 'Nazadnje dostopen', + 'monitoring' => 'Spremljanje', + 'no_monitoring' => 'Se ne spremlja', + 'email' => 'E-pošta', + 'send_email' => 'Pošlji e-pošto', + 'sms' => 'SMS', + 'send_sms' => 'Pošlji SMS', + 'pushover' => 'Pushover', + 'users' => 'Uporabniki', + 'delete_title' => 'Izbriši strežnik', + 'delete_message' => 'Ste prepričani, da želite izbrisati strežnik \'%1\'?', + 'deleted' => 'Strežnik izbrisan.', + 'updated' => 'Podatki o strežniku posodobljeni.', + 'inserted' => 'Strežnik dodan.', + 'latency' => 'Zakasnitev', + 'latency_max' => 'Zakasnitev (največja)', + 'latency_min' => 'Zakasnitev (najmanjša)', + 'latency_avg' => 'Zakasnitev (povprečna)', + 'uptime' => 'Neprekinjeno delovanje', + 'year' => 'leto', + 'month' => 'mesec', + 'week' => 'teden', + 'day' => 'dan', + 'hour' => 'ura', + 'warning_threshold' => 'Prag za opozorilo', + 'warning_threshold_description' => 'Število neuspešnih preverjanj preden je strežnik označen kot + nedelujoč.', + 'chart_last_week' => 'prejšnji teden', + 'chart_history' => 'Zgodovina', + 'chart_day_format' => '%m. %d. %Y', + 'chart_long_date_format' => '%m. %d. %Y %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS obvestila so onemogočena.', + 'warning_notifications_disabled_email' => 'Obvestila po e-pošti so onemogočena.', + 'warning_notifications_disabled_pushover' => 'Pushover obvestila so onemogočena.', + 'error_server_no_match' => 'Strežnik ni najden.', + 'error_server_label_bad_length' => 'Ime mora biti med 1 in 255 znaki.', + 'error_server_ip_bad_length' => 'Domena / IP naslov mora biti med 1 in 255 znaki.', + 'error_server_ip_bad_service' => 'IP naslov ni veljaven.', + 'error_server_ip_bad_website' => 'URL naslov spletne strani ni veljaven.', + 'error_server_type_invalid' => 'Izbrani tip strežnika ni veljaven.', + 'error_server_warning_threshold_invalid' => 'Prag za opozorilo mora biti število večje od 0.', + ), + 'config' => array( + 'general' => 'Splošno', + 'language' => 'Jezik', + 'show_update' => 'Preverim za posodobitve?', + 'email_status' => 'Dovolim pošiljanje e-pošte', + 'email_from_email' => 'E-poštni naslov pošiljatelja', + 'email_from_name' => 'Ime pošiljatelja', + 'email_smtp' => 'Enable SMTP', + 'email_smtp_host' => 'SMTP strežnik', + 'email_smtp_port' => 'SMTP vrata', + 'email_smtp_security' => 'SMTP varnost', + 'email_smtp_security_none' => 'brez', + 'email_smtp_username' => 'SMTP uporabniško ime', + 'email_smtp_password' => 'SMTP geslo', + 'email_smtp_noauth' => 'Če ni potrebna overovitev, pustite prazno', + 'sms_status' => 'Dovolim pošiljanje SMS sporočil?', + 'sms_gateway' => 'Prehod za pošiljanje SMS sporočil', + 'sms_gateway_username' => 'Uporabniško ime SMS prehoda', + 'sms_gateway_password' => 'Geslo SMS prehoda', + 'sms_from' => 'Telefonska številka pošiljatelja', + 'pushover_status' => 'Dovolim pošiljanje Pushover sporočil', + 'pushover_description' => 'Pushover je storitev, ki omogoča enostavno prejemanje obvestil v realnem času. + Več informacij je na voljo na njihovi spletni + strani.', + 'pushover_clone_app' => 'Kliknite za ustvarjanje vaše Pushover aplikacije', + 'pushover_api_token' => 'Pushover API žeton', + 'pushover_api_token_description' => 'Pred uporabo storitve Pushover, morate na njihovi spletni strani registrirati aplikacijo, + tukaj pa vnesti API žeton.', + 'alert_type' => 'Izberite kdaj naj se vam pošljejo obvestila.', + 'alert_type_description' => 'Sprememba statusa: Obvestilo boste dobili ob vsaki spremembi statusa, + torej iz delujoč -> nedelujoč ter nedelujoč -> delujoč.

    Nedelujoč: Obvestilo boste dobili samo, ko se bo strežnik PRVIKRAT + prenehal odzivati. Na primer:nastavljeno imate preverjanje strežnikov vsakih 15 + minut. Strežnik preneha delovati ob 13h in ostane nedelujoč do 18h. Dobili + boste obvestilo samo ob 13h.

    Vedno: Obvestilo boste dobili vedno, + ko se izvede skripta za preverjanje in strežnik ne deluje, pa čeprav bo + strežnik nedelujoč več ur.', + 'alert_type_status' => 'Sprememba statusa', + 'alert_type_offline' => 'Nedelujoč', + 'alert_type_always' => 'Vedno', + 'log_status' => 'Beleženje statusa', + 'log_status_description' => 'Če je beleženje statusa vključeno, se bodo beležili vsi dogodki povezani s + pošiljanjem obvestil.', + 'log_email' => 'Beleži e-pošto, ki jo pošilja aplikacija', + 'log_sms' => 'Beleži SMS sporočila, ki jih pošilja aplikacija', + 'log_pushover' => 'Beleži Pushover sporočila, ki jih pošilja aplikacija', + 'updated' => 'Nastavitve so bile posodobljene.', + 'tab_email' => 'E-pošta', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Nastavitve e-pošte', + 'settings_sms' => 'Nastavitve SMS sporočil', + 'settings_pushover' => 'Nastavitve Pushover sporočil', + 'settings_notification' => 'Nastavitve obvestil', + 'settings_log' => 'Hramba dnevniških zapisov', + 'auto_refresh' => 'Samodejno posodabljanje', + 'auto_refresh_description' => 'Samodejno posodabljanje pregleda statusa strežnikov.
    Čas v sekundah. Če je vrednost 0 se stran ne bo samodejno + posodabljala.', + 'seconds' => 'sekund', + 'test' => 'Test', + 'test_email' => 'Na naslov, ki ste ga določili v vašem profilu, bo poslano e-sporočilo.', + 'test_sms' => 'Na telefonsko številko, ki ste jo določili v vašem profilu, bo poslan SMS.', + 'test_pushover' => 'Na uporabniški ključ/napravo, ki ste ju določili v vašem profilu, bo poslano Pushover + sporočilo.', + 'send' => 'Pošlji', + 'test_subject' => 'Test', + 'test_message' => 'Testno sporočilo', + 'email_sent' => 'E-pošta poslana', + 'email_error' => 'Napaka pri pošiljanju e-pošte', + 'sms_sent' => 'SMS sporočilo poslano', + 'sms_error' => 'Napaka pri pošiljanju SMS sporočila. %s', + 'sms_error_nomobile' => 'Ni mogoče poslati testnega SMS sporočila: v vašem profilu ni vpisana veljavna + telefonska številka.', + 'pushover_sent' => 'Pushover obvestilo poslano', + 'pushover_error' => 'Napaka pri pošiljanju Pushover sporočila: %s', + 'pushover_error_noapp' => 'Ni mogoče poslati testnega sporočila: med globalnimi nastavitvami ne najdem + Pushover API žetona.', + 'pushover_error_nokey' => 'Ni mogoče poslati testnega sporočila: med vašimi nastavitvami ne najdem Pushover + ključa.', + 'log_retention_period' => 'Čas hrambe podatov', + 'log_retention_period_description' => 'Število dni, ko naj se hranijo podatki o obvestilih in statusu + strežnikov. Če želite podatke hraniti trajno, vnesite 0.', + 'log_retention_days' => 'dni', + ), + 'notifications' => array( + 'off_sms' => 'Streznik \'%LABEL%\' NE deluje: IP=%IP%, vrata=%PORT%. Napaka=%ERROR%', + 'off_email_subject' => 'POMEMBNO: Strežnik \'%LABEL%\' NE deluje', + 'off_email_body' => 'Pri povezovanju na streznik je prislo do napake:

    Streznik: %LABEL%
    IP: + %IP%
    vrata: %PORT%
    Napaka: %ERROR%
    Datum: %DATE%', + 'off_pushover_title' => 'Streznik \'%LABEL%\' NE deluje', + 'off_pushover_message' => 'Ni se mogoče povezati na naslednji streznik:

    Streznik: %LABEL%
    IP: + %IP%
    Vrata: %PORT%
    Error: %ERROR%
    Datum: %DATE%', + 'on_sms' => 'Streznik \'%LABEL%\' deluje: IP=%IP%, vrata=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'OBVESTILO: Streznik \'%LABEL%\' ponovno deluje', + 'on_email_body' => 'Streznik \'%LABEL%\' ponovno deluje, it was down for + %LAST_OFFLINE_DURATION%:

    Strežnik: %LABEL%
    IP: %IP%
    Vrata: %PORT%
    Datum: + %DATE%', + 'on_pushover_title' => 'Streznik \'%LABEL%\' deluje', + 'on_pushover_message' => 'Streznik \'%LABEL%\' ponovno deluje, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Vrata: + %PORT%
    Datum: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Pozdravljeni, %user_name%', + 'title_sign_in' => 'Prosimo, prijavite se', + 'title_forgot' => 'Ali ste pozabili geslo?', + 'title_reset' => 'Ponastavitev gesla', + 'submit' => 'Pošlji', + 'remember_me' => 'Zapomni si me', + 'login' => 'Prijava', + 'logout' => 'Odjava', + 'username' => 'Uporabniško ime', + 'password' => 'Geslo', + 'password_repeat' => 'Geslo (ponovno)', + 'password_forgot' => 'Pozabljeno geslo?', + 'password_reset' => 'Ponastavitev gesla', + 'password_reset_email_subject' => 'Ponastavite svoje geslo za PHP Server Monitor', + 'password_reset_email_body' => 'Za ponastavitev gesla uporabite spodnjo povezavo. Pomembno: povezava poteče v + 1 uri.

    %link%', + 'error_user_incorrect' => 'Vpisanega uporabniškega imena ne najdem.', + 'error_login_incorrect' => 'Podatki so napačni.', + 'error_login_passwords_nomatch' => 'Vneseno geslo ni pravilno.', + 'error_reset_invalid_link' => 'Povezava za ponastavitev gesla, ki ste jo vnesli, ni pravilna.', + 'success_password_forgot' => 'Poslano vam je bilo sporočilo z navodili za ponastavitev vašega gesla.', + 'success_password_reset' => 'Vaše geslo je bilo uspešno ponastavljeno. Prijavite se prosim.', + ), + 'error' => array( + '401_unauthorized' => 'Nepooblaščen dostop', + '401_unauthorized_description' => 'Nimate dovoljenja za ogled te strani.', + ), ); diff --git a/src/lang/sv_SE.lang.php b/src/lang/sv_SE.lang.php index 57840de6..3c6ec8a6 100644 --- a/src/lang/sv_SE.lang.php +++ b/src/lang/sv_SE.lang.php @@ -1,4 +1,5 @@ 'Svenska - Swedish', - 'locale' => array('sv_SE.UTF-8', 'sv_SE', 'svenska', 'svenska-SE'), - 'locale_tag' => 'sv', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Installera', - 'action' => 'Åtgärd', - 'save' => 'Spara', - 'edit' => 'Redigera', - 'delete' => 'Radera', - 'date' => 'Datum', - 'message' => 'Meddelande', - 'yes' => 'Ja', - 'no' => 'Nej', - 'insert' => 'Infoga', - 'add_new' => 'Lägg till', - 'update_available' => 'En ny version ({version}) finns tillgänglig från http://www.phpservermonitor.org.', - 'back_to_top' => 'Gå upp', - 'go_back' => 'Gå tillbaka', - 'ok' => 'OK', - 'cancel' => 'Avbryt', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Igår kl %k:%M', - 'other_day_format' => '%A kl %k:%M', - 'never' => 'Aldrig', - 'hours_ago' => '%d timmar sedan', - 'an_hour_ago' => 'ungefär en timme sedan', - 'minutes_ago' => '%d minuter sedan', - 'a_minute_ago' => 'ungefär en minut sen', - 'seconds_ago' => '%d sekunder sedan', - 'a_second_ago' => 'en sekund sedan', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Inställningar', - 'server' => 'Servrar', - 'server_log' => 'Logg', - 'server_status' => 'Status', - 'server_update' => 'Uppdatera', - 'user' => 'Användare', - 'help' => 'Hjälp', - ), - 'users' => array( - 'user' => 'Användare', - 'name' => 'Namn', - 'user_name' => 'Användarnamn', - 'password' => 'Lösenord', - 'password_repeat' => 'Upprepa lösenord', - 'password_leave_blank' => 'Lämna blankt för att inte ändra ', - 'level' => 'Nivå', - 'level_10' => 'Administratör', - 'level_20' => 'Användare', - 'level_description' => 'Administratörer har fulla rättigheter: de kan hantera servrar, användare och redigera gemensamma inställningar.
    Användare kan bara se och köra uppdateraren för de servrar som de blivit tilldelade.', - 'mobile' => 'Mobilnummer', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover är en tjänst som skickar meddelande i realtid. Se deras webbsida för mer information.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Enhetsnman att skicka meddelande till. Lämna tomt för att skicka till alla enheter.', - 'delete_title' => 'Radera användare', - 'delete_message' => 'Är du säker att du vill radera användare \'%1\'?', - 'deleted' => 'Användare raderad.', - 'updated' => 'Användare uppdaterad.', - 'inserted' => 'Användare tillagd.', - 'profile' => 'Profil', - 'profile_updated' => 'Din profil har uppdaterats.', - 'error_user_name_bad_length' => 'Användarnamn måste vara mellan 2 och 64 tecken.', - 'error_user_name_invalid' => 'Användarnamnet får bara innehålla bokstäver (a-z, A-Z), siffror (0-9), prickar (.) and understreck (_).', - 'error_user_name_exists' => 'Användarnamnet används redan.', - 'error_user_email_bad_length' => 'Email-adressen måste vara mellan 5 och 255 tecken.', - 'error_user_email_invalid' => 'Email-adressen är ogiltig.', - 'error_user_level_invalid' => 'Behörighetsnivån är ogiltig.', - 'error_user_no_match' => 'Användaren kunde inte hittas i databasen.', - 'error_user_password_invalid' => 'Lösenordet är ogiltigt.', - 'error_user_password_no_match' => 'Lösenorden stämmer inte överens.', - ), - 'log' => array( - 'title' => 'Logg-poster', - 'type' => 'Typ', - 'status' => 'Status', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Inga loggar', - 'clear' => 'Tydlig logg', - 'delete_title' => 'Tydlig logg', - 'delete_message' => 'Är du säker på att du vill radera alla loggar?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Status', - 'label' => 'Namn', - 'domain' => 'Domän/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Antal sekunder att vänta på svar.', - 'port' => 'Port', - 'type' => 'Typ', - 'type_website' => 'Website', - 'type_service' => 'Service', - 'pattern' => 'Hitta sträng/mönster', - 'pattern_description' => 'Om detta mönster inte hittas i svaret kommer servern att markeras offline. "Regular expressions" är tillåtna.', - 'last_check' => 'Senaste kontroll', - 'last_online' => 'Senast online', - 'last_offline' => 'Senast offline', - 'monitoring' => 'Övervakas', - 'no_monitoring' => 'Övervakas inte', - 'email' => 'Email', - 'send_email' => 'Skicka Email', - 'sms' => 'SMS', - 'send_sms' => 'Skicka SMS', - 'pushover' => 'Pushover', - 'users' => 'Användare', - 'delete_title' => 'Radera server', - 'delete_message' => 'Är du säker att du vill radera server \'%1\'?', - 'deleted' => 'Server raderad.', - 'updated' => 'Server uppdaterad.', - 'inserted' => 'Server tillagd.', - 'latency' => 'Fördröjning', - 'latency_max' => 'Fördröjning (maximum)', - 'latency_min' => 'Fördröjning (minimum)', - 'latency_avg' => 'Fördröjning (medel)', - 'uptime' => 'Uptime', - 'year' => 'År', - 'month' => 'Månad', - 'week' => 'Vecka', - 'day' => 'Dag', - 'hour' => 'Timme', - 'warning_threshold' => 'Varningströskel', - 'warning_threshold_description' => 'Antalet misslyckade kontroller innan server markeras som offline.', - 'chart_last_week' => 'Senaste veckan', - 'chart_history' => 'Historik', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS-meddelande är avstängda.', - 'warning_notifications_disabled_email' => 'Email-meddelande är avstängda.', - 'warning_notifications_disabled_pushover' => 'Pushover-meddelande är avstängda.', - 'error_server_no_match' => 'Server kan inte hittas.', - 'error_server_label_bad_length' => 'Namn måste vara mellan 1 och 255 tecken.', - 'error_server_ip_bad_length' => 'Domän / IP måste vara mellan 1 och 255 tecken.', - 'error_server_ip_bad_service' => 'IP-adressen är ogiltig.', - 'error_server_ip_bad_website' => 'URL:en är ogiltig.', - 'error_server_type_invalid' => 'Vald servertyp är ogiltig.', - 'error_server_warning_threshold_invalid' => 'Varningströskel skall vara ett heltal större än 0.', - ), - 'config' => array( - 'general' => 'Allmänt', - 'language' => 'Språk', - 'show_update' => 'Sök efter uppdateringar?', - 'email_status' => 'Tillåt email', - 'email_from_email' => 'Email avsändaradress', - 'email_from_name' => 'Email från namn', - 'email_smtp' => 'Aktivera SMTP', - 'email_smtp_host' => 'SMTP värd', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP säkerhet', - 'email_smtp_security_none' => 'Ingen', - 'email_smtp_username' => 'SMTP användarnamn', - 'email_smtp_password' => 'SMTP lösenord', - 'email_smtp_noauth' => 'Lämna blank för att inte autentisera', - 'sms_status' => 'Tillåt SMS', - 'sms_gateway' => 'Gateway för SMS', - 'sms_gateway_username' => 'Gateway användarnamn', - 'sms_gateway_password' => 'Gateway lösenord', - 'sms_from' => 'Avsändarens telefonnummer', - 'pushover_status' => 'Tillåt Pushover-meddelande', - 'pushover_description' => 'Pushover är en tjänst som skickar meddelande i realtid. Se deras webbsida för mer info.', - 'pushover_clone_app' => 'Klicka här för att skapa din Pushover app', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Innan du kan använda Pushover behöver du registrera en App på deras webbsida och skriva in App API Token här.', - 'alert_type' => 'Välj när du vill bli meddelad.', - 'alert_type_description' => 'Statusförändring: '. - 'Du får ett meddelande när status ändras. Så från online -> offline eller offline -> online.
    '. - '
    Offline: '. - 'Du får ett meddelande när en server går offline *FÖR FÖRSTA GÅNGEN* Exempelvis, '. - 'ditt cronjob körs var 15 minut och din server går ned kl 1 och är nere till kl 6. '. - 'Du kommer få 1 meddelande kl 1 och inga mer.
    '. - '
    Alltid: '. - 'Du kommer få ett meddelande varje gång kontrollen görs, även om servern har varit offline under en längre tid.', - 'alert_type_status' => 'Statusförändring', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Alltid', - 'log_status' => 'Statusloggning', - 'log_status_description' => 'Om statusloggning är TRUE, kommer alla händelser som triggar ett meddelande att loggas.', - 'log_email' => 'Logga email', - 'log_sms' => 'Logga SMS', - 'log_pushover' => 'Logga Pushover-meddelande', - 'updated' => 'Inställningarna har uppdaterats.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Email-inställningar', - 'settings_sms' => 'SMS-inställningar', - 'settings_pushover' => 'Pushover-inställningar', - 'settings_notification' => 'Meddelande-inställningar', - 'settings_log' => 'Logg-inställningar', - 'auto_refresh' => 'Auto-uppdatera', - 'auto_refresh_description' => - 'Auto-uppdatera status-sidan.
    '. - ''. - 'Tid i sekunder, om "0" så uppdateras sidan inte automatiskt.'. - '', - 'seconds' => 'sekunder', - 'test' => 'Test', - 'test_email' => 'Ett emial kommer skickas till adressen i din profil.', - 'test_sms' => 'Ett SMS kommer skickas till mobilnumret i din profil.', - 'test_pushover' => 'Ett Pushover-meddelande kommer skickas till "user key/device" i din profil.', - 'send' => 'Skicka', - 'test_subject' => 'Test', - 'test_message' => 'Testmeddelande', - 'email_sent' => 'Email skickat', - 'email_error' => 'Sändning av email misslyckades', - 'sms_sent' => 'Sms skickat', - 'sms_error' => 'Sändning av SMS misslyckades. %s', - 'sms_error_nomobile' => 'Kan inte skicka test-SMS: det finns inget giltigt mobilnummer i din profil.', - 'pushover_sent' => 'Pushover-meddelande skickat', - 'pushover_error' => 'Ett fel uppstod vid sändning av Pushover-meddelande: %s', - 'pushover_error_noapp' => 'Kan inte skicka test-meddelande: Ingen Pushover App API token hittades i gemensamma inställningar.', - 'pushover_error_nokey' => 'Kan inte skicka test-meddelande: Ingen Pushover key finns i din profil.', - 'log_retention_period' => 'Loggar sparas', - 'log_retention_period_description' => 'Antal dagar loggar över meddelande och uptime sparas. 0 innebär att loggrensning är avstängd.', - 'log_retention_days' => 'dagar', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' är NERE: ip=%IP%, port=%PORT%. Fel=%ERROR%', - 'off_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är NERE', - 'off_email_body' => "Kunde inte ansluta till följande server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fel: %ERROR%
    Tid: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' är NERE', - 'off_pushover_message' => "Kunde inte ansluta till följande server:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Fel: %ERROR%
    Tid: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' är UPPE: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är UPPE', - 'on_email_body' => "Server '%LABEL%' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tid: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' är UPPE', - 'on_pushover_message' => 'Server \'%LABEL%\' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tid: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Välkommen, %user_name%', - 'title_sign_in' => 'Logga in', - 'title_forgot' => 'Glömt ditt lösenord?', - 'title_reset' => 'Återställ ditt lösenord', - 'submit' => 'Skicka', - 'remember_me' => 'Kom ihåg mig', - 'login' => 'Logga in', - 'logout' => 'Logga ut', - 'username' => 'Användarnamn', - 'password' => 'Lösenord', - 'password_repeat' => 'Upprepa lösenord', - 'password_forgot' => 'Glömt lösenord?', - 'password_reset' => 'Återställ lösenord', - 'password_reset_email_subject' => 'Password reset for PHP Server Monitor', - 'password_reset_email_body' => 'Använd följande länk för att återställa ditt lösenord. Tänk på att länken bara är giltig 1 timme.

    %link%', - 'error_user_incorrect' => 'Användaren kunde inte hittas.', - 'error_login_incorrect' => 'Informationen är felaktig.', - 'error_login_passwords_nomatch' => 'Lösenorden stämmer inte överens.', - 'error_reset_invalid_link' => 'Reset-länken är ogiltig.', - 'success_password_forgot' => 'Ett email med information om hur du nollställer ditt lösenord har skickats.', - 'success_password_reset' => 'Ditt lösenord har nollställts. Var god logga in.', - ), - 'error' => array( - '401_unauthorized' => 'Unauthorized', - '401_unauthorized_description' => 'You do not have the privileges to view this page.', - ), + 'name' => 'Svenska - Swedish', + 'locale' => array( + '0' => 'sv_SE.UTF-8', + '1' => 'sv_SE', + '2' => 'svenska', + '3' => 'svenska-SE', + ), + 'locale_tag' => 'sv', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Installera', + 'action' => 'Åtgärd', + 'save' => 'Spara', + 'edit' => 'Redigera', + 'delete' => 'Radera', + 'date' => 'Datum', + 'message' => 'Meddelande', + 'yes' => 'Ja', + 'no' => 'Nej', + 'insert' => 'Infoga', + 'add_new' => 'Lägg till', + 'update_available' => 'En ny version ({version}) finns tillgänglig från http://www.phpservermonitor.org.', + 'back_to_top' => 'Gå upp', + 'go_back' => 'Gå tillbaka', + 'ok' => 'OK', + 'cancel' => 'Avbryt', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Igår kl %k:%M', + 'other_day_format' => '%A kl %k:%M', + 'never' => 'Aldrig', + 'hours_ago' => '%d timmar sedan', + 'an_hour_ago' => 'ungefär en timme sedan', + 'minutes_ago' => '%d minuter sedan', + 'a_minute_ago' => 'ungefär en minut sen', + 'seconds_ago' => '%d sekunder sedan', + 'a_second_ago' => 'en sekund sedan', + ), + 'menu' => array( + 'config' => 'Inställningar', + 'server' => 'Servrar', + 'server_log' => 'Logg', + 'server_status' => 'Status', + 'server_update' => 'Uppdatera', + 'user' => 'Användare', + 'help' => 'Hjälp', + ), + 'users' => array( + 'user' => 'Användare', + 'name' => 'Namn', + 'user_name' => 'Användarnamn', + 'password' => 'Lösenord', + 'password_repeat' => 'Upprepa lösenord', + 'password_leave_blank' => 'Lämna blankt för att inte ändra ', + 'level' => 'Nivå', + 'level_10' => 'Administratör', + 'level_20' => 'Användare', + 'level_description' => 'Administratörer har fulla rättigheter: de kan hantera servrar, användare och + redigera gemensamma inställningar.
    Användare kan bara se och köra + uppdateraren för de servrar som de blivit tilldelade.', + 'mobile' => 'Mobilnummer', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover är en tjänst som skickar meddelande i realtid. Se deras webbsida för mer information.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Enhetsnman att skicka meddelande till. Lämna tomt för att skicka till alla + enheter.', + 'delete_title' => 'Radera användare', + 'delete_message' => 'Är du säker att du vill radera användare \'%1\'?', + 'deleted' => 'Användare raderad.', + 'updated' => 'Användare uppdaterad.', + 'inserted' => 'Användare tillagd.', + 'profile' => 'Profil', + 'profile_updated' => 'Din profil har uppdaterats.', + 'error_user_name_bad_length' => 'Användarnamn måste vara mellan 2 och 64 tecken.', + 'error_user_name_invalid' => 'Användarnamnet får bara innehålla bokstäver (a-z, A-Z), siffror (0-9), + prickar (.) and understreck (_).', + 'error_user_name_exists' => 'Användarnamnet används redan.', + 'error_user_email_bad_length' => 'Email-adressen måste vara mellan 5 och 255 tecken.', + 'error_user_email_invalid' => 'Email-adressen är ogiltig.', + 'error_user_level_invalid' => 'Behörighetsnivån är ogiltig.', + 'error_user_no_match' => 'Användaren kunde inte hittas i databasen.', + 'error_user_password_invalid' => 'Lösenordet är ogiltigt.', + 'error_user_password_no_match' => 'Lösenorden stämmer inte överens.', + ), + 'log' => array( + 'title' => 'Logg-poster', + 'type' => 'Typ', + 'status' => 'Status', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Inga loggar', + 'clear' => 'Tydlig logg', + 'delete_title' => 'Tydlig logg', + 'delete_message' => 'Är du säker på att du vill radera alla loggar?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Status', + 'label' => 'Namn', + 'domain' => 'Domän/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Antal sekunder att vänta på svar.', + 'port' => 'Port', + 'type' => 'Typ', + 'type_website' => 'Website', + 'type_service' => 'Service', + 'pattern' => 'Hitta sträng/mönster', + 'pattern_description' => 'Om detta mönster inte hittas i svaret kommer servern att markeras offline. "Regular + expressions" är tillåtna.', + 'last_check' => 'Senaste kontroll', + 'last_online' => 'Senast online', + 'last_offline' => 'Senast offline', + 'monitoring' => 'Övervakas', + 'no_monitoring' => 'Övervakas inte', + 'email' => 'Email', + 'send_email' => 'Skicka Email', + 'sms' => 'SMS', + 'send_sms' => 'Skicka SMS', + 'pushover' => 'Pushover', + 'users' => 'Användare', + 'delete_title' => 'Radera server', + 'delete_message' => 'Är du säker att du vill radera server \'%1\'?', + 'deleted' => 'Server raderad.', + 'updated' => 'Server uppdaterad.', + 'inserted' => 'Server tillagd.', + 'latency' => 'Fördröjning', + 'latency_max' => 'Fördröjning (maximum)', + 'latency_min' => 'Fördröjning (minimum)', + 'latency_avg' => 'Fördröjning (medel)', + 'uptime' => 'Uptime', + 'year' => 'År', + 'month' => 'Månad', + 'week' => 'Vecka', + 'day' => 'Dag', + 'hour' => 'Timme', + 'warning_threshold' => 'Varningströskel', + 'warning_threshold_description' => 'Antalet misslyckade kontroller innan server markeras som offline.', + 'chart_last_week' => 'Senaste veckan', + 'chart_history' => 'Historik', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS-meddelande är avstängda.', + 'warning_notifications_disabled_email' => 'Email-meddelande är avstängda.', + 'warning_notifications_disabled_pushover' => 'Pushover-meddelande är avstängda.', + 'error_server_no_match' => 'Server kan inte hittas.', + 'error_server_label_bad_length' => 'Namn måste vara mellan 1 och 255 tecken.', + 'error_server_ip_bad_length' => 'Domän / IP måste vara mellan 1 och 255 tecken.', + 'error_server_ip_bad_service' => 'IP-adressen är ogiltig.', + 'error_server_ip_bad_website' => 'URL:en är ogiltig.', + 'error_server_type_invalid' => 'Vald servertyp är ogiltig.', + 'error_server_warning_threshold_invalid' => 'Varningströskel skall vara ett heltal större än 0.', + ), + 'config' => array( + 'general' => 'Allmänt', + 'language' => 'Språk', + 'show_update' => 'Sök efter uppdateringar?', + 'email_status' => 'Tillåt email', + 'email_from_email' => 'Email avsändaradress', + 'email_from_name' => 'Email från namn', + 'email_smtp' => 'Aktivera SMTP', + 'email_smtp_host' => 'SMTP värd', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP säkerhet', + 'email_smtp_security_none' => 'Ingen', + 'email_smtp_username' => 'SMTP användarnamn', + 'email_smtp_password' => 'SMTP lösenord', + 'email_smtp_noauth' => 'Lämna blank för att inte autentisera', + 'sms_status' => 'Tillåt SMS', + 'sms_gateway' => 'Gateway för SMS', + 'sms_gateway_username' => 'Gateway användarnamn', + 'sms_gateway_password' => 'Gateway lösenord', + 'sms_from' => 'Avsändarens telefonnummer', + 'pushover_status' => 'Tillåt Pushover-meddelande', + 'pushover_description' => 'Pushover är en tjänst som skickar meddelande i realtid. Se deras webbsida för mer info.', + 'pushover_clone_app' => 'Klicka här för att skapa din Pushover app', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Innan du kan använda Pushover behöver du registrera en App på deras webbsida och skriva in App + API Token här.', + 'alert_type' => 'Välj när du vill bli meddelad.', + 'alert_type_description' => 'Statusförändring: Du får ett meddelande när status ändras. Så från + online -> offline eller offline -> online.

    Offline: Du får ett + meddelande när en server går offline *FÖR FÖRSTA GÅNGEN* Exempelvis, ditt + cronjob körs var 15 minut och din server går ned kl 1 och är nere till kl 6. + Du kommer få 1 meddelande kl 1 och inga mer.

    Alltid: Du kommer få + ett meddelande varje gång kontrollen görs, även om servern har varit offline + under en längre tid.', + 'alert_type_status' => 'Statusförändring', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Alltid', + 'log_status' => 'Statusloggning', + 'log_status_description' => 'Om statusloggning är TRUE, kommer alla händelser som triggar ett meddelande att + loggas.', + 'log_email' => 'Logga email', + 'log_sms' => 'Logga SMS', + 'log_pushover' => 'Logga Pushover-meddelande', + 'updated' => 'Inställningarna har uppdaterats.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Email-inställningar', + 'settings_sms' => 'SMS-inställningar', + 'settings_pushover' => 'Pushover-inställningar', + 'settings_notification' => 'Meddelande-inställningar', + 'settings_log' => 'Logg-inställningar', + 'auto_refresh' => 'Auto-uppdatera', + 'auto_refresh_description' => 'Auto-uppdatera status-sidan.
    Tid i sekunder, om "0" så + uppdateras sidan inte automatiskt.', + 'seconds' => 'sekunder', + 'test' => 'Test', + 'test_email' => 'Ett emial kommer skickas till adressen i din profil.', + 'test_sms' => 'Ett SMS kommer skickas till mobilnumret i din profil.', + 'test_pushover' => 'Ett Pushover-meddelande kommer skickas till "user key/device" i din profil.', + 'send' => 'Skicka', + 'test_subject' => 'Test', + 'test_message' => 'Testmeddelande', + 'email_sent' => 'Email skickat', + 'email_error' => 'Sändning av email misslyckades', + 'sms_sent' => 'Sms skickat', + 'sms_error' => 'Sändning av SMS misslyckades. %s', + 'sms_error_nomobile' => 'Kan inte skicka test-SMS: det finns inget giltigt mobilnummer i din profil.', + 'pushover_sent' => 'Pushover-meddelande skickat', + 'pushover_error' => 'Ett fel uppstod vid sändning av Pushover-meddelande: %s', + 'pushover_error_noapp' => 'Kan inte skicka test-meddelande: Ingen Pushover App API token hittades i gemensamma + inställningar.', + 'pushover_error_nokey' => 'Kan inte skicka test-meddelande: Ingen Pushover key finns i din profil.', + 'log_retention_period' => 'Loggar sparas', + 'log_retention_period_description' => 'Antal dagar loggar över meddelande och uptime sparas. 0 innebär att + loggrensning är avstängd.', + 'log_retention_days' => 'dagar', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' är NERE: ip=%IP%, port=%PORT%. Fel=%ERROR%', + 'off_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är NERE', + 'off_email_body' => 'Kunde inte ansluta till följande server:

    Server: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Fel: %ERROR%
    Tid: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' är NERE', + 'off_pushover_message' => 'Kunde inte ansluta till följande server:

    Server: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Fel: %ERROR%
    Tid: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' är UPPE: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'VIKTIGT: Server \'%LABEL%\' är UPPE', + 'on_email_body' => 'Server \'%LABEL%\' är uppe igen, it was down for %LAST_OFFLINE_DURATION%:

    Server: + %LABEL%
    IP: %IP%
    Port: %PORT%
    Tid: %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' är UPPE', + 'on_pushover_message' => 'Server \'%LABEL%\' är uppe igen, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tid: + %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Välkommen, %user_name%', + 'title_sign_in' => 'Logga in', + 'title_forgot' => 'Glömt ditt lösenord?', + 'title_reset' => 'Återställ ditt lösenord', + 'submit' => 'Skicka', + 'remember_me' => 'Kom ihåg mig', + 'login' => 'Logga in', + 'logout' => 'Logga ut', + 'username' => 'Användarnamn', + 'password' => 'Lösenord', + 'password_repeat' => 'Upprepa lösenord', + 'password_forgot' => 'Glömt lösenord?', + 'password_reset' => 'Återställ lösenord', + 'password_reset_email_subject' => 'Password reset for PHP Server Monitor', + 'password_reset_email_body' => 'Använd följande länk för att återställa ditt + lösenord. Tänk på att länken bara är giltig 1 + timme.

    %link%', + 'error_user_incorrect' => 'Användaren kunde inte hittas.', + 'error_login_incorrect' => 'Informationen är felaktig.', + 'error_login_passwords_nomatch' => 'Lösenorden stämmer inte överens.', + 'error_reset_invalid_link' => 'Reset-länken är ogiltig.', + 'success_password_forgot' => 'Ett email med information om hur du nollställer ditt lösenord har skickats.', + 'success_password_reset' => 'Ditt lösenord har nollställts. Var god logga in.', + ), + 'error' => array( + '401_unauthorized' => 'Unauthorized', + '401_unauthorized_description' => 'You do not have the privileges to view this page.', + ), ); diff --git a/src/lang/tr_TR.lang.php b/src/lang/tr_TR.lang.php index 059be5a4..78ac5131 100644 --- a/src/lang/tr_TR.lang.php +++ b/src/lang/tr_TR.lang.php @@ -1,4 +1,5 @@ 'Türkçe - Turkish', - 'locale' => array('tr_TR.UTF-8', 'tr_TR', 'turkish', 'turkish-tr'), - 'locale_tag' => 'tr', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Yükle', - 'action' => 'Aksiyon', - 'save' => 'Kaydet', - 'edit' => 'Düzenle', - 'delete' => 'Sil', - 'date' => 'Tarih', - 'message' => 'Mesaj', - 'yes' => 'Evet', - 'no' => 'Hayır', - 'insert' => 'Ekle', - 'add_new' => 'Yeni ekle', - 'update_available' => '({version}) sürümü şu anda http://www.phpservermonitor.org adresindedir.', - 'back_to_top' => 'Başa Dön', - 'go_back' => 'Geri Git', - 'ok' => 'Tamam', - 'cancel' => 'İptal', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Yesterday at %k:%M', - 'other_day_format' => '%A at %k:%M', - 'never' => 'Hiç', - 'hours_ago' => '%d saat önce', - 'an_hour_ago' => 'yaklaşık bir saat önce', - 'minutes_ago' => '%d dakika önce', - 'a_minute_ago' => 'yaklaşık bir dakika önce', - 'seconds_ago' => '%d saniye önce', - 'a_second_ago' => 'bir saniye önce', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => 'Ayarlar', - 'server' => 'Sunucular', - 'server_log' => 'Log', - 'server_status' => 'Durum', - 'server_update' => 'Güncelle', - 'user' => 'Kullanıcılar', - 'help' => 'Yardım', - ), - 'users' => array( - 'user' => 'Kullanıcı', - 'name' => 'İsim', - 'user_name' => 'Kullanıcı adı', - 'password' => 'Şifre', - 'password_repeat' => 'Şifre tekrarı', - 'password_leave_blank' => 'Değiştirmemek için boş bırakın', - 'level' => 'Seviye', - 'level_10' => 'Yönetici', - 'level_20' => 'Kullanıcı', - 'level_description' => 'Yöneticiler tüm yetkilere sahiptir: Onlar sunucuları, kullanıcıları yönetebilir genel ayarlamaları düzenleyebilirler.
    Kullanıcılar sadece görüntüleyebilir ve onlara atanmış sunucu güncelleyicileri çalıştırabilirler.', - 'mobile' => 'Mobil', - 'email' => 'E-posta', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover gerçek zamanlı bildirim alabilmek için bir servistir. Daha fazla bilgi için sitesine bakabilirsiniz.', - 'pushover_key' => 'Pushover Anahtarı', - 'pushover_device' => 'Pushover Aracı', - 'pushover_device_description' => 'Mesajın gönderileceği cihazın adı. Tüm cihazlara göndermek için boş bırakın.', - 'delete_title' => 'Kullanıcıyı Sil', - 'delete_message' => '\'%1\' kullanıcısını silmek istediğinize emin misiniz?', - 'deleted' => 'Kullanıcı silindi.', - 'updated' => 'Kullanıcı güncellendi.', - 'inserted' => 'Kullanıcı eklendi.', - 'profile' => 'Profil', - 'profile_updated' => 'Profiliniz güncellendi.', - 'error_user_name_bad_length' => 'Kullanıcı adları en az 2 ve en fazla 64 karakter uzunluğunda olmalıdır.', - 'error_user_name_invalid' => 'Kullanıcı adları sadece harf (a-z, A-Z), sayı (0-9), noktalar (.) and alttan çizgi (_) karakterlerini içerebilir.', - 'error_user_name_exists' => 'Bu kullanıcı adı daha önce alınmış.', - 'error_user_email_bad_length' => 'E-posta adresi en az 5 ve en fazla 255 karakter uzunluğunda olmalıdır.', - 'error_user_email_invalid' => 'Geçersiz e-posta adresi.', - 'error_user_level_invalid' => 'Verilen kullanıcı seviyesi geçersiz.', - 'error_user_no_match' => 'Kullanıcı veritabanında bulunamadı.', - 'error_user_password_invalid' => 'Geçersiz bir şifre girdiniz.', - 'error_user_password_no_match' => 'Şifreler birbiri ile eşleşmedi.', - ), - 'log' => array( - 'title' => 'Log Girdileri', - 'type' => 'Tip', - 'status' => 'Durum', - 'email' => 'E-posta', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'Kayıt yok.', - 'clear' => 'Günlüğü temizle', - 'delete_title' => 'Günlüğü temizle', - 'delete_message' => 'Tüm günlükleri silmek istediğinizden emin misiniz?', - ), - 'servers' => array( - 'server' => 'Sunucu', - 'status' => 'Durum', - 'label' => 'Etiket', - 'domain' => 'Domain/IP', - 'timeout' => 'Zaman Aşımı', - 'timeout_description' => 'Sunucunun cevap vermesini beklenecek saniye.', - 'port' => 'Port', - 'type' => 'Tip', - 'type_website' => 'Website', - 'type_service' => 'Servis', - 'pattern' => 'String/Pattern ara', - 'pattern_description' => 'Bu pattern web sitenizde bulunamaz ise, sunucu offline olarak işaretlenecek. Regular expression\'a izin verilmiştir.', - 'last_check' => 'Son kontrol', - 'last_online' => 'Son çevrimiçi zamanı', - 'last_offline' => 'Last offline', - 'monitoring' => 'Monitoring', - 'no_monitoring' => 'No monitoring', - 'email' => 'E-posta', - 'send_email' => 'E-posta Gönder', - 'sms' => 'SMS', - 'send_sms' => 'SMS Gönder', - 'pushover' => 'Pushover', - 'users' => 'Kullanıcılar', - 'delete_title' => 'Sunucu Sil', - 'delete_message' => '\'%1\' sunucusunu silmek istediğinize emin misiniz?', - 'deleted' => 'Sunucu silindi.', - 'updated' => 'Sunucu güncellendi.', - 'inserted' => 'Sunucu eklendi.', - 'latency' => 'Gecikme', - 'latency_max' => 'Gecikme (Azami)', - 'latency_min' => 'Gecikme (Asgari)', - 'latency_avg' => 'Gecikme (Ortalama)', - 'uptime' => 'Uptime', - 'year' => 'Yıl', - 'month' => 'Ay', - 'week' => 'Hafta', - 'day' => 'Gün', - 'hour' => 'Saat', - 'warning_threshold' => 'Uyarı Eşiği', - 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', - 'chart_last_week' => 'Geçen Hafta', - 'chart_history' => 'Geçmiş', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS bildirimi devre dışı.', - 'warning_notifications_disabled_email' => 'E-posta bildirimi devre dışı.', - 'warning_notifications_disabled_pushover' => 'Pushover bildirimi devre dışı.', - 'error_server_no_match' => 'Sunucu bulunamadı.', - 'error_server_label_bad_length' => 'Etiken en az 1 ve en çok 255 karakter olmalıdır.', - 'error_server_ip_bad_length' => 'Alan adı / IP en az 1 ve en fazla 255 karakter olmalıdır.', - 'error_server_ip_bad_service' => 'IP adresi geçerli değil.', - 'error_server_ip_bad_website' => 'Site adresi geçerli değil.', - 'error_server_type_invalid' => 'Seçilen sunucu tipi geçerli değil.', - 'error_server_warning_threshold_invalid' => 'Hata eşiği 0\'dan büyük bir tam sayı olmalıdır.', - ), - 'config' => array( - 'general' => 'Genel', - 'language' => 'Dil', - 'show_update' => 'Güncellemeleri kontrol et?', - 'email_status' => 'E-posta gönderimine izin ver', - 'email_from_email' => 'Gönderilen e-posta adresi', - 'email_from_name' => 'E-posta adresinde görünecek isim', - 'email_smtp' => 'SMTP\'yi aktif et', - 'email_smtp_host' => 'SMTP sunucusu', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP kullanıcı adı', - 'email_smtp_password' => 'SMTP şifre', - 'email_smtp_noauth' => 'Doğrulama yapmamak için boş bırakın', - 'sms_status' => 'SMS mesaj göndermeye izin ver', - 'sms_gateway' => 'Mesaj göndermek için servisi seçin', - 'sms_gateway_username' => 'Servis kullanıcı adı', - 'sms_gateway_password' => 'Servis şifresi', - 'sms_from' => 'Gönderen numarası', - 'pushover_status' => 'Pushover mesaj gönderimine izin ver', - 'pushover_description' => 'Pushover gerçek zamanlı bildirim alabilmek için bir servistir. Daha fazla bilgi için sitesine bakabilirsiniz.', - 'pushover_clone_app' => 'Pushover uygulaması oluşturmak için buraya tıklayınız.', - 'pushover_api_token' => 'Pushover Uygulaması API Token Bilgisi', - 'pushover_api_token_description' => 'Pushover kullanmadan önce, Pushover sitesi üzerinden bir uygulama oluşturmalısınız ve API Token bilgilerini buraya yazmalısınız.', - 'alert_type' => 'Ne zaman uyarılmak istediğinizi seçin.', - 'alert_type_description' => 'Durum değişikliği: '. - 'Sunucu durumu değişiklik durumunda bildirim alacaksınız. Sunucu çevrimiçi durumundan çevrimdışı durumuna veya çevrimdışı durumundan çevrim için durumuna geçtiğinde.
    '. - '
    Çevrimdışı: '. - 'Sunucu çevrim dışı duruma geçtiğinde bildirim alırsınız. *SADECE İLK GEÇTİĞİNDE*. Örneğin, '. - 'Cronjob her 15 dakikada bir çalışıyorsa ve sunucu 1\'de gidip 6\'ya kadar kapalı kalırsa. '. - 'Sadece size saat 1\'de bildirim gönderilecektir.
    '. - '
    Daima: '. - 'Site çevrimdışı olduğu her zaman size bildirim gönderilecektir, site saatler boyunca kapalı kalse bile.', - 'alert_type_status' => 'Durum değişikliği', - 'alert_type_offline' => 'Çevrimdışı', - 'alert_type_always' => 'Daima', - 'log_status' => 'Log durumu', - 'log_status_description' => 'Eğer log durumu TRUE olarak işaretlenirse, bildirim ayarlarından geçen her olay log olarak tutulacaktır.', - 'log_email' => 'Log e-posta mesajı otomatik gönderilmiştir.', - 'log_sms' => 'Log sms mesajı otomatik gönderilmiştir.', - 'log_pushover' => 'Log pushover mesajı otomatik gönderilmiştir.', - 'updated' => 'Ayarlar güncellendi.', - 'tab_email' => 'E-posta', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'E-posta ayarları', - 'settings_sms' => 'Sms mesaj ayarları', - 'settings_pushover' => 'Pushover ayarları', - 'settings_notification' => 'Bildirim ayarları', - 'settings_log' => 'Log ayarları', - 'auto_refresh' => 'Otomatik Yenileme', - 'auto_refresh_description' => - 'Otomatik yenileme sunucu sayfası
    '. - ''. - 'Eğer sayfa yenilenmez ise.'. - '', - 'seconds' => 'saniye', - 'test' => 'Test', - 'test_email' => 'Profilinizde tanımladığınız e-posta adresinize bir e-posta gönderilecek.', - 'test_sms' => 'Profilinizde tanımladığınız numaranıza bir SMS mesajı gönderilecek.', - 'test_pushover' => 'Profilinizde tanımladığını bilgiler üzerinden bir pushover bildirimi gönderilecek.', - 'send' => 'Gönder', - 'test_subject' => 'Test', - 'test_message' => 'Test mesaj', - 'email_sent' => 'E-posta gönderildi', - 'email_error' => 'E-posta gönderiminde hata.', - 'sms_sent' => 'Sms gönderildi', - 'sms_error' => 'SMS gönderiminde hata. %s', - 'sms_error_nomobile' => 'SMS gönderilemiyor: profilinizde geçerli bir telefon numarası yok.', - 'pushover_sent' => 'Pushover bildirimi gönderildi', - 'pushover_error' => 'Pushover bildirimi gönderilirken bir hata meydana geldi: %s', - 'pushover_error_noapp' => 'Test için bildirim gönderilemiyor: Pushover Uygulaması API token bilgisi bulunamadı.', - 'pushover_error_nokey' => 'Test için bildirim gönderilemiyor: Pushover key bilgisi profilinizde bulunamadı.', - 'log_retention_period' => 'Log tutma süresi', - 'log_retention_period_description' => 'Bildirim loglarının ve sunucunun çalışma zamanlarının arşivinin saklanması için gün sayısı. Logların temizlenmesini kapatmak için 0 giriniz.', - 'log_retention_days' => 'gün', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => '\'%LABEL%\' isimli sunucu KAPANDI: ip=%IP%, port=%PORT%. Error=%ERROR%', - 'off_email_subject' => 'ÖNEMLİ: \'%LABEL%\' isimli sunucu KAPANDI.', - 'off_email_body' => "Aşağıdaki sunuculara erişim sağlanamıyor:

    Sunucu: %LABEL%
    IP: %IP%
    Port: %PORT%
    Hata: %ERROR%
    Tarih: %DATE%", - 'off_pushover_title' => '\'%LABEL%\' isimli sunucu KAPANDI.', - 'off_pushover_message' => "Aşağıdaki nuculara erişim sağlanamıyor:

    Sunucu: %LABEL%
    IP: %IP%
    Port: %PORT%
    Hata: %ERROR%
    Tarih: %DATE%", - 'on_sms' => '\'%LABEL%\' isimli sunucu YAYINDA: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'ÖNEMLİ:\'%LABEL%\' isimli sunucu YAYINDA.', - 'on_email_body' => "'%LABEL%' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:

    Sunucu: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tarih: %DATE%", - 'on_pushover_title' => '\'%LABEL%\' isimli sunucu YAYINDA', - 'on_pushover_message' => '\'%LABEL%\' isimli sunucu tekrar yayında, it was down for %LAST_OFFLINE_DURATION%:

    Sunucu: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tarih: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Hoşgeldin, %user_name%', - 'title_sign_in' => 'Lütfen giriş yapın', - 'title_forgot' => 'Şifreni mi unuttun?', - 'title_reset' => 'Şifreni yenile', - 'submit' => 'Gönder', - 'remember_me' => 'Beni hatırla', - 'login' => 'Giriş yap', - 'logout' => 'Çıkış yap', - 'username' => 'Kullanıcı adı', - 'password' => 'Şifre', - 'password_repeat' => 'Şifre tekrarı', - 'password_forgot' => 'Şifreni mi unuttun?', - 'password_reset' => 'Şifreni yenile', - 'password_reset_email_subject' => 'PHP Server Monitor için şifreni yenile', - 'password_reset_email_body' => 'Aşağıdaki bağlantıyı kullanarak şifrenizi güncelleyiniz. Bağlantı 1 saat sonra geçerliliğini kaybedecektir.

    %link%', - 'error_user_incorrect' => 'Kullanıcı adı bulunamadı.', - 'error_login_incorrect' => 'Bilgi yanlış.', - 'error_login_passwords_nomatch' => 'Şifreleriniz uyuşmuyor.', - 'error_reset_invalid_link' => 'Sağladığını sıfırlama bağlantısı geçersiz.', - 'success_password_forgot' => 'Şifrenizi yenilemeniz için gerekli bilgileri içeren bir e-posta gönderildi.', - 'success_password_reset' => 'Şifreniz başarıyla yenilendi. Şimdi giriş yapın.', - ), - 'error' => array( - '401_unauthorized' => 'Yetkisiz', - '401_unauthorized_description' => 'Bu sayfayı görüntülemek için yetkin yok.', - ), + 'name' => 'Türkçe - Turkish', + 'locale' => array( + '0' => 'tr_TR.UTF-8', + '1' => 'tr_TR', + '2' => 'turkish', + '3' => 'turkish-tr', + ), + 'locale_tag' => 'tr', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Yükle', + 'action' => 'Aksiyon', + 'save' => 'Kaydet', + 'edit' => 'Düzenle', + 'delete' => 'Sil', + 'date' => 'Tarih', + 'message' => 'Mesaj', + 'yes' => 'Evet', + 'no' => 'Hayır', + 'insert' => 'Ekle', + 'add_new' => 'Yeni ekle', + 'update_available' => '({version}) sürümü şu anda http://www.phpservermonitor.org adresindedir.', + 'back_to_top' => 'Başa Dön', + 'go_back' => 'Geri Git', + 'ok' => 'Tamam', + 'cancel' => 'İptal', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Yesterday at %k:%M', + 'other_day_format' => '%A at %k:%M', + 'never' => 'Hiç', + 'hours_ago' => '%d saat önce', + 'an_hour_ago' => 'yaklaşık bir saat önce', + 'minutes_ago' => '%d dakika önce', + 'a_minute_ago' => 'yaklaşık bir dakika önce', + 'seconds_ago' => '%d saniye önce', + 'a_second_ago' => 'bir saniye önce', + ), + 'menu' => array( + 'config' => 'Ayarlar', + 'server' => 'Sunucular', + 'server_log' => 'Log', + 'server_status' => 'Durum', + 'server_update' => 'Güncelle', + 'user' => 'Kullanıcılar', + 'help' => 'Yardım', + ), + 'users' => array( + 'user' => 'Kullanıcı', + 'name' => 'İsim', + 'user_name' => 'Kullanıcı adı', + 'password' => 'Şifre', + 'password_repeat' => 'Şifre tekrarı', + 'password_leave_blank' => 'Değiştirmemek için boş bırakın', + 'level' => 'Seviye', + 'level_10' => 'Yönetici', + 'level_20' => 'Kullanıcı', + 'level_description' => 'Yöneticiler tüm yetkilere sahiptir: Onlar sunucuları, kullanıcıları + yönetebilir genel ayarlamaları düzenleyebilirler.
    Kullanıcılar sadece + görüntüleyebilir ve onlara atanmış sunucu güncelleyicileri + çalıştırabilirler.', + 'mobile' => 'Mobil', + 'email' => 'E-posta', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover gerçek zamanlı bildirim alabilmek için bir servistir. Daha fazla bilgi + için sitesine bakabilirsiniz.', + 'pushover_key' => 'Pushover Anahtarı', + 'pushover_device' => 'Pushover Aracı', + 'pushover_device_description' => 'Mesajın gönderileceği cihazın adı. Tüm cihazlara göndermek için boş + bırakın.', + 'delete_title' => 'Kullanıcıyı Sil', + 'delete_message' => '\'%1\' kullanıcısını silmek istediğinize emin misiniz?', + 'deleted' => 'Kullanıcı silindi.', + 'updated' => 'Kullanıcı güncellendi.', + 'inserted' => 'Kullanıcı eklendi.', + 'profile' => 'Profil', + 'profile_updated' => 'Profiliniz güncellendi.', + 'error_user_name_bad_length' => 'Kullanıcı adları en az 2 ve en fazla 64 karakter uzunluğunda olmalıdır.', + 'error_user_name_invalid' => 'Kullanıcı adları sadece harf (a-z, A-Z), sayı (0-9), noktalar (.) and alttan + çizgi (_) karakterlerini içerebilir.', + 'error_user_name_exists' => 'Bu kullanıcı adı daha önce alınmış.', + 'error_user_email_bad_length' => 'E-posta adresi en az 5 ve en fazla 255 karakter uzunluğunda olmalıdır.', + 'error_user_email_invalid' => 'Geçersiz e-posta adresi.', + 'error_user_level_invalid' => 'Verilen kullanıcı seviyesi geçersiz.', + 'error_user_no_match' => 'Kullanıcı veritabanında bulunamadı.', + 'error_user_password_invalid' => 'Geçersiz bir şifre girdiniz.', + 'error_user_password_no_match' => 'Şifreler birbiri ile eşleşmedi.', + ), + 'log' => array( + 'title' => 'Log Girdileri', + 'type' => 'Tip', + 'status' => 'Durum', + 'email' => 'E-posta', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'Kayıt yok.', + 'clear' => 'Günlüğü temizle', + 'delete_title' => 'Günlüğü temizle', + 'delete_message' => 'Tüm günlükleri silmek istediğinizden emin misiniz?', + ), + 'servers' => array( + 'server' => 'Sunucu', + 'status' => 'Durum', + 'label' => 'Etiket', + 'domain' => 'Domain/IP', + 'timeout' => 'Zaman Aşımı', + 'timeout_description' => 'Sunucunun cevap vermesini beklenecek saniye.', + 'port' => 'Port', + 'type' => 'Tip', + 'type_website' => 'Website', + 'type_service' => 'Servis', + 'pattern' => 'String/Pattern ara', + 'pattern_description' => 'Bu pattern web sitenizde bulunamaz ise, sunucu offline olarak işaretlenecek. + Regular expression\'a izin verilmiştir.', + 'last_check' => 'Son kontrol', + 'last_online' => 'Son çevrimiçi zamanı', + 'last_offline' => 'Last offline', + 'monitoring' => 'Monitoring', + 'no_monitoring' => 'No monitoring', + 'email' => 'E-posta', + 'send_email' => 'E-posta Gönder', + 'sms' => 'SMS', + 'send_sms' => 'SMS Gönder', + 'pushover' => 'Pushover', + 'users' => 'Kullanıcılar', + 'delete_title' => 'Sunucu Sil', + 'delete_message' => '\'%1\' sunucusunu silmek istediğinize emin misiniz?', + 'deleted' => 'Sunucu silindi.', + 'updated' => 'Sunucu güncellendi.', + 'inserted' => 'Sunucu eklendi.', + 'latency' => 'Gecikme', + 'latency_max' => 'Gecikme (Azami)', + 'latency_min' => 'Gecikme (Asgari)', + 'latency_avg' => 'Gecikme (Ortalama)', + 'uptime' => 'Uptime', + 'year' => 'Yıl', + 'month' => 'Ay', + 'week' => 'Hafta', + 'day' => 'Gün', + 'hour' => 'Saat', + 'warning_threshold' => 'Uyarı Eşiği', + 'warning_threshold_description' => 'Number of failed checks required before it is marked offline.', + 'chart_last_week' => 'Geçen Hafta', + 'chart_history' => 'Geçmiş', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS bildirimi devre dışı.', + 'warning_notifications_disabled_email' => 'E-posta bildirimi devre dışı.', + 'warning_notifications_disabled_pushover' => 'Pushover bildirimi devre dışı.', + 'error_server_no_match' => 'Sunucu bulunamadı.', + 'error_server_label_bad_length' => 'Etiken en az 1 ve en çok 255 karakter olmalıdır.', + 'error_server_ip_bad_length' => 'Alan adı / IP en az 1 ve en fazla 255 karakter olmalıdır.', + 'error_server_ip_bad_service' => 'IP adresi geçerli değil.', + 'error_server_ip_bad_website' => 'Site adresi geçerli değil.', + 'error_server_type_invalid' => 'Seçilen sunucu tipi geçerli değil.', + 'error_server_warning_threshold_invalid' => 'Hata eşiği 0\'dan büyük bir tam sayı olmalıdır.', + ), + 'config' => array( + 'general' => 'Genel', + 'language' => 'Dil', + 'show_update' => 'Güncellemeleri kontrol et?', + 'email_status' => 'E-posta gönderimine izin ver', + 'email_from_email' => 'Gönderilen e-posta adresi', + 'email_from_name' => 'E-posta adresinde görünecek isim', + 'email_smtp' => 'SMTP\'yi aktif et', + 'email_smtp_host' => 'SMTP sunucusu', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP kullanıcı adı', + 'email_smtp_password' => 'SMTP şifre', + 'email_smtp_noauth' => 'Doğrulama yapmamak için boş bırakın', + 'sms_status' => 'SMS mesaj göndermeye izin ver', + 'sms_gateway' => 'Mesaj göndermek için servisi seçin', + 'sms_gateway_username' => 'Servis kullanıcı adı', + 'sms_gateway_password' => 'Servis şifresi', + 'sms_from' => 'Gönderen numarası', + 'pushover_status' => 'Pushover mesaj gönderimine izin ver', + 'pushover_description' => 'Pushover gerçek zamanlı bildirim alabilmek için bir servistir. Daha fazla bilgi + için sitesine bakabilirsiniz.', + 'pushover_clone_app' => 'Pushover uygulaması oluşturmak için buraya tıklayınız.', + 'pushover_api_token' => 'Pushover Uygulaması API Token Bilgisi', + 'pushover_api_token_description' => 'Pushover kullanmadan önce, Pushover sitesi üzerinden bir uygulama + oluşturmalısınız ve API Token bilgilerini buraya yazmalısınız.', + 'alert_type' => 'Ne zaman uyarılmak istediğinizi seçin.', + 'alert_type_description' => 'Durum değişikliği: Sunucu durumu değişiklik durumunda bildirim + alacaksınız. Sunucu çevrimiçi durumundan çevrimdışı durumuna veya + çevrimdışı durumundan çevrim için durumuna geçtiğinde.

    Çevrimdışı: Sunucu çevrim dışı duruma geçtiğinde bildirim + alırsınız. *SADECE İLK GEÇTİĞİNDE*. Örneğin, Cronjob her 15 dakikada + bir çalışıyorsa ve sunucu 1\'de gidip 6\'ya kadar kapalı kalırsa. Sadece + size saat 1\'de bildirim gönderilecektir.

    Daima: Site + çevrimdışı olduğu her zaman size bildirim gönderilecektir, site saatler + boyunca kapalı kalse bile.', + 'alert_type_status' => 'Durum değişikliği', + 'alert_type_offline' => 'Çevrimdışı', + 'alert_type_always' => 'Daima', + 'log_status' => 'Log durumu', + 'log_status_description' => 'Eğer log durumu TRUE olarak işaretlenirse, bildirim ayarlarından geçen her + olay log olarak tutulacaktır.', + 'log_email' => 'Log e-posta mesajı otomatik gönderilmiştir.', + 'log_sms' => 'Log sms mesajı otomatik gönderilmiştir.', + 'log_pushover' => 'Log pushover mesajı otomatik gönderilmiştir.', + 'updated' => 'Ayarlar güncellendi.', + 'tab_email' => 'E-posta', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'E-posta ayarları', + 'settings_sms' => 'Sms mesaj ayarları', + 'settings_pushover' => 'Pushover ayarları', + 'settings_notification' => 'Bildirim ayarları', + 'settings_log' => 'Log ayarları', + 'auto_refresh' => 'Otomatik Yenileme', + 'auto_refresh_description' => 'Otomatik yenileme sunucu sayfası
    Eğer sayfa yenilenmez + ise.', + 'seconds' => 'saniye', + 'test' => 'Test', + 'test_email' => 'Profilinizde tanımladığınız e-posta adresinize bir e-posta gönderilecek.', + 'test_sms' => 'Profilinizde tanımladığınız numaranıza bir SMS mesajı gönderilecek.', + 'test_pushover' => 'Profilinizde tanımladığını bilgiler üzerinden bir pushover bildirimi gönderilecek.', + 'send' => 'Gönder', + 'test_subject' => 'Test', + 'test_message' => 'Test mesaj', + 'email_sent' => 'E-posta gönderildi', + 'email_error' => 'E-posta gönderiminde hata.', + 'sms_sent' => 'Sms gönderildi', + 'sms_error' => 'SMS gönderiminde hata. %s', + 'sms_error_nomobile' => 'SMS gönderilemiyor: profilinizde geçerli bir telefon numarası yok.', + 'pushover_sent' => 'Pushover bildirimi gönderildi', + 'pushover_error' => 'Pushover bildirimi gönderilirken bir hata meydana geldi: %s', + 'pushover_error_noapp' => 'Test için bildirim gönderilemiyor: Pushover Uygulaması API token bilgisi + bulunamadı.', + 'pushover_error_nokey' => 'Test için bildirim gönderilemiyor: Pushover key bilgisi profilinizde bulunamadı.', + 'log_retention_period' => 'Log tutma süresi', + 'log_retention_period_description' => 'Bildirim loglarının ve sunucunun çalışma zamanlarının arşivinin + saklanması için gün sayısı. Logların temizlenmesini kapatmak + için 0 giriniz.', + 'log_retention_days' => 'gün', + ), + 'notifications' => array( + 'off_sms' => '\'%LABEL%\' isimli sunucu KAPANDI: ip=%IP%, port=%PORT%. Error=%ERROR%', + 'off_email_subject' => 'ÖNEMLİ: \'%LABEL%\' isimli sunucu KAPANDI.', + 'off_email_body' => 'Aşağıdaki sunuculara erişim sağlanamıyor:

    Sunucu: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Hata: %ERROR%
    Tarih: %DATE%', + 'off_pushover_title' => '\'%LABEL%\' isimli sunucu KAPANDI.', + 'off_pushover_message' => 'Aşağıdaki nuculara erişim sağlanamıyor:

    Sunucu: %LABEL%
    IP: + %IP%
    Port: %PORT%
    Hata: %ERROR%
    Tarih: %DATE%', + 'on_sms' => '\'%LABEL%\' isimli sunucu YAYINDA: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'ÖNEMLİ:\'%LABEL%\' isimli sunucu YAYINDA.', + 'on_email_body' => '\'%LABEL%\' isimli sunucu tekrar yayında, it was down for + %LAST_OFFLINE_DURATION%:

    Sunucu: %LABEL%
    IP: %IP%
    Port: %PORT%
    Tarih: + %DATE%', + 'on_pushover_title' => '\'%LABEL%\' isimli sunucu YAYINDA', + 'on_pushover_message' => '\'%LABEL%\' isimli sunucu tekrar yayında, it was down for + %LAST_OFFLINE_DURATION%:

    Sunucu: %LABEL%
    IP: %IP%
    Port: + %PORT%
    Tarih: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Hoşgeldin, %user_name%', + 'title_sign_in' => 'Lütfen giriş yapın', + 'title_forgot' => 'Şifreni mi unuttun?', + 'title_reset' => 'Şifreni yenile', + 'submit' => 'Gönder', + 'remember_me' => 'Beni hatırla', + 'login' => 'Giriş yap', + 'logout' => 'Çıkış yap', + 'username' => 'Kullanıcı adı', + 'password' => 'Şifre', + 'password_repeat' => 'Şifre tekrarı', + 'password_forgot' => 'Şifreni mi unuttun?', + 'password_reset' => 'Şifreni yenile', + 'password_reset_email_subject' => 'PHP Server Monitor için şifreni yenile', + 'password_reset_email_body' => 'Aşağıdaki bağlantıyı kullanarak şifrenizi güncelleyiniz. Bağlantı 1 + saat sonra geçerliliğini kaybedecektir.

    %link%', + 'error_user_incorrect' => 'Kullanıcı adı bulunamadı.', + 'error_login_incorrect' => 'Bilgi yanlış.', + 'error_login_passwords_nomatch' => 'Şifreleriniz uyuşmuyor.', + 'error_reset_invalid_link' => 'Sağladığını sıfırlama bağlantısı geçersiz.', + 'success_password_forgot' => 'Şifrenizi yenilemeniz için gerekli bilgileri içeren bir e-posta gönderildi.', + 'success_password_reset' => 'Şifreniz başarıyla yenilendi. Şimdi giriş yapın.', + ), + 'error' => array( + '401_unauthorized' => 'Yetkisiz', + '401_unauthorized_description' => 'Bu sayfayı görüntülemek için yetkin yok.', + ), ); diff --git a/src/lang/uk_UA.lang.php b/src/lang/uk_UA.lang.php new file mode 100644 index 00000000..3bad1325 --- /dev/null +++ b/src/lang/uk_UA.lang.php @@ -0,0 +1,537 @@ +. + * + * @package phpservermon + * @author Oleksa Vyshnivsky + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + **/ + +$sm_lang = array( + 'name' => 'Українська — Ukrainian', + 'locale' => array( + '0' => 'uk_UA.UTF-8', + '1' => 'uk_UA', + '2' => 'ukrainian', + ), + 'locale_tag' => 'uk', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Встановити', + 'action' => 'Дія', + 'save' => 'Зберегти', + 'edit' => 'Редагувати', + 'delete' => 'Видалити', + 'view' => 'Перегляд', + 'date' => 'Дата', + 'message' => 'Повідомлення', + 'yes' => 'Так', + 'no' => 'Ні', + 'insert' => 'Вставити', + 'add_new' => 'Додати', + 'update_available' => 'Доступна нова версія ({version}). Перейдіть сюди для завантаження оновлення.', + 'back_to_top' => 'Нагору', + 'go_back' => 'Назад', + 'ok' => 'OK', + 'bad' => 'погано', + 'cancel' => 'Скасувати', + 'none' => 'Жоден', + 'activate' => 'Активувати', + 'short_day_format' => '%e %b', + 'long_day_format' => '%e %b %Y', + 'yesterday_format' => 'Учора о %k:%M', + 'other_day_format' => '%A о %k:%M', + 'never' => 'Ніколи', + 'hours_ago' => '%d годин тому', + 'an_hour_ago' => 'близько години тому', + 'minutes_ago' => '%d хвилин тому', + 'a_minute_ago' => 'близько хвилини тому', + 'seconds_ago' => '%d секунд тому', + 'a_second_ago' => 'секунду тому', + 'year' => 'рік', + 'years' => 'років', + 'month' => 'місяць', + 'months' => 'місяців', + 'day' => 'дні', + 'days' => 'днів', + 'hour' => 'година', + 'hours' => 'годин', + 'minute' => 'хвилина', + 'minutes' => 'хвилин', + 'second' => 'секунда', + 'seconds' => 'секунд', + 'current' => 'поточний', + 'settings' => 'Налаштування', + 'search' => 'Пошук', + ), + 'menu' => array( + 'config' => 'Конфіг', + 'server' => 'Сервери', + 'server_log' => 'Лог', + 'server_status' => 'Статус', + 'server_update' => 'Оновити', + 'user' => 'Користувачі', + 'help' => 'Довідка', + ), + 'users' => array( + 'user' => 'Користувач', + 'name' => 'Ім’я', + 'user_name' => 'Ім’я користувача', + 'password' => 'Пароль', + 'password_repeat' => 'Повторити пароль', + 'password_leave_blank' => 'Залиште пустим, щоб не змінювати', + 'level' => 'Рівень', + 'level_10' => 'Адміністратор', + 'level_20' => 'Користувач', + 'level_description' => 'Адміністратори мають повний доступ: вони + можуть керувати серверами, користувачами, а + також редагувати глобальні + налаштування.
    Користувачі можуть тільки + переглядати й запускати перевірку серверів, до + яких їм надали доступ.', + 'mobile' => 'Мобільний', + 'email' => 'Електронна пошта', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover — сервіс, що дозволяє легко отримувати + сповіщення у реальному часі. За деталями + перейдіть на їхній + вебсайт.', + 'pushover_key' => 'Ключ Pushover', + 'pushover_device' => 'Пристрій Pushover', + 'pushover_device_description' => 'Ім’я пристрою, на який надсилати + повідомлення. Залиште пустим, щоб + надсилати на всі пристрої.', + 'telegram' => 'Telegram', + 'telegram_description' => 'Telegram — чат-застосунок, що + дозволяє легко отримувати сповіщення у + реальному часі. За деталями й інструкцією зі + встановлення зверніться до документації.', + 'telegram_chat_id' => 'Ідентифікатор чату Telegram', + 'telegram_chat_id_description' => 'Повідомлення буде надіслане у + відповідний чат.', + 'telegram_get_chat_id' => 'Натисніть тут для отримання свого + ідентифікатора чату', + 'activate_telegram' => 'Активувати сповіщення у Telegram', + 'activate_telegram_description' => 'Дозволити надсилання Telegram-сповіщень на + визначений ідентифікатор чату. Без + цього дозволу Telegram не дозволить нам + надсилати вам сповіщення.', + 'telegram_bot_username_found' => 'Бот знайдений!

    На ньому відкриється чат з + ботом. Там буде потрібно натиснути start або + набрати /start.', + 'telegram_bot_username_error_token' => '401 - Несанкціоновано. Будь ласка, + перевірте, чи API-токен правильний.', + 'telegram_bot_error' => 'Сталася помилка при активації Telegram-сповіщень: + %s', + 'delete_title' => 'Видалити користувача', + 'delete_message' => 'Ви дійсно хочете видалити користувача \'%1\'?', + 'deleted' => 'Користувача видалено.', + 'updated' => 'Користувача оновлено.', + 'inserted' => 'Користувача додано.', + 'profile' => 'Профіль', + 'profile_updated' => 'Ваш профіль оновлено.', + 'error_user_name_bad_length' => 'Імена користувачів мають бути довжиною + від 2 до 64 символів.', + 'error_user_name_invalid' => 'Ім’я користувача може містити лише літери + (a-z, A-Z), цифри (0-9), крапки (.) і підкреслення (_).', + 'error_user_name_exists' => 'Таке ім’я користувача уже існує у базі + даних.', + 'error_user_email_bad_length' => 'Електронні адреси мають бути довжиною + від 5 до 255 символів.', + 'error_user_email_invalid' => 'Неправильна електронна адреса.', + 'error_user_level_invalid' => 'Неправильний рівень користувача.', + 'error_user_no_match' => 'Користувача у базі даних не знайдено.', + 'error_user_password_invalid' => 'Введено неправильний пароль.', + 'error_user_password_no_match' => 'Введені паролі не збігаються.', + 'error_user_admin_cant_be_deleted' => 'Останнього адміністратора видалити не + можна.', + ), + 'log' => array( + 'title' => 'Записи у журналі', + 'type' => 'Тип', + 'status' => 'Статус', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'telegram' => 'Telegram', + 'no_logs' => 'Немає журналів', + 'clear' => 'Очистити журнали', + 'delete_title' => 'Видалити журнал', + 'delete_message' => 'Ви дійсно хочете видалити усі журнали?', + ), + 'servers' => array( + 'server' => 'Сервер', + 'status' => 'Статус', + 'label' => 'Назва', + 'domain' => 'Домен/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Кількість секунд очікування на відповідь + сервера.', + 'authentication_settings' => 'Налаштування автентифікації', + 'optional' => 'Необов’язково', + 'website_username' => 'Ім’я користувача', + 'website_username_description' => 'Ім’я користувача для доступу до сайту. + (Підтримується лише Apache-автентифікація.)', + 'website_password' => 'Пароль', + 'website_password_description' => 'Пароль для доступу до сайту. У базі даних + пароль зберігається зашифрованим.', + 'fieldset_monitoring' => 'Моніторинг', + 'fieldset_permissions' => 'Дозволи', + 'permissions' => 'Сервер можуть переглядати такі користувачі', + 'port' => 'Порт', + 'custom_port' => 'Власний порт', + 'popular_ports' => 'Популярні порти', + 'request_method' => 'Метод запиту', + 'custom_request_method' => 'Власний метод запиту', + 'popular_request_methods' => 'Популярні методи запиту', + 'post_field' => 'Post-поле', + 'post_field_description' => 'Дані будуть надіслані з використанням + вибраного вище методу.', + 'please_select' => 'Будь ласка, виберіть', + 'type' => 'Тип', + 'type_website' => 'Вебсайт', + 'type_service' => 'Сервіс', + 'type_ping' => 'Пінг', + 'pattern' => 'Шукати рядок/зразок', + 'pattern_description' => 'Якщо цей зразок не знайдено на сайті, сервер + буде позначений як онлайн/офлайн. Регулярні + вирази дозволені.', + 'pattern_online' => 'Зразок свідчить, що сайт — ', + 'pattern_online_description' => 'Онлайн: Якщо цей зразок не знайдено на + сайті, сервер буде позначений як онлайн. + Офлайн: Якщо цей зразок не знайдено на + сайті, сервер буде позначений як офлайн.', + 'redirect_check' => 'Переспрямування на інший домен —', + 'redirect_check_description' => 'Переспрямування на інший домен зазвичай є + поганим знаком.', + 'allow_http_status' => 'Дозволити код статусу HTTP', + 'allow_http_status_description' => 'Позначити вебсайт як онлайн. Коди + статусів HTTP нижче ніж 400 позначаються як + онлайн за замовчуванням. Розділяти коди + символом |.', + 'header_name' => 'Ім’я у заголовку', + 'header_value' => 'Значення у заголовку', + 'header_name_description' => 'З урахуванням регістру.', + 'header_value_description' => 'Регулярні вирази дозволені.', + 'last_check' => 'Остання перевірка', + 'last_online' => 'Востаннє онлайн', + 'last_offline' => 'Востаннє офлайн', + 'last_output' => 'Остання позитивна відповідь', + 'last_error' => 'Остання помилка', + 'last_error_output' => 'Остання негативна відповідь', + 'output' => 'Вивід', + 'monitoring' => 'Моніторинг', + 'no_monitoring' => 'Немає моніторингу', + 'email' => 'Email', + 'send_email' => 'Надсилати електронні листи', + 'sms' => 'SMS', + 'send_sms' => 'Надсилати SMS', + 'pushover' => 'Pushover', + 'send_pushover' => 'Надсилати Pushover-сповіщення', + 'telegram' => 'Telegram', + 'send_telegram' => 'Надсилати Telegram-сповіщення', + 'users' => 'Користувачі', + 'delete_title' => 'Видалити сервер', + 'delete_message' => 'Ви дійсно хочете видалити сервер \'%1\'?', + 'deleted' => 'Сервер видалено.', + 'updated' => 'Сервер оновлено.', + 'inserted' => 'Сервер додано.', + 'latency' => 'Затримка', + 'latency_max' => 'Затримка (максимум)', + 'latency_min' => 'Затримка (мінімум)', + 'latency_avg' => 'Затримка (середня)', + 'online' => 'онлайн', + 'offline' => 'офлайн', + 'uptime' => 'Час роботи', + 'year' => 'Років', + 'month' => 'Місяць', + 'week' => 'Тиждень', + 'day' => 'День', + 'hour' => 'Година', + 'warning_threshold' => 'Поріг попередження', + 'warning_threshold_description' => 'Кількість невдалих перевірок перед + виставленням статусу офлайн.', + 'chart_last_week' => 'Останній тиждень', + 'chart_history' => 'Історія', + 'chart_day_format' => '%d/%m/%Y', + 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', + 'chart_short_date_format' => '%d/%m %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS-сповіщення вимкнено.', + 'warning_notifications_disabled_email' => 'Email-сповіщення вимкнено.', + 'warning_notifications_disabled_pushover' => 'Pushover-сповіщення вимкнено.', + 'warning_notifications_disabled_telegram' => 'Telegram-сповіщення вимкнено.', + 'error_server_no_match' => 'Сервер не знайдено.', + 'error_server_label_bad_length' => 'Заголовок повинен бути довжиною від 1 до + 255 символів.', + 'error_server_ip_bad_length' => 'Домен/IP повинен бути довжиною від 1 до 255 + символів.', + 'error_server_ip_bad_service' => 'IP-адреса недійсна.', + 'error_server_ip_bad_website' => 'URL вебсайту недійсний.', + 'error_server_type_invalid' => 'Вибраний тип сервера недійсний.', + 'error_server_warning_threshold_invalid' => 'Поріг попередження має бути цілим + числом більше 0.', + ), + 'config' => array( + 'general' => 'Загальне', + 'language' => 'Мова', + 'show_update' => 'Перевіряти наявність оновлень?', + 'password_encrypt_key' => 'Пароль ключа шифрування', + 'password_encrypt_key_note' => 'Цей ключ використовується для шифрування + паролів доступу до вебсайтів, що + зберігаються на сервері. Якщо ключ буде + змінений, збережені паролі будуть + недійсними!', + 'proxy' => 'Увімкнути проксі-сервер', + 'proxy_url' => 'URL-адреса проксі-сервера', + 'proxy_user' => 'Ім’я користувача проксі-сервера', + 'proxy_password' => 'Пароль користувача проксі-сервера', + 'email_status' => 'Дозволити надсилання електронної пошти', + 'email_from_email' => 'Листи з адреси', + 'email_from_name' => 'Листи від імені', + 'email_smtp' => 'Увімкнути SMTP', + 'email_smtp_host' => 'SMTP-хост', + 'email_smtp_port' => 'SMTP-порт', + 'email_smtp_security' => 'SMTP-безпека', + 'email_smtp_security_none' => 'Немає', + 'email_smtp_username' => 'Ім’я користувача SMTP', + 'email_smtp_password' => 'Пароль користувача SMTP', + 'email_smtp_noauth' => 'Залиште пустим, щоб не автентифікуватися', + 'sms_status' => 'Дозволити надсилання текстових повідомлень', + 'sms_gateway' => 'Шлюз для надсилання повідомлень', + 'sms_gateway_username' => 'Ім’я користувача шлюзу', + 'sms_gateway_password' => 'Пароль користувача шлюзу', + 'sms_from' => 'Номер телефону відправника', + 'pushover_status' => 'Дозволити надсилання Pushover-повідомлень', + 'pushover_description' => 'Pushover — сервіс, що дозволяє легко отримувати + сповіщення у реальному часі. За детальнішою + інформацію перейдіть на їхній вебсайт.', + 'pushover_clone_app' => 'Натисніть тут, щоб створити ваш Pushover-додаток', + 'pushover_api_token' => 'Токен API Pushover-додатку', + 'pushover_api_token_description' => 'Перед використанням Pushover ви маєте зареєструвати + Додаток на їхньому вебсайті та ввести + токен API Додатку тут.', + 'telegram_status' => 'Дозволити надсилання Telegram-повідомлень', + 'telegram_description' => 'Telegram — чат-застосунок, що + дозволяє легко отримувати сповіщення у + реальному часі. Детальніша інформація та + інструкція зі встановлення доступні у документації.', + 'telegram_api_token' => 'Токен Telegram API', + 'telegram_api_token_description' => 'Перед використанням Telegram ви маєте + отримати токен API. За довідкою + зверніться до документації.', + 'alert_type' => 'Виберіть, коли б вам хотілося отримувати + сповіщення.', + 'alert_type_description' => 'Зміна статусу: Ви отримуватимете + сповіщення, коли змінюється статус сервера. + Тобто при переходах онлайн -> офлайн і офлайн + -> онлайн.

    Офлайн: Ви отримаєте + сповіщення, коли сервер переходить у офлайн + *ТІЛЬКИ ПЕРШИЙ РАЗ*. Наприклад, ваше + крон-завдання виконується кожні 15 хвилин і + ваш сервер лягає о 1-й годині ночі й лежить до + 6-ї години ранку. Ви отримаєте тільки одне + сповіщення — о 1-й годині + ночі.

    Завжди: Ви отримуватимете + сповіщення при кожному запуску сценарію, + коли сайт лежить, навіть якщо він лежить + годинами.', + 'alert_type_status' => 'Зміна статусу', + 'alert_type_offline' => 'Офлайн', + 'alert_type_always' => 'Завжди', + 'combine_notifications' => 'Об’єднувати сповіщення', + 'combine_notifications_description' => 'Зменшує кількість сповіщень, + об’єднуючи їх в 1 єдине сповіщення. (Це + не стосується SMS-сповіщень.)', + 'alert_proxy' => 'Навіть якщо увімкнений, проксі-сервер ніколи не + використовується для сервісів', + 'alert_proxy_url' => 'Формат: хост:порт', + 'log_status' => 'Статус журналу', + 'log_status_description' => 'Якщо статус журналу — TRUE, то монітор + записуватиме у журнал подію щоразу, коли + виконуватимуться умови надсилання + сповіщення.', + 'log_email' => 'Записувати у журнал електронні листи, надіслані + сценарієм', + 'log_sms' => 'Записувати у журнал текстові повідомлення, + надіслані сценарієм', + 'log_pushover' => 'Записувати у журнал Pushover-повідомлення, надіслані + сценарієм', + 'log_telegram' => 'Записувати у журнал Telegram-повідомлення, надіслані + сценарієм', + 'updated' => 'Налаштування оновлено.', + 'tab_email' => 'Електронна пошта', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'tab_telegram' => 'Telegram', + 'settings_email' => 'Налаштування електронної пошти', + 'settings_sms' => 'Налаштування текстових повідомлень', + 'settings_pushover' => 'Налаштування Pushover', + 'settings_telegram' => 'Налаштування Telegram', + 'settings_notification' => 'Налаштування сповіщень', + 'settings_log' => 'Налаштування логів', + 'settings_proxy' => 'Налаштування проксі', + 'auto_refresh' => 'Автооновлення', + 'auto_refresh_description' => 'Сторінка автооновлення серверів.
    Час у секундах; якщо 0, сторінка не + оновлюватиметься.', + 'seconds' => 'секунд', + 'test' => 'Тест', + 'test_email' => 'Електронний лист буде надісланий на адресу, + вказану у вашому профілі користувача.', + 'test_sms' => 'SMS буде надіслане на номер телефону, вказаний у + вашому профілі користувача.', + 'test_pushover' => 'Pushover-сповіщення буде надіслане на ключ/пристрій + користувача, заданий у вашому профілі + користувача.', + 'test_telegram' => 'Telegram-сповіщення буде надіслане у чат, + ідентифікатор якого заданий у вашому профілі + користувача.', + 'send' => 'Надіслати', + 'test_subject' => 'Тест', + 'test_message' => 'Тестове повідомлення', + 'email_sent' => 'Електронний лист надіслано', + 'email_error' => 'Помилка надсилання електронного листа', + 'sms_sent' => 'SMS надіслане', + 'sms_error' => 'При надсиланні SMS сталася помилка: %s', + 'sms_error_nomobile' => 'Не можу надіслати тестове SMS: у вашому профілі + не знайдено дійсного номера телефону.', + 'pushover_sent' => 'Pushover-сповіщення надіслане', + 'pushover_error' => 'При надсиланні Pushover-сповіщення сталася помилка: + %s', + 'pushover_error_noapp' => 'Не можу надіслати тестове сповіщення: у + глобальних налаштуваннях не знайдено токен + API Pushover-додатку.', + 'pushover_error_nokey' => 'Не можу надіслати тестове сповіщення: у + вашому профілі не знайдено ключа Pushover.', + 'telegram_sent' => 'Telegram-сповіщення надіслане', + 'telegram_error' => 'При надсиланні Telegram-сповіщення сталася помилка: + %s', + 'telegram_error_notoken' => 'Не можу надіслати тестове сповіщення: у + глобальних налаштуваннях не знайдено токен + Telegram API.', + 'telegram_error_noid' => 'Не можу надіслати тестове сповіщення: у + вашому профілі не знайдено ідентифікатор + чату.', + 'log_retention_period' => 'Період зберігання логів', + 'log_retention_period_description' => 'Кількість днів зберігання журналів + сповіщень і архівів часу роботи + серверів. Введіть 0, щоб вимкнути + очищення журналів.', + 'log_retention_days' => 'днів', + ), + 'notifications' => array( + 'off_sms' => 'Сервер \'%LABEL%\' ЛЕЖИТЬ: ip=%IP%, порт=%PORT%. Помилка=%ERROR%', + 'off_email_subject' => 'ВАЖЛИВО: Сервер \'%LABEL%\' ЛЕЖИТЬ', + 'off_email_body' => 'Не вдалося під’єднатися до такого + сервера:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Помилка: %ERROR%
    Дата: %DATE%', + 'off_pushover_title' => 'Сервер \'%LABEL%\' ЛЕЖИТЬ', + 'off_pushover_message' => 'Не вдалося під’єднатися до такого + сервера:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Помилка: %ERROR%
    Дата: %DATE%', + 'off_telegram_message' => 'Не вдалося під’єднатися до такого + сервера:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Помилка: %ERROR%
    Дата: %DATE%', + 'on_sms' => 'Сервер \'%LABEL%\' ПРАЦЮЄ: ip=%IP%, порт=%PORT%, він лежав + протягом %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'ВАЖЛИВО: Сервер \'%LABEL%\' ПРАЦЮЄ', + 'on_email_body' => 'Сервер \'%LABEL%\' знову працює, він лежав протягом + %LAST_OFFLINE_DURATION%:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Дата: %DATE%', + 'on_pushover_title' => 'Сервер \'%LABEL%\' ПРАЦЮЄ', + 'on_pushover_message' => 'Сервер \'%LABEL%\' знову працює, він лежав протягом + %LAST_OFFLINE_DURATION%:

    Сервер: %LABEL%
    IP: %IP%
    Порт: + %PORT%
    Дата: %DATE%', + 'on_telegram_message' => 'Сервер \'%LABEL%\' знову працює, він лежав + протягом: %LAST_OFFLINE_DURATION%

    Сервер: %LABEL%
    IP: + %IP%
    Порт: %PORT%
    Дата: %DATE%', + 'combi_off_email_message' => '
    • Сервер: %LABEL%
    • IP: %IP%
    • Порт: + %PORT%
    • Помилка: %ERROR%
    • Дата: %DATE%
    ', + 'combi_off_pushover_message' => '
    • Сервер: %LABEL%
    • IP: %IP%
    • Порт: + %PORT%
    • Помилка: %ERROR%
    • Дата: %DATE%
    ', + 'combi_off_telegram_message' => '- Сервер: %LABEL%
    - IP: %IP%
    - Порт: %PORT%
    - + Помилка: %ERROR%
    - Дата: %DATE%

    ', + 'combi_on_email_message' => '
    • Сервер: %LABEL%
    • IP: %IP%
    • Порт: + %PORT%
    • Час простою: %LAST_OFFLINE_DURATION%
    • Дата: + %DATE%
    ', + 'combi_on_pushover_message' => '
    • Сервер: %LABEL%
    • IP: %IP%
    • Порт: + %PORT%
    • Час простою: + %LAST_OFFLINE_DURATION%
    • Дата: %DATE%
    ', + 'combi_on_telegram_message' => '- Сервер: %LABEL%
    - IP: %IP%
    - Порт: %PORT%
    - Час + простою: %LAST_OFFLINE_DURATION%
    - Дата: %DATE%

    ', + 'combi_email_subject' => 'ВАЖЛИВО: \'%UP%\' серверів знову ПРАЦЮЮТЬ, \'%DOWN%\' + серверів ЛЕЖАТЬ', + 'combi_pushover_subject' => '\'%UP%\' серверів знову ПРАЦЮЮТЬ, \'%DOWN%\' + серверів ЛЕЖАТЬ', + 'combi_email_message' => 'Такі сервери лягли:
    %DOWN_SERVERS%
    Такі + сервери знову працюють:
    %UP_SERVERS%', + 'combi_pushover_message' => 'Такі сервери лягли:
    %DOWN_SERVERS%
    Такі + сервери знову працюють:
    %UP_SERVERS%', + 'combi_telegram_message' => 'Такі сервери лягли:
    %DOWN_SERVERS%
    Такі + сервери знову працюють:
    %UP_SERVERS%', + ), + 'login' => array( + 'welcome_usermenu' => 'Ласкаво просимо, %user_name%', + 'title_sign_in' => 'Будь ласка, увійдіть', + 'title_forgot' => 'Забули свій пароль?', + 'title_reset' => 'Скинути пароль', + 'submit' => 'Надіслати', + 'remember_me' => 'Запам’ятати мене', + 'login' => 'Вхід', + 'logout' => 'Вихід', + 'username' => 'Ім’я користувача', + 'password' => 'Пароль', + 'password_repeat' => 'Повторити пароль', + 'password_forgot' => 'Забули пароль?', + 'password_reset' => 'Скинути пароль', + 'password_reset_email_subject' => 'Скинути свій пароль до PHP Server Monitor', + 'password_reset_email_body' => 'Будь ласка, скористайтеся наступним + посиланням для скидання свого пароля. Будь + ласка, пам’ятайте, що воно діє протягом 1 + години.

    %link%', + 'error_user_incorrect' => 'Не вдалося знайти вказане ім’я користувача.', + 'error_login_incorrect' => 'Інформація неправильна.', + 'error_login_passwords_nomatch' => 'Надані паролі не збігаються.', + 'error_reset_invalid_link' => 'Надане посилання для скидання пароля + недійсне.', + 'success_password_forgot' => 'Вам надіслано електронний лист із + інформацією про відновлення пароля.', + 'success_password_reset' => 'Ваш пароль успішно скинутий. Будь ласка, + увійдіть.', + ), + 'error' => array( + '401_unauthorized' => 'Несанкціоновано', + '401_unauthorized_description' => 'Ви не маєте дозволу переглядати цю + сторінку.', + ), +); diff --git a/src/lang/vi_VN.lang.php b/src/lang/vi_VN.lang.php index d16285ba..fe587d8a 100644 --- a/src/lang/vi_VN.lang.php +++ b/src/lang/vi_VN.lang.php @@ -1,4 +1,5 @@ 'Tiếng Việt - Vietnamese', - 'locale' => array('vi_VN.UTF-8', 'vi_VN', 'Việt Nam'), - 'system' => array( - 'title' => 'Server Monitor', - 'install' => 'Cài đặt', - 'action' => 'Hành động', - 'save' => 'Lưu', - 'edit' => 'Sửa', - 'delete' => 'Xóa', - 'date' => 'Ngày', - 'message' => 'Message', - 'yes' => 'Yes', - 'no' => 'No', - 'insert' => 'Thêm mới', - 'add_new' => 'Thêm mới', - 'update_available' => 'Phiên bản mới ({version}) có săn trên http://www.phpservermonitor.org.', - 'back_to_top' => 'Lên đầu trang', - 'go_back' => 'Quay lại', - 'ok' => 'OK', - 'cancel' => 'Cancel', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => 'Yesterday at %k:%M', - 'other_day_format' => '%A at %k:%M', - 'never' => 'Never', - 'hours_ago' => '%d giờ trước', - 'an_hour_ago' => 'khoảng một giờ trước', - 'minutes_ago' => '%d phút trước', - 'a_minute_ago' => 'khoảng một phút trước', - 'seconds_ago' => '%d giây trước', - 'a_second_ago' => 'một giây trước', - ), - 'menu' => array( - 'config' => 'Cấu hình', - 'server' => 'Servers', - 'server_log' => 'Log', - 'server_status' => 'Trạng thái', - 'server_update' => 'Cập nhật', - 'user' => 'Người dùng', - 'help' => 'Giúp đỡ', - ), - 'users' => array( - 'user' => 'Người dùng', - 'name' => 'Tên', - 'user_name' => 'Tên đăng nhập', - 'password' => 'Mật khẩu', - 'password_repeat' => 'Nhập lại mật khẩu', - 'password_leave_blank' => 'Leave blank to keep unchanged', - 'level' => 'Cấp độ', - 'level_10' => 'Administrator', - 'level_20' => 'User', - 'level_description' => 'Administrators có toàn quyền: họ có thể quản lý server, người dùng và chỉnh sửa cấu hình.
    Users chỉ xem và chạy cập nhật cho servers được giao cho họ.', - 'mobile' => 'Di động', - 'email' => 'Email', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian thực. Xem website của họ để biết thêm thông tin.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => 'Tên thiết bị để gửi tin nhắn đến. Để trống để gửi cho tất cả các thiết bị.', - 'delete_title' => 'Xóa Người dùng', - 'delete_message' => 'Bạn có chắc chắn xóa người dùng \'%1\'?', - 'deleted' => 'Đã xóa người dùng.', - 'updated' => 'Đã cập nhật người dùng.', - 'inserted' => 'Đã thêm người dùng.', - 'profile' => 'Hồ sơ', - 'profile_updated' => 'Hồ sơ của bạn đã được cập nhật.', - 'error_user_name_bad_length' => 'Tên người dùng phải có từ 2 và 64 ký tự.', - 'error_user_name_invalid' => 'Tên người dùng chỉ có thể chứa các chữ cái(a-z, A-Z), số (0-9), dấu chấm (.) và dấu gạch dưới (_).', - 'error_user_name_exists' => 'Tên người dùng đã tồn tại trong cơ sở dữ liệu.', - 'error_user_email_bad_length' => 'Địa chỉ email phải từ 5 đến 255 ký tự.', - 'error_user_email_invalid' => 'Địa chỉ email không hợp lệ.', - 'error_user_level_invalid' => 'Cấp độ người dùng không hợp lệ.', - 'error_user_no_match' => 'Người dùng không tìm thấy trong cơ sở dữ liệu.', - 'error_user_password_invalid' => 'Đặt mật khẩu không hợp lệ.', - 'error_user_password_no_match' => 'Các mật khẩu không khớp.', - ), - 'log' => array( - 'title' => 'Log entries', - 'type' => 'Loại', - 'status' => 'Trạng thái', - 'email' => 'Email', - 'sms' => 'SMS', - 'pushover' => 'Pushover', - 'no_logs' => 'No logs', - 'clear' => 'Xoá nhật ký', - 'delete_title' => 'Xoá nhật ký', - 'delete_message' => 'Bạn có chắc chắn muốn xóa tất cả các bản ghi?', - ), - 'servers' => array( - 'server' => 'Server', - 'status' => 'Trạng thái', - 'label' => 'Nhãn', - 'domain' => 'Domain/IP', - 'timeout' => 'Timeout', - 'timeout_description' => 'Số giây để đợi máy chủ phản hồi.', - 'port' => 'Cổng', - 'type' => 'Loại', - 'type_website' => 'Website', - 'type_service' => 'Dịch vụ', - 'pattern' => 'Tìm kiếm chuỗi/mẫu', - 'pattern_description' => 'Nếu mẫu không tìm thấy trên website, server sẽ được đánh dấu là offline. Biểu thức chính quy (Regular expressions) được cho phép.', - 'last_check' => 'Kiểm tra lần cuối', - 'last_online' => 'Trực tuyến lần cuối', - 'monitoring' => 'Giám sát', - 'no_monitoring' => 'Không giám sát', - 'email' => 'Email', - 'send_email' => 'Gửi Email', - 'sms' => 'SMS', - 'send_sms' => 'Gửi SMS', - 'pushover' => 'Pushover', - 'users' => 'Người dùng', - 'delete_title' => 'Xóa server', - 'delete_message' => 'Bạn có chắt chắn xóa server \'%1\'?', - 'deleted' => 'Đã xóa server.', - 'updated' => 'Đã cập nhật server.', - 'inserted' => 'Đã thêm server.', - 'latency' => 'Độ trễ', - 'latency_max' => 'Độ trễ (cao nhất)', - 'latency_min' => 'Độ trễ (thấp nhất)', - 'latency_avg' => 'Độ trễ (trung bình)', - 'uptime' => 'Thời gian hoạt động', - 'year' => 'Năm', - 'month' => 'Tháng', - 'week' => 'Tuần', - 'day' => 'Ngày', - 'hour' => 'Giờ', - 'warning_threshold' => 'Ngưỡng cảnh báo', - 'warning_threshold_description' => 'Số lần kiểm tra thất bại trước khi đánh đấu là offline.', - 'chart_last_week' => 'Tuần trước', - 'chart_history' => 'Lịch sử', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => 'SMS thông báo bị vô hiệu hóa.', - 'warning_notifications_disabled_email' => 'Email thông báo bị vô hiệu hóa.', - 'warning_notifications_disabled_pushover' => 'Pushover thông báo bị vô hiệu hóa.', - 'error_server_no_match' => 'Không tìm thấy server.', - 'error_server_label_bad_length' => 'Nhãn phải có từ 1 đến 255 ký tự.', - 'error_server_ip_bad_length' => 'The domain / IP Nhãn phải có từ 1 đến 255 ký tự.', - 'error_server_ip_bad_service' => 'Địa chỉ IP không hợp lệ.', - 'error_server_ip_bad_website' => 'URL website không hợp lệ.', - 'error_server_type_invalid' => 'Chọn loại server không hợp lệ.', - 'error_server_warning_threshold_invalid' => 'Ngưỡng cảnh báo phải là một số nguyên có giá trị lớn hơn 0.', - ), - 'config' => array( - 'general' => 'Tổng quát', - 'language' => 'Ngôn ngữ', - 'show_update' => 'Kiểm tra cập nhật?', - 'email_status' => 'Cho phép gửi email', - 'email_from_email' => 'Gửi email từ địa chỉ', - 'email_from_name' => 'Tên địa chỉ mail', - 'email_smtp' => 'Enable SMTP', - 'email_smtp_host' => 'SMTP host', - 'email_smtp_port' => 'SMTP port', - 'email_smtp_security' => 'SMTP security', - 'email_smtp_security_none' => 'None', - 'email_smtp_username' => 'SMTP username', - 'email_smtp_password' => 'SMTP password', - 'email_smtp_noauth' => 'Để trống nếu không có chứng thực', - 'sms_status' => 'Cho phép gửi tin nhắn văn bản', - 'sms_gateway' => 'Gateway sử dụng để gửi tin nhắn', - 'sms_gateway_username' => 'Gateway username', - 'sms_gateway_password' => 'Gateway password', - 'sms_from' => 'Số điện thoại của người gửi', - 'pushover_status' => 'Cho phép gửi tin nhắn bằng Pushover', - 'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian thực. Xem website của họ để biết thêm thông tin.', - 'pushover_clone_app' => 'Nhấn vào đây để tạo ứng dụng Pushover của bạn', - 'pushover_api_token' => 'Pushover App API Token', - 'pushover_api_token_description' => 'Trước khi bạn có thể sử dụng Pushover, bạn cần phải đăng ký một ứng dụng tại trang web của họ và nhập Token App API ở đây.', - 'alert_type' => 'Chọn khi bạn muốn được thông báo.', - 'alert_type_description' => 'Thay đổi trạng thái: '. - 'Bạn sẽ nhận được thông báo khi một máy chủ có một sự thay đổi trạng thái. Từ online -> offline hoặc offline -> online.
    '. - '
    Offline: '. - 'Bạn sẽ nhận được thông báo khi một máy chủ offline *MỘT LẦN DUY NHẤT*. Ví dụ, '. - 'cronjob của bạn hoạt động mỗi 15 phút và server của bạn down tại 01h00 cho đến 6h00. '. - 'Bạn sẽ nhận được 1 thông báo lúc 01h00 và đó là nó.
    '. - '
    Always: '. - 'Bạn sẽ nhận được thông báo mỗi khi chạy đoạn script và một trang web tắt, ngay cả khi trang web đã được offline trong nhiều giờ.', - 'alert_type_status' => 'Thay đổi trạng thái', - 'alert_type_offline' => 'Offline', - 'alert_type_always' => 'Always', - 'log_status' => 'Log status', - 'log_status_description' => 'Nếu log status được đặt là TRUE, màn hình sẽ đăng sự kiện này bất cứ khi nào các thiết lập thông báo được truyền.', - 'log_email' => 'Log emails gửi bởi script', - 'log_sms' => 'Log Tin nhăn văn bản gửi bởi script', - 'log_pushover' => 'Log tin nhắn pushover gửi bởi script', - 'updated' => 'Cấu hình đã được cập nhật.', - 'tab_email' => 'Email', - 'tab_sms' => 'SMS', - 'tab_pushover' => 'Pushover', - 'settings_email' => 'Thiết lặp email', - 'settings_sms' => 'Thiết lập tin nhăn văn bản', - 'settings_pushover' => 'Thiết lặp Pushover', - 'settings_notification' => 'Thiết lặp thông báo', - 'settings_log' => 'Thiết lặp Log', - 'auto_refresh' => 'Tự động làm mới', - 'auto_refresh_description' => - 'Tự động làm mới servers page.
    '. - ''. - 'Trong vài giây, nếu 0 trang sẽ không làm mới.'. - '', - 'seconds' => 'giây', - 'test' => 'Thử', - 'test_email' => 'Một email sẽ được gửi đến địa chỉ được xác định trong hồ sơ người dùng của bạn.', - 'test_sms' => 'Một SMS sẽ được gửi đến địa chỉ được xác định trong hồ sơ người dùng của bạn.', - 'test_pushover' => 'Một thông báo Pushover sẽ được gửi đến địa chỉ được xác định trong hồ sơ người dùng của bạn.', - 'send' => 'Gửi', - 'test_subject' => 'Thử nghiệm', - 'test_message' => 'tin nhắn thử nghiệm', - 'email_sent' => 'Gửi email', - 'email_error' => 'Lỗi trong khi gửi mail', - 'sms_sent' => 'Gửi SMS', - 'sms_error' => 'Lỗi trong khi gửi sms. %s', - 'sms_error_nomobile' => 'Không thể gửi thử SMS: không có số điện thoại hợp lệ được tìm thấy trong hồ sơ của bạn.', - 'pushover_sent' => 'Gửi thông báo Pushover', - 'pushover_error' => 'Một lỗi đã xảy ra trong khi gửi thông báo Pushover: %s', - 'pushover_error_noapp' => 'Không thể gửi thử thông báo: không tìm thấy Pushover App API token trong cấu hình.', - 'pushover_error_nokey' => 'Không thể gửi thử thông báo: không tìm thấy Pushover key trong hồ sơ của bạn.', - 'log_retention_period' => 'Thời gian lưu giữ log', - 'log_retention_period_description' => 'Số ngày để giữ các bản ghi của các thông báo và tài liệu lưu trữ của thời gian hoạt động máy chủ. Nhập 0 để vô hiệu hóa dọn dẹp log.', - 'log_retention_days' => 'ngày', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, cổng=%PORT%. Lỗi=%ERROR%', - 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', - 'off_email_body' => "Không thể kết nối đến máy chủ sau:

    Server: %LABEL%
    IP: %IP%
    Cổng: %PORT%
    Lỗi: %ERROR%
    Thời gian: %DATE%", - 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', - 'off_pushover_message' => "Không thể kết nối đến máy chủ:

    Server: %LABEL%
    IP: %IP%
    Cổng: %PORT%
    Lỗi: %ERROR%
    Thời gian: %DATE%", - 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' hoạt động', - 'on_email_body' => "Server '%LABEL%' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Cổng: %PORT%
    Thời gian: %DATE%", - 'on_pushover_title' => 'Server \'%LABEL%\' hoạt động', - 'on_pushover_message' => 'Server \'%LABEL%\' hoạt động lại, it was down for %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Cổng: %PORT%
    Thời gian: %DATE%', - ), - 'login' => array( - 'welcome_usermenu' => 'Chào mừng, %user_name%', - 'title_sign_in' => 'Vui lòng đăng nhập', - 'title_forgot' => 'Quên mật khẩu?', - 'title_reset' => 'Khôi phục mật khẩu', - 'submit' => 'Gửi', - 'remember_me' => 'Ghi nhớ tôi', - 'login' => 'Đăng nhập', - 'logout' => 'Đăng xuất', - 'username' => 'Tên đăng nhập', - 'password' => 'Mật khẩu', - 'password_repeat' => 'Nhập lại mật khẩu', - 'password_forgot' => 'Quên mật khẩu?', - 'password_reset' => 'Khôi phục mật khẩu', - 'password_reset_email_subject' => 'Khôi phục lại mật khẩu của bạn cho PHP Server Monitor', - 'password_reset_email_body' => 'Vui lòng sử dụng liên kết sau đây để thiết lập lại mật khẩu của bạn. Xin lưu ý nó hết hạn trong 1 giờ.

    %link%', - 'error_user_incorrect' => 'Tên người dùng cung cấp không thể tìm thấy.', - 'error_login_incorrect' => 'Thông tin không đúng.', - 'error_login_passwords_nomatch' => 'Mật khẩu được cung cấp không phù hợp.', - 'error_reset_invalid_link' => 'Liên kết đặt lại mà bạn cung cấp không hợp lệ.', - 'success_password_forgot' => 'Một email đã được gửi đến bạn với thông tin làm thế nào để khôi phục lại mật khẩu của bạn.', - 'success_password_reset' => 'Mật khẩu bạn được khôi phục thành công. Vui lòng đăng nhập.', - ), - 'error' => array( - '401_unauthorized' => 'Không được phép', - '401_unauthorized_description' => 'Bạn không có quyền xem trang này.', - ), + 'name' => 'Tiếng Việt - Vietnamese', + 'locale' => array( + '0' => 'vi_VN.UTF-8', + '1' => 'vi_VN', + '2' => 'Việt Nam', + ), + 'system' => array( + 'title' => 'Server Monitor', + 'install' => 'Cài đặt', + 'action' => 'Hành động', + 'save' => 'Lưu', + 'edit' => 'Sửa', + 'delete' => 'Xóa', + 'date' => 'Ngày', + 'message' => 'Message', + 'yes' => 'Yes', + 'no' => 'No', + 'insert' => 'Thêm mới', + 'add_new' => 'Thêm mới', + 'update_available' => 'Phiên bản mới ({version}) có săn trên http://www.phpservermonitor.org.', + 'back_to_top' => 'Lên đầu trang', + 'go_back' => 'Quay lại', + 'ok' => 'OK', + 'cancel' => 'Cancel', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => 'Yesterday at %k:%M', + 'other_day_format' => '%A at %k:%M', + 'never' => 'Never', + 'hours_ago' => '%d giờ trước', + 'an_hour_ago' => 'khoảng một giờ trước', + 'minutes_ago' => '%d phút trước', + 'a_minute_ago' => 'khoảng một phút trước', + 'seconds_ago' => '%d giây trước', + 'a_second_ago' => 'một giây trước', + ), + 'menu' => array( + 'config' => 'Cấu hình', + 'server' => 'Servers', + 'server_log' => 'Log', + 'server_status' => 'Trạng thái', + 'server_update' => 'Cập nhật', + 'user' => 'Người dùng', + 'help' => 'Giúp đỡ', + ), + 'users' => array( + 'user' => 'Người dùng', + 'name' => 'Tên', + 'user_name' => 'Tên đăng nhập', + 'password' => 'Mật khẩu', + 'password_repeat' => 'Nhập lại mật khẩu', + 'password_leave_blank' => 'Leave blank to keep unchanged', + 'level' => 'Cấp độ', + 'level_10' => 'Administrator', + 'level_20' => 'User', + 'level_description' => 'Administrators có toàn quyền: họ có thể quản lý server, người + dùng và chỉnh sửa cấu hình.
    Users chỉ xem và chạy cập nhật + cho servers được giao cho họ.', + 'mobile' => 'Di động', + 'email' => 'Email', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian + thực. Xem website của họ để biết + thêm thông tin.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => 'Tên thiết bị để gửi tin nhắn đến. Để trống để gửi + cho tất cả các thiết bị.', + 'delete_title' => 'Xóa Người dùng', + 'delete_message' => 'Bạn có chắc chắn xóa người dùng \'%1\'?', + 'deleted' => 'Đã xóa người dùng.', + 'updated' => 'Đã cập nhật người dùng.', + 'inserted' => 'Đã thêm người dùng.', + 'profile' => 'Hồ sơ', + 'profile_updated' => 'Hồ sơ của bạn đã được cập nhật.', + 'error_user_name_bad_length' => 'Tên người dùng phải có từ 2 và 64 ký tự.', + 'error_user_name_invalid' => 'Tên người dùng chỉ có thể chứa các chữ cái(a-z, A-Z), số + (0-9), dấu chấm (.) và dấu gạch dưới (_).', + 'error_user_name_exists' => 'Tên người dùng đã tồn tại trong cơ sở dữ liệu.', + 'error_user_email_bad_length' => 'Địa chỉ email phải từ 5 đến 255 ký tự.', + 'error_user_email_invalid' => 'Địa chỉ email không hợp lệ.', + 'error_user_level_invalid' => 'Cấp độ người dùng không hợp lệ.', + 'error_user_no_match' => 'Người dùng không tìm thấy trong cơ sở dữ liệu.', + 'error_user_password_invalid' => 'Đặt mật khẩu không hợp lệ.', + 'error_user_password_no_match' => 'Các mật khẩu không khớp.', + ), + 'log' => array( + 'title' => 'Log entries', + 'type' => 'Loại', + 'status' => 'Trạng thái', + 'email' => 'Email', + 'sms' => 'SMS', + 'pushover' => 'Pushover', + 'no_logs' => 'No logs', + 'clear' => 'Xoá nhật ký', + 'delete_title' => 'Xoá nhật ký', + 'delete_message' => 'Bạn có chắc chắn muốn xóa tất cả các bản ghi?', + ), + 'servers' => array( + 'server' => 'Server', + 'status' => 'Trạng thái', + 'label' => 'Nhãn', + 'domain' => 'Domain/IP', + 'timeout' => 'Timeout', + 'timeout_description' => 'Số giây để đợi máy chủ phản hồi.', + 'port' => 'Cổng', + 'type' => 'Loại', + 'type_website' => 'Website', + 'type_service' => 'Dịch vụ', + 'pattern' => 'Tìm kiếm chuỗi/mẫu', + 'pattern_description' => 'Nếu mẫu không tìm thấy trên website, server sẽ được đánh dấu là + offline. Biểu thức chính quy (Regular expressions) được cho phép.', + 'last_check' => 'Kiểm tra lần cuối', + 'last_online' => 'Trực tuyến lần cuối', + 'monitoring' => 'Giám sát', + 'no_monitoring' => 'Không giám sát', + 'email' => 'Email', + 'send_email' => 'Gửi Email', + 'sms' => 'SMS', + 'send_sms' => 'Gửi SMS', + 'pushover' => 'Pushover', + 'users' => 'Người dùng', + 'delete_title' => 'Xóa server', + 'delete_message' => 'Bạn có chắt chắn xóa server \'%1\'?', + 'deleted' => 'Đã xóa server.', + 'updated' => 'Đã cập nhật server.', + 'inserted' => 'Đã thêm server.', + 'latency' => 'Độ trễ', + 'latency_max' => 'Độ trễ (cao nhất)', + 'latency_min' => 'Độ trễ (thấp nhất)', + 'latency_avg' => 'Độ trễ (trung bình)', + 'uptime' => 'Thời gian hoạt động', + 'year' => 'Năm', + 'month' => 'Tháng', + 'week' => 'Tuần', + 'day' => 'Ngày', + 'hour' => 'Giờ', + 'warning_threshold' => 'Ngưỡng cảnh báo', + 'warning_threshold_description' => 'Số lần kiểm tra thất bại trước khi đánh đấu là offline.', + 'chart_last_week' => 'Tuần trước', + 'chart_history' => 'Lịch sử', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => 'SMS thông báo bị vô hiệu hóa.', + 'warning_notifications_disabled_email' => 'Email thông báo bị vô hiệu hóa.', + 'warning_notifications_disabled_pushover' => 'Pushover thông báo bị vô hiệu hóa.', + 'error_server_no_match' => 'Không tìm thấy server.', + 'error_server_label_bad_length' => 'Nhãn phải có từ 1 đến 255 ký tự.', + 'error_server_ip_bad_length' => 'The domain / IP Nhãn phải có từ 1 đến 255 ký tự.', + 'error_server_ip_bad_service' => 'Địa chỉ IP không hợp lệ.', + 'error_server_ip_bad_website' => 'URL website không hợp lệ.', + 'error_server_type_invalid' => 'Chọn loại server không hợp lệ.', + 'error_server_warning_threshold_invalid' => 'Ngưỡng cảnh báo phải là một số nguyên có giá + trị lớn hơn 0.', + ), + 'config' => array( + 'general' => 'Tổng quát', + 'language' => 'Ngôn ngữ', + 'show_update' => 'Kiểm tra cập nhật?', + 'email_status' => 'Cho phép gửi email', + 'email_from_email' => 'Gửi email từ địa chỉ', + 'email_from_name' => 'Tên địa chỉ mail', + 'email_smtp' => 'Enable SMTP', + 'email_smtp_host' => 'SMTP host', + 'email_smtp_port' => 'SMTP port', + 'email_smtp_security' => 'SMTP security', + 'email_smtp_security_none' => 'None', + 'email_smtp_username' => 'SMTP username', + 'email_smtp_password' => 'SMTP password', + 'email_smtp_noauth' => 'Để trống nếu không có chứng thực', + 'sms_status' => 'Cho phép gửi tin nhắn văn bản', + 'sms_gateway' => 'Gateway sử dụng để gửi tin nhắn', + 'sms_gateway_username' => 'Gateway username', + 'sms_gateway_password' => 'Gateway password', + 'sms_from' => 'Số điện thoại của người gửi', + 'pushover_status' => 'Cho phép gửi tin nhắn bằng Pushover', + 'pushover_description' => 'Pushover là một dịch vụ dễ dàng nhận các thông báo theo thời gian + thực. Xem website của họ để biết + thêm thông tin.', + 'pushover_clone_app' => 'Nhấn vào đây để tạo ứng dụng Pushover của bạn', + 'pushover_api_token' => 'Pushover App API Token', + 'pushover_api_token_description' => 'Trước khi bạn có thể sử dụng Pushover, bạn cần phải đăng ký một ứng + dụng tại trang web của họ và nhập Token App API ở đây.', + 'alert_type' => 'Chọn khi bạn muốn được thông báo.', + 'alert_type_description' => 'Thay đổi trạng thái: Bạn sẽ nhận được thông báo khi + một máy chủ có một sự thay đổi trạng thái. Từ online -> offline + hoặc offline -> online.

    Offline: Bạn sẽ nhận được + thông báo khi một máy chủ offline *MỘT LẦN DUY NHẤT*. Ví dụ, + cronjob của bạn hoạt động mỗi 15 phút và server của bạn down + tại 01h00 cho đến 6h00. Bạn sẽ nhận được 1 thông báo lúc 01h00 + và đó là nó.

    Always: Bạn sẽ nhận được thông báo + mỗi khi chạy đoạn script và một trang web tắt, ngay cả khi trang + web đã được offline trong nhiều giờ.', + 'alert_type_status' => 'Thay đổi trạng thái', + 'alert_type_offline' => 'Offline', + 'alert_type_always' => 'Always', + 'log_status' => 'Log status', + 'log_status_description' => 'Nếu log status được đặt là TRUE, màn hình sẽ đăng sự kiện + này bất cứ khi nào các thiết lập thông báo được truyền.', + 'log_email' => 'Log emails gửi bởi script', + 'log_sms' => 'Log Tin nhăn văn bản gửi bởi script', + 'log_pushover' => 'Log tin nhắn pushover gửi bởi script', + 'updated' => 'Cấu hình đã được cập nhật.', + 'tab_email' => 'Email', + 'tab_sms' => 'SMS', + 'tab_pushover' => 'Pushover', + 'settings_email' => 'Thiết lặp email', + 'settings_sms' => 'Thiết lập tin nhăn văn bản', + 'settings_pushover' => 'Thiết lặp Pushover', + 'settings_notification' => 'Thiết lặp thông báo', + 'settings_log' => 'Thiết lặp Log', + 'auto_refresh' => 'Tự động làm mới', + 'auto_refresh_description' => 'Tự động làm mới servers page.
    Trong vài giây, + nếu 0 trang sẽ không làm mới.', + 'seconds' => 'giây', + 'test' => 'Thử', + 'test_email' => 'Một email sẽ được gửi đến địa chỉ được xác định trong hồ sơ + người dùng của bạn.', + 'test_sms' => 'Một SMS sẽ được gửi đến địa chỉ được xác định trong hồ sơ người + dùng của bạn.', + 'test_pushover' => 'Một thông báo Pushover sẽ được gửi đến địa chỉ được xác định + trong hồ sơ người dùng của bạn.', + 'send' => 'Gửi', + 'test_subject' => 'Thử nghiệm', + 'test_message' => 'tin nhắn thử nghiệm', + 'email_sent' => 'Gửi email', + 'email_error' => 'Lỗi trong khi gửi mail', + 'sms_sent' => 'Gửi SMS', + 'sms_error' => 'Lỗi trong khi gửi sms. %s', + 'sms_error_nomobile' => 'Không thể gửi thử SMS: không có số điện thoại hợp lệ được + tìm thấy trong hồ sơ của bạn.', + 'pushover_sent' => 'Gửi thông báo Pushover', + 'pushover_error' => 'Một lỗi đã xảy ra trong khi gửi thông báo Pushover: %s', + 'pushover_error_noapp' => 'Không thể gửi thử thông báo: không tìm thấy Pushover App API token + trong cấu hình.', + 'pushover_error_nokey' => 'Không thể gửi thử thông báo: không tìm thấy Pushover key trong hồ + sơ của bạn.', + 'log_retention_period' => 'Thời gian lưu giữ log', + 'log_retention_period_description' => 'Số ngày để giữ các bản ghi của các thông báo và tài + liệu lưu trữ của thời gian hoạt động máy chủ. Nhập 0 + để vô hiệu hóa dọn dẹp log.', + 'log_retention_days' => 'ngày', + ), + 'notifications' => array( + 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, cổng=%PORT%. Lỗi=%ERROR%', + 'off_email_subject' => 'IMPORTANT: Server \'%LABEL%\' is DOWN', + 'off_email_body' => 'Không thể kết nối đến máy chủ sau:

    Server: %LABEL%
    IP: + %IP%
    Cổng: %PORT%
    Lỗi: %ERROR%
    Thời gian: %DATE%', + 'off_pushover_title' => 'Server \'%LABEL%\' is DOWN', + 'off_pushover_message' => 'Không thể kết nối đến máy chủ:

    Server: %LABEL%
    IP: + %IP%
    Cổng: %PORT%
    Lỗi: %ERROR%
    Thời gian: %DATE%', + 'on_sms' => 'Server \'%LABEL%\' is RUNNING: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANT: Server \'%LABEL%\' hoạt động', + 'on_email_body' => 'Server \'%LABEL%\' hoạt động lại, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Cổng: %PORT%
    Thời + gian: %DATE%', + 'on_pushover_title' => 'Server \'%LABEL%\' hoạt động', + 'on_pushover_message' => 'Server \'%LABEL%\' hoạt động lại, it was down for + %LAST_OFFLINE_DURATION%:

    Server: %LABEL%
    IP: %IP%
    Cổng: + %PORT%
    Thời gian: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => 'Chào mừng, %user_name%', + 'title_sign_in' => 'Vui lòng đăng nhập', + 'title_forgot' => 'Quên mật khẩu?', + 'title_reset' => 'Khôi phục mật khẩu', + 'submit' => 'Gửi', + 'remember_me' => 'Ghi nhớ tôi', + 'login' => 'Đăng nhập', + 'logout' => 'Đăng xuất', + 'username' => 'Tên đăng nhập', + 'password' => 'Mật khẩu', + 'password_repeat' => 'Nhập lại mật khẩu', + 'password_forgot' => 'Quên mật khẩu?', + 'password_reset' => 'Khôi phục mật khẩu', + 'password_reset_email_subject' => 'Khôi phục lại mật khẩu của bạn cho PHP Server Monitor', + 'password_reset_email_body' => 'Vui lòng sử dụng liên kết sau đây để thiết lập lại mật + khẩu của bạn. Xin lưu ý nó hết hạn trong 1 giờ.

    %link%', + 'error_user_incorrect' => 'Tên người dùng cung cấp không thể tìm thấy.', + 'error_login_incorrect' => 'Thông tin không đúng.', + 'error_login_passwords_nomatch' => 'Mật khẩu được cung cấp không phù hợp.', + 'error_reset_invalid_link' => 'Liên kết đặt lại mà bạn cung cấp không hợp lệ.', + 'success_password_forgot' => 'Một email đã được gửi đến bạn với thông tin làm thế nào + để khôi phục lại mật khẩu của bạn.', + 'success_password_reset' => 'Mật khẩu bạn được khôi phục thành công. Vui lòng đăng nhập.', + ), + 'error' => array( + '401_unauthorized' => 'Không được phép', + '401_unauthorized_description' => 'Bạn không có quyền xem trang này.', + ), ); diff --git a/src/lang/zh_CN.lang.php b/src/lang/zh_CN.lang.php index 21074170..c3350957 100644 --- a/src/lang/zh_CN.lang.php +++ b/src/lang/zh_CN.lang.php @@ -1,4 +1,5 @@ '中文 - Chinese', - 'locale' => array('zh_CN.UTF-8', 'zh_CN', 'chinese', 'chinese-cn'), - 'locale_tag' => 'zh', - 'locale_dir' => 'ltr', - 'system' => array( - 'title' => 'Server Monitor', - 'install' => '安装', - 'action' => '操作', - 'save' => '保存', - 'edit' => '编辑', - 'delete' => '删除', - 'date' => '日期', - 'message' => '消息', - 'yes' => '是', - 'no' => '否', - 'insert' => '新增', - 'add_new' => '添加', - 'update_available' => '发现新版本({version}) http://www.phpservermonitor.org.', - 'back_to_top' => '返回顶部', - 'go_back' => '后退', - 'ok' => '确认', - 'cancel' => '取消', - // date/time format according the strftime php function format parameter http://php.net/manual/function.strftime.php - 'short_day_format' => '%B %e', - 'long_day_format' => '%B %e, %Y', - 'yesterday_format' => '昨日 %k:%M', - 'other_day_format' => '%A %k:%M', - 'never' => '从未', - 'hours_ago' => '%d 小时前', - 'an_hour_ago' => '1小时前', - 'minutes_ago' => '%d 分钟前', - 'a_minute_ago' => '1分钟前', - 'seconds_ago' => '%d 秒前', - 'a_second_ago' => '刚刚', - 'year' => 'year', - 'years' => 'years', - 'month' => 'month', - 'months' => 'months', - 'day' => 'day', - 'days' => 'days', - 'hour' => 'hour', - 'hours' => 'hours', - 'minute' => 'minute', - 'minutes' => 'minutes', - 'second' => 'second', - 'seconds' => 'seconds', - ), - 'menu' => array( - 'config' => '设置', - 'server' => '监控', - 'server_log' => '日志', - 'server_status' => '状态', - 'server_update' => '刷新', - 'user' => '用户', - 'help' => '帮助', - ), - 'users' => array( - 'user' => '用户', - 'name' => '名称', - 'user_name' => '用户名', - 'password' => '密码', - 'password_repeat' => '重复密码', - 'password_leave_blank' => '留空为不修改', - 'level' => '等级', - 'level_10' => '超级管理员', - 'level_20' => '普通用户', - 'level_description' => '超级管理员 拥有所有权限: 管理服务器, 用户 以及修改设置.
    普通用户 只能查看及更新自己名下所属的服务器.', - 'mobile' => '手机', - 'email' => '邮件', - 'pushover' => 'Pushover', - 'pushover_description' => 'Pushover 是第三方用于实时通知的服务(收费). 详情见 Pushover 官网.', - 'pushover_key' => 'Pushover Key', - 'pushover_device' => 'Pushover Device', - 'pushover_device_description' => '要发送信息的设备名. 留空则发送到所有设备.', - 'delete_title' => '删除用户', - 'delete_message' => '确认删除用户 \'%1\'?', - 'deleted' => '用户已删除.', - 'updated' => '用户已更新.', - 'inserted' => '用户已添加.', - 'profile' => '个人资料', - 'profile_updated' => '个人资料已更新.', - 'error_user_name_bad_length' => '用户名长度必须为2-64个字符.', - 'error_user_name_invalid' => '用户名只允许使用字母 (a-z, A-Z), 数字 (0-9), 點(。) 及下划线 (_).', - 'error_user_name_exists' => '该用户名已存在.', - 'error_user_email_bad_length' => '电子邮箱长度必须为5-255个字符.', - 'error_user_email_invalid' => '无效的邮箱地址.', - 'error_user_level_invalid' => '该用户等级无效.', - 'error_user_no_match' => '该用户名不存在.', - 'error_user_password_invalid' => '密码无效.', - 'error_user_password_no_match' => '密码不符.', - ), - 'log' => array( - 'title' => '日志概览', - 'type' => '类型', - 'status' => '状态', - 'email' => '邮件', - 'sms' => '短信', - 'pushover' => 'Pushover', - 'no_logs' => '没有日志', - 'clear' => 'Clear log', - 'delete_title' => 'Delete log', - 'delete_message' => 'Are you sure you want to delete all logs?', - ), - 'servers' => array( - 'server' => '业务', - 'status' => '状态', - 'label' => '标签', - 'domain' => 'URL/IP', - 'timeout' => '超时时间', - 'timeout_description' => '等待服务器响应的时间.', - 'authentication_settings' => '访问权限设置', - 'optional' => '可选', - 'website_username' => '用户名', - 'website_username_description' => '网站分配的用户名.', - 'website_password' => '密码', - 'website_password_description' => '网站分配的密码,密码将会加密存放', - 'fieldset_monitoring' => '通知', - 'fieldset_permissions' => '权限', - 'port' => '端口', - 'custom_port' => '指定端口', - 'popular_ports' => '默认端口', - 'please_select' => '请选择', - 'type' => '类型', - 'type_website' => '网站', - 'type_service' => '服务', - 'pattern' => '字符串/正则匹配', - 'pattern_description' => '如果在网站上未找到对应匹配内容, 则标记该网站为离线. 支持正则表达式.', - 'last_check' => '最后检查', - 'last_online' => '最后在线', - 'last_offline' => 'Last offline', - 'monitoring' => '监控', - 'no_monitoring' => '未监控', - 'email' => '邮件', - 'send_email' => '发送邮件', - 'sms' => '短信', - 'send_sms' => '发送短信', - 'pushover' => 'Pushover', - 'users' => '用户', - 'delete_title' => '删除服务器', - 'delete_message' => '确认删除服务器 \'%1\'?', - 'deleted' => '服务器已删除.', - 'updated' => '服务器已更新.', - 'inserted' => '服务器已添加.', - 'latency' => '延迟', - 'latency_max' => '最大延迟', - 'latency_min' => '最小延迟', - 'latency_avg' => '平均延迟', - 'uptime' => '在线时长', - 'year' => '年', - 'month' => '月', - 'week' => '周', - 'day' => '日', - 'hour' => '小时', - 'warning_threshold' => '报警阈值', - 'warning_threshold_description' => '失败达到多少次数则标记为离线.', - 'chart_last_week' => '上周', - 'chart_history' => '更早', - // Charts date format according jqPlot date format http://www.jqplot.com/docs/files/plugins/jqplot-dateAxisRenderer-js.html - 'chart_day_format' => '%Y-%m-%d', - 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', - 'chart_short_date_format' => '%m/%d %H:%M', - 'chart_short_time_format' => '%H:%M', - 'warning_notifications_disabled_sms' => '短信通知不可用.', - 'warning_notifications_disabled_email' => 'Email 通知不可用.', - 'warning_notifications_disabled_pushover' => 'Pushover 通知不可用.', - 'error_server_no_match' => '服务器不存在.', - 'error_server_label_bad_length' => '标签 长度要求 1 ~ 255 字符.', - 'error_server_ip_bad_length' => 'URL / IP 长度要求 1 ~ 255 字符.', - 'error_server_ip_bad_service' => '非法 IP.', - 'error_server_ip_bad_website' => '非法 URL.', - 'error_server_type_invalid' => '非法选项.', - 'error_server_warning_threshold_invalid' => '报警阈值为大于 0 的数字.', - ), - 'config' => array( - 'general' => '通用', - 'language' => '语言', - 'show_update' => '每周检查更新?', - 'password_encrypt_key' => '加密密钥', - 'password_encrypt_key_note' => '该密钥用于加密访问 URL 时的用户名和密码. 如果需要修改密钥,请同步修改以前的监控业务,确认密钥匹配!', - 'proxy' => '使用代理', - 'proxy_url' => '代理IP', - 'proxy_user' => '用户名', - 'proxy_password' => '密码', - 'email_status' => '允许发送邮件?', - 'email_from_email' => '发件人地址', - 'email_from_name' => '发件人名称', - 'email_smtp' => '使用SMTP发送', - 'email_smtp_host' => 'SMTP主机', - 'email_smtp_port' => 'SMTP端口', - 'email_smtp_security' => 'SMTP 设置', - 'email_smtp_security_none' => '空', - 'email_smtp_username' => 'SMTP用户名', - 'email_smtp_password' => 'SMTP密码', - 'email_smtp_noauth' => '留空为无验证', - 'sms_status' => '允许发送短信SMS?', - 'sms_gateway' => '短信SMS发送网关', - 'sms_gateway_username' => 'SMS网关用户名', - 'sms_gateway_password' => 'SMS网关密码', - 'sms_from' => '发信人电话号', - 'pushover_status' => '允许 Pushover 通知', - 'pushover_description' => 'Pushover 是第三方用于实时通知的服务(收费). 详情见 Pushover 官网.', - 'pushover_clone_app' => '点此创建 Pushover App', - 'pushover_api_token' => 'Pushover API Token', - 'pushover_api_token_description' => '请先 注册Pushover 并获取 Api Token.', - 'alert_type' => '如果想要收到提醒请选中此项.', - 'alert_type_description' => '状态变化: '. - '业务 online -> offline 或 offline -> online 的状态变化将会收到提醒.
    '. - '
    离线状态: '. - '服务器首次发生离线状态将会收到提醒 ,如:'. - 'cronjob 设定为15分钟执行一次, 服务器从1:00-6:00一直处于当状态'. - '那么你将于1:00首次发现脱机时收到一条提醒,之后不会重复提醒.
    '. - '
    总是提醒: '. - '每次脚本执行或站点离线(即使站点离线很久已提醒过)均发送提醒.', - 'alert_type_status' => '状态变化', - 'alert_type_offline' => '离线状态', - 'alert_type_always' => '总是提醒', - 'alert_proxy' => '代理只用于 URL 监控,如没有用户名密码,请留空', - 'alert_proxy_url' => '格式: Host:Port', - 'log_status' => '状态记录', - 'log_status_description' => '如果状态记录设置为开, 提醒发送时均会保存记录.', - 'log_email' => '记录脚本所发邮件?', - 'log_sms' => '记录脚本所发短信?', - 'log_pushover' => '记录脚本所发pushover消息?', - 'updated' => '设置已更新.', - 'tab_email' => '邮件发送设置', - 'tab_sms' => '短信发送设置', - 'tab_pushover' => 'Pushover', - 'settings_email' => '邮件发送设置', - 'settings_sms' => '短信发送设置', - 'settings_pushover' => 'Pushover 设置', - 'settings_notification' => '提醒设置', - 'settings_log' => '日志设置', - 'settings_proxy' => '代理设置', - 'auto_refresh' => '自动刷新', - 'auto_refresh_description' => - '自动刷新服务器页.
    '. - ''. - '单位为秒, 设置为 0 则不自动刷新.'. - '', - 'seconds' => '秒', - 'test' => '测试', - 'test_email' => '将发送一封邮件到您账户设置的邮件地址.', - 'test_sms' => '将发送一封短信到您账户设置的手机号码.', - 'test_pushover' => '将发送一条 Pushover 通知到您账户设置的 key/device 设备上.', - 'send' => '发送', - 'test_subject' => '测试', - 'test_message' => '测试信息', - 'email_sent' => '发送邮件', - 'email_error' => '发送出错', - 'sms_sent' => '发送短信', - 'sms_error' => '短信发送出错 %s', - 'sms_error_nomobile' => '无法发送短信: 您的账号未设置有效手机号码.', - 'pushover_sent' => '发送Pushover通知', - 'pushover_error' => 'Pushover通知发送出错: %s', - 'pushover_error_noapp' => 'Pushover通知发送出错: no Pushover App API token found in the global configuration.', - 'pushover_error_nokey' => 'Pushover通知无法发送: no Pushover key found in your profile.', - 'log_retention_period' => '日志保留时长', - 'log_retention_period_description' => '日志存档保留时间,0为禁用日志清理', - 'log_retention_days' => '天', - ), - // for newlines in the email messages use
    - 'notifications' => array( - 'off_sms' => '监控项 \'%LABEL%:%PORT%\' 异常. %ERROR% %IP%', - 'off_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 宕机', - 'off_email_body' => "无法连接到以下服务器:

    服务器: %LABEL%
    IP: %IP%
    Port: %PORT%
    错误: %ERROR%
    日期: %DATE%", - 'off_pushover_title' => '服务器 \'%LABEL%\' 宕机', - 'off_pushover_message' => "无法连接到以下服务器:

    服务器: %LABEL%
    IP: %IP%
    Port: %PORT%
    错误: %ERROR%
    日期: %DATE%", - 'on_sms' => '服务器 \'%LABEL%\' 运行中: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', - 'on_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 运行中', - 'on_email_body' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:

    服务器: %LABEL%
    IP: %IP%
    Port: %PORT%
    日期: %DATE%", - 'on_pushover_title' => '服务器 \'%LABEL%\' 运行中', - 'on_pushover_message' => "服务器 '%LABEL%' 恢复运行, it was down for %LAST_OFFLINE_DURATION%:

    服务器: %LABEL%
    IP: %IP%
    Port: %PORT%
    日期: %DATE%", - ), - 'login' => array( - 'welcome_usermenu' => '欢迎, %user_name%', - 'title_sign_in' => '请登录', - 'title_forgot' => '忘记密码?', - 'title_reset' => '重设密码', - 'submit' => '提交', - 'remember_me' => '记住我', - 'login' => '登录', - 'logout' => '注销', - 'username' => '用户名', - 'password' => '密码', - 'password_repeat' => '重复密码', - 'password_forgot' => '忘记密码?', - 'password_reset' => '重设密码', - 'password_reset_email_subject' => '重设你的密码', - 'password_reset_email_body' => '点击以下链接重设密码. 链接1小时内有效.

    %link%', - 'error_user_incorrect' => '该用户不存在.', - 'error_login_incorrect' => '登录信息不正确.', - 'error_login_passwords_nomatch' => '密码不符.', - 'error_reset_invalid_link' => '重设密码链接无效.', - 'success_password_forgot' => '密码重设邮件已发送.', - 'success_password_reset' => '密码重设成功.请登录.', - ), - 'error' => array( - '401_unauthorized' => '未授权的请求', - '401_unauthorized_description' => '未授权的请求.', - ), + 'name' => '中文 - Chinese', + 'locale' => array( + '0' => 'zh_CN.UTF-8', + '1' => 'zh_CN', + '2' => 'chinese', + '3' => 'chinese-cn', + ), + 'locale_tag' => 'zh', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => '安装', + 'action' => '操作', + 'save' => '保存', + 'edit' => '编辑', + 'delete' => '删除', + 'date' => '日期', + 'message' => '消息', + 'yes' => '是', + 'no' => '否', + 'insert' => '新增', + 'add_new' => '添加', + 'update_available' => '发现新版本({version}) http://www.phpservermonitor.org.', + 'back_to_top' => '返回顶部', + 'go_back' => '后退', + 'ok' => '确认', + 'cancel' => '取消', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => '昨日 %k:%M', + 'other_day_format' => '%A %k:%M', + 'never' => '从未', + 'hours_ago' => '%d 小时前', + 'an_hour_ago' => '1小时前', + 'minutes_ago' => '%d 分钟前', + 'a_minute_ago' => '1分钟前', + 'seconds_ago' => '%d 秒前', + 'a_second_ago' => '刚刚', + ), + 'menu' => array( + 'config' => '设置', + 'server' => '监控', + 'server_log' => '日志', + 'server_status' => '状态', + 'server_update' => '刷新', + 'user' => '用户', + 'help' => '帮助', + ), + 'users' => array( + 'user' => '用户', + 'name' => '名称', + 'user_name' => '用户名', + 'password' => '密码', + 'password_repeat' => '重复密码', + 'password_leave_blank' => '留空为不修改', + 'level' => '等级', + 'level_10' => '超级管理员', + 'level_20' => '普通用户', + 'level_description' => '超级管理员 拥有所有权限: 管理服务器, 用户 + 以及修改设置.
    普通用户 + 只能查看及更新自己名下所属的服务器.', + 'mobile' => '手机', + 'email' => '邮件', + 'pushover' => 'Pushover', + 'pushover_description' => 'Pushover 是第三方用于实时通知的服务(收费). 详情见 Pushover 官网.', + 'pushover_key' => 'Pushover Key', + 'pushover_device' => 'Pushover Device', + 'pushover_device_description' => '要发送信息的设备名. 留空则发送到所有设备.', + 'delete_title' => '删除用户', + 'delete_message' => '确认删除用户 \'%1\'?', + 'deleted' => '用户已删除.', + 'updated' => '用户已更新.', + 'inserted' => '用户已添加.', + 'profile' => '个人资料', + 'profile_updated' => '个人资料已更新.', + 'error_user_name_bad_length' => '用户名长度必须为2-64个字符.', + 'error_user_name_invalid' => '用户名只允许使用字母 (a-z, A-Z), 数字 (0-9), 點(。) + 及下划线 (_).', + 'error_user_name_exists' => '该用户名已存在.', + 'error_user_email_bad_length' => '电子邮箱长度必须为5-255个字符.', + 'error_user_email_invalid' => '无效的邮箱地址.', + 'error_user_level_invalid' => '该用户等级无效.', + 'error_user_no_match' => '该用户名不存在.', + 'error_user_password_invalid' => '密码无效.', + 'error_user_password_no_match' => '密码不符.', + ), + 'log' => array( + 'title' => '日志概览', + 'type' => '类型', + 'status' => '状态', + 'email' => '邮件', + 'sms' => '短信', + 'pushover' => 'Pushover', + 'no_logs' => '没有日志', + ), + 'servers' => array( + 'server' => '业务', + 'status' => '状态', + 'label' => '标签', + 'domain' => 'URL/IP', + 'timeout' => '超时时间', + 'timeout_description' => '等待服务器响应的时间.', + 'authentication_settings' => '访问权限设置', + 'optional' => '可选', + 'website_username' => '用户名', + 'website_username_description' => '网站分配的用户名.', + 'website_password' => '密码', + 'website_password_description' => '网站分配的密码,密码将会加密存放', + 'fieldset_monitoring' => '通知', + 'fieldset_permissions' => '权限', + 'port' => '端口', + 'custom_port' => '指定端口', + 'popular_ports' => '默认端口', + 'please_select' => '请选择', + 'type' => '类型', + 'type_website' => '网站', + 'type_service' => '服务', + 'pattern' => '字符串/正则匹配', + 'pattern_description' => '如果在网站上未找到对应匹配内容, 则标记该网站为离线. + 支持正则表达式.', + 'last_check' => '最后检查', + 'last_online' => '最后在线', + 'last_offline' => 'Last offline', + 'monitoring' => '监控', + 'no_monitoring' => '未监控', + 'email' => '邮件', + 'send_email' => '发送邮件', + 'sms' => '短信', + 'send_sms' => '发送短信', + 'pushover' => 'Pushover', + 'users' => '用户', + 'delete_title' => '删除服务器', + 'delete_message' => '确认删除服务器 \'%1\'?', + 'deleted' => '服务器已删除.', + 'updated' => '服务器已更新.', + 'inserted' => '服务器已添加.', + 'latency' => '延迟', + 'latency_max' => '最大延迟', + 'latency_min' => '最小延迟', + 'latency_avg' => '平均延迟', + 'uptime' => '在线时长', + 'year' => '年', + 'month' => '月', + 'week' => '周', + 'day' => '日', + 'hour' => '小时', + 'warning_threshold' => '报警阈值', + 'warning_threshold_description' => '失败达到多少次数则标记为离线.', + 'chart_last_week' => '上周', + 'chart_history' => '更早', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => '短信通知不可用.', + 'warning_notifications_disabled_email' => 'Email 通知不可用.', + 'warning_notifications_disabled_pushover' => 'Pushover 通知不可用.', + 'error_server_no_match' => '服务器不存在.', + 'error_server_label_bad_length' => '标签 长度要求 1 ~ 255 字符.', + 'error_server_ip_bad_length' => 'URL / IP 长度要求 1 ~ 255 字符.', + 'error_server_ip_bad_service' => '非法 IP.', + 'error_server_ip_bad_website' => '非法 URL.', + 'error_server_type_invalid' => '非法选项.', + 'error_server_warning_threshold_invalid' => '报警阈值为大于 0 的数字.', + ), + 'config' => array( + 'general' => '通用', + 'language' => '语言', + 'show_update' => '每周检查更新?', + 'password_encrypt_key' => '加密密钥', + 'password_encrypt_key_note' => '该密钥用于加密访问 URL 时的用户名和密码. + 如果需要修改密钥,请同步修改以前的监控业务,确认密钥匹配!', + 'proxy' => '使用代理', + 'proxy_url' => '代理IP', + 'proxy_user' => '用户名', + 'proxy_password' => '密码', + 'email_status' => '允许发送邮件?', + 'email_from_email' => '发件人地址', + 'email_from_name' => '发件人名称', + 'email_smtp' => '使用SMTP发送', + 'email_smtp_host' => 'SMTP主机', + 'email_smtp_port' => 'SMTP端口', + 'email_smtp_security' => 'SMTP 设置', + 'email_smtp_security_none' => '空', + 'email_smtp_username' => 'SMTP用户名', + 'email_smtp_password' => 'SMTP密码', + 'email_smtp_noauth' => '留空为无验证', + 'sms_status' => '允许发送短信SMS?', + 'sms_gateway' => '短信SMS发送网关', + 'sms_gateway_username' => 'SMS网关用户名', + 'sms_gateway_password' => 'SMS网关密码', + 'sms_from' => '发信人电话号', + 'pushover_status' => '允许 Pushover 通知', + 'pushover_description' => 'Pushover 是第三方用于实时通知的服务(收费). 详情见 Pushover 官网.', + 'pushover_clone_app' => '点此创建 Pushover App', + 'pushover_api_token' => 'Pushover API Token', + 'pushover_api_token_description' => '请先 注册Pushover + 并获取 Api Token.', + 'alert_type' => '如果想要收到提醒请选中此项.', + 'alert_type_description' => '状态变化: 业务 online -> offline 或 offline -> online + 的状态变化将会收到提醒.

    离线状态: + 服务器首次发生离线状态将会收到提醒 ,如:cronjob + 设定为15分钟执行一次, + 服务器从1:00-6:00一直处于当状态那么你将于1:00首次发现脱机时收到一条提醒,之后不会重复提醒.

    总是提醒: + 每次脚本执行或站点离线(即使站点离线很久已提醒过)均发送提醒.', + 'alert_type_status' => '状态变化', + 'alert_type_offline' => '离线状态', + 'alert_type_always' => '总是提醒', + 'alert_proxy' => '代理只用于 URL 监控,如没有用户名密码,请留空', + 'alert_proxy_url' => '格式: Host:Port', + 'log_status' => '状态记录', + 'log_status_description' => '如果状态记录设置为开, 提醒发送时均会保存记录.', + 'log_email' => '记录脚本所发邮件?', + 'log_sms' => '记录脚本所发短信?', + 'log_pushover' => '记录脚本所发pushover消息?', + 'updated' => '设置已更新.', + 'tab_email' => '邮件发送设置', + 'tab_sms' => '短信发送设置', + 'tab_pushover' => 'Pushover', + 'settings_email' => '邮件发送设置', + 'settings_sms' => '短信发送设置', + 'settings_pushover' => 'Pushover 设置', + 'settings_notification' => '提醒设置', + 'settings_log' => '日志设置', + 'settings_proxy' => '代理设置', + 'auto_refresh' => '自动刷新', + 'auto_refresh_description' => '自动刷新服务器页.
    单位为秒, 设置为 0 + 则不自动刷新.', + 'seconds' => '秒', + 'test' => '测试', + 'test_email' => '将发送一封邮件到您账户设置的邮件地址.', + 'test_sms' => '将发送一封短信到您账户设置的手机号码.', + 'test_pushover' => '将发送一条 Pushover 通知到您账户设置的 key/device 设备上.', + 'send' => '发送', + 'test_subject' => '测试', + 'test_message' => '测试信息', + 'email_sent' => '发送邮件', + 'email_error' => '发送出错', + 'sms_sent' => '发送短信', + 'sms_error' => '短信发送出错 %s', + 'sms_error_nomobile' => '无法发送短信: 您的账号未设置有效手机号码.', + 'pushover_sent' => '发送Pushover通知', + 'pushover_error' => 'Pushover通知发送出错: %s', + 'pushover_error_noapp' => 'Pushover通知发送出错: no Pushover App API token found in the global + configuration.', + 'pushover_error_nokey' => 'Pushover通知无法发送: no Pushover key found in your profile.', + 'log_retention_period' => '日志保留时长', + 'log_retention_period_description' => '日志存档保留时间,0为禁用日志清理', + 'log_retention_days' => '天', + ), + 'notifications' => array( + 'off_sms' => '监控项 \'%LABEL%:%PORT%\' 异常. %ERROR% %IP%', + 'off_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 宕机', + 'off_email_body' => '无法连接到以下服务器:

    服务器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    错误: %ERROR%
    日期: %DATE%', + 'off_pushover_title' => '服务器 \'%LABEL%\' 宕机', + 'off_pushover_message' => '无法连接到以下服务器:

    服务器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    错误: %ERROR%
    日期: %DATE%', + 'on_sms' => '服务器 \'%LABEL%\' 运行中: ip=%IP%, port=%PORT%, it was down for %LAST_OFFLINE_DURATION%', + 'on_email_subject' => 'IMPORTANT: 服务器 \'%LABEL%\' 运行中', + 'on_email_body' => '服务器 \'%LABEL%\' 恢复运行, it was down for + %LAST_OFFLINE_DURATION%:

    服务器: %LABEL%
    IP: %IP%
    Port: %PORT%
    日期: + %DATE%', + 'on_pushover_title' => '服务器 \'%LABEL%\' 运行中', + 'on_pushover_message' => '服务器 \'%LABEL%\' 恢复运行, it was down for + %LAST_OFFLINE_DURATION%:

    服务器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    日期: %DATE%', + ), + 'login' => array( + 'welcome_usermenu' => '欢迎, %user_name%', + 'title_sign_in' => '请登录', + 'title_forgot' => '忘记密码?', + 'title_reset' => '重设密码', + 'submit' => '提交', + 'remember_me' => '记住我', + 'login' => '登录', + 'logout' => '注销', + 'username' => '用户名', + 'password' => '密码', + 'password_repeat' => '重复密码', + 'password_forgot' => '忘记密码?', + 'password_reset' => '重设密码', + 'password_reset_email_subject' => '重设你的密码', + 'password_reset_email_body' => '点击以下链接重设密码. 链接1小时内有效.

    %link%', + 'error_user_incorrect' => '该用户不存在.', + 'error_login_incorrect' => '登录信息不正确.', + 'error_login_passwords_nomatch' => '密码不符.', + 'error_reset_invalid_link' => '重设密码链接无效.', + 'success_password_forgot' => '密码重设邮件已发送.', + 'success_password_reset' => '密码重设成功.请登录.', + ), + 'error' => array( + '401_unauthorized' => '未授权的请求', + '401_unauthorized_description' => '未授权的请求.', + ), ); diff --git a/src/lang/zh_TW.lang.php b/src/lang/zh_TW.lang.php new file mode 100644 index 00000000..29157d84 --- /dev/null +++ b/src/lang/zh_TW.lang.php @@ -0,0 +1,367 @@ +. + * + * @package phpservermon + * @author Jason Cheng + * @copyright Copyright (c) 2008-2014 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: v3.1.1 + * @link http://www.phpservermonitor.org/ + **/ + +$sm_lang = array( + 'name' => '繁體中文 - Traditional Chinese', + 'locale' => array( + '0' => 'zh_TW.UTF-8', + '1' => 'zh_TW', + '2' => 'chinese', + '3' => 'chinese-tw', + ), + 'locale_tag' => 'zh_TW', + 'locale_dir' => 'ltr', + 'system' => array( + 'title' => 'Server Monitor', + 'install' => '安裝', + 'action' => '動作', + 'save' => '儲存', + 'edit' => '編輯', + 'delete' => '刪除', + 'date' => '日期', + 'message' => '訊息', + 'yes' => '是', + 'no' => '否', + 'insert' => '插入', + 'add_new' => '增加', + 'back_to_top' => '回到最上層', + 'go_back' => '返回', + 'ok' => '確定', + 'cancel' => '取消', + 'activate' => '啟用', + 'short_day_format' => '%B %e', + 'long_day_format' => '%B %e, %Y', + 'yesterday_format' => '昨日 %k:%M', + 'other_day_format' => '%A %k:%M', + 'never' => '從未', + 'hours_ago' => '%d小時前', + 'an_hour_ago' => '1小時前', + 'minutes_ago' => '%d分鐘前', + 'a_minute_ago' => '1分鐘前', + 'seconds_ago' => '%d秒前', + 'a_second_ago' => '剛剛', + 'year' => '年', + 'years' => '年', + 'month' => '月', + 'months' => '月', + 'day' => '日', + 'days' => '日', + 'hour' => '時', + 'hours' => '時', + 'minute' => '分', + 'minutes' => '分', + 'second' => '秒', + 'seconds' => '秒', + ), + 'menu' => array( + 'config' => '設定', + 'server' => '伺服器', + 'server_log' => '記錄', + 'server_status' => '狀態', + 'server_update' => '更新', + 'user' => '使用者', + 'help' => '說明', + ), + 'users' => array( + 'user' => '使用者', + 'name' => '顯示名稱', + 'user_name' => '使用者名稱', + 'password' => '密碼', + 'password_repeat' => '再次輸入密碼', + 'password_leave_blank' => '若密碼欄位保持空白,表示不做修改', + 'level' => '等級', + 'level_10' => '超級管理員', + 'level_20' => '一般使用者', + 'level_description' => '超級管理員 + 具備所有伺服器的管理權限,可管理使用者以及修改系統設定。
    一般使用者 + 僅能查看以及更新自己所負責的伺服器。', + 'mobile' => '行動電話', + 'email' => '電子郵件', + 'pushover' => 'Pushover 通知', + 'pushover_description' => 'Pushover + 是一種雲端服務,讓你可以很方便的收到即時訊息通知,您可以到網站了解更多的內容。', + 'pushover_key' => 'Pushover 金鑰', + 'pushover_device' => 'Pushover 裝置', + 'pushover_device_description' => '發送訊息的裝置名稱,若保留空白,將會發送到所有的裝置。', + 'telegram' => 'Telegram 通知', + 'telegram_description' => 'Telegram + 是一種聊天應用程式,它提供很容易使用的的即時通知能力。您可以到 + documentation + 了解更多的內容。', + 'telegram_chat_id' => 'Telegram Chat ID', + 'telegram_chat_id_description' => '將訊息發送到指定的聊天室', + 'telegram_get_chat_id' => '點選這裡可以取得您的 Chat ID', + 'activate_telegram' => '啟用 Telegram 通知', + 'activate_telegram_description' => '允許 Telegram 將訊息發送到指定的 Chat + ID。若沒有啟用此項目,Telegram + 將不允許我們發送通知給您。', + 'telegram_bot_username_error_token' => '401 - 未授權,請確認您的 API Token 是有效的。', + 'telegram_bot_error' => '啟用 Telegram 通知時發生錯誤:%s', + 'delete_title' => '刪除使用者', + 'delete_message' => '您確定要刪除使用者 \'%1\'?', + 'deleted' => '已刪除使用者。', + 'updated' => '已更新使用者。', + 'inserted' => '已增加使用者。', + 'profile' => '個人資料', + 'profile_updated' => '個人資料已經更新。', + 'error_user_name_bad_length' => '使用者名稱長度必須為2-64個字元。', + 'error_user_name_invalid' => '使用者名稱只允許英文字母(a-z、A-Z)、數字(0-9)以及底線(_)。', + 'error_user_name_exists' => '這個使用者名稱已存在。', + 'error_user_email_bad_length' => '電子郵件長度為5-255個字元。', + 'error_user_email_invalid' => '無效的電子郵件。', + 'error_user_level_invalid' => '無效的使用者等級。', + 'error_user_no_match' => '這個使用者名稱不存在。', + 'error_user_password_invalid' => '無效的密碼。', + 'error_user_password_no_match' => '密碼不符。', + ), + 'log' => array( + 'title' => '記錄概覽', + 'type' => '類型', + 'status' => '狀態', + 'email' => '電子郵件通知', + 'sms' => '簡訊通知', + 'pushover' => 'Pushover 通知', + 'telegram' => 'Telegram 通知', + 'no_logs' => '沒有記錄', + 'clear' => '清除記錄', + 'delete_title' => '刪除記錄', + 'delete_message' => '您確定要刪除 所有 記錄?', + ), + 'servers' => array( + 'server' => '伺服器', + 'status' => '狀態', + 'label' => '標籤', + 'domain' => '網域/IP', + 'timeout' => '逾時', + 'timeout_description' => '等待伺服器回應的秒數。', + 'authentication_settings' => '驗證設定 (非必要)', + 'website_username' => '使用者', + 'website_username_description' => '存取這個網站的使用者。(只支援 Apache 驗證)', + 'website_password' => '密碼', + 'website_password_description' => '存取這個網站的使用者。(密碼將會以加密形式存放在資料庫)', + 'fieldset_monitoring' => '監視', + 'fieldset_permissions' => '權限', + 'port' => '連接埠', + 'custom_port' => '自訂連接埠', + 'popular_ports' => '常用連接埠', + 'please_select' => '請選擇', + 'type' => '類型', + 'type_website' => '網站', + 'type_service' => '服務', + 'type_ping' => 'Ping', + 'pattern' => '字串', + 'pattern_description' => '如果在網站上沒有找到符合的字串,則將網站標示為離線。', + 'pattern_online' => '指明網站上的字串', + 'pattern_online_description' => '線上:如果在網站上沒有找到符合的字串,則將網站標示為線上。', + 'header_name_description' => '標頭名稱 (區分大小寫)', + 'header_value_description' => '標頭的值,可以使用正則表示式。', + 'last_check' => '最後一次檢查', + 'last_online' => '最後一次上線', + 'last_offline' => '最後一次離線', + 'monitoring' => '監控中', + 'no_monitoring' => '未監控', + 'email' => '電子郵件通知', + 'send_email' => '發送電子郵件', + 'sms' => '簡訊通知', + 'send_sms' => '發送簡訊', + 'pushover' => 'Pushover 通知', + 'send_pushover' => '發送 Pushover 通知', + 'telegram' => 'Telegram 通知', + 'send_telegram' => '發送 Telegram 通知', + 'users' => '使用者', + 'delete_title' => '刪除伺服器', + 'delete_message' => '您確定要刪除這個伺服器 \'%1\'?', + 'deleted' => '伺服器已刪除。', + 'updated' => '伺服器已更新。', + 'inserted' => '伺服器已增加。', + 'latency' => '延遲', + 'latency_max' => '延遲 (最大)', + 'latency_min' => '延遲 (最小)', + 'latency_avg' => '延遲 (平均)', + 'uptime' => '上線時間', + 'year' => '年', + 'month' => '月', + 'week' => '週', + 'day' => '日', + 'hour' => '小時', + 'warning_threshold' => '警報臨界值', + 'warning_threshold_description' => '失敗達到多少次數則標示為離線。', + 'chart_last_week' => '上週', + 'chart_history' => '更早', + 'chart_day_format' => '%Y-%m-%d', + 'chart_long_date_format' => '%Y-%m-%d %H:%M:%S', + 'chart_short_date_format' => '%m/%d %H:%M', + 'chart_short_time_format' => '%H:%M', + 'warning_notifications_disabled_sms' => '簡訊通知已關閉。', + 'warning_notifications_disabled_email' => '電子郵件通知已關閉。', + 'warning_notifications_disabled_pushover' => 'Pushover 通知已關閉。', + 'warning_notifications_disabled_telegram' => 'Telegram 通知已關閉。', + 'error_server_no_match' => '找不到伺服器。', + 'error_server_label_bad_length' => '標籤必須在1到255間的字元。', + 'error_server_ip_bad_length' => '網域/IP必須在1到255間的字元。', + 'error_server_ip_bad_service' => '無效的 IP 位址。', + 'error_server_ip_bad_website' => '無效的網址。', + 'error_server_type_invalid' => '無效的的伺服器型態', + 'error_server_warning_threshold_invalid' => '警報臨界值必須是大於 0 的有效整數。', + ), + 'config' => array( + 'general' => '一般', + 'language' => '語言', + 'show_update' => '檢查更新', + 'password_encrypt_key' => '加密金鑰', + 'password_encrypt_key_note' => '這個加密金鑰將用於保護您登入這個網站的密碼,如果修改了此金鑰,原本已經存在的密碼將無法使用!', + 'proxy' => '啟用 Proxy', + 'proxy_url' => 'Proxy URL', + 'proxy_user' => 'Proxy 使用者名稱', + 'proxy_password' => 'Proxy 密碼', + 'email_status' => '啟用電子郵件通知', + 'email_from_email' => '寄件者信箱', + 'email_from_name' => '寄件者名稱', + 'email_smtp' => '使用SMTP發信', + 'email_smtp_host' => 'SMTP主機', + 'email_smtp_port' => 'SMTP連接埠口', + 'email_smtp_security' => 'SMTP安全性', + 'email_smtp_security_none' => '無', + 'email_smtp_username' => 'SMTP使用者名稱', + 'email_smtp_password' => 'SMTP使用者密碼', + 'email_smtp_noauth' => '留空白表示不做帳號驗證', + 'sms_status' => '啟用簡訊通知', + 'sms_gateway' => '簡訊服務提供者', + 'sms_gateway_username' => '簡訊閘道使用者名稱', + 'sms_gateway_password' => '簡訊閘道使用者密碼', + 'sms_from' => '發送人電話號碼', + 'pushover_status' => '啟用Pushover通知', + 'pushover_description' => 'Pushover是線上服務,讓您可以方便的收到即時通知,請參考 網站 可以得到更詳細的資訊。 ', + 'pushover_clone_app' => '點選這裡可快速建立Pushover App', + 'pushover_api_token_description' => '在您使用 Pushover 通知之前,需要先到這裡->註冊Pushover App帳號 + 接著在這個網頁輸入你的的Pushover App API Token號碼。', + 'telegram_status' => '允許發送 Telegram 訊息', + 'telegram_description' => 'Telegram + 是一種聊天應用程式,它提供很容易使用的即時通知服務。請參考 + 文件庫 + 可以取得更多資訊與安裝說明。', + 'telegram_api_token_description' => '使用 Telegram 通知之前,您必需先取得 API Token。請到 文件庫 取得說明。', + 'alert_type' => '需要提醒的類別', + 'alert_type_description' => '狀態改變: 伺服器 連線 -> 離線或連線 -> + 連線的狀態變化將會收到提醒通知。

    離線: + 伺服器首次發生離線狀態將會收到提醒,如:設定為15分鐘執行一次,伺服器從1:00-6:00一直處於離線狀態那麼你將會在1:00首次收到一則提醒通知,之後便不會在收到重覆的提醒通知。

    全部: + 每次執行當伺服器離線(即使伺服器離線很久已提醒過了)均發送提醒通知。', + 'alert_type_status' => '狀態改變', + 'alert_type_offline' => '離線', + 'alert_type_always' => '全部', + 'alert_proxy_url' => '格式: Host:Port', + 'log_status' => '狀態記錄', + 'log_status_description' => '如果啟用狀態記錄,則每一筆提醒通知都會保留記錄。', + 'log_email' => '保留電子郵件通知發送記錄', + 'log_sms' => '保留簡訊通知發送記錄', + 'log_pushover' => '保留 pushover 通知發送記錄', + 'log_telegram' => '保留 telegram 通知發送記錄', + 'updated' => '已更新設定。', + 'tab_email' => '電子郵件發送設定', + 'tab_sms' => '簡訊發送設定', + 'tab_pushover' => 'Pushover 通知', + 'tab_telegram' => 'Telegram 通知', + 'settings_email' => '電子郵件發送設定', + 'settings_sms' => '簡訊發送設定', + 'settings_pushover' => 'Pushover 發送設定', + 'settings_telegram' => 'Telegram 發送設定', + 'settings_notification' => '提醒設定', + 'settings_log' => '記錄設定', + 'settings_proxy' => 'Proxy 設定', + 'auto_refresh' => '自動更新', + 'seconds' => '秒', + 'test' => '測試', + 'test_email' => '電子郵件將發送到您在使用者設定內指定的電子郵件信箱。', + 'test_sms' => '簡訊將發送到您在使用者設定內指定的行動電話號碼。', + 'test_pushover' => 'Pushover 通知將發送到您在使用者設定的裝置。', + 'test_telegram' => 'Telegram 通知將發送到您在使用者設定的 Chat ID。', + 'send' => '傳送', + 'test_subject' => '標題', + 'test_message' => '訊息', + 'email_sent' => '傳送', + 'email_error' => '電子郵件傳送發生錯誤', + 'sms_sent' => '簡訊發送', + 'sms_error' => '簡訊發送發生錯誤', + 'sms_error_nomobile' => '無法傳送 SMS 簡訊測試:您設定的電話號碼無效或無法找到。', + 'pushover_sent' => '傳送 Pushover 通知', + 'pushover_error' => '傳送 Pushover 通知發生錯誤: %s', + 'pushover_error_noapp' => '無法傳送 Pushover 通知: 在系統設定找不到 Pushover App API token。', + 'pushover_error_nokey' => '無法傳送 Pushover 通知: 在系統設定找不到 Pushover key found 。', + 'telegram_sent' => '傳送 Telegram 通知', + 'telegram_error' => '傳送 Telegram 通知發生錯誤: %s', + 'telegram_error_notoken' => '無法傳送 Telegram 通知: 在系統設定找不到 Telegram API token。', + 'telegram_error_noid' => '無法傳送 Telegram 通知: 在您的個人資料找不到 Chat ID。', + 'log_retention_period' => '記錄保留期限', + 'log_retention_period_description' => '保留伺服器運作時間和記錄歸檔的天數,輸入0可以防止記錄被清除', + 'log_retention_days' => '日', + ), + 'notifications' => array( + 'off_sms' => '伺服器 \'%LABEL%\' 關機: ip=%IP%, port=%PORT%. Error=%ERROR%', + 'off_email_subject' => 'IMPORTANT: 服務器 \'%LABEL%\' 關機', + 'off_email_body' => '無法連線到以下伺服器:

    伺服器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    錯誤: %ERROR%
    日期: %DATE%', + 'off_pushover_title' => '伺服器 \'%LABEL%\' 關機', + 'off_pushover_message' => '無法連線到以下伺服器:

    伺服器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    錯誤: %ERROR%
    日期: %DATE%', + 'off_telegram_message' => '無法連線到以下伺服器:

    伺服器: %LABEL%
    IP: %IP%
    Port: + %PORT%
    錯誤: %ERROR%
    日期: %DATE%', + 'on_email_subject' => 'IMPORTANT: 伺服器 \'%LABEL%\' 運行中', + 'on_pushover_title' => '伺服器 \'%LABEL%\' 運作中', + ), + 'login' => array( + 'welcome_usermenu' => '歡迎,%user_name%', + 'title_sign_in' => '請登入', + 'title_forgot' => '忘記密碼', + 'title_reset' => '密碼重置', + 'submit' => '送出', + 'remember_me' => '記住我', + 'login' => '登入', + 'logout' => '登出', + 'username' => '使用者名稱', + 'password' => '密碼', + 'password_repeat' => '再次輸入密碼', + 'password_forgot' => '忘記密碼', + 'password_reset' => '重設密碼', + 'password_reset_email_subject' => '重設您的密碼', + 'password_reset_email_body' => '點選以下連結來重設密碼,這個連結於1小時後失效。

    %link%', + 'error_user_incorrect' => '使用者不存在。', + 'error_login_incorrect' => '登入資料不正確。', + 'error_login_passwords_nomatch' => '密碼不符合。', + 'error_reset_invalid_link' => '重設密碼連結無效。', + 'success_password_forgot' => '重設密碼電子郵件已發送。', + 'success_password_reset' => '密碼重設成功,請登入。', + ), + 'error' => array( + '401_unauthorized' => '驗證失敗', + '401_unauthorized_description' => '您没有權限進入這個頁面。', + ), +); diff --git a/src/psm/Module/AbstractController.php b/src/psm/Module/AbstractController.php index d080934c..260543e6 100644 --- a/src/psm/Module/AbstractController.php +++ b/src/psm/Module/AbstractController.php @@ -1,4 +1,5 @@ db = $db; + $this->twig = $twig; + } - function __construct(Database $db, \Twig_Environment $twig) { - $this->db = $db; - $this->twig = $twig; - } + /** + * Run the controller. + * + * @param string $action if NULL, the action will be retrieved from user input (GET/POST) + * @return \Symfony\Component\HttpFoundation\Response + */ + public function run($action = null) + { + if ($action === null) { + $action = psm_GET('action', psm_POST('action', $this->action_default)); + } + $this->xhr = (bool) psm_GET('xhr', psm_POST('xhr', false)); - /** - * Run the controller. - * - * @param string $action if NULL, the action will be retrieved from user input (GET/POST) - * @return \Symfony\Component\HttpFoundation\Response - */ - public function run($action = null) { - if ($action === null) { - $action = psm_GET('action', psm_POST('action', $this->action_default)); - } - $this->xhr = (bool) psm_GET('xhr', psm_POST('xhr', false)); + $result = $this->runAction($action); - if (!in_array($action, $this->actions) || !($result = $this->runAction($action))) { - $result = $this->runAction($this->action_default); - } + if (!in_array($action, $this->actions) || !$result) { + $result = $this->runAction($this->action_default); + } - if ($result instanceof Response) { - return $result; - } + if ($result instanceof Response) { + return $result; + } - // no response returned from execute, create regular HTML - return $this->createHTML($result); - } + // no response returned from execute, create regular HTML + return $this->createHTML($result); + } - /** - * Run a specified action - * - * For it to run, the "execute$action" method must exist. - * @param string $action - * @return mixed FALSE when action couldnt be initialized, response otherwise - */ - protected function runAction($action) { - if (isset($this->user_level_required_actions[$action])) { - if ($this->getUser()->getUserLevel() > $this->user_level_required_actions[$action]) { - // user is not allowed to access this action.. - return false; - } - } - $method = 'execute'.ucfirst($action); - if (method_exists($this, $method)) { - $this->action = $action; - $result = $this->$method(); - // if result from execute is null, no return value given so return true to indicate a successful execute - return ($result === null) ? true : $result; - } - return false; - } + /** + * Run a specified action + * + * For it to run, the "execute$action" method must exist. + * @param string $action + * @return mixed FALSE when action couldnt be initialized, response otherwise + */ + protected function runAction($action) + { + if (isset($this->user_level_required_actions[$action])) { + if ($this->getUser()->getUserLevel() > $this->user_level_required_actions[$action]) { + // user is not allowed to access this action.. + return false; + } + } + $method = 'execute' . ucfirst($action); + if (method_exists($this, $method)) { + $this->action = $action; + $result = $this->$method(); + // if result from execute is null, no return value given so return true to indicate a successful execute + return ($result === null) ? true : $result; + } + return false; + } - /** - * Create the HTML code for the module. - * - * If XHR is on, no main template will be added. - * - * @param string $html HTML code to add to the main body - * @return \Symfony\Component\HttpFoundation\Response - */ - protected function createHTML($html = null) { - if (!$this->xhr) { - // in XHR mode, we will not add the main template - $tpl_data = array( - 'title' => strtoupper(psm_get_lang('system', 'title')), - 'label_back_to_top' => psm_get_lang('system', 'back_to_top'), - 'add_footer' => $this->add_footer, - 'version' => 'v'.PSM_VERSION, - 'messages' => $this->getMessages(), - 'html_content' => $html, - ); + /** + * Create the HTML code for the module. + * + * If XHR is on, no main template will be added. + * + * @param string $html HTML code to add to the main body + * @return \Symfony\Component\HttpFoundation\Response + */ + protected function createHTML($html = null) + { + if (!$this->xhr) { + // in XHR mode, we will not add the main template + $tpl_data = array( + 'title' => strtoupper(psm_get_lang('system', 'title')), + 'label_back_to_top' => psm_get_lang('system', 'back_to_top'), + 'add_footer' => $this->add_footer, + 'version' => 'v' . PSM_VERSION, + 'messages' => $this->getMessages(), + 'html_content' => $html, + ); - // add menu to page? - if ($this->add_menu) { - $tpl_data['html_menu'] = $this->createHTMLMenu(); - } - // add header accessories to page ? - if ($this->header_accessories) { - $tpl_data['header_accessories'] = $this->header_accessories; - } - // add modal dialog to page ? - if (sizeof($this->modal)) { - $html_modal = ''; - foreach ($this->modal as $modal) { - $html_modal .= $modal->createHTML(); - } - $tpl_data['html_modal'] = $html_modal; - } - // add sidebar to page? - if ($this->sidebar !== null) { - $tpl_data['html_sidebar'] = $this->sidebar->createHTML(); - } + // add menu to page? + if ($this->add_menu) { + $tpl_data['html_menu'] = $this->createHTMLMenu(); + } + // add header accessories to page ? + if ($this->header_accessories) { + $tpl_data['header_accessories'] = $this->header_accessories; + } + // add modal dialog to page ? + if (sizeof($this->modal)) { + $html_modal = ''; + foreach ($this->modal as $modal) { + $html_modal .= $modal->createHTML(); + } + $tpl_data['html_modal'] = $html_modal; + } + // add sidebar to page? + if ($this->sidebar !== null) { + $tpl_data['html_sidebar'] = $this->sidebar->createHTML(); + } - if (psm_update_available()) { - $tpl_data['update_available'] = str_replace('{version}', 'v'.psm_get_conf('version_update_check'), psm_get_lang('system', 'update_available')); - } + if (psm_update_available()) { + $tpl_data['update_available'] = str_replace( + '{version}', + 'v' . + psm_get_conf('version_update_check'), + psm_get_lang('system', 'update_available') + ); + } - if ($this->black_background) { - $tpl_data['body_class'] = 'black_background'; - } - $html = $this->twig->render('main/body.tpl.html', $tpl_data); - } + if ($this->black_background) { + $tpl_data['body_class'] = 'black_background'; + } + $html = $this->twig->render('main/body.tpl.html', $tpl_data); + } - $response = new Response($html); + $response = new Response($html); - return $response; - } + return $response; + } - /** - * Create HTML code for the menu - * @return string - */ - protected function createHTMLMenu() { - $ulvl = $this->getUser()->getUserLevel(); + /** + * Create HTML code for the menu + * @return string + */ + protected function createHTMLMenu() + { + $ulvl = $this->getUser()->getUserLevel(); - $tpl_data = array( - 'label_help' => psm_get_lang('menu', 'help'), - 'label_profile' => psm_get_lang('users', 'profile'), - 'label_logout' => psm_get_lang('login', 'logout'), - 'url_profile' => psm_build_url(array('mod' => 'user_profile')), - 'url_logout' => psm_build_url(array('logout' => 1)), - 'label_current' => psm_get_lang('system', 'current'), - ); + $tpl_data = array( + 'label_help' => psm_get_lang('menu', 'help'), + 'label_profile' => psm_get_lang('users', 'profile'), + 'label_logout' => psm_get_lang('login', 'logout'), + 'url_profile' => psm_build_url(array('mod' => 'user_profile')), + 'url_logout' => psm_build_url(array('logout' => 1)), + 'label_current' => psm_get_lang('system', 'current'), + ); - switch ($ulvl) { - case PSM_USER_ADMIN: - $items = array('server_status', 'server', 'server_log', 'user', 'config', 'server_update'); - break; - case PSM_USER_USER: - $items = array('server_status', 'server', 'server_log', 'server_update'); - break; - default: - $items = array(); - break; - } - $tpl_data['menu'] = array(); - foreach ($items as $key) { - $tpl_data['menu'][] = array( - 'active' => ($key == psm_GET('mod')) ? 'active' : '', - 'url' => psm_build_url(array('mod' => $key)), - 'label' => psm_get_lang('menu', $key), - ); - } + switch ($ulvl) { + case PSM_USER_ADMIN: + $items = array('server_status', 'server', 'server_log', 'user', 'config', 'server_update'); + break; + case PSM_USER_USER: + $items = array('server_status', 'server', 'server_log', 'server_update'); + break; + default: + $items = array(); + break; + } + $tpl_data['menu'] = array(); + foreach ($items as $key) { + $tpl_data['menu'][] = array( + 'active' => ($key == psm_GET('mod')) ? 'active' : '', + 'url' => psm_build_url(array('mod' => $key)), + 'label' => psm_get_lang('menu', $key), + ); + } - if ($ulvl != PSM_USER_ANONYMOUS) { - $user = $this->getUser()->getUser(); - $tpl_data['label_usermenu'] = str_replace( - '%user_name%', - $user->name, - psm_get_lang('login', 'welcome_usermenu') - ); - } - return $this->twig->render('main/menu.tpl.html', $tpl_data); - } + if ($ulvl != PSM_USER_ANONYMOUS) { + $user = $this->getUser()->getUser(); + $tpl_data['label_usermenu'] = str_replace( + '%user_name%', + $user->name, + psm_get_lang('login', 'welcome_usermenu') + ); + } + return $this->twig->render('main/menu.tpl.html', $tpl_data); + } - /** - * Hide or show the footer of the page - * @param boolean $value - */ - protected function addFooter($value) { - $this->add_footer = $value; - } + /** + * Hide or show the footer of the page + * @param boolean $value + */ + protected function addFooter($value) + { + $this->add_footer = $value; + } - /** - * Hide or show the menu of the page - * @param boolean $value - */ - protected function addMenu($value) { - $this->add_menu = $value; - } + /** + * Hide or show the menu of the page + * @param boolean $value + */ + protected function addMenu($value) + { + $this->add_menu = $value; + } - /** - * Set actions available - * @param string|array $actions - * @param string $default default action - * @param boolean $append if TRUE, the actions will be added to the current actions - * @return psm\Module\AbstractModule - * @see getAction() - */ - protected function setActions($actions, $default = null, $append = true) { - if (!is_array($actions)) { - $actions = array($actions); - } - if ($append) { - $this->actions = array_merge($actions); - } else { - $this->actions = $actions; - } - if ($default !== null) { - $this->action_default = $default; - } - return $this; - } + /** + * Set actions available + * @param string|array $actions + * @param string $default default action + * @param boolean $append if TRUE, the actions will be added to the current actions + * @return psm\Module\AbstractModule + * @see getAction() + */ + protected function setActions($actions, $default = null, $append = true) + { + if (!is_array($actions)) { + $actions = array($actions); + } + if ($append) { + $this->actions = array_merge($actions); + } else { + $this->actions = $actions; + } + if ($default !== null) { + $this->action_default = $default; + } + return $this; + } - /** - * Get the current action - * @return string - * @see setActions() - */ - public function getAction() { - return $this->action; - } + /** + * Get the current action + * @return string + * @see setActions() + */ + public function getAction() + { + return $this->action; + } - /** - * Add one or multiple message to the stack to be displayed to the user - * @param string|array $msg - * @param string $shortcode primary/success/warning/danger - * @return \psm\Module\ControllerInterface - * @see getMessages() - */ - public function addMessage($msg, $shortcode = 'primary') { - if (!is_array($msg)) { - $msg = array($msg); - } - $class= $shortcode; - switch ($shortcode) { - case 'error': - $icon = 'exclamation-circle'; - $class= 'danger'; - break; - case 'success': - $icon = 'check-circle'; - break; - case 'warning': - $icon = 'exclamation-triangle'; - break; - case 'primary': - default: - $icon = 'info-circle'; - $shortcode = 'info'; - break; - } + /** + * Add one or multiple message to the stack to be displayed to the user + * @param string|array $msg + * @param string $shortcode primary/success/warning/danger + * @return \psm\Module\ControllerInterface + * @see getMessages() + */ + public function addMessage($msg, $shortcode = 'primary') + { + if (!is_array($msg)) { + $msg = array($msg); + } + $class = $shortcode; + switch ($shortcode) { + case 'error': + $icon = 'exclamation-circle'; + $class = 'danger'; + break; + case 'success': + $icon = 'check-circle'; + break; + case 'warning': + $icon = 'exclamation-triangle'; + break; + case 'primary': + default: + $icon = 'info-circle'; + $shortcode = 'info'; + break; + } - foreach ($msg as $m) { - $this->messages[] = array( - 'message' => $m, - 'shortcode' => $shortcode, - 'class' => $class, - 'icon' => $icon, - ); - } - return $this; - } + foreach ($msg as $m) { + $this->messages[] = array( + 'message' => $m, + 'shortcode' => $shortcode, + 'class' => $class, + 'icon' => $icon, + ); + } + return $this; + } - /** - * Get all messages (and optionally clear them) - * @param boolean $clear - * @return array - * @see addMessage() - */ - public function getMessages($clear = true) { - $msgs = $this->messages; - if ($clear) { - $this->messages = array(); - } - return $msgs; - } + /** + * Get all messages (and optionally clear them) + * @param boolean $clear + * @return array + * @see addMessage() + */ + public function getMessages($clear = true) + { + $msgs = $this->messages; + if ($clear) { + $this->messages = array(); + } + return $msgs; + } - /** - * Set the minimum required user level for this controller - * @param int $level - * @return \psm\Module\AbstractController - */ - public function setMinUserLevelRequired($level) { - $this->user_level_required = intval($level); - return $this; - } + /** + * Set the minimum required user level for this controller + * @param int $level + * @return \psm\Module\AbstractController + */ + public function setMinUserLevelRequired($level) + { + $this->user_level_required = intval($level); + return $this; + } - /** - * Get the minimum required user level for this controller - * @return int - */ - public function getMinUserLevelRequired() { - return $this->user_level_required; - } + /** + * Get the minimum required user level for this controller + * @return int + */ + public function getMinUserLevelRequired() + { + return $this->user_level_required; + } - /** - * Set the minimum required user level for a certain action. - * - * Use this only if one of the access is more restricted than the entire controller - * @param int $level - * @param string|array $actions one or more actions to set this level for - * @return \psm\Module\AbstractController - * @see setMinUserLevelRequired() - */ - public function setMinUserLevelRequiredForAction($level, $actions) { - if (!is_array($actions)) { - $actions = array($actions); - } - foreach ($actions as $action) { - $this->user_level_required_actions[$action] = intval($level); - } - return $this; - } + /** + * Set the minimum required user level for a certain action. + * + * Use this only if one of the access is more restricted than the entire controller + * @param int $level + * @param string|array $actions one or more actions to set this level for + * @return \psm\Module\AbstractController + * @see setMinUserLevelRequired() + */ + public function setMinUserLevelRequiredForAction($level, $actions) + { + if (!is_array($actions)) { + $actions = array($actions); + } + foreach ($actions as $action) { + $this->user_level_required_actions[$action] = intval($level); + } + return $this; + } - /** - * Add a sidebar to the page - * @param \psm\Util\Module\SidebarInterface $sidebar - * @return \psm\Module\ControllerInterface - */ - public function setSidebar(\psm\Util\Module\SidebarInterface $sidebar) { - $this->sidebar = $sidebar; - return $this; - } + /** + * Add a sidebar to the page + * @param \psm\Util\Module\SidebarInterface $sidebar + * @return \psm\Module\ControllerInterface + */ + public function setSidebar(\psm\Util\Module\SidebarInterface $sidebar) + { + $this->sidebar = $sidebar; + return $this; + } - /** - * Add a modal dialog to the page - * @param \psm\Util\Module\ModalInterface $modal - * @return \psm\Module\ControllerInterface - */ - public function addModal(\psm\Util\Module\ModalInterface $modal) { - $this->modal[$modal->getModalID()] = $modal; - return $this; - } + /** + * Add a modal dialog to the page + * @param \psm\Util\Module\ModalInterface $modal + * @return \psm\Module\ControllerInterface + */ + public function addModal(\psm\Util\Module\ModalInterface $modal) + { + $this->modal[$modal->getModalID()] = $modal; + return $this; + } - /** - * Set the html code of the header accessories - * @param string $html - */ - public function setHeaderAccessories($html) { - $this->header_accessories = $html; - } + /** + * Set the html code of the header accessories + * @param string $html + */ + public function setHeaderAccessories($html) + { + $this->header_accessories = $html; + } - /** - * Check if XHR is on - * @return boolean - */ - public function isXHR() { - return $this->xhr; - } + /** + * Check if XHR is on + * @return boolean + */ + public function isXHR() + { + return $this->xhr; + } - /** - * Get user service - * @return \psm\Service\User - */ - public function getUser() { - return $this->container->get('user'); - } + /** + * Get user service + * @return \psm\Service\User + */ + public function getUser() + { + return $this->container->get('user'); + } - /** - * Get custom key for CSRF validation - * @return string - */ - public function getCSRFKey() { - return $this->csrf_key; - } + /** + * Get custom key for CSRF validation + * @return string + */ + public function getCSRFKey() + { + return $this->csrf_key; + } - /** - * Set CSRF key for validation - * @param string $key - * @return \psm\Module\ControllerInterface - */ - protected function setCSRFKey($key) { - $this->csrf_key = $key; - $this->twig->addGlobal('csrf_key', $key); - return $this; - } + /** + * Set CSRF key for validation + * @param string $key + * @return \psm\Module\ControllerInterface + */ + protected function setCSRFKey($key) + { + $this->csrf_key = $key; + $this->twig->addGlobal('csrf_key', $key); + return $this; + } } diff --git a/src/psm/Module/Config/ConfigModule.php b/src/psm/Module/Config/ConfigModule.php index 3e33ceb3..7d72756f 100644 --- a/src/psm/Module/Config/ConfigModule.php +++ b/src/psm/Module/Config/ConfigModule.php @@ -1,4 +1,5 @@ __NAMESPACE__.'\Controller\ConfigController', - ); - - } + public function getControllers() + { + return array( + 'config' => __NAMESPACE__ . '\Controller\ConfigController', + ); + } } diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index fc0e8cfa..4c6a7e5d 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -1,4 +1,5 @@ setMinUserLevelRequired(PSM_USER_ADMIN); + $this->setCSRFKey('config'); + + $this->setActions(array( + 'index', 'save', + ), 'index'); + } + + /** + * Populate all the config fields with values from the database + * + * @return string + */ + protected function executeIndex() + { + $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'config')); + $tpl_data = $this->getLabels(); + + $config_db = $this->db->select( + PSM_DB_PREFIX . 'config', + null, + array('key', 'value') + ); + + $config = array(); + foreach ($config_db as $entry) { + $config[$entry['key']] = $entry['value']; + } + + // generate language array + $lang_keys = psm_get_langs(); + $tpl_data['language_current'] = (isset($config['language'])) + ? $config['language'] + : 'en_US'; + $tpl_data['languages'] = array(); + foreach ($lang_keys as $key => $label) { + $tpl_data['languages'][] = array( + 'value' => $key, + 'label' => $label, + ); + } + + // generate sms_gateway array + $sms_gateways = psm_get_sms_gateways(); + $tpl_data['sms_gateway'] = array(); + foreach ($sms_gateways as $sms_gateway => $label) { + $tpl_data['sms_gateway'][] = array( + 'value' => $sms_gateway, + 'label' => $label, + ); + } + + foreach (array("status", "offline", "always") as $alert_type) { + $tpl_data['alert_type'][] = array( + 'value' => $alert_type, + 'label' => psm_get_lang('config', 'alert_type_' . $alert_type), + ); + } + + $tpl_data['email_smtp_security'] = array( + array( + 'value' => '', + 'label' => psm_get_lang('config', 'email_smtp_security_none') + ), + array( + 'value' => 'ssl', + 'label' => 'SSL' + ), + array( + 'value' => 'tls', + 'label' => 'TLS' + ) + ); + + $tpl_data['sms_gateway_selected'] = isset($config['sms_gateway']) ? + $config['sms_gateway'] : current($sms_gateways); + $tpl_data['alert_type_selected'] = isset($config['alert_type']) ? + $config['alert_type'] : ''; + $tpl_data['email_smtp_security_selected'] = isset($config['email_smtp_security']) ? + $config['email_smtp_security'] : ''; + $tpl_data['auto_refresh_servers'] = isset($config['auto_refresh_servers']) ? + $config['auto_refresh_servers'] : '0'; + $tpl_data['log_retention_period'] = isset($config['log_retention_period']) ? + $config['log_retention_period'] : '365'; + $tpl_data['password_encrypt_key'] = isset($config['password_encrypt_key']) ? + $config['password_encrypt_key'] : sha1(microtime()); + + foreach ($this->checkboxes as $input_key) { + $tpl_data[$input_key . '_checked'] = + (isset($config[$input_key]) && (int) $config[$input_key] == 1) + ? 'checked="checked"' + : ''; + } + foreach ($this->fields as $input_key) { + $tpl_data[$input_key] = (isset($config[$input_key])) ? $config[$input_key] : ''; + } + // encrypted fields + foreach ($this->encryptedFields as $encryptedField) { + $tpl_data[$encryptedField] = ''; + } + + $tpl_data[$this->default_tab . '_active'] = 'active'; + + $testmodals = array('email', 'sms', 'pushover', 'telegram', 'jabber'); + foreach ($testmodals as $modal_id) { + $modal = new \psm\Util\Module\Modal( + $this->twig, + 'test' . ucfirst($modal_id), + \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL + ); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('servers', 'send_' . $modal_id)); + $modal->setMessage(psm_get_lang('config', 'test_' . $modal_id)); + $modal->setOKButtonLabel(psm_get_lang('config', 'send')); + } + + return $this->twig->render('module/config/config.tpl.html', $tpl_data); + } + + /** + * If a post has been done, gather all the posted data + * and save it to the database + */ + protected function executeSave() + { + if (!empty($_POST)) { + // save new config + $clean = array( + 'language' => $_POST['language'], + 'sms_gateway' => $_POST['sms_gateway'], + 'alert_type' => $_POST['alert_type'], + 'email_smtp_security' => + in_array($_POST['email_smtp_security'], array('', 'ssl', 'tls')) + ? $_POST['email_smtp_security'] + : '', + 'auto_refresh_servers' => intval(psm_POST('auto_refresh_servers', 0)), + 'log_retention_period' => intval(psm_POST('log_retention_period', 365)), + 'password_encrypt_key' => psm_POST('password_encrypt_key', sha1(microtime())) + ); + foreach ($this->checkboxes as $input_key) { + $clean[$input_key] = (isset($_POST[$input_key])) ? '1' : '0'; + } + foreach ($this->fields as $input_key) { + if (isset($_POST[$input_key])) { + $clean[$input_key] = $_POST[$input_key]; + } + } + foreach ($this->encryptedFields as $encryptedField) { + $value = filter_input(INPUT_POST, $encryptedField); + if ($value !== null && $value !== '') { + $clean[$encryptedField] = psm_password_encrypt(psm_get_conf('password_encrypt_key'), $value); + } + // else { leave as is } + } + $language_refresh = ($clean['language'] != psm_get_conf('language')); + foreach ($clean as $key => $value) { + psm_update_conf($key, $value); + } + $this->addMessage(psm_get_lang('config', 'updated'), 'success'); + + if (!empty($_POST['test_email'])) { + $this->testEmail(); + } elseif (!empty($_POST['test_sms'])) { + $this->testSMS(); + } elseif (!empty($_POST['test_pushover'])) { + $this->testPushover(); + } elseif (!empty($_POST['test_telegram'])) { + $this->testTelegram(); + } elseif (!empty($_POST['test_jabber'])) { + $this->testJabber(); + } + + if ($language_refresh) { + header('Location: ' . psm_build_url(array('mod' => 'config'), true, false)); + die(); + } + + if (isset($_POST['general_submit'])) { + $this->default_tab = 'general'; + } elseif (isset($_POST['email_submit']) || !empty($_POST['test_email'])) { + $this->default_tab = 'email'; + } elseif (isset($_POST['sms_submit']) || !empty($_POST['test_sms'])) { + $this->default_tab = 'sms'; + } elseif (isset($_POST['pushover_submit']) || !empty($_POST['test_pushover'])) { + $this->default_tab = 'pushover'; + } elseif (isset($_POST['telegram_submit']) || !empty($_POST['test_telegram'])) { + $this->default_tab = 'telegram'; + } elseif (isset($_POST['jabber_submit']) || !empty($_POST['test_jabber'])) { + $this->default_tab = 'jabber'; + } + } + return $this->runAction('index'); + } + + /** + * Execute email test + * + * @todo move test to separate class + */ + protected function testEmail() + { + $mail = psm_build_mail(); + $message = psm_get_lang('config', 'test_message'); + $mail->Subject = psm_get_lang('config', 'test_subject'); + $mail->Priority = 1; + $mail->Body = $message; + $mail->AltBody = str_replace('
    ', "\n", $message); + $user = $this->getUser()->getUser(); + $mail->AddAddress($user->email, $user->name); + if ($mail->Send()) { + $this->addMessage(psm_get_lang('config', 'email_sent'), 'success'); + } else { + $this->addMessage(psm_get_lang('config', 'email_error') . ': ' . $mail->ErrorInfo, 'error'); + } + } + + /** + * Execute SMS test + * + * @todo move test to separate class + */ + protected function testSMS() + { + $sms = psm_build_sms(); + if ($sms) { + $user = $this->getUser()->getUser(); + if (empty($user->mobile)) { + $this->addMessage(psm_get_lang('config', 'sms_error_nomobile'), 'error'); + } else { + $sms->addRecipients($user->mobile); + $result = $sms->sendSMS(psm_get_lang('config', 'test_message')); + if ($result === 1) { + $this->addMessage(psm_get_lang('config', 'sms_sent'), 'success'); + } else { + $this->addMessage(sprintf(psm_get_lang('config', 'sms_error'), $result), 'error'); + } + } + } + } + + /** + * Execute pushover test + * + * @todo move test to separate class + */ + protected function testPushover() + { + $pushover = psm_build_pushover(); + $pushover->setDebug(true); + $user = $this->getUser()->getUser(); + $apiToken = psm_get_conf('pushover_api_token'); + + if (empty($apiToken)) { + $this->addMessage(psm_get_lang('config', 'pushover_error_noapp'), 'error'); + } elseif (empty($user->pushover_key)) { + $this->addMessage(psm_get_lang('config', 'pushover_error_nokey'), 'error'); + } else { + $pushover->setPriority(0); + $pushover->setTitle(psm_get_lang('config', 'test_subject')); + $pushover->setMessage(psm_get_lang('config', 'test_message')); + $pushover->setUser($user->pushover_key); + if ($user->pushover_device != '') { + $pushover->setDevice($user->pushover_device); + } + $result = $pushover->send(); + + if (isset($result['output']->status) && $result['output']->status == 1) { + $this->addMessage(psm_get_lang('config', 'pushover_sent'), 'success'); + } else { + if (isset($result['output']->errors->error)) { + $error = $result['output']->errors->error; + } else { + $error = 'Unknown'; + } + $this->addMessage(sprintf(psm_get_lang('config', 'pushover_error'), $error), 'error'); + } + } + } + + /** + * Execute telegram test + * + * @todo move test to separate class + */ + protected function testTelegram() + { + $telegram = psm_build_telegram(); + $user = $this->getUser()->getUser(); + $apiToken = psm_get_conf('telegram_api_token'); + + if (empty($apiToken)) { + $this->addMessage(psm_get_lang('config', 'telegram_error_notoken'), 'error'); + } elseif (empty($user->telegram_id)) { + $this->addMessage(psm_get_lang('config', 'telegram_error_noid'), 'error'); + } else { + $telegram->setMessage(psm_get_lang('config', 'test_message')); + $telegram->setUser($user->telegram_id); + + $result = $telegram->send(); + + if (isset($result['ok']) && $result['ok'] != false) { + $this->addMessage(psm_get_lang('config', 'telegram_sent'), 'success'); + } else { + if (isset($result['description'])) { + $error = $result['description']; + } else { + $error = 'Unknown'; + } + $this->addMessage(sprintf(psm_get_lang('config', 'telegram_error'), $error), 'error'); + } + } + } /** - * Fields for saving - * @var array $fields + * Test Jabber. */ - protected $fields = array( - 'proxy_url', - 'proxy_user', - 'proxy_password', - 'email_from_name', - 'email_from_email', - 'email_smtp_host', - 'email_smtp_port', - 'email_smtp_username', - 'email_smtp_password', - 'sms_gateway_username', - 'sms_gateway_password', - 'sms_from', - 'pushover_api_token', - 'telegram_api_token', - ); + protected function testJabber() + { + $user = $this->getUser()->getUser(); + psm_jabber_send_message( + psm_get_conf('jabber_host'), + psm_get_conf('jabber_username'), + psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')), + [$user->jabber], + psm_get_lang('config', 'test_message'), + (trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null), + (trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null) + ); + // no message - async ... so just info + $this->addMessage(psm_get_lang('config', 'jabber_check'), 'info'); + // @todo possible to set message via ajax with callback ... + } - private $default_tab = 'general'; - - function __construct(Database $db, \Twig_Environment $twig) { - parent::__construct($db, $twig); - - $this->setMinUserLevelRequired(PSM_USER_ADMIN); - $this->setCSRFKey('config'); - - $this->setActions(array( - 'index', 'save', - ), 'index'); - } - - /** - * Populate all the config fields with values from the database - * - * @return string - */ - protected function executeIndex() { - $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'config')); - $tpl_data = $this->getLabels(); - - $config_db = $this->db->select( - PSM_DB_PREFIX.'config', - null, - array('key', 'value') - ); - - $config = array(); - foreach ($config_db as $entry) { - $config[$entry['key']] = $entry['value']; - } - - // generate language array - $lang_keys = psm_get_langs(); - $tpl_data['language_current'] = (isset($config['language'])) - ? $config['language'] - : 'en_US'; - $tpl_data['languages'] = array(); - foreach ($lang_keys as $key => $label) { - $tpl_data['languages'][] = array( - 'value' => $key, - 'label' => $label, - ); - } - - // generate sms_gateway array - $sms_gateways = psm_get_sms_gateways(); - $tpl_data['sms_gateway'] = array(); - foreach ($sms_gateways as $sms_gateway => $label) { - $tpl_data['sms_gateway'][] = array( - 'value' => $sms_gateway, - 'label' => $label, - ); - } - - foreach (array("status", "offline", "always") as $alert_type) { - $tpl_data['alert_type'][] = array( - 'value' => $alert_type, - 'label' => psm_get_lang('config', 'alert_type_'.$alert_type), - ); - } - - $tpl_data['email_smtp_security'] = array( - array( - 'value' => '', - 'label' => psm_get_lang('config', 'email_smtp_security_none') - ), - array( - 'value' => 'ssl', - 'label' => 'SSL' - ), - array( - 'value' => 'tls', - 'label' => 'TLS' - ) - ); - - $tpl_data['sms_gateway_selected'] = isset($config['sms_gateway']) ? $config['sms_gateway'] : current($sms_gateways); - $tpl_data['alert_type_selected'] = isset($config['alert_type']) ? $config['alert_type'] : ''; - $tpl_data['email_smtp_security_selected'] = isset($config['email_smtp_security']) ? $config['email_smtp_security'] : ''; - $tpl_data['auto_refresh_servers'] = isset($config['auto_refresh_servers']) ? $config['auto_refresh_servers'] : '0'; - $tpl_data['log_retention_period'] = isset($config['log_retention_period']) ? $config['log_retention_period'] : '365'; - $tpl_data['password_encrypt_key'] = isset($config['password_encrypt_key']) ? $config['password_encrypt_key'] : sha1(microtime()); - - foreach ($this->checkboxes as $input_key) { - $tpl_data[$input_key.'_checked'] = - (isset($config[$input_key]) && (int) $config[$input_key] == 1) - ? 'checked="checked"' - : ''; - } - foreach ($this->fields as $input_key) { - $tpl_data[$input_key] = (isset($config[$input_key])) ? $config[$input_key] : ''; - } - - $tpl_data[$this->default_tab.'_active'] = 'active'; - - $testmodals = array('email', 'sms', 'pushover', 'telegram'); - foreach ($testmodals as $modal_id) { - $modal = new \psm\Util\Module\Modal($this->twig, 'test'.ucfirst($modal_id), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('servers', 'send_'.$modal_id)); - $modal->setMessage(psm_get_lang('config', 'test_'.$modal_id)); - $modal->setOKButtonLabel(psm_get_lang('config', 'send')); - } - - return $this->twig->render('module/config/config.tpl.html', $tpl_data); - } - - /** - * If a post has been done, gather all the posted data - * and save it to the database - */ - protected function executeSave() { - if (!empty($_POST)) { - // save new config - $clean = array( - 'language' => $_POST['language'], - 'sms_gateway' => $_POST['sms_gateway'], - 'alert_type' => $_POST['alert_type'], - 'email_smtp_security' => - in_array($_POST['email_smtp_security'], array('', 'ssl', 'tls')) - ? $_POST['email_smtp_security'] - : '', - 'auto_refresh_servers' => intval(psm_POST('auto_refresh_servers', 0)), - 'log_retention_period' => intval(psm_POST('log_retention_period', 365)), - 'password_encrypt_key' => psm_POST('password_encrypt_key', sha1(microtime())), - ); - foreach ($this->checkboxes as $input_key) { - $clean[$input_key] = (isset($_POST[$input_key])) ? '1' : '0'; - } - foreach ($this->fields as $input_key) { - if (isset($_POST[$input_key])) { - $clean[$input_key] = $_POST[$input_key]; - } - } - $language_refresh = ($clean['language'] != psm_get_conf('language')); - foreach ($clean as $key => $value) { - psm_update_conf($key, $value); - } - $this->addMessage(psm_get_lang('config', 'updated'), 'success'); - - if (!empty($_POST['test_email'])) { - $this->testEmail(); - } elseif (!empty($_POST['test_sms'])) { - $this->testSMS(); - } elseif (!empty($_POST['test_pushover'])) { - $this->testPushover(); - } elseif (!empty($_POST['test_telegram'])) { - $this->testTelegram(); - } - - if ($language_refresh) { - header('Location: '.psm_build_url(array('mod' => 'config'), true, false)); - trigger_error("Redirect failed.", E_USER_ERROR); - } - - if (isset($_POST['general_submit'])) { - $this->default_tab = 'general'; - } elseif (isset($_POST['email_submit']) || !empty($_POST['test_email'])) { - $this->default_tab = 'email'; - } elseif (isset($_POST['sms_submit']) || !empty($_POST['test_sms'])) { - $this->default_tab = 'sms'; - } elseif (isset($_POST['pushover_submit']) || !empty($_POST['test_pushover'])) { - $this->default_tab = 'pushover'; - } elseif (isset($_POST['telegram_submit']) || !empty($_POST['test_telegram'])) { - $this->default_tab = 'telegram'; - } - } - return $this->runAction('index'); - } - - /** - * Execute email test - * - * @todo move test to separate class - */ - protected function testEmail() { - $mail = psm_build_mail(); - $message = psm_get_lang('config', 'test_message'); - $mail->Subject = psm_get_lang('config', 'test_subject'); - $mail->Priority = 1; - $mail->Body = $message; - $mail->AltBody = str_replace('
    ', "\n", $message); - $user = $this->getUser()->getUser(); - $mail->AddAddress($user->email, $user->name); - if ($mail->Send()) { - $this->addMessage(psm_get_lang('config', 'email_sent'), 'success'); - } else { - $this->addMessage(psm_get_lang('config', 'email_error').': '.$mail->ErrorInfo, 'error'); - } - } - - /** - * Execute SMS test - * - * @todo move test to separate class - */ - protected function testSMS() { - $sms = psm_build_sms(); - if ($sms) { - $user = $this->getUser()->getUser(); - if (empty($user->mobile)) { - $this->addMessage(psm_get_lang('config', 'sms_error_nomobile'), 'error'); - } else { - $sms->addRecipients($user->mobile); - $result = $sms->sendSMS(psm_get_lang('config', 'test_message')); - if ($result === 1) { - $this->addMessage(psm_get_lang('config', 'sms_sent'), 'success'); - } else { - $this->addMessage(sprintf(psm_get_lang('config', 'sms_error'), $result), 'error'); - } - } - } - } - - /** - * Execute pushover test - * - * @todo move test to separate class - */ - protected function testPushover() { - $pushover = psm_build_pushover(); - $pushover->setDebug(true); - $user = $this->getUser()->getUser(); - $apiToken = psm_get_conf('pushover_api_token'); - - if (empty($apiToken)) { - $this->addMessage(psm_get_lang('config', 'pushover_error_noapp'), 'error'); - } elseif (empty($user->pushover_key)) { - $this->addMessage(psm_get_lang('config', 'pushover_error_nokey'), 'error'); - } else { - $pushover->setPriority(0); - $pushover->setTitle(psm_get_lang('config', 'test_subject')); - $pushover->setMessage(psm_get_lang('config', 'test_message')); - $pushover->setUser($user->pushover_key); - if ($user->pushover_device != '') { - $pushover->setDevice($user->pushover_device); - } - $result = $pushover->send(); - - if (isset($result['output']->status) && $result['output']->status == 1) { - $this->addMessage(psm_get_lang('config', 'pushover_sent'), 'success'); - } else { - if (isset($result['output']->errors->error)) { - $error = $result['output']->errors->error; - } else { - $error = 'Unknown'; - } - $this->addMessage(sprintf(psm_get_lang('config', 'pushover_error'), $error), 'error'); - } - } - } - - /** - * Execute telegram test - * - * @todo move test to separate class - */ - protected function testTelegram() { - $telegram = psm_build_telegram(); - $user = $this->getUser()->getUser(); - $apiToken = psm_get_conf('telegram_api_token'); - - if (empty($apiToken)) { - $this->addMessage(psm_get_lang('config', 'telegram_error_notoken'), 'error'); - } elseif (empty($user->telegram_id)) { - $this->addMessage(psm_get_lang('config', 'telegram_error_noid'), 'error'); - } else { - $telegram->setMessage(psm_get_lang('config', 'test_message')); - $telegram->setUser($user->telegram_id); - - $result = $telegram->send(); - - if (isset($result['ok']) && $result['ok'] != false) { - $this->addMessage(psm_get_lang('config', 'telegram_sent'), 'success'); - } else { - if (isset($result['description'])) { - $error = $result['description']; - } else { - $error = 'Unknown'; - } - $this->addMessage(sprintf(psm_get_lang('config', 'telegram_error'), $error), 'error'); - } - } - } - - protected function getLabels() { - return array( - 'label_tab_email' => psm_get_lang('config', 'tab_email'), - 'label_tab_sms' => psm_get_lang('config', 'tab_sms'), - 'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'), - 'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'), - 'label_settings_email' => psm_get_lang('config', 'settings_email'), - 'label_settings_sms' => psm_get_lang('config', 'settings_sms'), - 'label_settings_pushover' => psm_get_lang('config', 'settings_pushover'), - 'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'), - 'label_settings_notification' => psm_get_lang('config', 'settings_notification'), - 'label_settings_log' => psm_get_lang('config', 'settings_log'), - 'label_settings_proxy' => psm_get_lang('config', 'settings_proxy'), - 'label_general' => psm_get_lang('config', 'general'), - 'label_language' => psm_get_lang('config', 'language'), - 'label_show_update' => psm_get_lang('config', 'show_update'), - 'label_password_encrypt_key' => psm_get_lang('config', 'password_encrypt_key'), - 'label_password_encrypt_key_note' => psm_get_lang('config', 'password_encrypt_key_note'), - 'label_proxy' => psm_get_lang('config', 'proxy'), - 'label_proxy_url' => psm_get_lang('config', 'proxy_url'), - 'label_proxy_user' => psm_get_lang('config', 'proxy_user'), - 'label_proxy_password' => psm_get_lang('config', 'proxy_password'), - 'label_email_status' => psm_get_lang('config', 'email_status'), - 'label_email_from_email' => psm_get_lang('config', 'email_from_email'), - 'label_email_from_name' => psm_get_lang('config', 'email_from_name'), - 'label_email_smtp' => psm_get_lang('config', 'email_smtp'), - 'label_email_smtp_host' => psm_get_lang('config', 'email_smtp_host'), - 'label_email_smtp_port' => psm_get_lang('config', 'email_smtp_port'), - 'label_email_smtp_security' => psm_get_lang('config', 'email_smtp_security'), - 'label_email_smtp_username' => psm_get_lang('config', 'email_smtp_username'), - 'label_email_smtp_password' => psm_get_lang('config', 'email_smtp_password'), - 'label_email_smtp_noauth' => psm_get_lang('config', 'email_smtp_noauth'), - 'label_sms_status' => psm_get_lang('config', 'sms_status'), - 'label_sms_gateway' => psm_get_lang('config', 'sms_gateway'), - 'label_sms_gateway_username' => psm_get_lang('config', 'sms_gateway_username'), - 'label_sms_gateway_password' => psm_get_lang('config', 'sms_gateway_password'), - 'label_sms_from' => psm_get_lang('config', 'sms_from'), - 'label_pushover_description' => psm_get_lang('config', 'pushover_description'), - 'label_pushover_status' => psm_get_lang('config', 'pushover_status'), - 'label_pushover_clone_app' => psm_get_lang('config', 'pushover_clone_app'), - 'pushover_clone_url' => PSM_PUSHOVER_CLONE_URL, - 'label_pushover_api_token' => psm_get_lang('config', 'pushover_api_token'), - 'label_pushover_api_token_description' => sprintf( - psm_get_lang('config', 'pushover_api_token_description'), - PSM_PUSHOVER_CLONE_URL - ), - 'label_telegram_description' => psm_get_lang('config', 'telegram_description'), - 'label_telegram_status' => psm_get_lang('config', 'telegram_status'), - 'label_telegram_api_token' => psm_get_lang('config', 'telegram_api_token'), - 'label_telegram_api_token_description' => psm_get_lang('config', 'telegram_api_token_description'), - 'label_alert_type' => psm_get_lang('config', 'alert_type'), - 'label_alert_type_description' => psm_get_lang('config', 'alert_type_description'), - 'label_combine_notifications' => psm_get_lang('config', 'combine_notifications'), + protected function getLabels() + { + return array( + 'label_tab_email' => psm_get_lang('config', 'tab_email'), + 'label_tab_sms' => psm_get_lang('config', 'tab_sms'), + 'label_tab_pushover' => psm_get_lang('config', 'tab_pushover'), + 'label_tab_telegram' => psm_get_lang('config', 'tab_telegram'), + 'label_tab_jabber' => psm_get_lang('config', 'tab_jabber'), + 'label_settings_email' => psm_get_lang('config', 'settings_email'), + 'label_settings_sms' => psm_get_lang('config', 'settings_sms'), + 'label_settings_pushover' => psm_get_lang('config', 'settings_pushover'), + 'label_settings_telegram' => psm_get_lang('config', 'settings_telegram'), + 'label_settings_jabber' => psm_get_lang('config', 'settings_jabber'), + 'label_settings_notification' => psm_get_lang('config', 'settings_notification'), + 'label_settings_log' => psm_get_lang('config', 'settings_log'), + 'label_settings_proxy' => psm_get_lang('config', 'settings_proxy'), + 'label_general' => psm_get_lang('config', 'general'), + 'label_language' => psm_get_lang('config', 'language'), + 'label_show_update' => psm_get_lang('config', 'show_update'), + 'label_password_encrypt_key' => psm_get_lang('config', 'password_encrypt_key'), + 'label_password_encrypt_key_note' => psm_get_lang('config', 'password_encrypt_key_note'), + 'label_proxy' => psm_get_lang('config', 'proxy'), + 'label_proxy_url' => psm_get_lang('config', 'proxy_url'), + 'label_proxy_user' => psm_get_lang('config', 'proxy_user'), + 'label_proxy_password' => psm_get_lang('config', 'proxy_password'), + 'label_email_status' => psm_get_lang('config', 'email_status'), + 'label_email_from_email' => psm_get_lang('config', 'email_from_email'), + 'label_email_from_name' => psm_get_lang('config', 'email_from_name'), + 'label_email_smtp' => psm_get_lang('config', 'email_smtp'), + 'label_email_smtp_host' => psm_get_lang('config', 'email_smtp_host'), + 'label_email_smtp_port' => psm_get_lang('config', 'email_smtp_port'), + 'label_email_smtp_security' => psm_get_lang('config', 'email_smtp_security'), + 'label_email_smtp_username' => psm_get_lang('config', 'email_smtp_username'), + 'label_email_smtp_password' => psm_get_lang('config', 'email_smtp_password'), + 'label_email_smtp_noauth' => psm_get_lang('config', 'email_smtp_noauth'), + 'label_sms_status' => psm_get_lang('config', 'sms_status'), + 'label_sms_gateway' => psm_get_lang('config', 'sms_gateway'), + 'label_sms_gateway_username' => psm_get_lang('config', 'sms_gateway_username'), + 'label_sms_gateway_password' => psm_get_lang('config', 'sms_gateway_password'), + 'label_sms_from' => psm_get_lang('config', 'sms_from'), + 'label_pushover_description' => psm_get_lang('config', 'pushover_description'), + 'label_pushover_status' => psm_get_lang('config', 'pushover_status'), + 'label_pushover_clone_app' => psm_get_lang('config', 'pushover_clone_app'), + 'pushover_clone_url' => PSM_PUSHOVER_CLONE_URL, + 'label_pushover_api_token' => psm_get_lang('config', 'pushover_api_token'), + 'label_pushover_api_token_description' => sprintf( + psm_get_lang('config', 'pushover_api_token_description'), + PSM_PUSHOVER_CLONE_URL + ), + 'label_telegram_description' => psm_get_lang('config', 'telegram_description'), + 'label_telegram_status' => psm_get_lang('config', 'telegram_status'), + 'label_telegram_api_token' => psm_get_lang('config', 'telegram_api_token'), + 'label_telegram_api_token_description' => psm_get_lang('config', 'telegram_api_token_description'), + 'label_jabber_status' => psm_get_lang('config', 'jabber_status'), + 'label_jabber_description' => psm_get_lang('config', 'jabber_description'), + 'label_jabber_host' => psm_get_lang('config', 'jabber_host'), + 'label_jabber_host_description' => psm_get_lang('config', 'jabber_host_description'), + 'label_jabber_port' => psm_get_lang('config', 'jabber_port'), + 'label_jabber_port_description' => psm_get_lang('config', 'jabber_port_description'), + 'label_jabber_username' => psm_get_lang('config', 'jabber_username'), + 'label_jabber_username_description' => psm_get_lang('config', 'jabber_username_description'), + 'label_jabber_domain' => psm_get_lang('config', 'jabber_domain'), + 'label_jabber_domain_description' => psm_get_lang('config', 'jabber_domain_description'), + 'label_jabber_password' => psm_get_lang('config', 'jabber_password'), + 'label_jabber_password_description' => psm_get_lang('config', 'jabber_password_description'), + 'label_alert_type' => psm_get_lang('config', 'alert_type'), + 'label_alert_type_description' => psm_get_lang('config', 'alert_type_description'), + 'label_combine_notifications' => psm_get_lang('config', 'combine_notifications'), 'label_combine_notifications_description' => psm_get_lang('config', 'combine_notifications_description'), - 'label_log_status' => psm_get_lang('config', 'log_status'), - 'label_log_status_description' => psm_get_lang('config', 'log_status_description'), - 'label_log_email' => psm_get_lang('config', 'log_email'), - 'label_log_sms' => psm_get_lang('config', 'log_sms'), - 'label_log_pushover' => psm_get_lang('config', 'log_pushover'), - 'label_log_telegram' => psm_get_lang('config', 'log_telegram'), - 'label_alert_proxy' => psm_get_lang('config', 'alert_proxy'), - 'label_alert_proxy_url' => psm_get_lang('config', 'alert_proxy_url'), - 'label_auto_refresh' => psm_get_lang('config', 'auto_refresh'), - 'label_auto_refresh_description' => psm_get_lang('config', 'auto_refresh_description'), - 'label_seconds' => psm_get_lang('config', 'seconds'), - 'label_save' => psm_get_lang('system', 'save'), - 'label_test' => psm_get_lang('config', 'test'), - 'label_log_retention_period' => psm_get_lang('config', 'log_retention_period'), - 'label_log_retention_period_description' => psm_get_lang('config', 'log_retention_period_description'), - 'label_log_retention_days' => psm_get_lang('config', 'log_retention_days'), - 'label_days' => psm_get_lang('config', 'log_retention_days'), + 'label_log_status' => psm_get_lang('config', 'log_status'), + 'label_log_status_description' => psm_get_lang('config', 'log_status_description'), + 'label_log_email' => psm_get_lang('config', 'log_email'), + 'label_log_sms' => psm_get_lang('config', 'log_sms'), + 'label_log_pushover' => psm_get_lang('config', 'log_pushover'), + 'label_log_telegram' => psm_get_lang('config', 'log_telegram'), + 'label_log_jabber' => psm_get_lang('config', 'log_jabber'), + 'label_alert_proxy' => psm_get_lang('config', 'alert_proxy'), + 'label_alert_proxy_url' => psm_get_lang('config', 'alert_proxy_url'), + 'label_auto_refresh' => psm_get_lang('config', 'auto_refresh'), + 'label_auto_refresh_description' => psm_get_lang('config', 'auto_refresh_description'), + 'label_seconds' => psm_get_lang('config', 'seconds'), + 'label_save' => psm_get_lang('system', 'save'), + 'label_test' => psm_get_lang('config', 'test'), + 'label_log_retention_period' => psm_get_lang('config', 'log_retention_period'), + 'label_log_retention_period_description' => psm_get_lang('config', 'log_retention_period_description'), + 'label_log_retention_days' => psm_get_lang('config', 'log_retention_days'), + 'label_days' => psm_get_lang('config', 'log_retention_days'), + 'label_leave_blank' => psm_get_lang('users', 'password_leave_blank'), - ); - } + ); + } } diff --git a/src/psm/Module/ControllerInterface.php b/src/psm/Module/ControllerInterface.php index 6ebefb71..672fbe1a 100644 --- a/src/psm/Module/ControllerInterface.php +++ b/src/psm/Module/ControllerInterface.php @@ -1,4 +1,5 @@ setMinUserLevelRequired(PSM_USER_ANONYMOUS); + $this->setMinUserLevelRequired(PSM_USER_ANONYMOUS); - $this->setActions(array( - '401', - ), '401'); - } + $this->setActions(array( + '401', + ), '401'); + } - /** - * 401 error page - * - * @return string - */ - protected function execute401() { - return $this->twig->render('module/error/401.tpl.html', array( - 'label_title' => psm_get_lang('error', '401_unauthorized'), - 'label_description' => psm_get_lang('error', '401_unauthorized_description'), - )); - } + /** + * 401 error page + * + * @return string + */ + protected function execute401() + { + return $this->twig->render('module/error/401.tpl.html', array( + 'label_title' => psm_get_lang('error', '401_unauthorized'), + 'label_description' => psm_get_lang('error', '401_unauthorized_description'), + )); + } } diff --git a/src/psm/Module/Error/ErrorModule.php b/src/psm/Module/Error/ErrorModule.php index 52496e22..a9ad9f44 100644 --- a/src/psm/Module/Error/ErrorModule.php +++ b/src/psm/Module/Error/ErrorModule.php @@ -1,4 +1,5 @@ __NAMESPACE__.'\Controller\ErrorController', - ); - - } + public function getControllers() + { + return array( + 'error' => __NAMESPACE__ . '\Controller\ErrorController', + ); + } } diff --git a/src/psm/Module/Install/Controller/InstallController.php b/src/psm/Module/Install/Controller/InstallController.php index 667a2696..cd1e38e0 100644 --- a/src/psm/Module/Install/Controller/InstallController.php +++ b/src/psm/Module/Install/Controller/InstallController.php @@ -1,4 +1,5 @@ setMinUserLevelRequired(PSM_USER_ANONYMOUS); - $this->setCSRFKey('install'); - $this->addMenu(false); + $this->setMinUserLevelRequired(PSM_USER_ANONYMOUS); + $this->setCSRFKey('install'); + $this->addMenu(false); - $this->path_config = PSM_PATH_SRC.'../config.php'; - $this->path_config_old = PSM_PATH_SRC.'../config.inc.php'; + $this->path_config = PSM_PATH_SRC . '../config.php'; + $this->path_config_old = PSM_PATH_SRC . '../config.inc.php'; - $this->setActions(array( - 'index', 'config', 'install' - ), 'index'); + $this->setActions(array( + 'index', 'config', 'install' + ), 'index'); - $this->twig->addGlobal('subtitle', psm_get_lang('system', 'install')); - } + $this->twig->addGlobal('subtitle', psm_get_lang('system', 'install')); + } - /** - * Say hi to our new user - */ - protected function executeIndex() { - // build prerequisites - $errors = 0; + /** + * Say hi to our new user + */ + protected function executeIndex() + { + // build prerequisites + $errors = 0; - $phpv = phpversion(); - if (version_compare($phpv, '5.5.9', '<') || (version_compare($phpv, '7.0.8', '<') && version_compare($phpv, '7.0.0', '>='))) { - $errors++; - $this->addMessage('PHP 5.5.9+ or 7.0.8+ is required to run PHP Server Monitor. You\'re using '.$phpv.'.', 'error'); - } else { - $this->addMessage('PHP version: '.$phpv, 'success'); - } - if (version_compare(PHP_RELEASE_VERSION, '7', '<')) { - $this->addMessage('PHP 5 reaches the end of life (January 1, 2019), please update to PHP 7. PHP supported versions can be found here.', 'warning'); - } - if (!function_exists('curl_init')) { - $this->addMessage('PHP is installed without the cURL module. Please install cURL.', 'warning'); - } else { - $this->addMessage('PHP cURL module found', 'success'); - } - if (!in_array('mysql', \PDO::getAvailableDrivers())) { - $errors++; - $this->addMessage('The PDO MySQL driver needs to be installed.', 'error'); - } - if (!ini_get('date.timezone')) { - $this->addMessage('You should set a timezone in your php.ini file (e.g. \'date.timezone = UTC\'). See this page for more info.', 'warning'); - } + $phpv = phpversion(); + if ( + version_compare($phpv, '5.6.0', '<') || + (version_compare($phpv, '7.0.8', '<') && version_compare($phpv, '7.0.0', '>=')) + ) { + $errors++; + $this->addMessage('PHP 5.6.0+ or 7.0.8+ is required to run PHP Server Monitor. You\'re using ' . + $phpv . '.', 'error'); + } else { + $this->addMessage('PHP version: ' . $phpv, 'success'); + } + if (version_compare(PHP_RELEASE_VERSION, '7', '<')) { + $this->addMessage( + 'PHP 5 reaches the end of life (January 1, 2019), please update to PHP 7. + PHP supported versions can be found + here.', + 'warning' + ); + } + if (!function_exists('curl_init')) { + $this->addMessage('PHP is installed without the cURL module. Please install cURL.', 'warning'); + } else { + $this->addMessage('PHP cURL module found', 'success'); + } + if (!in_array('mysql', \PDO::getAvailableDrivers())) { + $errors++; + $this->addMessage('The PDO MySQL driver needs to be installed.', 'error'); + } + if (!ini_get('date.timezone')) { + $this->addMessage( + 'You should set a timezone in your php.ini file (e.g. \'date.timezone = UTC\'). + See this page + for more info.', + 'warning' + ); + } - if ($errors > 0) { - $this->addMessage($errors.' error(s) have been encountered. Please fix them and refresh this page.', 'error'); - } + if ($errors > 0) { + $this->addMessage( + $errors . ' error(s) have been encountered. Please fix them and refresh this page.', + 'error' + ); + } - return $this->twig->render('module/install/index.tpl.html', array( - 'messages' => $this->getMessages() - )); - } + return $this->twig->render('module/install/index.tpl.html', array( + 'messages' => $this->getMessages() + )); + } - /** - * Help the user create a new config file - */ - protected function executeConfig() { - $tpl_name = 'module/install/config_new.tpl.html'; - $tpl_data = array(); + /** + * Help the user create a new config file + */ + protected function executeConfig() + { + $tpl_name = 'module/install/config_new.tpl.html'; + $tpl_data = array(); - if (!defined('PSM_DB_PREFIX')) { - // first detect "old" config file (2.0) - if (file_exists($this->path_config_old)) { - // oldtimer huh - $this->addMessage('Configuration file for v2.0 found.', 'success'); - $this->addMessage( - 'The location of the config file has been changed since v2.0.
    '. - 'We will attempt to create a new config file for you.' - , 'warning'); - $values = $this->parseConfig20(); - } else { - // fresh install - $values = $_POST; - } + if (!defined('PSM_DB_PREFIX')) { + // first detect "old" config file (2.0) + if (file_exists($this->path_config_old)) { + // oldtimer huh + $this->addMessage('Configuration file for v2.0 found.', 'success'); + $this->addMessage( + 'The location of the config file has been changed since v2.0.
    ' . + 'We will attempt to create a new config file for you.', + 'warning' + ); + $values = $this->parseConfig20(); + } else { + // fresh install + $values = $_POST; + } - $config = array( - 'db_host' => 'localhost', - 'db_port' => '', - 'db_name' => '', - 'db_user' => '', - 'db_pass' => '', - 'db_prefix' => 'psm_', - 'base_url' => $this->getBaseUrl(), - ); + $config = array( + 'db_host' => 'localhost', + 'db_port' => '', + 'db_name' => '', + 'db_user' => '', + 'db_pass' => '', + 'db_prefix' => 'psm_', + 'base_url' => $this->getBaseUrl(), + ); - $changed = false; - foreach ($config as $ckey => &$cvalue) { - if (isset($values[$ckey])) { - $changed = true; - $cvalue = $values[$ckey]; - } - } - // add config to template data for prefilling the form - $tpl_data = $config; + $changed = false; + foreach ($config as $ckey => &$cvalue) { + if (isset($values[$ckey])) { + $changed = true; + $cvalue = $values[$ckey]; + } + } + // add config to template data for prefilling the form + $tpl_data = $config; - if ($changed) { - // test db connection - $this->db = new \psm\Service\Database( - $config['db_host'], - $config['db_user'], - $config['db_pass'], - $config['db_name'], - $config['db_port'] - ); + if ($changed) { + // test db connection + $this->db = new \psm\Service\Database( + $config['db_host'], + $config['db_user'], + $config['db_pass'], + $config['db_name'], + $config['db_port'] + ); - if ($this->db->status()) { - $this->addMessage('Connection to MySQL successful.', 'success'); - $config_php = $this->writeConfigFile($config); - if ($config_php === true) { - $this->addMessage('Configuration file written successfully.', 'success'); - } else { - $this->addMessage('Config file is not writable, we cannot save it for you.', 'error'); - $tpl_data['include_config_new_copy'] = true; - $tpl_data['php_config'] = $config_php; - } - } else { - $this->addMessage('Unable to connect to MySQL. Please check your information.', 'error'); - } - } - } + if ($this->db->status()) { + $this->addMessage('Connection to MySQL successful.', 'success'); + $config_php = $this->writeConfigFile($config); + if ($config_php === true) { + $this->addMessage('Configuration file written successfully.', 'success'); + } else { + $this->addMessage('Config file is not writable, we cannot save it for you.', 'error'); + $tpl_data['include_config_new_copy'] = true; + $tpl_data['php_config'] = $config_php; + } + } else { + $this->addMessage('Unable to connect to MySQL. Please check your information.', 'error'); + } + } + } - if (defined('PSM_DB_PREFIX')) { - if ($this->db->status()) { - if ($this->isUpgrade()) { - // upgrade - $version_from = $this->getPreviousVersion(); - if (version_compare($version_from, '3.0.0', '<')) { - // upgrade from before 3.0, does not have passwords yet.. create new user first - $this->addMessage('Your current version does not have an authentication system, but since v3.0 access to the monitor is restricted by user accounts. Please set up a new account to be able to login after the upgrade, and which you can use to change the passwords for your other accounts.'); - $tpl_name = 'module/install/config_new_user.tpl.html'; - } - elseif (version_compare($version_from, PSM_VERSION, '=')) { - $this->addMessage('Your installation is already at the latest version.', 'success'); - $tpl_name = 'module/install/success.tpl.html'; - } - else { - $this->addMessage('We have discovered a previous version.'); - $tpl_name = 'module/install/config_upgrade.tpl.html'; - $tpl_data['version'] = PSM_VERSION; - } - } else { - // fresh install ahead - $tpl_name = 'module/install/config_new_user.tpl.html'; + if (defined('PSM_DB_PREFIX')) { + if ($this->db->status()) { + if ($this->isUpgrade()) { + // upgrade + $version_from = $this->getPreviousVersion(); + if (version_compare($version_from, '3.0.0', '<')) { + // upgrade from before 3.0, does not have passwords yet.. create new user first + $this->addMessage( + 'Your current version does not have an authentication system, + but since v3.0 access to the monitor is restricted by user accounts. + Please set up a new account to be able to login after the upgrade, + and which you can use to change the passwords for your other accounts.' + ); + $tpl_name = 'module/install/config_new_user.tpl.html'; + } elseif (version_compare($version_from, PSM_VERSION, '=')) { + $this->addMessage('Your installation is already at the latest version.', 'success'); + $tpl_name = 'module/install/success.tpl.html'; + } else { + $this->addMessage('We have discovered a previous version.'); + $tpl_name = 'module/install/config_upgrade.tpl.html'; + $tpl_data['version'] = PSM_VERSION; + } + } else { + // fresh install ahead + $tpl_name = 'module/install/config_new_user.tpl.html'; - $tpl_data['username'] = (isset($_POST['username'])) ? $_POST['username'] : ''; - $tpl_data['email'] = (isset($_POST['email'])) ? $_POST['email'] : ''; - } - } else { - $this->addMessage('Configuration file found, but unable to connect to MySQL. Please check your information.', 'error'); - } - } - $tpl_data['messages'] = $this->getMessages(); - return $this->twig->render($tpl_name, $tpl_data); - } + $tpl_data['username'] = (isset($_POST['username'])) ? $_POST['username'] : ''; + $tpl_data['email'] = (isset($_POST['email'])) ? $_POST['email'] : ''; + } + } else { + $this->addMessage( + 'Configuration file found, but unable to connect to MySQL. Please check your information.', + 'error' + ); + } + } + $tpl_data['messages'] = $this->getMessages(); + return $this->twig->render($tpl_name, $tpl_data); + } - /** - * Execute the install and upgrade process to a newer version - */ - protected function executeInstall() { - if (!defined('PSM_DB_PREFIX') || !$this->db->status()) { - return $this->executeConfig(); - } - $add_user = false; + /** + * Execute the install and upgrade process to a newer version + */ + protected function executeInstall() + { + if (!defined('PSM_DB_PREFIX') || !$this->db->status()) { + return $this->executeConfig(); + } + $add_user = false; - // check if user submitted username + password in previous step - // this would only be the case for new installs, and install from - // before 3.0 - $new_user = array( - 'user_name' => psm_POST('username'), - 'name' => psm_POST('username'), - 'password' => psm_POST('password'), - 'password_repeat' => psm_POST('password_repeat'), - 'email' => psm_POST('email', ''), - 'mobile' => '', - 'level' => PSM_USER_ADMIN, - 'pushover_key' => '', - 'pushover_device' => '', - 'telegram_id' => '', - ); + // check if user submitted username + password in previous step + // this would only be the case for new installs, and install from + // before 3.0 + $new_user = array( + 'user_name' => psm_POST('username'), + 'name' => psm_POST('username'), + 'password' => psm_POST('password'), + 'password_repeat' => psm_POST('password_repeat'), + 'email' => psm_POST('email', ''), + 'mobile' => '', + 'level' => PSM_USER_ADMIN, + 'pushover_key' => '', + 'pushover_device' => '', + 'telegram_id' => '', + 'jabber' => '' + ); - $validator = $this->container->get('util.user.validator'); + $validator = $this->container->get('util.user.validator'); - $logger = array($this, 'addMessage'); - $installer = new \psm\Util\Install\Installer($this->db, $logger); + $logger = array($this, 'addMessage'); + $installer = new \psm\Util\Install\Installer($this->db, $logger); - if ($this->isUpgrade()) { - $this->addMessage('Upgrade process started.'); + if ($this->isUpgrade()) { + $this->addMessage('Upgrade process started.'); - $version_from = $this->getPreviousVersion(); - if ($version_from === false) { - $this->addMessage('Unable to locate your previous version. Please run a fresh install.', 'error'); - } else { - if (version_compare($version_from, PSM_VERSION, '=')) { - $this->addMessage('Your installation is already at the latest version.', 'success'); - } elseif (version_compare($version_from, PSM_VERSION, '>')) { - $this->addMessage('This installer does not support downgrading, sorry.', 'error'); - } else { - $this->addMessage('Upgrading from '.$version_from.' to '.PSM_VERSION); - $installer->upgrade($version_from, PSM_VERSION); + $version_from = $this->getPreviousVersion(); + if ($version_from === false) { + $this->addMessage('Unable to locate your previous version. Please run a fresh install.', 'error'); + } else { + if (version_compare($version_from, PSM_VERSION, '=')) { + $this->addMessage('Your installation is already at the latest version.', 'success'); + } elseif (version_compare($version_from, PSM_VERSION, '>')) { + $this->addMessage('This installer does not support downgrading, sorry.', 'error'); + } else { + $this->addMessage('Upgrading from ' . $version_from . ' to ' . PSM_VERSION); + $installer->upgrade($version_from, PSM_VERSION); + } + if (version_compare($version_from, '3.0.0', '<')) { + $add_user = true; + } + } + } else { + // validate the lot + try { + $validator->usernameNew($new_user['user_name']); + $validator->email($new_user['email']); + $validator->password($new_user['password'], $new_user['password_repeat']); + } catch (\InvalidArgumentException $e) { + $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); + return $this->executeConfig(); + } - } - if (version_compare($version_from, '3.0.0', '<')) { - $add_user = true; - } - } - } else { - // validate the lot - try { - $validator->username_new($new_user['user_name']); - $validator->email($new_user['email']); - $validator->password($new_user['password'], $new_user['password_repeat']); - } catch (\InvalidArgumentException $e) { - $this->addMessage(psm_get_lang('users', 'error_'.$e->getMessage()), 'error'); - return $this->executeConfig(); - } + $this->addMessage('Installation process started.', 'success'); + $installer->install(); + // add user + $add_user = true; + } - $this->addMessage('Installation process started.', 'success'); - $installer->install(); - // add user - $add_user = true; - } + if ($add_user) { + unset($new_user['password_repeat']); + $user_id = $this->db->save(PSM_DB_PREFIX . 'users', $new_user); + if (intval($user_id) > 0) { + $this->getUser()->changePassword($user_id, $new_user['password']); + $this->addMessage('User account has been created successfully.', 'success'); + } else { + $this->addMessage('There was an error adding your user account.', 'error'); + } + } - if ($add_user) { - unset($new_user['password_repeat']); - $user_id = $this->db->save(PSM_DB_PREFIX.'users', $new_user); - if (intval($user_id) > 0) { - $this->getUser()->changePassword($user_id, $new_user['password']); - $this->addMessage('User account has been created successfully.', 'success'); - } else { - $this->addMessage('There was an error adding your user account.', 'error'); - } - } + return $this->twig->render('module/install/success.tpl.html', array( + 'messages' => $this->getMessages() + )); + } - return $this->twig->render('module/install/success.tpl.html', array( - 'messages' => $this->getMessages() - )); - } + /** + * Write config file with db variables + * @param array $array_config prefix,user,pass,name,host + * @return boolean|string TRUE on success, string with config otherwise + */ + protected function writeConfigFile($array_config) + { + $config = " $value) { + $line = "define('PSM_{key}', '{value}');" . PHP_EOL; + $line = str_replace( + array('{key}', '{value}'), + array(strtoupper($key), $value), + $line + ); + $config .= $line; + } + if (is_writeable($this->path_config)) { + file_put_contents($this->path_config, $config); + return true; + } else { + return $config; + } + } - foreach ($array_config as $key => $value) { - $line = "define('PSM_{key}', '{value}');".PHP_EOL; - $line = str_replace( - array('{key}', '{value}'), - array(strtoupper($key), $value), - $line - ); - $config .= $line; - } - if (is_writeable($this->path_config)) { - file_put_contents($this->path_config, $config); - return true; - } else { - return $config; - } - } + /** + * Parse the 2.0 config file for prefilling + * @return array + */ + protected function parseConfig20() + { + $config_old = file_get_contents($this->path_config_old); + $vars = array( + 'prefix' => '', + 'user' => '', + 'pass' => '', + 'name' => '', + 'host' => '', + 'port' => '' + ); + $pattern = "/define\('SM_{key}', '(.*?)'/u"; - /** - * Parse the 2.0 config file for prefilling - * @return array - */ - protected function parseConfig20() { - $config_old = file_get_contents($this->path_config_old); - $vars = array( - 'prefix' => '', - 'user' => '', - 'pass' => '', - 'name' => '', - 'host' => '', - 'port' => '' - ); - $pattern = "/define\('SM_{key}', '(.*?)'/u"; + foreach ($vars as $key => $value) { + $pattern_key = str_replace('{key}', strtoupper($key), $pattern); + preg_match($pattern_key, $config_old, $value_matches); + $vars[$key] = (isset($value_matches[1])) ? $value_matches[1] : ''; + } - foreach ($vars as $key => $value) { - $pattern_key = str_replace('{key}', strtoupper($key), $pattern); - preg_match($pattern_key, $config_old, $value_matches); - $vars[$key] = (isset($value_matches[1])) ? $value_matches[1] : ''; - } + return $vars; + } - return $vars; - } + /** + * Is it an upgrade or install? + */ + protected function isUpgrade() + { + if (!$this->db->status()) { + return false; + } + return $this->db->ifTableExists(PSM_DB_PREFIX . 'config'); + } - /** - * Is it an upgrade or install? - */ - protected function isUpgrade() { - if (!$this->db->status()) { - return false; - } - return $this->db->ifTableExists(PSM_DB_PREFIX.'config'); - } + /** + * Get the previous version from the config table + * @return boolean|string FALSE on failure, string otherwise + */ + protected function getPreviousVersion() + { + if (!$this->isUpgrade()) { + return false; + } + $version_conf = $this->db->selectRow(PSM_DB_PREFIX . 'config', array('key' => 'version'), array('value')); + if (empty($version_conf)) { + return false; + } else { + $version_from = $version_conf['value']; + if (strpos($version_from, '.') === false) { + // yeah, my bad.. previous version did not follow proper naming scheme + $version_from = rtrim(chunk_split($version_from, 1, '.'), '.'); + } + return $version_from; + } + } - /** - * Get the previous version from the config table - * @return boolean|string FALSE on failure, string otherwise - */ - protected function getPreviousVersion() { - if (!$this->isUpgrade()) { - return false; - } - $version_conf = $this->db->selectRow(PSM_DB_PREFIX.'config', array('key' => 'version'), array('value')); - if (empty($version_conf)) { - return false; - } else { - $version_from = $version_conf['value']; - if (strpos($version_from, '.') === false) { - // yeah, my bad.. previous version did not follow proper naming scheme - $version_from = rtrim(chunk_split($version_from, 1, '.'), '.'); - } - return $version_from; - } - } + /** + * Get base url of the current application + * @return string + */ + protected function getBaseUrl() + { + $sym_request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); - /** - * Get base url of the current application - * @return string - */ - protected function getBaseUrl() { - $sym_request = \Symfony\Component\HttpFoundation\Request::createFromGlobals(); - - return $sym_request->getSchemeAndHttpHost().$sym_request->getBasePath(); - } + return $sym_request->getSchemeAndHttpHost() . $sym_request->getBasePath(); + } } diff --git a/src/psm/Module/Install/InstallModule.php b/src/psm/Module/Install/InstallModule.php index cfd6c067..9bc5babc 100644 --- a/src/psm/Module/Install/InstallModule.php +++ b/src/psm/Module/Install/InstallModule.php @@ -1,4 +1,5 @@ __NAMESPACE__.'\Controller\InstallController', - ); - - } + public function getControllers() + { + return array( + 'install' => __NAMESPACE__ . '\Controller\InstallController', + ); + } } diff --git a/src/psm/Module/ModuleInterface.php b/src/psm/Module/ModuleInterface.php index a680973b..63923515 100644 --- a/src/psm/Module/ModuleInterface.php +++ b/src/psm/Module/ModuleInterface.php @@ -1,4 +1,5 @@ getUser()->getUserLevel() > PSM_USER_ADMIN) { - // restrict by user_id - $sql_join = "JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( + if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) { + // restrict by user_id + $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( `us`.`user_id`={$this->getUser()->getUserId()} AND `us`.`server_id`=`s`.`server_id` )"; - } - if ($server_id !== null) { - $server_id = intval($server_id); - $sql_where = "WHERE `s`.`server_id`={$server_id} "; - } + } + if ($server_id !== null) { + $server_id = intval($server_id); + $sql_where = "WHERE `s`.`server_id`={$server_id} "; + } - $sql = "SELECT + $sql = "SELECT `s`.`server_id`, `s`.`ip`, `s`.`port`, @@ -83,63 +83,76 @@ abstract class AbstractServerController extends AbstractController { `s`.`sms`, `s`.`pushover`, `s`.`telegram`, + `s`.`jabber`, `s`.`warning_threshold`, `s`.`warning_threshold_counter`, + `s`.`ssl_cert_expiry_days`, + `s`.`ssl_cert_expired_time`, `s`.`timeout`, `s`.`website_username`, `s`.`website_password`, `s`.`last_error`, `s`.`last_error_output`, `s`.`last_output` - FROM `".PSM_DB_PREFIX."servers` AS `s` + FROM `" . PSM_DB_PREFIX . "servers` AS `s` {$sql_join} {$sql_where} ORDER BY `active` ASC, `status` DESC, `label` ASC"; - $servers = $this->db->query($sql); + $servers = $this->db->query($sql); - if ($server_id !== null && count($servers) == 1) { - $servers = $servers[0]; - } + if ($server_id !== null && count($servers) == 1) { + $servers = $servers[0]; + } - return $servers; - } + return $servers; + } - /** - * Format server data for display - * @param array $server - * @return array - */ - protected function formatServer($server) { - $server['rtime'] = round((float) $server['rtime'], 4); - $server['last_online'] = psm_timespan($server['last_online']); - $server['last_offline'] = psm_timespan($server['last_offline']); - if ($server['last_offline'] != psm_get_lang('system', 'never')) { - $server['last_offline_duration'] = is_null($server['last_offline_duration']) ? - null : "(".$server['last_offline_duration'].")"; - } - $server['last_check'] = psm_timespan($server['last_check']); + /** + * Format server data for display + * @param array $server + * @return array + */ + protected function formatServer($server) + { + $server['rtime'] = round((float) $server['rtime'], 4); + $server['last_online'] = psm_timespan($server['last_online']); + $server['last_offline'] = psm_timespan($server['last_offline']); + if ($server['last_offline'] != psm_get_lang('system', 'never')) { + $server['last_offline_duration'] = is_null($server['last_offline_duration']) ? + null : "(" . $server['last_offline_duration'] . ")"; + } + $server['last_check'] = psm_timespan($server['last_check']); - if ($server['status'] == 'on' && $server['warning_threshold_counter'] > 0) { - $server['status'] = 'warning'; - } + if ( + ( + $server['status'] == 'on' && + $server['warning_threshold_counter'] > 0 + ) || ( + $server['status'] == 'on' && + $server['ssl_cert_expired_time'] !== null && + $server['ssl_cert_expiry_days'] > 0 + ) + ) { + $server['status'] = 'warning'; + } - $server['error'] = htmlentities($server['error']); - $server['type'] = psm_get_lang('servers', 'type_'.$server['type']); - $server['timeout'] = ($server['timeout'] > 0) ? $server['timeout'] : PSM_CURL_TIMEOUT; + $server['error'] = htmlentities($server['error']); + $server['type'] = psm_get_lang('servers', 'type_' . $server['type']); + $server['timeout'] = ($server['timeout'] > 0) ? $server['timeout'] : PSM_CURL_TIMEOUT; - $server['last_error'] = htmlentities($server['last_error']); - $server['last_error_output'] = htmlentities($server['last_error_output']); - $server['last_output'] = htmlentities($server['last_output']); + $server['last_error'] = htmlentities($server['last_error']); + $server['last_error_output'] = htmlentities($server['last_error_output']); + $server['last_output'] = htmlentities($server['last_output']); - $url_actions = array('delete', 'edit', 'view'); - foreach ($url_actions as $action) { - $server['url_'.$action] = psm_build_url(array( - 'mod' => 'server', - 'action' => $action, - 'id' => $server['server_id'], - )); - } + $url_actions = array('delete', 'edit', 'view'); + foreach ($url_actions as $action) { + $server['url_' . $action] = psm_build_url(array( + 'mod' => 'server', + 'action' => $action, + 'id' => $server['server_id'], + )); + } - return $server; - } + return $server; + } } diff --git a/src/psm/Module/Server/Controller/LogController.php b/src/psm/Module/Server/Controller/LogController.php index 3fc68060..72685baf 100644 --- a/src/psm/Module/Server/Controller/LogController.php +++ b/src/psm/Module/Server/Controller/LogController.php @@ -1,4 +1,5 @@ setActions(array( - 'index', 'delete', - ), 'index'); - } + $this->setActions(array( + 'index', 'delete', + ), 'index'); + } - /** - * Prepare the template with a list of all log entries - */ - protected function executeIndex() { - $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server_log')); - $tpl_data = array( - 'label_status' => psm_get_lang('log', 'status'), - 'label_email' => psm_get_lang('log', 'email'), - 'label_sms' => psm_get_lang('log', 'sms'), - 'label_pushover' => psm_get_lang('log', 'pushover'), - 'label_telegram' => psm_get_lang('log', 'telegram'), - 'label_title' => psm_get_lang('log', 'title'), - 'label_server' => psm_get_lang('servers', 'server'), - 'label_type' => psm_get_lang('log', 'type'), - 'label_message' => psm_get_lang('system', 'message'), - 'label_date' => psm_get_lang('system', 'date'), - 'label_users' => ucfirst(psm_get_lang('menu', 'user')), - 'label_no_logs' => psm_get_lang('log', 'no_logs'), - 'tabs' => array(), - ); + /** + * Prepare the template with a list of all log entries + */ + protected function executeIndex() + { + $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server_log')); + $tpl_data = array( + 'label_status' => psm_get_lang('log', 'status'), + 'label_email' => psm_get_lang('log', 'email'), + 'label_sms' => psm_get_lang('log', 'sms'), + 'label_pushover' => psm_get_lang('log', 'pushover'), + 'label_telegram' => psm_get_lang('log', 'telegram'), + 'label_jabber' => psm_get_lang('log', 'jabber'), + 'label_title' => psm_get_lang('log', 'title'), + 'label_server' => psm_get_lang('servers', 'server'), + 'label_type' => psm_get_lang('log', 'type'), + 'label_message' => psm_get_lang('system', 'message'), + 'label_date' => psm_get_lang('system', 'date'), + 'label_users' => ucfirst(psm_get_lang('menu', 'user')), + 'label_no_logs' => psm_get_lang('log', 'no_logs'), + 'tabs' => array(), + ); - $sidebar = new \psm\Util\Module\Sidebar($this->twig); - $this->setSidebar($sidebar); + $sidebar = new \psm\Util\Module\Sidebar($this->twig); + $this->setSidebar($sidebar); - if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { - $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('log', 'delete_title')); - $modal->setMessage(psm_get_lang('log', 'delete_message')); - $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); - - $sidebar->addButton( - 'clear_logn', - psm_get_lang('log', 'clear'), - psm_build_url(array('mod' => 'server_log', 'action' => 'delete')), - 'trash', - 'danger show-modal', - psm_get_lang('log', 'delete_title'), - 'delete' - ); - } + if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { + $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('log', 'delete_title')); + $modal->setMessage(psm_get_lang('log', 'delete_message')); + $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); + + $sidebar->addButton( + 'clear_logn', + psm_get_lang('log', 'clear'), + psm_build_url(array('mod' => 'server_log', 'action' => 'delete')), + 'trash', + 'danger show-modal', + psm_get_lang('log', 'delete_title'), + 'delete' + ); + } - $log_types = array('status', 'email', 'sms', 'pushover', 'telegram'); + $log_types = array('status', 'email', 'sms', 'pushover', 'telegram', 'jabber'); - foreach ($log_types as $key) { - $records = $this->getEntries($key); - $log_count = count($records); + foreach ($log_types as $key) { + $records = $this->getEntries($key); + $log_count = count($records); - $tab_data = array( - 'id' => $key, - 'label' => psm_get_lang('log', $key), - 'has_users' => ($key == 'status') ? false : true, - 'no_logs' => ($log_count == 0) ? true : false, - 'tab_active' => ($key == 'status') ? 'active' : '', - ); + $tab_data = array( + 'id' => $key, + 'label' => psm_get_lang('log', $key), + 'has_users' => ($key == 'status') ? false : true, + 'no_logs' => ($log_count == 0) ? true : false, + 'tab_active' => ($key == 'status') ? 'active' : '', + ); - for ($x = 0; $x < $log_count; $x++) { - $record = &$records[$x]; - $record['users'] = ''; - if($key == 'status'){ - $record['server'] = $record['label']; - $record['type_icon'] = ($record['server_type'] == 'website') ? 'globe-americas' : 'cogs'; - $record['type_title'] = psm_get_lang('servers', 'type_'.$record['server_type']); - $ip = '('.$record['ip']; - if (!empty($record['port']) && (($record['server_type'] != 'website') || ($record['port'] != 80))) { - $ip .= ':'.$record['port']; - } - $ip .= ')'; - $record['ip'] = $ip; - } - $record['datetime_format'] = psm_date($record['datetime']); + for ($x = 0; $x < $log_count; $x++) { + $record = &$records[$x]; + $record['users'] = ''; + if ($key == 'status') { + $record['server'] = $record['label']; + $record['type_icon'] = ($record['server_type'] == 'website') ? 'globe-americas' : 'cogs'; + $record['type_title'] = psm_get_lang('servers', 'type_' . $record['server_type']); + $ip = '(' . $record['ip']; + if (!empty($record['port']) && (($record['server_type'] != 'website') || ($record['port'] != 80))) { + $ip .= ':' . $record['port']; + } + $ip .= ')'; + $record['ip'] = $ip; + } + $record['datetime_format'] = psm_date($record['datetime']); - // fix up user list - $users = $this->getLogUsers($record['log_id']); - if (!empty($users)) { - $names = array(); - foreach ($users as $user) { - $names[] = $user['name']; - } - $record['users'] = implode('
    ', $names); - $record['user_list'] = implode(' • ', $names); - } - } - $tab_data['entries'] = $records; - $tpl_data['tabs'][] = $tab_data; - } - return $this->twig->render('module/server/log.tpl.html', $tpl_data); - } + // fix up user list + $users = $this->getLogUsers($record['log_id']); + if (!empty($users)) { + $names = array(); + foreach ($users as $user) { + $names[] = $user['name']; + } + $record['users'] = implode('
    ', $names); + $record['user_list'] = implode(' • ', $names); + } + } + $tab_data['entries'] = $records; + $tpl_data['tabs'][] = $tab_data; + } + return $this->twig->render('module/server/log.tpl.html', $tpl_data); + } - protected function executeDelete() { - /** - * Empty table log and log_users. - * Only when user is admin. - */ - if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { - $archiver = new \psm\Util\Server\Archiver\LogsArchiver($this->db); - $archiver->cleanupall(); - } - return $this->runAction('index'); - } + protected function executeDelete() + { + /** + * Empty table log and log_users. + * Only when user is admin. + */ + if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { + $archiver = new \psm\Util\Server\Archiver\LogsArchiver($this->db); + $archiver->cleanupall(); + } + return $this->runAction('index'); + } - /** - * Get all the log entries for a specific $type - * - * @param string $type status/email/sms - * @return \PDOStatement array - */ - public function getEntries($type) { - $sql_join = ''; - if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) { - // restrict by user_id - $sql_join = "JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( + /** + * Get all the log entries for a specific $type + * + * @param string $type status/email/sms + * @return \PDOStatement array + */ + public function getEntries($type) + { + $sql_join = ''; + if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) { + // restrict by user_id + $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( `us`.`user_id`={$this->getUser()->getUserId()} AND `us`.`server_id`=`servers`.`server_id` )"; - } - $entries = $this->db->query( - 'SELECT '. - '`servers`.`label`, '. - '`servers`.`ip`, '. - '`servers`.`port`, '. - '`servers`.`type` AS server_type, '. - '`log`.`log_id`, '. - '`log`.`type`, '. - '`log`.`message`, '. - '`log`.`datetime` '. - 'FROM `'.PSM_DB_PREFIX.'log` AS `log` '. - 'JOIN `'.PSM_DB_PREFIX.'servers` AS `servers` ON (`servers`.`server_id`=`log`.`server_id`) '. - $sql_join. - 'WHERE `log`.`type`=\''.$type.'\' '. - 'ORDER BY `datetime` DESC '. - 'LIMIT 0,20' - ); - return $entries; - } + } + $entries = $this->db->query( + 'SELECT ' . + '`servers`.`label`, ' . + '`servers`.`ip`, ' . + '`servers`.`port`, ' . + '`servers`.`type` AS server_type, ' . + '`log`.`log_id`, ' . + '`log`.`type`, ' . + '`log`.`message`, ' . + '`log`.`datetime` ' . + 'FROM `' . PSM_DB_PREFIX . 'log` AS `log` ' . + 'JOIN `' . PSM_DB_PREFIX . 'servers` AS `servers` ON (`servers`.`server_id`=`log`.`server_id`) ' . + $sql_join . + 'WHERE `log`.`type`=\'' . $type . '\' ' . + 'ORDER BY `datetime` DESC ' . + 'LIMIT 0,20' + ); + return $entries; + } - /** - * Get all the user entries for a specific $log_id - * - * @param $log_id - * @return \PDOStatement array - */ - protected function getLogUsers($log_id) { - return $this->db->query( - "SELECT + /** + * Get all the user entries for a specific $log_id + * + * @param $log_id + * @return \PDOStatement array + */ + protected function getLogUsers($log_id) + { + return $this->db->query( + "SELECT u.`user_id`, u.`name` - FROM `".PSM_DB_PREFIX."log_users` AS lu - LEFT JOIN `".PSM_DB_PREFIX."users` AS u ON lu.`user_id` = u.`user_id` - WHERE lu.`log_id` = ".(int) $log_id." + FROM `" . PSM_DB_PREFIX . "log_users` AS lu + LEFT JOIN `" . PSM_DB_PREFIX . "users` AS u ON lu.`user_id` = u.`user_id` + WHERE lu.`log_id` = " . (int) $log_id . " ORDER BY u.`name` ASC" - ); - } + ); + } } diff --git a/src/psm/Module/Server/Controller/ServerController.php b/src/psm/Module/Server/Controller/ServerController.php index b1a2f5dc..16f0860d 100644 --- a/src/psm/Module/Server/Controller/ServerController.php +++ b/src/psm/Module/Server/Controller/ServerController.php @@ -1,4 +1,5 @@ server_id = isset($_GET['id']) ? intval($_GET['id']) : 0; + $this->server_id = isset($_GET['id']) ? intval($_GET['id']) : 0; - $this->setCSRFKey('server'); - $this->setActions(array( - 'index', 'edit', 'save', 'delete', 'view', - ), 'index'); + $this->setCSRFKey('server'); + $this->setActions(array( + 'index', 'edit', 'save', 'delete', 'view', + ), 'index'); - // make sure only admins are allowed to edit/delete servers: - $this->setMinUserLevelRequiredForAction(PSM_USER_ADMIN, array( - 'delete', 'edit', 'save' - )); - $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server')); - } + // make sure only admins are allowed to edit/delete servers: + $this->setMinUserLevelRequiredForAction(PSM_USER_ADMIN, array( + 'delete', 'edit', 'save' + )); + $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server')); + } - /** - * Prepare the template to show a list of all servers - */ - protected function executeIndex() { - $tpl_data = $this->getLabels(); - $tpl_data['user_level'] = $this->getUser()->getUserLevel(); - $sidebar = new \psm\Util\Module\Sidebar($this->twig); - $this->setSidebar($sidebar); + /** + * Prepare the template to show a list of all servers + */ + protected function executeIndex() + { + $tpl_data = $this->getLabels(); + $tpl_data['user_level'] = $this->getUser()->getUserLevel(); + $sidebar = new \psm\Util\Module\Sidebar($this->twig); + $this->setSidebar($sidebar); - // check if user is admin, in that case we add the buttons - if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { - $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('servers', 'delete_title')); - $modal->setMessage(psm_get_lang('servers', 'delete_message')); - $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); + // check if user is admin, in that case we add the buttons + if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { + $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('servers', 'delete_title')); + $modal->setMessage(psm_get_lang('servers', 'delete_message')); + $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); - $sidebar->addButton( - 'add_new', - psm_get_lang('system', 'add_new'), - psm_build_url(array('mod' => 'server', 'action' => 'edit')), - 'plus', - 'success', - psm_get_lang('system', 'add_new') - ); - } + $sidebar->addButton( + 'add_new', + psm_get_lang('system', 'add_new'), + psm_build_url(array('mod' => 'server', 'action' => 'edit')), + 'plus', + 'success', + psm_get_lang('system', 'add_new') + ); + } - $sidebar->addButton( - 'update', - psm_get_lang('menu', 'server_update'), - psm_build_url(array('mod' => 'server_update')), - 'sync-alt', - 'primary', - psm_get_lang('menu', 'server_update') - ); + $sidebar->addButton( + 'update', + psm_get_lang('menu', 'server_update'), + psm_build_url(array('mod' => 'server_update')), + 'sync-alt', + 'primary', + psm_get_lang('menu', 'server_update') + ); - $icons = array( - 'email' => 'icon-envelope', - 'sms' => 'icon-mobile', - 'pushover' => 'icon-pushover', - 'telegram' => 'icon-telegram', - ); + $icons = array( + 'email' => 'icon-envelope', + 'sms' => 'icon-mobile', + 'pushover' => 'icon-pushover', + 'telegram' => 'icon-telegram', + 'jabber' => 'icon-jabber' + ); - $servers = $this->getServers(); - $server_count = count($servers); + $servers = $this->getServers(); + $server_count = count($servers); - for ($x = 0; $x < $server_count; $x++) { - if ($servers[$x]['type'] == 'website') { - // add link to label - $ip = $servers[$x]['ip']; - $servers[$x]['ip'] = ''.$ip.''; - } - if (($servers[$x]['active'] == 'yes')) { - $servers[$x]['active_title'] = psm_get_lang('servers', 'monitoring'); - } else { - $servers[$x]['active_title'] = psm_get_lang('servers', 'no_monitoring'); - } + for ($x = 0; $x < $server_count; $x++) { + if ($servers[$x]['type'] == 'website') { + // add link to label + $ip = $servers[$x]['ip']; + $servers[$x]['ip'] = '' . $ip . ''; + } + if ($servers[$x]['type'] == 'ping') { + $servers[$x]['port'] = ''; + } + if (($servers[$x]['active'] == 'yes')) { + $servers[$x]['active_title'] = psm_get_lang('servers', 'monitoring'); + } else { + $servers[$x]['active_title'] = psm_get_lang('servers', 'no_monitoring'); + } - $servers[$x] = $this->formatServer($servers[$x]); - } - $tpl_data['servers'] = $servers; - return $this->twig->render('module/server/server/list.tpl.html', $tpl_data); - } + $servers[$x] = $this->formatServer($servers[$x]); + } + $tpl_data['servers'] = $servers; - /** - * Prepare the template to show the update screen for a single server - */ - protected function executeEdit() { - $back_to = isset($_GET['back_to']) ? $_GET['back_to'] : ''; + $tpl_data['config']['email'] = psm_get_conf('email_status'); + $tpl_data['config']['sms'] = psm_get_conf('sms_status'); + $tpl_data['config']['pushover'] = psm_get_conf('pushover_status'); + $tpl_data['config']['telegram'] = psm_get_conf('telegram_status'); - $tpl_data = $this->getLabels(); - $tpl_data['edit_server_id'] = $this->server_id; - $tpl_data['url_save'] = psm_build_url(array( - 'mod' => 'server', - 'action' => 'save', - 'id' => $this->server_id, - 'back_to' => $back_to, - )); + return $this->twig->render('module/server/server/list.tpl.html', $tpl_data); + } - // depending on where the user came from, add the go back url: - if ($back_to == 'view' && $this->server_id > 0) { - $tpl_data['url_go_back'] = psm_build_url(array('mod' => 'server', 'action' => 'view', 'id' => $this->server_id)); - } else { - $tpl_data['url_go_back'] = psm_build_url(array('mod' => 'server')); - } + /** + * Prepare the template to show the update screen for a single server + */ + protected function executeEdit() + { + $back_to = isset($_GET['back_to']) ? $_GET['back_to'] : ''; - $tpl_data['users'] = $this->db->select(PSM_DB_PREFIX.'users', null, array('user_id', 'name'), '', 'name'); + $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('servers', 'delete_title')); + $modal->setMessage(psm_get_lang('servers', 'delete_message')); + $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); - switch ($this->server_id) { - case 0: - // insert mode - $tpl_data['titlemode'] = psm_get_lang('system', 'insert'); - $tpl_data['edit_value_warning_threshold'] = '1'; + $tpl_data = $this->getLabels(); + $tpl_data['edit_server_id'] = $this->server_id; + $tpl_data['url_save'] = psm_build_url(array( + 'mod' => 'server', + 'action' => 'save', + 'id' => $this->server_id, + 'back_to' => $back_to, + )); + $tpl_data['url_delete'] = psm_build_url(array( + 'mod' => 'server', + 'action' => 'delete', + 'id' => $this->server_id, + )); - $edit_server = $_POST; - break; - default: - // edit mode - // get server entry - $edit_server = $this->getServers($this->server_id); - if (empty($edit_server)) { - $this->addMessage(psm_get_lang('servers', 'error_server_no_match'), 'error'); - return $this->runAction('index'); - } - $tpl_data['titlemode'] = psm_get_lang('system', 'edit').' '.$edit_server['label']; + // depending on where the user came from, add the go back url: + if ($back_to == 'view' && $this->server_id > 0) { + $tpl_data['url_go_back'] = psm_build_url( + array('mod' => 'server', 'action' => 'view', 'id' => $this->server_id) + ); + } else { + $tpl_data['url_go_back'] = psm_build_url(array('mod' => 'server')); + } - $user_idc_selected = $this->getServerUsers($this->server_id); - foreach ($tpl_data['users'] as &$user) { - $user['id'] = $user['user_id']; - unset($user['user_id']); - $user['label'] = $user['name']; - unset($user['name']); - if (in_array($user['id'], $user_idc_selected)) { - $user['edit_selected'] = 'selected="selected"'; - } - } + $tpl_data['users'] = $this->db->select(PSM_DB_PREFIX . 'users', null, array('user_id', 'name'), '', 'name'); - break; - } + switch ($this->server_id) { + case 0: + // insert mode + $tpl_data['titlemode'] = psm_get_lang('system', 'insert'); + $tpl_data['edit_value_warning_threshold'] = '1'; - if (!empty($edit_server)) { - // attempt to prefill previously posted fields - foreach ($edit_server as $key => $value) { - $edit_server[$key] = psm_POST($key, $value); - } + $edit_server = $_POST; + break; + default: + // edit mode + // get server entry + $edit_server = $this->getServers($this->server_id); + if (empty($edit_server)) { + $this->addMessage(psm_get_lang('servers', 'error_server_no_match'), 'error'); + return $this->runAction('index'); + } + $tpl_data['titlemode'] = psm_get_lang('system', 'edit') . ' ' . $edit_server['label']; - $tpl_data = array_merge($tpl_data, array( - 'edit_value_label' => $edit_server['label'], - 'edit_value_ip' => $edit_server['ip'], - 'edit_value_port' => $edit_server['port'], - 'edit_value_request_method' => $edit_server['request_method'], - 'edit_value_post_field' => $edit_server['post_field'], - 'edit_value_timeout' => $edit_server['timeout'], - 'edit_value_pattern' => $edit_server['pattern'], - 'edit_pattern_selected_'.$edit_server['pattern_online'] => 'selected="selected"', - 'edit_redirect_check_selected_'.$edit_server['redirect_check'] => 'selected="selected"', - 'edit_value_allow_http_status' => $edit_server['allow_http_status'], - 'edit_value_header_name' => $edit_server['header_name'], - 'edit_value_header_value' => $edit_server['header_value'], - 'edit_value_warning_threshold' => $edit_server['warning_threshold'], - 'edit_website_username' => $edit_server['website_username'], - 'edit_website_password' => empty($edit_server['website_password']) ? '' : sha1($edit_server['website_password']), - 'edit_type_selected_'.$edit_server['type'] => 'selected="selected"', - 'edit_active_selected' => $edit_server['active'], - 'edit_email_selected' => $edit_server['email'], - 'edit_sms_selected' => $edit_server['sms'], - 'edit_pushover_selected' => $edit_server['pushover'], - 'edit_telegram_selected' => $edit_server['telegram'], - )); - } + $user_idc_selected = $this->getServerUsers($this->server_id); + foreach ($tpl_data['users'] as &$user) { + $user['id'] = $user['user_id']; + unset($user['user_id']); + $user['label'] = $user['name']; + unset($user['name']); + if (in_array($user['id'], $user_idc_selected)) { + $user['edit_selected'] = 'selected="selected"'; + } + } - $notifications = array('email', 'sms', 'pushover', 'telegram'); - foreach ($notifications as $notification) { - if (psm_get_conf($notification.'_status') == 0) { - $tpl_data['warning_'.$notification] = true; - $tpl_data['label_warning_'.$notification] = psm_get_lang( - 'servers', 'warning_notifications_disabled_'.$notification - ); - } else { - $tpl_data['warning_'.$notification] = false; - } - } + break; + } - return $this->twig->render('module/server/server/update.tpl.html', $tpl_data); - } + if (!empty($edit_server)) { + // attempt to prefill previously posted fields + foreach ($edit_server as $key => $value) { + $edit_server[$key] = psm_POST($key, $value); + } - /** - * Executes the saving of one of the servers - */ - protected function executeSave() { - if (empty($_POST)) { - // dont process anything if no data has been posted - return $this->executeIndex(); - } + $tpl_data = array_merge($tpl_data, array( + 'edit_value_label' => $edit_server['label'], + 'edit_value_ip' => $edit_server['ip'], + 'edit_value_port' => $edit_server['port'], + 'edit_value_request_method' => $edit_server['request_method'], + 'edit_value_post_field' => $edit_server['post_field'], + 'edit_value_timeout' => $edit_server['timeout'], + 'edit_value_pattern' => $edit_server['pattern'], + 'edit_pattern_selected_' . $edit_server['pattern_online'] => 'selected="selected"', + 'edit_redirect_check_selected_' . $edit_server['redirect_check'] => 'selected="selected"', + 'edit_value_allow_http_status' => $edit_server['allow_http_status'], + 'edit_value_header_name' => $edit_server['header_name'], + 'edit_value_header_value' => $edit_server['header_value'], + 'edit_value_warning_threshold' => $edit_server['warning_threshold'], + 'edit_value_website_username' => $edit_server['website_username'], + 'edit_value_website_password' => empty($edit_server['website_password']) ? '' : + sha1($edit_server['website_password']), + 'edit_value_ssl_cert_expiry_days' => $edit_server['ssl_cert_expiry_days'], + 'edit_type_selected_' . $edit_server['type'] => 'selected="selected"', + 'edit_active_selected' => $edit_server['active'], + 'edit_email_selected' => $edit_server['email'], + 'edit_sms_selected' => $edit_server['sms'], + 'edit_pushover_selected' => $edit_server['pushover'], + 'edit_telegram_selected' => $edit_server['telegram'], + 'edit_jabber_selected' => $edit_server['jabber'], + )); + } - // We need the server id to encrypt the password. Encryption will be done after the server is added - $encrypted_password = ''; - - if (!empty($_POST['website_password'])) { - $new_password = psm_POST('website_password'); + $notifications = array('email', 'sms', 'pushover', 'telegram', 'jabber'); + foreach ($notifications as $notification) { + if (psm_get_conf($notification . '_status') == 0) { + $tpl_data['warning_' . $notification] = true; + $tpl_data['label_warning_' . $notification] = psm_get_lang( + 'servers', + 'warning_notifications_disabled_' . $notification + ); + } else { + $tpl_data['warning_' . $notification] = false; + } + } - if ($this->server_id > 0) { - $edit_server = $this->getServers($this->server_id); - $hash = sha1($edit_server['website_password']); + return $this->twig->render('module/server/server/update.tpl.html', $tpl_data); + } - if ($new_password == $hash) { - $encrypted_password = $edit_server['website_password']; - } else { - $encrypted_password = psm_password_encrypt(strval($this->server_id).psm_get_conf('password_encrypt_key'), $new_password); - } - } - } + /** + * Executes the saving of one of the servers + */ + protected function executeSave() + { + if (empty($_POST)) { + // dont process anything if no data has been posted + return $this->executeIndex(); + } - $clean = array( - 'label' => trim(strip_tags(psm_POST('label', ''))), - 'ip' => trim(strip_tags(psm_POST('ip', ''))), - 'timeout' => (isset($_POST['timeout']) && intval($_POST['timeout']) > 0) ? intval($_POST['timeout']) : null, - 'website_username' => psm_POST('website_username'), - 'website_password' => $encrypted_password, - 'port' => intval(psm_POST('port', 0)), - 'request_method' => empty(psm_POST('request_method')) ? null : psm_POST('request_method'), - 'post_field' => empty(psm_POST('post_field')) ? null : psm_POST('post_field'), - 'type' => psm_POST('type', ''), - 'pattern' => psm_POST('pattern', ''), - 'pattern_online' => in_array($_POST['pattern_online'], array('yes', 'no')) ? $_POST['pattern_online'] : 'yes', - 'redirect_check' => in_array($_POST['redirect_check'], array('ok', 'bad')) ? $_POST['redirect_check'] : 'bad', - 'allow_http_status' => psm_POST('allow_http_status', ''), - 'header_name' => psm_POST('header_name', ''), - 'header_value' => psm_POST('header_value', ''), - 'warning_threshold' => intval(psm_POST('warning_threshold', 0)), - 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', - 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', - 'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no', - 'pushover' => in_array($_POST['pushover'], array('yes', 'no')) ? $_POST['pushover'] : 'no', - 'telegram' => in_array($_POST['telegram'], array('yes', 'no')) ? $_POST['telegram'] : 'no', - ); - // make sure websites start with http:// - if ($clean['type'] == 'website' && substr($clean['ip'], 0, 4) != 'http' && substr($clean['ip'], 0, 3) != 'rdp') { - $clean['ip'] = 'http://'.$clean['ip']; - } + // We need the server id to encrypt the password. Encryption will be done after the server is added + $encrypted_password = ''; + + if (!empty($_POST['website_password'])) { + $new_password = psm_POST('website_password'); - if($clean['request_method'] == null) { + if ($this->server_id > 0) { + $edit_server = $this->getServers($this->server_id); + $hash = sha1($edit_server['website_password']); + + if ($new_password == $hash) { + $encrypted_password = $edit_server['website_password']; + } else { + $encrypted_password = psm_password_encrypt(strval($this->server_id) . + psm_get_conf('password_encrypt_key'), $new_password); + } + } + } + + $clean = array( + 'label' => trim(strip_tags(psm_POST('label', ''))), + 'ip' => trim(strip_tags(psm_POST('ip', ''))), + 'timeout' => (isset($_POST['timeout']) && intval($_POST['timeout']) > 0) ? intval($_POST['timeout']) : 10, + 'website_username' => psm_POST('website_username'), + 'website_password' => $encrypted_password, + 'port' => intval(psm_POST('port', 0)), + 'request_method' => empty(psm_POST('request_method')) ? null : psm_POST('request_method'), + 'post_field' => empty(psm_POST('post_field')) ? null : psm_POST('post_field'), + 'type' => psm_POST('type', ''), + 'pattern' => psm_POST('pattern', ''), + 'pattern_online' => in_array($_POST['pattern_online'], array('yes', 'no')) ? + $_POST['pattern_online'] : 'yes', + 'redirect_check' => in_array($_POST['redirect_check'], array('ok', 'bad')) ? + $_POST['redirect_check'] : 'bad', + 'allow_http_status' => psm_POST('allow_http_status', ''), + 'header_name' => psm_POST('header_name', ''), + 'header_value' => psm_POST('header_value', ''), + 'warning_threshold' => intval(psm_POST('warning_threshold', 0)), + 'ssl_cert_expiry_days' => intval(psm_POST('ssl_cert_expiry_days', 1)), + 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', + 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', + 'sms' => in_array($_POST['sms'], array('yes', 'no')) ? $_POST['sms'] : 'no', + 'pushover' => in_array($_POST['pushover'], array('yes', 'no')) ? $_POST['pushover'] : 'no', + 'telegram' => in_array($_POST['telegram'], array('yes', 'no')) ? $_POST['telegram'] : 'no', + 'jabber' => in_array($_POST['jabber'], array('yes', 'no')) ? $_POST['jabber'] : 'no', + ); + // make sure websites start with http:// + if ( + $clean['type'] == 'website' && + substr($clean['ip'], 0, 4) != 'http' && + substr($clean['ip'], 0, 3) != 'rdp' + ) { + $clean['ip'] = 'http://' . $clean['ip']; + } + + if ($clean['request_method'] == null) { $clean['post_field'] = null; } - // validate the lot - $server_validator = new \psm\Util\Server\ServerValidator($this->db); + // validate the lot + $server_validator = new \psm\Util\Server\ServerValidator($this->db); - // format port from http, https or rdp url - if ($clean['type'] == 'website') { - $tmp = parse_url($clean["ip"]); - if (isset($tmp["port"])) { - $clean["port"] = $tmp["port"]; - } elseif ($tmp["scheme"] === "https") { - $clean["port"] = 443; - } elseif ($tmp["scheme"] === "http") { - $clean["port"] = 80; - } elseif ($tmp["scheme"] === "rdp") { - $clean["port"] = 3389; - } - } + // format port from http, https or rdp url + if ($clean['type'] == 'website') { + $tmp = parse_url($clean["ip"]); + if (isset($tmp["port"])) { + $clean["port"] = $tmp["port"]; + } elseif ($tmp["scheme"] === "https") { + $clean["port"] = 443; + } elseif ($tmp["scheme"] === "http") { + $clean["port"] = 80; + } elseif ($tmp["scheme"] === "rdp") { + $clean["port"] = 3389; + } + } - try { - if ($this->server_id > 0) { - $server_validator->serverId($this->server_id); - } - $server_validator->label($clean['label']); - $server_validator->type($clean['type']); - $server_validator->ip($clean['ip'], $clean['type']); - $server_validator->warningThreshold($clean['warning_threshold']); - } catch (\InvalidArgumentException $ex) { - $this->addMessage(psm_get_lang('servers', 'error_'.$ex->getMessage()), 'error'); - return $this->executeEdit(); - } + try { + if ($this->server_id > 0) { + $server_validator->serverId($this->server_id); + } + $server_validator->label($clean['label']); + $server_validator->type($clean['type']); + $server_validator->ip($clean['ip'], $clean['type']); + $server_validator->warningThreshold($clean['warning_threshold']); + $server_validator->sslCertExpiryDays($clean['ssl_cert_expiry_days']); + } catch (\InvalidArgumentException $ex) { + $this->addMessage(psm_get_lang('servers', 'error_' . $ex->getMessage()), 'error'); + return $this->executeEdit(); + } - // check for edit or add - if ($this->server_id > 0) { - // edit - $this->db->save( - PSM_DB_PREFIX.'servers', - $clean, - array('server_id' => $this->server_id) - ); - $this->addMessage(psm_get_lang('servers', 'updated'), 'success'); - } else { - // add - $clean['status'] = 'on'; - $this->server_id = $this->db->save(PSM_DB_PREFIX.'servers', $clean); + // check for edit or add + if ($this->server_id > 0) { + // edit + $this->db->save( + PSM_DB_PREFIX . 'servers', + $clean, + array('server_id' => $this->server_id) + ); + $this->addMessage(psm_get_lang('servers', 'updated'), 'success'); + } else { + // add + $clean['status'] = 'on'; + $this->server_id = $this->db->save(PSM_DB_PREFIX . 'servers', $clean); - // server has been added, re-encrypt - if (!empty($_POST['website_password'])) { - $cleanWebsitePassword = array( - 'website_password' => psm_password_encrypt( - strval($this->server_id).psm_get_conf('password_encrypt_key'), - psm_POST('website_password') - ), - ); + // server has been added, re-encrypt + if (!empty($_POST['website_password'])) { + $cleanWebsitePassword = array( + 'website_password' => psm_password_encrypt( + strval($this->server_id) . psm_get_conf('password_encrypt_key'), + psm_POST('website_password') + ), + ); - $this->db->save( - PSM_DB_PREFIX.'servers', - $cleanWebsitePassword, - array('server_id' => $this->server_id) - ); - } + $this->db->save( + PSM_DB_PREFIX . 'servers', + $cleanWebsitePassword, + array('server_id' => $this->server_id) + ); + } - $this->addMessage(psm_get_lang('servers', 'inserted'), 'success'); - } + $this->addMessage(psm_get_lang('servers', 'inserted'), 'success'); + } - // update users - $user_idc = psm_POST('user_id', array()); - $user_idc_save = array(); + // update users + $user_idc = psm_POST('user_id', array()); + $user_idc_save = array(); - foreach ($user_idc as $user_id) { - $user_idc_save[] = array( - 'user_id' => intval($user_id), - 'server_id' => intval($this->server_id), - ); - } - $this->db->delete(PSM_DB_PREFIX.'users_servers', array('server_id' => $this->server_id)); - if (!empty($user_idc_save)) { - // add all new users - $this->db->insertMultiple(PSM_DB_PREFIX.'users_servers', $user_idc_save); - } + foreach ($user_idc as $user_id) { + $user_idc_save[] = array( + 'user_id' => intval($user_id), + 'server_id' => intval($this->server_id), + ); + } + $this->db->delete(PSM_DB_PREFIX . 'users_servers', array('server_id' => $this->server_id)); + if (!empty($user_idc_save)) { + // add all new users + $this->db->insertMultiple(PSM_DB_PREFIX . 'users_servers', $user_idc_save); + } - $back_to = isset($_GET['back_to']) ? $_GET['back_to'] : 'index'; - if ($back_to == 'view') { - return $this->runAction('view'); - } else { - return $this->runAction('index'); - } - } + $back_to = isset($_GET['back_to']) ? $_GET['back_to'] : 'index'; + if ($back_to == 'view') { + return $this->runAction('view'); + } else { + return $this->runAction('index'); + } + } - /** - * Executes the deletion of one of the servers - */ - protected function executeDelete() { - if (isset($_GET['id'])) { - $id = intval($_GET['id']); - // do delete - $res = $this->db->delete(PSM_DB_PREFIX.'servers', array('server_id' => $id)); + /** + * Executes the deletion of one of the servers + */ + protected function executeDelete() + { + if (isset($_GET['id'])) { + $id = intval($_GET['id']); + // do delete + $res = $this->db->delete(PSM_DB_PREFIX . 'servers', array('server_id' => $id)); - if ($res === 1) { - $this->db->delete(PSM_DB_PREFIX.'log', array('server_id' => $id)); - $this->db->delete(PSM_DB_PREFIX.'users_servers', array('server_id' => $id)); - $this->db->delete(PSM_DB_PREFIX.'servers_uptime', array('server_id' => $id)); - $this->db->delete(PSM_DB_PREFIX.'servers_history', array('server_id' => $id)); - } - $this->addMessage(psm_get_lang('servers', 'deleted'), 'success'); - } - return $this->runAction('index'); - } + if ($res === 1) { + $this->db->delete(PSM_DB_PREFIX . 'log', array('server_id' => $id)); + $this->db->delete(PSM_DB_PREFIX . 'users_servers', array('server_id' => $id)); + $this->db->delete(PSM_DB_PREFIX . 'servers_uptime', array('server_id' => $id)); + $this->db->delete(PSM_DB_PREFIX . 'servers_history', array('server_id' => $id)); + } + $this->addMessage(psm_get_lang('servers', 'deleted'), 'success'); + } + return $this->runAction('index'); + } - /** - * Prepare the view template - */ - protected function executeView() { - if ($this->server_id == 0) { - return $this->runAction('index'); - } - $server = $this->getServers($this->server_id); + /** + * Prepare the view template + */ + protected function executeView() + { + if ($this->server_id == 0) { + return $this->runAction('index'); + } + $server = $this->getServers($this->server_id); - if (empty($server)) { - return $this->runAction('index'); - } + if (empty($server)) { + return $this->runAction('index'); + } - $tpl_data = $this->getLabels(); - $tpl_data = array_merge($tpl_data, $this->formatServer($server)); + $tpl_data = $this->getLabels(); + $tpl_data = array_merge($tpl_data, $this->formatServer($server)); - // create history HTML - $history = new \psm\Util\Server\HistoryGraph($this->db, $this->twig); - $tpl_data['html_history'] = $history->createHTML($this->server_id); + // create history HTML + $history = new \psm\Util\Server\HistoryGraph($this->db, $this->twig); + $tpl_data['html_history'] = $history->createHTML($this->server_id); - $sidebar = new \psm\Util\Module\Sidebar($this->twig); - $this->setSidebar($sidebar); + $sidebar = new \psm\Util\Module\Sidebar($this->twig); + $this->setSidebar($sidebar); - // check which module the user came from, and add a link accordingly - $back_to = isset($_GET['back_to']) && ($_GET['back_to'] == 'server_status' || $_GET['back_to'] == 'user') ? $_GET['back_to'] : 'server'; - $sidebar->addButton( - 'go_back', - psm_get_lang('system', 'go_back'), - psm_build_url(array('mod' => $back_to)), - 'angle-left', - 'link', - psm_get_lang('system', 'go_back') - ); + // check which module the user came from, and add a link accordingly + $back_to = isset($_GET['back_to']) && ($_GET['back_to'] == 'server_status' || $_GET['back_to'] == 'user') ? + $_GET['back_to'] : 'server'; + $sidebar->addButton( + 'go_back', + psm_get_lang('system', 'go_back'), + psm_build_url(array('mod' => $back_to)), + 'angle-left', + 'link', + psm_get_lang('system', 'go_back') + ); - // add edit/delete buttons for admins - if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { - $tpl_data['has_admin_actions'] = true; - $tpl_data['url_edit'] = psm_build_url(array('mod' => 'server', 'action' => 'edit', 'id' => $this->server_id, 'back_to' => 'view')); + // add edit/delete buttons for admins + if ($this->getUser()->getUserLevel() == PSM_USER_ADMIN) { + $tpl_data['has_admin_actions'] = true; + $tpl_data['url_edit'] = psm_build_url( + array('mod' => 'server', 'action' => 'edit', 'id' => $this->server_id, 'back_to' => 'view') + ); - $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('servers', 'delete_title')); - $modal->setMessage(psm_get_lang('servers', 'delete_message')); - $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); + $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('servers', 'delete_title')); + $modal->setMessage(psm_get_lang('servers', 'delete_message')); + $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); - $sidebar->addButton( - 'edit', - psm_get_lang('system', 'edit'), - psm_build_url(array('mod' => 'server', 'action' => 'edit', 'id' => $this->server_id, 'back_to' => 'view')), - 'edit', - 'primary', - psm_get_lang('system', 'edit') - ); - } + $sidebar->addButton( + 'edit', + psm_get_lang('system', 'edit'), + psm_build_url( + array('mod' => 'server', 'action' => 'edit', 'id' => $this->server_id, 'back_to' => 'view') + ), + 'edit', + 'primary', + psm_get_lang('system', 'edit') + ); + } - // add all available servers to the menu - $servers = $this->getServers(); - $tpl_data['options'] = array(); - foreach ($servers as $i => $server_available) { - $tpl_data['options'][] = array( - 'class_active' => ($server_available['server_id'] == $this->server_id) ? 'active' : '', - 'url' => psm_build_url(array('mod' => 'server', 'action' => 'view', 'id' => $server_available['server_id'])), - 'label' => $server_available['label'], - ); - } + // add all available servers to the menu + $servers = $this->getServers(); + $tpl_data['options'] = array(); + foreach ($servers as $i => $server_available) { + $tpl_data['options'][] = array( + 'class_active' => ($server_available['server_id'] == $this->server_id) ? 'active' : '', + 'url' => psm_build_url( + array('mod' => 'server', 'action' => 'view', 'id' => $server_available['server_id']) + ), + 'label' => $server_available['label'], + ); + } - $tpl_data['last_output_truncated'] = $tpl_data['last_output']; - $tpl_data['last_error_output_truncated'] = $tpl_data['last_error_output']; + $tpl_data['last_output_truncated'] = $tpl_data['last_output']; + $tpl_data['last_error_output_truncated'] = $tpl_data['last_error_output']; - if (strlen($tpl_data['last_output']) > 255) { - $tpl_data['last_output_truncated'] = substr($tpl_data['last_output'], 0, 255) . '...'; - } + if (strlen($tpl_data['last_output']) > 255) { + $tpl_data['last_output_truncated'] = substr($tpl_data['last_output'], 0, 255) . '...'; + } - if (strlen($tpl_data['last_error_output']) > 255) { - $tpl_data['last_error_output_truncated'] = substr($tpl_data['last_error_output'], 0, 255) . '...'; - } + if (strlen($tpl_data['last_error_output']) > 255) { + $tpl_data['last_error_output_truncated'] = substr($tpl_data['last_error_output'], 0, 255) . '...'; + } - return $this->twig->render('module/server/server/view.tpl.html', $tpl_data); - } + return $this->twig->render('module/server/server/view.tpl.html', $tpl_data); + } - protected function getLabels() { - return array( - 'label_label' => psm_get_lang('servers', 'label'), - 'label_status' => psm_get_lang('servers', 'status'), - 'label_domain' => psm_get_lang('servers', 'domain'), - 'label_timeout' => psm_get_lang('servers', 'timeout'), - 'label_timeout_description' => psm_get_lang('servers', 'timeout_description'), - 'label_authentication_settings' => psm_get_lang('servers', 'authentication_settings'), - 'label_optional' => psm_get_lang('servers', 'optional'), - 'label_website_username' => psm_get_lang('servers', 'website_username'), - 'label_website_username_description' => psm_get_lang('servers', 'website_username_description'), - 'label_website_password' => psm_get_lang('servers', 'website_password'), - 'label_website_password_description' => psm_get_lang('servers', 'website_password_description'), - 'label_fieldset_monitoring' => psm_get_lang('servers', 'fieldset_monitoring'), - 'label_fieldset_permissions' => psm_get_lang('servers', 'fieldset_permissions'), - 'label_permissions' => psm_get_lang('servers', 'permissions'), - 'label_port' => psm_get_lang('servers', 'port'), - 'label_custom_port' => psm_get_lang('servers', 'custom_port'), - 'label_popular_ports' => psm_get_lang('servers', 'popular_ports'), - 'label_request_method' => psm_get_lang('servers', 'request_method'), - 'label_custom_request_method' => psm_get_lang('servers', 'custom_request_method'), - 'label_popular_request_methods' => psm_get_lang('servers', 'popular_request_methods'), - 'label_post_field' => psm_get_lang('servers', 'post_field'), - 'label_post_field_description' => psm_get_lang('servers', 'post_field_description'), - 'label_none' => psm_get_lang('system', 'none'), - 'label_please_select' => psm_get_lang('servers', 'please_select'), - 'label_type' => psm_get_lang('servers', 'type'), - 'label_website' => psm_get_lang('servers', 'type_website'), - 'label_service' => psm_get_lang('servers', 'type_service'), - 'label_ping' => psm_get_lang('servers', 'type_ping'), - 'label_pattern' => psm_get_lang('servers', 'pattern'), - 'label_pattern_description' => psm_get_lang('servers', 'pattern_description'), - 'label_pattern_online' => psm_get_lang('servers', 'pattern_online'), - 'label_pattern_online_description' => psm_get_lang('servers', 'pattern_online_description'), - 'label_redirect_check' => psm_get_lang('servers', 'redirect_check'), - 'label_redirect_check_description' => psm_get_lang('servers', 'redirect_check_description'), - 'label_allow_http_status' => psm_get_lang('servers', 'allow_http_status'), - 'label_allow_http_status_description' => psm_get_lang('servers', 'allow_http_status_description'), - 'label_header_name' => psm_get_lang('servers', 'header_name'), - 'label_header_value' => psm_get_lang('servers', 'header_value'), - 'label_header_name_description' => psm_get_lang('servers', 'header_name_description'), - 'label_header_value_description' => psm_get_lang('servers', 'header_value_description'), - 'label_last_check' => psm_get_lang('servers', 'last_check'), - 'label_rtime' => psm_get_lang('servers', 'latency'), - 'label_last_online' => psm_get_lang('servers', 'last_online'), - 'label_last_offline' => psm_get_lang('servers', 'last_offline'), - 'label_last_output' => psm_get_lang('servers', 'last_output'), - 'label_last_error' => psm_get_lang('servers', 'last_error'), - 'label_last_error_output' => psm_get_lang('servers', 'last_error_output'), - 'label_monitoring' => psm_get_lang('servers', 'monitoring'), - 'label_email' => psm_get_lang('servers', 'email'), - 'label_send_email' => psm_get_lang('servers', 'send_email'), - 'label_sms' => psm_get_lang('servers', 'sms'), - 'label_send_sms' => psm_get_lang('servers', 'send_sms'), - 'label_send_pushover' => psm_get_lang('servers', 'send_pushover'), - 'label_telegram' => psm_get_lang('servers', 'telegram'), - 'label_pushover' => psm_get_lang('servers', 'pushover'), - 'label_send_telegram' => psm_get_lang('servers', 'send_telegram'), - 'label_users' => psm_get_lang('servers', 'users'), - 'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'), - 'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'), - 'label_action' => psm_get_lang('system', 'action'), - 'label_save' => psm_get_lang('system', 'save'), - 'label_go_back' => psm_get_lang('system', 'go_back'), - 'label_edit' => psm_get_lang('system', 'edit'), - 'label_delete' => psm_get_lang('system', 'delete'), - 'label_view' => psm_get_lang('system', 'view'), - 'label_yes' => psm_get_lang('system', 'yes'), - 'label_no' => psm_get_lang('system', 'no'), - 'label_add_new' => psm_get_lang('system', 'add_new'), - 'label_seconds' => psm_get_lang('config', 'seconds'), - 'label_online' => psm_get_lang('servers', 'online'), - 'label_offline' => psm_get_lang('servers', 'offline'), - 'label_ok' => psm_get_lang('system', 'ok'), - 'label_bad' => psm_get_lang('system', 'bad'), - 'default_value_timeout' => PSM_CURL_TIMEOUT, - 'label_settings' => psm_get_lang('system', 'settings'), - 'label_output' => psm_get_lang('servers', 'output'), - 'label_search' => psm_get_lang('system', 'search'), - ); - } + protected function getLabels() + { + return array( + 'label_label' => psm_get_lang('servers', 'label'), + 'label_status' => psm_get_lang('servers', 'status'), + 'label_domain' => psm_get_lang('servers', 'domain'), + 'label_timeout' => psm_get_lang('servers', 'timeout'), + 'label_timeout_description' => psm_get_lang('servers', 'timeout_description'), + 'label_authentication_settings' => psm_get_lang('servers', 'authentication_settings'), + 'label_optional' => psm_get_lang('servers', 'optional'), + 'label_website_username' => psm_get_lang('servers', 'website_username'), + 'label_website_username_description' => psm_get_lang('servers', 'website_username_description'), + 'label_website_password' => psm_get_lang('servers', 'website_password'), + 'label_website_password_description' => psm_get_lang('servers', 'website_password_description'), + 'label_fieldset_monitoring' => psm_get_lang('servers', 'fieldset_monitoring'), + 'label_fieldset_permissions' => psm_get_lang('servers', 'fieldset_permissions'), + 'label_permissions' => psm_get_lang('servers', 'permissions'), + 'label_port' => psm_get_lang('servers', 'port'), + 'label_custom_port' => psm_get_lang('servers', 'custom_port'), + 'label_popular_ports' => psm_get_lang('servers', 'popular_ports'), + 'label_request_method' => psm_get_lang('servers', 'request_method'), + 'label_custom_request_method' => psm_get_lang('servers', 'custom_request_method'), + 'label_popular_request_methods' => psm_get_lang('servers', 'popular_request_methods'), + 'label_post_field' => psm_get_lang('servers', 'post_field'), + 'label_post_field_description' => psm_get_lang('servers', 'post_field_description'), + 'label_none' => psm_get_lang('system', 'none'), + 'label_please_select' => psm_get_lang('servers', 'please_select'), + 'label_type' => psm_get_lang('servers', 'type'), + 'label_website' => psm_get_lang('servers', 'type_website'), + 'label_service' => psm_get_lang('servers', 'type_service'), + 'label_ping' => psm_get_lang('servers', 'type_ping'), + 'label_pattern' => psm_get_lang('servers', 'pattern'), + 'label_pattern_description' => psm_get_lang('servers', 'pattern_description'), + 'label_pattern_online' => psm_get_lang('servers', 'pattern_online'), + 'label_pattern_online_description' => psm_get_lang('servers', 'pattern_online_description'), + 'label_redirect_check' => psm_get_lang('servers', 'redirect_check'), + 'label_redirect_check_description' => psm_get_lang('servers', 'redirect_check_description'), + 'label_allow_http_status' => psm_get_lang('servers', 'allow_http_status'), + 'label_allow_http_status_description' => psm_get_lang('servers', 'allow_http_status_description'), + 'label_header_name' => psm_get_lang('servers', 'header_name'), + 'label_header_value' => psm_get_lang('servers', 'header_value'), + 'label_header_name_description' => psm_get_lang('servers', 'header_name_description'), + 'label_header_value_description' => psm_get_lang('servers', 'header_value_description'), + 'label_last_check' => psm_get_lang('servers', 'last_check'), + 'label_rtime' => psm_get_lang('servers', 'latency'), + 'label_last_online' => psm_get_lang('servers', 'last_online'), + 'label_last_offline' => psm_get_lang('servers', 'last_offline'), + 'label_last_output' => psm_get_lang('servers', 'last_output'), + 'label_last_error' => psm_get_lang('servers', 'last_error'), + 'label_last_error_output' => psm_get_lang('servers', 'last_error_output'), + 'label_monitoring' => psm_get_lang('servers', 'monitoring'), + 'label_email' => psm_get_lang('servers', 'email'), + 'label_send_email' => psm_get_lang('servers', 'send_email'), + 'label_sms' => psm_get_lang('servers', 'sms'), + 'label_send_sms' => psm_get_lang('servers', 'send_sms'), + 'label_send_pushover' => psm_get_lang('servers', 'send_pushover'), + 'label_telegram' => psm_get_lang('servers', 'telegram'), + 'label_jabber' => psm_get_lang('servers', 'jabber'), + 'label_pushover' => psm_get_lang('servers', 'pushover'), + 'label_send_telegram' => psm_get_lang('servers', 'send_telegram'), + 'label_send_jabber' => psm_get_lang('servers', 'send_jabber'), + 'label_users' => psm_get_lang('servers', 'users'), + 'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'), + 'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'), + 'label_ssl_cert_expiry_days' => psm_get_lang('servers', 'ssl_cert_expiry_days'), + 'label_ssl_cert_expiry_days_description' => psm_get_lang('servers', 'ssl_cert_expiry_days_description'), + 'label_action' => psm_get_lang('system', 'action'), + 'label_save' => psm_get_lang('system', 'save'), + 'label_go_back' => psm_get_lang('system', 'go_back'), + 'label_edit' => psm_get_lang('system', 'edit'), + 'label_delete' => psm_get_lang('system', 'delete'), + 'label_view' => psm_get_lang('system', 'view'), + 'label_yes' => psm_get_lang('system', 'yes'), + 'label_no' => psm_get_lang('system', 'no'), + 'label_add_new' => psm_get_lang('system', 'add_new'), + 'label_seconds' => psm_get_lang('config', 'seconds'), + 'label_online' => psm_get_lang('servers', 'online'), + 'label_offline' => psm_get_lang('servers', 'offline'), + 'label_ok' => psm_get_lang('system', 'ok'), + 'label_bad' => psm_get_lang('system', 'bad'), + 'default_value_timeout' => PSM_CURL_TIMEOUT, + 'label_settings' => psm_get_lang('system', 'settings'), + 'label_output' => psm_get_lang('servers', 'output'), + 'label_search' => psm_get_lang('system', 'search'), + ); + } - /** - * Get all user ids for a server - * @param int $server_id - * @return array with ids only - */ - protected function getServerUsers($server_id) { - $users = $this->db->select( - PSM_DB_PREFIX.'users_servers', - array('server_id' => $server_id), - array('user_id') - ); - $result = array(); - foreach ($users as $user) { - $result[] = $user['user_id']; - } - return $result; - } + /** + * Get all user ids for a server + * @param int $server_id + * @return array with ids only + */ + protected function getServerUsers($server_id) + { + $users = $this->db->select( + PSM_DB_PREFIX . 'users_servers', + array('server_id' => $server_id), + array('user_id') + ); + $result = array(); + foreach ($users as $user) { + $result[] = $user['user_id']; + } + return $result; + } } diff --git a/src/psm/Module/Server/Controller/StatusController.php b/src/psm/Module/Server/Controller/StatusController.php index dc425910..d4ee083d 100644 --- a/src/psm/Module/Server/Controller/StatusController.php +++ b/src/psm/Module/Server/Controller/StatusController.php @@ -1,4 +1,5 @@ setCSRFKey('status'); - $this->setActions(array('index', 'saveLayout'), 'index'); - } + $this->setCSRFKey('status'); + $this->setActions(array('index', 'saveLayout'), 'index'); + } - /** - * Prepare the template to show a list of all servers - */ - protected function executeIndex() { - // set background color to black - $this->black_background = true; - $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server_status')); + /** + * Prepare the template to show a list of all servers + */ + protected function executeIndex() + { + // set background color to black + $this->black_background = true; + $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'server_status')); - // add header accessories - $layout = $this->getUser()->getUserPref('status_layout', 0); - $layout_data = array( - 'label_none' => psm_get_lang('system', 'none'), - 'label_last_check' => psm_get_lang('servers', 'last_check'), - 'label_last_online' => psm_get_lang('servers', 'last_online'), - 'label_last_offline' => psm_get_lang('servers', 'last_offline'), - 'label_online' => psm_get_lang('servers', 'online'), - 'label_offline' => psm_get_lang('servers', 'offline'), - 'label_rtime' => psm_get_lang('servers', 'latency'), - 'block_layout_active' => ($layout == 0) ? 'active' : '', - 'list_layout_active' => ($layout != 0) ? 'active' : '', - 'label_add_server' => psm_get_lang('system', 'add_new'), - 'layout' => $layout, - 'url_save' => psm_build_url(array('mod' => 'server', 'action' => 'edit')), - ); - $this->setHeaderAccessories($this->twig->render('module/server/status/header.tpl.html', $layout_data)); + // add header accessories + $layout = $this->getUser()->getUserPref('status_layout', 0); + $layout_data = array( + 'label_none' => psm_get_lang('system', 'none'), + 'label_last_check' => psm_get_lang('servers', 'last_check'), + 'label_last_online' => psm_get_lang('servers', 'last_online'), + 'label_last_offline' => psm_get_lang('servers', 'last_offline'), + 'label_online' => psm_get_lang('servers', 'online'), + 'label_offline' => psm_get_lang('servers', 'offline'), + 'label_rtime' => psm_get_lang('servers', 'latency'), + 'block_layout_active' => ($layout == 0) ? 'active' : '', + 'list_layout_active' => ($layout != 0) ? 'active' : '', + 'label_add_server' => psm_get_lang('system', 'add_new'), + 'layout' => $layout, + 'url_save' => psm_build_url(array('mod' => 'server', 'action' => 'edit')), + ); + $this->setHeaderAccessories($this->twig->render('module/server/status/header.tpl.html', $layout_data)); - $this->addFooter(false); + $this->addFooter(false); - // get the active servers from database - $servers = $this->getServers(); + // get the active servers from database + $servers = $this->getServers(); - $layout_data['servers_offline'] = array(); - $layout_data['servers_online'] = array(); + $layout_data['servers_offline'] = array(); + $layout_data['servers_warning'] = array(); + $layout_data['servers_online'] = array(); - foreach ($servers as $server) { - if ($server['active'] == 'no') { - continue; - } - $server['last_checked_nice'] = psm_timespan($server['last_check']); - $server['last_online_nice'] = psm_timespan($server['last_online']); - $server['last_offline_nice'] = psm_timespan($server['last_offline']); - $server['last_offline_duration_nice'] = ""; - if ($server['last_offline_nice'] != psm_get_lang('system', 'never')) { - $server['last_offline_duration_nice'] = "(".$server['last_offline_duration'].")"; - } - $server['url_view'] = psm_build_url(array('mod' => 'server', 'action' => 'view', 'id' => $server['server_id'], 'back_to' => 'server_status')); + foreach ($servers as $server) { + if ($server['active'] == 'no') { + continue; + } + $server['last_checked_nice'] = psm_timespan($server['last_check']); + $server['last_online_nice'] = psm_timespan($server['last_online']); + $server['last_offline_nice'] = psm_timespan($server['last_offline']); + $server['last_offline_duration_nice'] = ""; + if ($server['last_offline_nice'] != psm_get_lang('system', 'never')) { + $server['last_offline_duration_nice'] = "(" . $server['last_offline_duration'] . ")"; + } + $server['url_view'] = psm_build_url( + array('mod' => 'server', 'action' => 'view', 'id' => $server['server_id'], 'back_to' => 'server_status') + ); - if ($server['status'] == "off") { - $layout_data['servers_offline'][] = $server; - } elseif ($server['warning_threshold_counter'] > 0) { - $server['class_warning'] = 'warning'; - $layout_data['servers_offline'][] = $server; - } else { - $layout_data['servers_online'][] = $server; - } - } + if ($server['status'] == "off") { + $layout_data['servers_offline'][] = $server; + } elseif ($server['warning_threshold_counter'] > 0) { + $layout_data['servers_warning'][] = $server; + } elseif ($server['ssl_cert_expired_time'] !== null && $server['ssl_cert_expiry_days'] > 0) { + $layout_data['servers_warning'][] = $server; + } else { + $layout_data['servers_online'][] = $server; + } + } - $auto_refresh_seconds = psm_get_conf('auto_refresh_servers'); - if (intval($auto_refresh_seconds) > 0) { - $this->twig->addGlobal('auto_refresh', true); - $this->twig->addGlobal('auto_refresh_seconds', $auto_refresh_seconds); - } + $auto_refresh_seconds = psm_get_conf('auto_refresh_servers'); + if (intval($auto_refresh_seconds) > 0) { + $this->twig->addGlobal('auto_refresh', true); + $this->twig->addGlobal('auto_refresh_seconds', $auto_refresh_seconds); + } - if ($this->isXHR() || isset($_SERVER["HTTP_X_REQUESTED_WITH"])) { - $this->xhr = true; - //disable auto refresh in ajax return html - $layout_data["auto_refresh"] = 0; - } + if ($this->isXHR() || isset($_SERVER["HTTP_X_REQUESTED_WITH"])) { + $this->xhr = true; + //disable auto refresh in ajax return html + $layout_data["auto_refresh"] = 0; + } - return $this->twig->render('module/server/status/index.tpl.html', $layout_data); - } + return $this->twig->render('module/server/status/index.tpl.html', $layout_data); + } - protected function executeSaveLayout() { - if ($this->isXHR()) { - $layout = psm_POST('layout', 0); - $this->getUser()->setUserPref('status_layout', $layout); + protected function executeSaveLayout() + { + if ($this->isXHR()) { + $layout = psm_POST('layout', 0); + $this->getUser()->setUserPref('status_layout', $layout); - $response = new \Symfony\Component\HttpFoundation\JsonResponse(); - $response->setData(array( - 'layout' => $layout, - )); - return $response; - } - } + $response = new \Symfony\Component\HttpFoundation\JsonResponse(); + $response->setData(array( + 'layout' => $layout, + )); + return $response; + } + } } diff --git a/src/psm/Module/Server/Controller/UpdateController.php b/src/psm/Module/Server/Controller/UpdateController.php index 4080f5d1..d2addcac 100644 --- a/src/psm/Module/Server/Controller/UpdateController.php +++ b/src/psm/Module/Server/Controller/UpdateController.php @@ -1,4 +1,5 @@ setActions('index', 'index'); - } + $this->setActions('index', 'index'); + } - protected function executeIndex() { - $autorun = $this->container->get('util.server.updatemanager'); - $autorun->run(); - - header('Location: '.psm_build_url(array( - 'mod' => 'server_status' - ), true, false)); - trigger_error("Redirect failed.", E_USER_ERROR); - } + protected function executeIndex() + { + $autorun = $this->container->get('util.server.updatemanager'); + $autorun->run(); + header('Location: ' . psm_build_url(array( + 'mod' => 'server_status' + ), true, false)); + die(); + } } diff --git a/src/psm/Module/Server/ServerModule.php b/src/psm/Module/Server/ServerModule.php index 44a5b06e..a4cf1d76 100644 --- a/src/psm/Module/Server/ServerModule.php +++ b/src/psm/Module/Server/ServerModule.php @@ -1,4 +1,5 @@ __NAMESPACE__.'\Controller\ServerController', - 'log' => __NAMESPACE__.'\Controller\LogController', - 'status' => __NAMESPACE__.'\Controller\StatusController', - 'update' => __NAMESPACE__.'\Controller\UpdateController', - ); - - } + public function getControllers() + { + return array( + 'server' => __NAMESPACE__ . '\Controller\ServerController', + 'log' => __NAMESPACE__ . '\Controller\LogController', + 'status' => __NAMESPACE__ . '\Controller\StatusController', + 'update' => __NAMESPACE__ . '\Controller\UpdateController', + ); + } } diff --git a/src/psm/Module/User/Controller/LoginController.php b/src/psm/Module/User/Controller/LoginController.php index a4fad4b5..4c50272d 100644 --- a/src/psm/Module/User/Controller/LoginController.php +++ b/src/psm/Module/User/Controller/LoginController.php @@ -1,4 +1,5 @@ setMinUserLevelRequired(PSM_USER_ANONYMOUS); + $this->setMinUserLevelRequired(PSM_USER_ANONYMOUS); - $this->setActions(array( - 'login', 'forgot', 'reset', - ), 'login'); + $this->setActions(array( + 'login', 'forgot', 'reset', + ), 'login'); - $this->addMenu(false); - } + $this->addMenu(false); + } - protected function executeLogin() { - if (isset($_POST['user_name']) && isset($_POST['user_password'])) { - $rememberme = (isset($_POST['user_rememberme'])) ? true : false; - $result = $this->getUser()->loginWithPostData( - $_POST['user_name'], - $_POST['user_password'], - $rememberme - ); + protected function executeLogin() + { + if (isset($_POST['user_name']) && isset($_POST['user_password'])) { + $rememberme = (isset($_POST['user_rememberme'])) ? true : false; + $result = $this->getUser()->loginWithPostData( + $_POST['user_name'], + $_POST['user_password'], + $rememberme + ); - if ($result) { - // success login, redirect - header('Location: '.psm_build_url($_SERVER['QUERY_STRING'])); - trigger_error("Redirect failed.", E_USER_ERROR); - } else { - $this->addMessage(psm_get_lang('login', 'error_login_incorrect'), 'error'); - } - } + if ($result) { + // success login, redirect + header('Location: ' . + psm_build_url( + empty($_SERVER["QUERY_STRING"]) ? null : $_SERVER["QUERY_STRING"] + )); + die(); + } else { + $this->addMessage(psm_get_lang('login', 'error_login_incorrect'), 'error'); + } + } - $tpl_data = array( - 'title_sign_in' => psm_get_lang('login', 'title_sign_in'), - 'label_username' => psm_get_lang('login', 'username'), - 'label_password' => psm_get_lang('login', 'password'), - 'label_remember_me' => psm_get_lang('login', 'remember_me'), - 'label_login' => psm_get_lang('login', 'login'), - 'label_password_forgot' => psm_get_lang('login', 'password_forgot'), - 'value_user_name' => (isset($_POST['user_name'])) ? $_POST['user_name'] : '', - 'value_rememberme' => (isset($rememberme) && $rememberme) ? 'checked="checked"' : '', - ); + $tpl_data = array( + 'title_sign_in' => psm_get_lang('login', 'title_sign_in'), + 'label_username' => psm_get_lang('login', 'username'), + 'label_password' => psm_get_lang('login', 'password'), + 'label_remember_me' => psm_get_lang('login', 'remember_me'), + 'label_login' => psm_get_lang('login', 'login'), + 'label_password_forgot' => psm_get_lang('login', 'password_forgot'), + 'value_user_name' => (isset($_POST['user_name'])) ? $_POST['user_name'] : '', + 'value_rememberme' => (isset($rememberme) && $rememberme) ? 'checked="checked"' : '', + ); - return $this->twig->render('module/user/login/login.tpl.html', $tpl_data); - } + return $this->twig->render('module/user/login/login.tpl.html', $tpl_data); + } - /** - * Show/process the password forgot form (before the mail) - * - * @return string - */ - protected function executeForgot() { - if (isset($_POST['user_name'])) { - $user = $this->getUser()->getUserByUsername($_POST['user_name']); + /** + * Show/process the password forgot form (before the mail) + * + * @return string + */ + protected function executeForgot() + { + if (isset($_POST['user_name'])) { + $user = $this->getUser()->getUserByUsername($_POST['user_name']); - if (!empty($user)) { - $token = $this->getUser()->generatePasswordResetToken($user->user_id); - // we have a token, send it along - $this->sendPasswordForgotMail( - $user->user_id, - $user->email, - $token - ); + if (!empty($user)) { + $token = $this->getUser()->generatePasswordResetToken($user->user_id); + // we have a token, send it along + $this->sendPasswordForgotMail( + $user->user_id, + $user->email, + $token + ); - $this->addMessage(psm_get_lang('login', 'success_password_forgot'), 'success'); - return $this->executeLogin(); - } else { - $this->addMessage(psm_get_lang('login', 'error_user_incorrect'), 'error'); - } - } + $this->addMessage(psm_get_lang('login', 'success_password_forgot'), 'success'); + return $this->executeLogin(); + } else { + $this->addMessage(psm_get_lang('login', 'error_user_incorrect'), 'error'); + } + } - $tpl_data = array( - 'title_forgot' => psm_get_lang('login', 'title_forgot'), - 'label_username' => psm_get_lang('login', 'username'), - 'label_submit' => psm_get_lang('login', 'submit'), - 'label_go_back' => psm_get_lang('system', 'go_back'), - ); - return $this->twig->render('module/user/login/forgot.tpl.html', $tpl_data); - } + $tpl_data = array( + 'title_forgot' => psm_get_lang('login', 'title_forgot'), + 'label_username' => psm_get_lang('login', 'username'), + 'label_submit' => psm_get_lang('login', 'submit'), + 'label_go_back' => psm_get_lang('system', 'go_back'), + ); + return $this->twig->render('module/user/login/forgot.tpl.html', $tpl_data); + } - /** - * Show/process the password reset form (after the mail) - */ - protected function executeReset() { - $service_user = $this->getUser(); - $user_id = (isset($_GET['user_id'])) ? intval($_GET['user_id']) : 0; - $token = (isset($_GET['token'])) ? $_GET['token'] : ''; + /** + * Show/process the password reset form (after the mail) + */ + protected function executeReset() + { + $service_user = $this->getUser(); + $user_id = (isset($_GET['user_id'])) ? intval($_GET['user_id']) : 0; + $token = (isset($_GET['token'])) ? $_GET['token'] : ''; - if (!$service_user->verifyPasswordResetToken($user_id, $token)) { - $this->addMessage(psm_get_lang('login', 'error_reset_invalid_link'), 'error'); - return $this->executeLogin(); - } + if (!$service_user->verifyPasswordResetToken($user_id, $token)) { + $this->addMessage(psm_get_lang('login', 'error_reset_invalid_link'), 'error'); + return $this->executeLogin(); + } - if (!empty($_POST['user_password_new']) && !empty($_POST['user_password_repeat'])) { - if ($_POST['user_password_new'] !== $_POST['user_password_repeat']) { - $this->addMessage(psm_get_lang('login', 'error_login_passwords_nomatch'), 'error'); - } else { - $result = $service_user->changePassword($user_id, $_POST['user_password_new']); + if (!empty($_POST['user_password_new']) && !empty($_POST['user_password_repeat'])) { + if ($_POST['user_password_new'] !== $_POST['user_password_repeat']) { + $this->addMessage(psm_get_lang('login', 'error_login_passwords_nomatch'), 'error'); + } else { + $result = $service_user->changePassword($user_id, $_POST['user_password_new']); - if ($result) { - $this->addMessage(psm_get_lang('login', 'success_password_reset'), 'success'); - return $this->executeLogin(); - } else { - $this->addMessage(psm_get_lang('login', 'error_login_incorrect'), 'error'); - } - } - } - $user = $service_user->getUser($user_id); + if ($result) { + $this->addMessage(psm_get_lang('login', 'success_password_reset'), 'success'); + return $this->executeLogin(); + } else { + $this->addMessage(psm_get_lang('login', 'error_login_incorrect'), 'error'); + } + } + } + $user = $service_user->getUser($user_id); - $tpl_data = array( - 'title_reset' => psm_get_lang('login', 'title_reset'), - 'label_username' => psm_get_lang('login', 'username'), - 'label_password' => psm_get_lang('login', 'password'), - 'label_password_repeat' => psm_get_lang('login', 'password_repeat'), - 'label_reset' => psm_get_lang('login', 'password_reset'), - 'label_go_back' => psm_get_lang('system', 'go_back'), - 'value_user_name' => $user->user_name, - ); - return $this->twig->render('module/user/login/reset.tpl.html', $tpl_data); - } + $tpl_data = array( + 'title_reset' => psm_get_lang('login', 'title_reset'), + 'label_username' => psm_get_lang('login', 'username'), + 'label_password' => psm_get_lang('login', 'password'), + 'label_password_repeat' => psm_get_lang('login', 'password_repeat'), + 'label_reset' => psm_get_lang('login', 'password_reset'), + 'label_go_back' => psm_get_lang('system', 'go_back'), + 'value_user_name' => $user->user_name, + ); + return $this->twig->render('module/user/login/reset.tpl.html', $tpl_data); + } - /** - * Sends the password-reset-email. - * @param int $user_id - * @param string $user_email - * @param string $user_password_reset_hash - */ - protected function sendPasswordForgotMail($user_id, $user_email, $user_password_reset_hash) { - $mail = psm_build_mail(); - $mail->Subject = psm_get_lang('login', 'password_reset_email_subject'); + /** + * Sends the password-reset-email. + * @param int $user_id + * @param string $user_email + * @param string $user_password_reset_hash + */ + protected function sendPasswordForgotMail($user_id, $user_email, $user_password_reset_hash) + { + $mail = psm_build_mail(); + $mail->Subject = psm_get_lang('login', 'password_reset_email_subject'); - $url = psm_build_url(array( - 'action' => 'reset', - 'user_id' => $user_id, - 'token' => $user_password_reset_hash, - ), true, false); - $body = psm_get_lang('login', 'password_reset_email_body'); - $body = str_replace('%link%', $url, $body); - $mail->Body = $body; - $mail->AltBody = str_replace('
    ', "\n", $body); + $url = psm_build_url(array( + 'action' => 'reset', + 'user_id' => $user_id, + 'token' => $user_password_reset_hash, + ), true, false); + $body = psm_get_lang('login', 'password_reset_email_body'); + $body = str_replace('%link%', $url, $body); + $mail->Body = $body; + $mail->AltBody = str_replace('
    ', "\n", $body); - $mail->AddAddress($user_email); - $mail->Send(); - } + $mail->AddAddress($user_email); + $mail->Send(); + } } diff --git a/src/psm/Module/User/Controller/ProfileController.php b/src/psm/Module/User/Controller/ProfileController.php index daeca3b6..09f88691 100644 --- a/src/psm/Module/User/Controller/ProfileController.php +++ b/src/psm/Module/User/Controller/ProfileController.php @@ -1,4 +1,5 @@ setActions(array( - 'index', 'save', - ), 'index'); - $this->setCSRFKey('profile'); - } + $this->setActions(array( + 'index', 'save', + ), 'index'); + $this->setCSRFKey('profile'); + } - /** - * Show the profile page - * @return string - */ - protected function executeIndex() { - $this->twig->addGlobal('subtitle', psm_get_lang('users', 'profile')); - $user = $this->getUser()->getUser(null, true); + /** + * Show the profile page + * @return string + */ + protected function executeIndex() + { + $this->twig->addGlobal('subtitle', psm_get_lang('users', 'profile')); + $user = $this->getUser()->getUser(null, true); - $modal = new \psm\Util\Module\Modal($this->twig, 'activate' . ucfirst('telegram'), \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('users', 'activate_telegram')); - $modal->setMessage(psm_get_lang('users', 'activate_telegram_description')); - $modal->setOKButtonLabel(psm_get_lang('system', 'activate')); + $modal = new \psm\Util\Module\Modal( + $this->twig, + 'activate' . ucfirst('telegram'), + \psm\Util\Module\Modal::MODAL_TYPE_OKCANCEL + ); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('users', 'activate_telegram')); + $modal->setMessage(psm_get_lang('users', 'activate_telegram_description')); + $modal->setOKButtonLabel(psm_get_lang('system', 'activate')); - $tpl_data = array( - 'label_general' => psm_get_lang('config', 'general'), - 'label_name' => psm_get_lang('users', 'name'), - 'label_user_name' => psm_get_lang('users', 'user_name'), - 'label_password' => psm_get_lang('users', 'password'), - 'label_password_repeat' => psm_get_lang('users', 'password_repeat'), - 'label_level' => psm_get_lang('users', 'level'), - 'label_mobile' => psm_get_lang('users', 'mobile'), - 'label_pushover' => psm_get_lang('users', 'pushover'), - 'label_pushover_description' => psm_get_lang('users', 'pushover_description'), - 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), - 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), - 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), - 'label_telegram' => psm_get_lang('users', 'telegram'), - 'label_telegram_description' => psm_get_lang('users', 'telegram_description'), - 'label_telegram_chat_id' => psm_get_lang('users', 'telegram_chat_id'), - 'label_telegram_chat_id_description' => psm_get_lang('users', 'telegram_chat_id_description'), - 'label_activate_telegram' => psm_get_lang('users', 'activate_telegram'), - 'label_telegram_get_chat_id' => psm_get_lang('users', 'telegram_get_chat_id'), - 'telegram_get_chat_id_url' => PSM_TELEGRAM_GET_ID_URL, - 'label_email' => psm_get_lang('users', 'email'), - 'label_save' => psm_get_lang('system', 'save'), - 'form_action' => psm_build_url(array( - 'mod' => 'user_profile', - 'action' => 'save', - )), - 'level' => psm_get_lang('users', 'level_' . $user->level), - 'placeholder_password' => psm_get_lang('users', 'password_leave_blank'), - ); - foreach ($this->profile_fields as $field) { - $tpl_data[$field] = (isset($user->$field)) ? $user->$field : ''; - } - return $this->twig->render('module/user/profile.tpl.html', $tpl_data); - } + $tpl_data = array( + 'label_general' => psm_get_lang('config', 'general'), + 'label_name' => psm_get_lang('users', 'name'), + 'label_user_name' => psm_get_lang('users', 'user_name'), + 'label_password' => psm_get_lang('users', 'password'), + 'label_password_repeat' => psm_get_lang('users', 'password_repeat'), + 'label_level' => psm_get_lang('users', 'level'), + 'label_mobile' => psm_get_lang('users', 'mobile'), + 'label_pushover' => psm_get_lang('users', 'pushover'), + 'label_pushover_description' => psm_get_lang('users', 'pushover_description'), + 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), + 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), + 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), + 'label_telegram' => psm_get_lang('users', 'telegram'), + 'label_telegram_description' => psm_get_lang('users', 'telegram_description'), + 'label_telegram_chat_id' => psm_get_lang('users', 'telegram_chat_id'), + 'label_telegram_chat_id_description' => psm_get_lang('users', 'telegram_chat_id_description'), + 'label_activate_telegram' => psm_get_lang('users', 'activate_telegram'), + 'label_telegram_get_chat_id' => psm_get_lang('users', 'telegram_get_chat_id'), + 'telegram_get_chat_id_url' => PSM_TELEGRAM_GET_ID_URL, + 'label_jabber' => psm_get_lang('users', 'jabber'), + 'label_jabber_description' => psm_get_lang('users', 'jabber_description'), + 'label_email' => psm_get_lang('users', 'email'), + 'label_save' => psm_get_lang('system', 'save'), + 'form_action' => psm_build_url(array( + 'mod' => 'user_profile', + 'action' => 'save', + )), + 'level' => psm_get_lang('users', 'level_' . $user->level), + 'placeholder_password' => psm_get_lang('users', 'password_leave_blank'), + ); + foreach ($this->profile_fields as $field) { + $tpl_data[$field] = (isset($user->$field)) ? $user->$field : ''; + } + return $this->twig->render('module/user/profile.tpl.html', $tpl_data); + } - /** - * Save the profile - */ - protected function executeSave() { - if (empty($_POST)) { - // dont process anything if no data has been posted - return $this->executeIndex(); - } - $validator = $this->container->get('util.user.validator'); - $fields = $this->profile_fields; - $fields[] = 'password'; - $fields[] = 'password_repeat'; + /** + * Save the profile + */ + protected function executeSave() + { + if (empty($_POST)) { + // dont process anything if no data has been posted + return $this->executeIndex(); + } + $validator = $this->container->get('util.user.validator'); + $fields = $this->profile_fields; + $fields[] = 'password'; + $fields[] = 'password_repeat'; - $clean = array(); - foreach ($fields as $field) { - if (isset($_POST[$field])) { - $clean[$field] = trim(strip_tags($_POST[$field])); - } else { - $clean[$field] = ''; - } - } + $clean = array(); + foreach ($fields as $field) { + if (isset($_POST[$field])) { + $clean[$field] = trim(strip_tags($_POST[$field])); + } else { + $clean[$field] = ''; + } + } - // validate the lot - try { - $validator->username($clean['user_name'], $this->getUser()->getUserId()); - $validator->email($clean['email']); + // validate the lot + try { + $validator->username($clean['user_name'], $this->getUser()->getUserId()); + $validator->email($clean['email']); - // always validate password for new users, - // but only validate it for existing users when they change it. - if ($clean['password'] != '') { - $validator->password($clean['password'], $clean['password_repeat']); - } - } catch (\InvalidArgumentException $e) { - $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); - return $this->executeIndex(); - } - if (!empty($clean['password'])) { - $password = $clean['password']; - } - unset($clean['password']); - unset($clean['password_repeat']); + // always validate password for new users, + // but only validate it for existing users when they change it. + if ($clean['password'] != '') { + $validator->password($clean['password'], $clean['password_repeat']); + } + } catch (\InvalidArgumentException $e) { + $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); + return $this->executeIndex(); + } + if (!empty($clean['password'])) { + $password = $clean['password']; + } + unset($clean['password']); + unset($clean['password_repeat']); - $this->db->save(PSM_DB_PREFIX . 'users', $clean, array('user_id' => $this->getUser()->getUserId())); - $this->container->get('event')->dispatch( - \psm\Module\User\UserEvents::USER_EDIT, - new \psm\Module\User\Event\UserEvent($this->getUser()->getUserId()) - ); - if (isset($password)) { - $this->getUser()->changePassword($this->getUser()->getUserId(), $password); - } - $this->addMessage(psm_get_lang('users', 'profile_updated'), 'success'); - if (!empty($_POST['activate_telegram'])) { - $this->activateTelegram(); - } - return $this->executeIndex(); - } + $this->db->save(PSM_DB_PREFIX . 'users', $clean, array('user_id' => $this->getUser()->getUserId())); + $this->container->get('event')->dispatch( + \psm\Module\User\UserEvents::USER_EDIT, + new \psm\Module\User\Event\UserEvent($this->getUser()->getUserId()) + ); + if (isset($password)) { + $this->getUser()->changePassword($this->getUser()->getUserId(), $password); + } + $this->addMessage(psm_get_lang('users', 'profile_updated'), 'success'); + if (!empty($_POST['activate_telegram'])) { + $this->activateTelegram(); + } + return $this->executeIndex(); + } - /** - * Allow the bot to send notifications to chat_id - * - */ - protected function activateTelegram() { - $telegram = psm_build_telegram(); - $apiToken = psm_get_conf('telegram_api_token'); + /** + * Allow the bot to send notifications to chat_id + * + */ + protected function activateTelegram() + { + $telegram = psm_build_telegram(); + $apiToken = psm_get_conf('telegram_api_token'); - if (empty($apiToken)) { - $this->addMessage(psm_get_lang('config', 'telegram_error_notoken'), 'error'); - return; - } + if (empty($apiToken)) { + $this->addMessage(psm_get_lang('config', 'telegram_error_notoken'), 'error'); + return; + } - $result = $telegram->getBotUsername(); + $result = $telegram->getBotUsername(); - if (isset($result['ok']) && $result['ok'] != false) { - $url = "https://t.me/" . $result["result"]["username"]; - $this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_username_found'), $url), 'success'); - return; - } + if (isset($result['ok']) && $result['ok'] != false) { + $url = "https://t.me/" . $result["result"]["username"]; + $this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_username_found'), $url), 'success'); + return; + } - if (isset($result['error_code']) && $result['error_code'] == 401) { - $error = psm_get_lang('users', 'telegram_bot_username_error_token'); - } elseif (isset($result['description'])) { - $error = $result['description']; - } else { - $error = 'Unknown'; - } - $this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_error'), $error), 'error'); - } + if (isset($result['error_code']) && $result['error_code'] == 401) { + $error = psm_get_lang('users', 'telegram_bot_username_error_token'); + } elseif (isset($result['description'])) { + $error = $result['description']; + } else { + $error = 'Unknown'; + } + $this->addMessage(sprintf(psm_get_lang('users', 'telegram_bot_error'), $error), 'error'); + } } diff --git a/src/psm/Module/User/Controller/UserController.php b/src/psm/Module/User/Controller/UserController.php index 75de8fe2..1104a4d0 100644 --- a/src/psm/Module/User/Controller/UserController.php +++ b/src/psm/Module/User/Controller/UserController.php @@ -1,4 +1,5 @@ setMinUserLevelRequired(PSM_USER_ADMIN); - $this->setCSRFKey('user'); + $this->setMinUserLevelRequired(PSM_USER_ADMIN); + $this->setCSRFKey('user'); - $this->setActions(array( - 'index', 'edit', 'delete', 'save', - ), 'index'); - $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'user')); - } + $this->setActions(array( + 'index', 'edit', 'delete', 'save', + ), 'index'); + $this->twig->addGlobal('subtitle', psm_get_lang('menu', 'user')); + } - public function run($action = NULL) { - $servers = $this->db->select(PSM_DB_PREFIX.'servers', null, array('server_id', 'label'), '', "ORDER BY `label` ASC"); - // change the indexes to reflect their server ids - foreach ($servers as $server) { - $this->servers[$server['server_id']] = $server; - } + public function run($action = null) + { + $servers = $this->db->select( + PSM_DB_PREFIX . 'servers', + null, + array('server_id', 'label'), + '', + "ORDER BY `label` ASC" + ); + // change the indexes to reflect their server ids + foreach ($servers as $server) { + $this->servers[$server['server_id']] = $server; + } - return parent::run($action); - } + return parent::run($action); + } - /** - * Create HTML to show a list of all users - * - * @return string - */ - protected function executeIndex() { - $sidebar = new \psm\Util\Module\Sidebar($this->twig); - $this->setSidebar($sidebar); + /** + * Create HTML to show a list of all users + * + * @return string + */ + protected function executeIndex() + { + $sidebar = new \psm\Util\Module\Sidebar($this->twig); + $this->setSidebar($sidebar); - $sidebar->addButton( - 'add_new', - psm_get_lang('system', 'add_new'), - psm_build_url(array('mod' => 'user', 'action' => 'edit')), - 'plus icon-white', - 'success', - psm_get_lang('system', 'add_new') - ); + $sidebar->addButton( + 'add_new', + psm_get_lang('system', 'add_new'), + psm_build_url(array('mod' => 'user', 'action' => 'edit')), + 'plus icon-white', + 'success', + psm_get_lang('system', 'add_new') + ); - $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); - $this->addModal($modal); - $modal->setTitle(psm_get_lang('users', 'delete_title')); - $modal->setMessage(psm_get_lang('users', 'delete_message')); - $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); + $modal = new \psm\Util\Module\Modal($this->twig, 'delete', \psm\Util\Module\Modal::MODAL_TYPE_DANGER); + $this->addModal($modal); + $modal->setTitle(psm_get_lang('users', 'delete_title')); + $modal->setMessage(psm_get_lang('users', 'delete_message')); + $modal->setOKButtonLabel(psm_get_lang('system', 'delete')); - // build label array for the next loop - $servers_labels = array(); - foreach ($this->servers as $server) { - $servers_labels[$server['server_id']] = $server['label']; - } + // build label array for the next loop + $servers_labels = array(); + foreach ($this->servers as $server) { + $servers_labels[$server['server_id']] = $server['label']; + } - $users = $this->db->select( - PSM_DB_PREFIX.'users', - null, - array('user_id', 'user_name', 'level', 'name', 'mobile', 'email'), - null, - array('name') - ); + $users = $this->db->select( + PSM_DB_PREFIX . 'users', + null, + array('user_id', 'user_name', 'level', 'name', 'mobile', 'email'), + null, + array('name') + ); - foreach ($users as $x => &$user) { - $user_servers = $this->getUserServers($user['user_id']); - $user['class'] = ($x & 1) ? 'odd' : 'even'; - $user['level_text'] = psm_get_lang('users', 'level_'.$user['level']); + foreach ($users as $x => &$user) { + $user_servers = $this->getUserServers($user['user_id']); + $user['class'] = ($x & 1) ? 'odd' : 'even'; + $user['level_text'] = psm_get_lang('users', 'level_' . $user['level']); - $user['emp_servers'] = array(); + $user['emp_servers'] = array(); - // fix server list - foreach ($user_servers as $server_id) { - if (!isset($servers_labels[$server_id])) { - continue; - } - $user['emp_servers'][] = array( - 'label' => $servers_labels[$server_id], - 'url' => psm_build_url(array('mod' => 'server', 'action' => 'view', 'id' => $server_id, 'back_to' => 'user')) - ); - } - sort($user['emp_servers']); + // fix server list + foreach ($user_servers as $server_id) { + if (!isset($servers_labels[$server_id])) { + continue; + } + $user['emp_servers'][] = array( + 'label' => $servers_labels[$server_id], + 'url' => psm_build_url( + array('mod' => 'server', 'action' => 'view', 'id' => $server_id, 'back_to' => 'user') + ) + ); + } + sort($user['emp_servers']); - $user['url_delete'] = psm_build_url(array( - 'mod' => 'user', - 'action' => 'delete', - 'id' => $user['user_id'], - )); - $user['url_edit'] = psm_build_url(array( - 'mod' => 'user', - 'action' => 'edit', - 'id' => $user['user_id'], - )); - } - $tpl_data = $this->getLabels(); - $tpl_data['users'] = $users; + $user['url_delete'] = psm_build_url(array( + 'mod' => 'user', + 'action' => 'delete', + 'id' => $user['user_id'], + )); + $user['url_edit'] = psm_build_url(array( + 'mod' => 'user', + 'action' => 'edit', + 'id' => $user['user_id'], + )); + } + $tpl_data = $this->getLabels(); + $tpl_data['users'] = $users; - return $this->twig->render('module/user/user/list.tpl.html', $tpl_data); - } + return $this->twig->render('module/user/user/list.tpl.html', $tpl_data); + } - /** - * Crate HTML for the update screen for a user - * - * @return string - */ - protected function executeEdit() { - $user_id = isset($_GET['id']) ? intval($_GET['id']) : 0; - $fields_prefill = array('name', 'user_name', 'mobile', 'pushover_key', 'pushover_device', 'telegram_id', 'email'); + /** + * Crate HTML for the update screen for a user + * + * @return string + */ + protected function executeEdit() + { + $user_id = isset($_GET['id']) ? intval($_GET['id']) : 0; + $fields_prefill = array( + 'name', + 'user_name', + 'mobile', + 'pushover_key', + 'pushover_device', + 'telegram_id', + 'jabber', + 'email' + ); - if ($user_id == 0) { - // insert mode - $title = psm_get_lang('system', 'insert'); - $placeholder_password = ''; - $lvl_selected = PSM_USER_USER; // default level is regular user + if ($user_id == 0) { + // insert mode + $title = psm_get_lang('system', 'insert'); + $placeholder_password = ''; + $lvl_selected = PSM_USER_USER; // default level is regular user - // attempt to prefill previously posted fields - $edit_user = new \stdClass(); - foreach ($fields_prefill as $field) { - $edit_user->$field = (isset($_POST[$field])) ? $_POST[$field] : ''; - } + // attempt to prefill previously posted fields + $edit_user = new \stdClass(); + foreach ($fields_prefill as $field) { + $edit_user->$field = (isset($_POST[$field])) ? $_POST[$field] : ''; + } - // add inactive class to all servers - foreach ($this->servers as &$server) { - $server['class'] = 'inactive'; - } - } else { - // edit mode - try { - $this->container->get('util.user.validator')->userId($user_id); - } catch (\InvalidArgumentException $e) { - $this->addMessage(psm_get_lang('users', 'error_'.$e->getMessage()), 'error'); - return $this->executeIndex(); - } - $edit_user = $this->getUser()->getUser($user_id); - $title = psm_get_lang('system', 'edit').' '.$edit_user->name; - $placeholder_password = psm_get_lang('users', 'password_leave_blank'); - $lvl_selected = $edit_user->level; + // add inactive class to all servers + foreach ($this->servers as &$server) { + $server['class'] = 'inactive'; + } + } else { + // edit mode + try { + $this->container->get('util.user.validator')->userId($user_id); + } catch (\InvalidArgumentException $e) { + $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); + return $this->executeIndex(); + } + $edit_user = $this->getUser()->getUser($user_id); + $title = psm_get_lang('system', 'edit') . ' ' . $edit_user->name; + $placeholder_password = psm_get_lang('users', 'password_leave_blank'); + $lvl_selected = $edit_user->level; - // select servers for this user - $user_servers = $this->getUserServers($user_id); + // select servers for this user + $user_servers = $this->getUserServers($user_id); - foreach ($this->servers as &$server) { - $this->servers[$server['server_id']]['id'] = $server['server_id']; - if (in_array($server['server_id'], $user_servers)) { - $server['edit_selected'] = 'selected="selected"'; - $server['class'] = 'active'; - } - } - } + foreach ($this->servers as &$server) { + $this->servers[$server['server_id']]['id'] = $server['server_id']; + if (in_array($server['server_id'], $user_servers)) { + $server['edit_selected'] = 'selected="selected"'; + $server['class'] = 'active'; + } + } + } - $tpl_data = array( - 'titlemode' => $title, - 'placeholder_password' => $placeholder_password, - 'edit_user_id' => $user_id, - 'url_save' => psm_build_url(array( - 'mod' => 'user', - 'action' => 'save', - 'id' => $user_id, - )), - 'servers' => $this->servers, - 'user_level' => $lvl_selected, - ); - foreach ($fields_prefill as $field) { - if (isset($edit_user->$field)) { - $tpl_data['edit_value_'.$field] = $edit_user->$field; - } - } + $tpl_data = array( + 'titlemode' => $title, + 'placeholder_password' => $placeholder_password, + 'edit_user_id' => $user_id, + 'url_save' => psm_build_url(array( + 'mod' => 'user', + 'action' => 'save', + 'id' => $user_id, + )), + 'servers' => $this->servers, + 'user_level' => $lvl_selected, + ); + foreach ($fields_prefill as $field) { + if (isset($edit_user->$field)) { + $tpl_data['edit_value_' . $field] = $edit_user->$field; + } + } - $tpl_data['levels'] = array(); - foreach ($this->container->get('util.user.validator')->getUserLevels() as $lvl) { - $tpl_data['levels'][] = array( - 'value' => $lvl, - 'label' => psm_get_lang('users', 'level_'.$lvl), - ); - } + $tpl_data['levels'] = array(); + foreach ($this->container->get('util.user.validator')->getUserLevels() as $lvl) { + $tpl_data['levels'][] = array( + 'value' => $lvl, + 'label' => psm_get_lang('users', 'level_' . $lvl), + ); + } - $tpl_data = array_merge($this->getLabels(), $tpl_data); + $tpl_data = array_merge($this->getLabels(), $tpl_data); - return $this->twig->render('module/user/user/update.tpl.html', $tpl_data); - } + return $this->twig->render('module/user/user/update.tpl.html', $tpl_data); + } - /** - * Executes the saving of a user - */ - protected function executeSave() { - if (empty($_POST)) { - // dont process anything if no data has been posted - return $this->executeIndex(); - } - $user_id = (isset($_GET['id'])) ? intval($_GET['id']) : 0; + /** + * Executes the saving of a user + */ + protected function executeSave() + { + if (empty($_POST)) { + // dont process anything if no data has been posted + return $this->executeIndex(); + } + $user_id = (isset($_GET['id'])) ? intval($_GET['id']) : 0; - $fields = array('name', 'user_name', 'password', 'password_repeat', 'level', 'mobile', 'pushover_key', 'pushover_device', 'telegram_id', 'email'); - $clean = array(); - foreach ($fields as $field) { - if (isset($_POST[$field])) { - $clean[$field] = trim(strip_tags($_POST[$field])); - } else { - $clean[$field] = ''; - } - } + $fields = array( + 'name', + 'user_name', + 'password', + 'password_repeat', + 'level', + 'mobile', + 'pushover_key', + 'pushover_device', + 'telegram_id', + 'jabber', + 'email' + ); + $clean = array(); + foreach ($fields as $field) { + if (isset($_POST[$field])) { + $clean[$field] = trim(strip_tags($_POST[$field])); + } else { + $clean[$field] = ''; + } + } - $user_validator = $this->container->get('util.user.validator'); + $user_validator = $this->container->get('util.user.validator'); - try { - $user_validator->username($clean['user_name'], $user_id); - $user_validator->email($clean['email']); - $user_validator->level($clean['level']); + try { + $user_validator->username($clean['user_name'], $user_id); + $user_validator->email($clean['email']); + $user_validator->level($clean['level']); - // always validate password for new users, - // but only validate it for existing users when they change it. - if ($user_id == 0 || ($user_id > 0 && $clean['password'] != '')) { - $user_validator->password($clean['password'], $clean['password_repeat']); - } - if ($user_id > 0) { - $user_validator->userId($user_id); - } - } catch (\InvalidArgumentException $e) { - $this->addMessage(psm_get_lang('users', 'error_'.$e->getMessage()), 'error'); - return $this->executeEdit(); - } - if (!empty($clean['password'])) { - $password = $clean['password']; - } - unset($clean['password_repeat']); + // always validate password for new users, + // but only validate it for existing users when they change it. + if ($user_id == 0 || ($user_id > 0 && $clean['password'] != '')) { + $user_validator->password($clean['password'], $clean['password_repeat']); + } + if ($user_id > 0) { + $user_validator->userId($user_id); + } + } catch (\InvalidArgumentException $e) { + $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); + return $this->executeEdit(); + } + if (!empty($clean['password'])) { + $password = $clean['password']; + } + unset($clean['password_repeat']); - if ($user_id > 0) { - // edit user - unset($clean['password']); // password update is executed separately - $this->db->save(PSM_DB_PREFIX.'users', $clean, array('user_id' => $user_id)); - $this->addMessage(psm_get_lang('users', 'updated'), 'success'); + if ($user_id > 0) { + // edit user + unset($clean['password']); // password update is executed separately + $admins = $this->db->select(PSM_DB_PREFIX . 'users', array('level' => PSM_USER_ADMIN)); + if ( + (int) count($admins) === (int) 1 && + (int) $admins[0]['user_id'] === (int) $user_id && + (int) $clean['level'] === (int) PSM_USER_USER + ) { + $this->addMessage(psm_get_lang('users', 'error_user_admin_cant_be_deleted'), 'warning'); + $clean['level'] = PSM_USER_ADMIN; + } + $this->db->save(PSM_DB_PREFIX . 'users', $clean, array('user_id' => $user_id)); + $this->addMessage(psm_get_lang('users', 'updated'), 'success'); - $event = \psm\Module\User\UserEvents::USER_EDIT; - } else { - // add user - $clean['password'] = ''; // password update is executed separately - $user_id = $this->db->save(PSM_DB_PREFIX.'users', $clean); - $this->addMessage(psm_get_lang('users', 'inserted'), 'success'); + $event = \psm\Module\User\UserEvents::USER_EDIT; + } else { + // add user + $clean['password'] = ''; // password update is executed separately + $user_id = $this->db->save(PSM_DB_PREFIX . 'users', $clean); + $this->addMessage(psm_get_lang('users', 'inserted'), 'success'); - $event = \psm\Module\User\UserEvents::USER_ADD; - } - $this->container->get('event')->dispatch( - $event, - new \psm\Module\User\Event\UserEvent($user_id, $this->getUser()->getUserId()) - ); - if (isset($password)) { - $this->getUser()->changePassword($user_id, $password); - } + $event = \psm\Module\User\UserEvents::USER_ADD; + } + $this->container->get('event')->dispatch( + $event, + new \psm\Module\User\Event\UserEvent($user_id, $this->getUser()->getUserId()) + ); + if (isset($password)) { + $this->getUser()->changePassword($user_id, $password); + } - // update servers - $server_idc = psm_POST('server_id', array()); - $server_idc_save = array(); + // update servers + $server_idc = psm_POST('server_id', array()); + $server_idc_save = array(); - foreach ($server_idc as $server_id) { - $server_idc_save[] = array( - 'user_id' => $user_id, - 'server_id' => intval($server_id), - ); - } - // delete all existing records - $this->db->delete(PSM_DB_PREFIX.'users_servers', array('user_id' => $user_id)); - if (!empty($server_idc_save)) { - // add all new servers - $this->db->insertMultiple(PSM_DB_PREFIX.'users_servers', $server_idc_save); - } + foreach ($server_idc as $server_id) { + $server_idc_save[] = array( + 'user_id' => $user_id, + 'server_id' => intval($server_id), + ); + } + // delete all existing records + $this->db->delete(PSM_DB_PREFIX . 'users_servers', array('user_id' => $user_id)); + if (!empty($server_idc_save)) { + // add all new servers + $this->db->insertMultiple(PSM_DB_PREFIX . 'users_servers', $server_idc_save); + } - return $this->executeIndex(); - } + return $this->executeIndex(); + } - /** - * Executes the deletion of a user - */ - protected function executeDelete() { - $id = (isset($_GET['id'])) ? intval($_GET['id']) : 0; + /** + * Executes the deletion of a user + */ + protected function executeDelete() + { + $id = (isset($_GET['id'])) ? intval($_GET['id']) : 0; - try { - $this->container->get('util.user.validator')->userId($id); + try { + $this->container->get('util.user.validator')->userId($id); - $this->db->delete(PSM_DB_PREFIX.'users', array('user_id' => $id,)); - $this->db->delete(PSM_DB_PREFIX.'users_servers', array('user_id' => $id)); + $admins = $this->db->select(PSM_DB_PREFIX . 'users', array('level' => PSM_USER_ADMIN)); + if ( + (int) count($admins) === (int) 1 && + (int) $admins[0]['user_id'] === (int) $id + ) { + $this->addMessage(psm_get_lang('users', 'error_user_admin_cant_be_deleted'), 'error'); + } else { + $this->db->delete(PSM_DB_PREFIX . 'users', array('user_id' => $id,)); + $this->db->delete(PSM_DB_PREFIX . 'users_servers', array('user_id' => $id)); - $this->container->get('event')->dispatch( - \psm\Module\User\UserEvents::USER_DELETE, - new \psm\Module\User\Event\UserEvent($id, $this->getUser()->getUserId()) - ); + $this->container->get('event')->dispatch( + \psm\Module\User\UserEvents::USER_DELETE, + new \psm\Module\User\Event\UserEvent($id, $this->getUser()->getUserId()) + ); - $this->addMessage(psm_get_lang('users', 'deleted'), 'success'); - } catch (\InvalidArgumentException $e) { - $this->addMessage(psm_get_lang('users', 'error_'.$e->getMessage()), 'error'); - } + $this->addMessage(psm_get_lang('users', 'deleted'), 'success'); + } + } catch (\InvalidArgumentException $e) { + $this->addMessage(psm_get_lang('users', 'error_' . $e->getMessage()), 'error'); + } - return $this->executeIndex(); - } + return $this->executeIndex(); + } - protected function getLabels() { - return array( - 'label_users' => psm_get_lang('menu', 'user'), - 'label_user' => psm_get_lang('users', 'user'), - 'label_name' => psm_get_lang('users', 'name'), - 'label_user_name' => psm_get_lang('users', 'user_name'), - 'label_password' => psm_get_lang('users', 'password'), - 'label_password_repeat' => psm_get_lang('users', 'password_repeat'), - 'label_level' => psm_get_lang('users', 'level'), - 'label_level_description' => psm_get_lang('users', 'level_description'), - 'label_mobile' => psm_get_lang('users', 'mobile'), - 'label_pushover' => psm_get_lang('users', 'pushover'), - 'label_pushover_description' => psm_get_lang('users', 'pushover_description'), - 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), - 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), - 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), - 'label_telegram' => psm_get_lang('users', 'telegram'), - 'label_telegram_description' => psm_get_lang('users', 'telegram_description'), - 'label_telegram_id' => psm_get_lang('users', 'telegram_chat_id'), - 'label_telegram_id_description' => psm_get_lang('users', 'telegram_chat_id_description'), - 'label_email' => psm_get_lang('users', 'email'), - 'label_servers' => psm_get_lang('menu', 'server'), - 'label_save' => psm_get_lang('system', 'save'), - 'label_go_back' => psm_get_lang('system', 'go_back'), - 'label_edit' => psm_get_lang('system', 'edit'), - 'label_delete' => psm_get_lang('system', 'delete'), - 'label_add_new' => psm_get_lang('system', 'add_new'), - 'label_search' => psm_get_lang('system', 'search'), - ); - } + protected function getLabels() + { + return array( + 'label_users' => psm_get_lang('menu', 'user'), + 'label_user' => psm_get_lang('users', 'user'), + 'label_name' => psm_get_lang('users', 'name'), + 'label_user_name' => psm_get_lang('users', 'user_name'), + 'label_password' => psm_get_lang('users', 'password'), + 'label_password_repeat' => psm_get_lang('users', 'password_repeat'), + 'label_level' => psm_get_lang('users', 'level'), + 'label_level_description' => psm_get_lang('users', 'level_description'), + 'label_mobile' => psm_get_lang('users', 'mobile'), + 'label_pushover' => psm_get_lang('users', 'pushover'), + 'label_pushover_description' => psm_get_lang('users', 'pushover_description'), + 'label_pushover_key' => psm_get_lang('users', 'pushover_key'), + 'label_pushover_device' => psm_get_lang('users', 'pushover_device'), + 'label_pushover_device_description' => psm_get_lang('users', 'pushover_device_description'), + 'label_telegram' => psm_get_lang('users', 'telegram'), + 'label_telegram_id' => psm_get_lang('users', 'telegram_chat_id'), + 'label_telegram_id_description' => psm_get_lang('users', 'telegram_chat_id_description'), + 'label_jabber' => psm_get_lang('users', 'jabber'), + 'label_jabber_description' => psm_get_lang('users', 'jabber_description'), + 'label_email' => psm_get_lang('users', 'email'), + 'label_servers' => psm_get_lang('menu', 'server'), + 'label_save' => psm_get_lang('system', 'save'), + 'label_go_back' => psm_get_lang('system', 'go_back'), + 'label_edit' => psm_get_lang('system', 'edit'), + 'label_delete' => psm_get_lang('system', 'delete'), + 'label_add_new' => psm_get_lang('system', 'add_new'), + 'label_search' => psm_get_lang('system', 'search'), + ); + } - /** - * Get all server ids for a user - * @param int $user_id - * @return array with ids only - * @todo we should probably find a central place for this kind of stuff - */ - protected function getUserServers($user_id) { - $servers = $this->db->select( - PSM_DB_PREFIX.'users_servers', - array('user_id' => $user_id), - array('server_id') - ); - $result = array(); - foreach ($servers as $server) { - $result[] = $server['server_id']; - } - return $result; - } + /** + * Get all server ids for a user + * @param int $user_id + * @return array with ids only + * @todo we should probably find a central place for this kind of stuff + */ + protected function getUserServers($user_id) + { + $servers = $this->db->select( + PSM_DB_PREFIX . 'users_servers', + array('user_id' => $user_id), + array('server_id') + ); + $result = array(); + foreach ($servers as $server) { + $result[] = $server['server_id']; + } + return $result; + } } diff --git a/src/psm/Module/User/Event/UserEvent.php b/src/psm/Module/User/Event/UserEvent.php index 44cdfee0..9bf14d1a 100644 --- a/src/psm/Module/User/Event/UserEvent.php +++ b/src/psm/Module/User/Event/UserEvent.php @@ -1,4 +1,5 @@ user_id = $user_id; - $this->user_id_by = $user_id_by; - } + public function __construct($user_id, $user_id_by = null) + { + $this->user_id = $user_id; + $this->user_id_by = $user_id_by; + } - public function getUserId() { - return $this->user_id; - } + public function getUserId() + { + return $this->user_id; + } - public function getUserIdBy() { - return $this->user_id_by; - } -} \ No newline at end of file + public function getUserIdBy() + { + return $this->user_id_by; + } +} diff --git a/src/psm/Module/User/EventListener/UserSubscriber.php b/src/psm/Module/User/EventListener/UserSubscriber.php index 34ec5183..080bfec3 100644 --- a/src/psm/Module/User/EventListener/UserSubscriber.php +++ b/src/psm/Module/User/EventListener/UserSubscriber.php @@ -1,4 +1,5 @@ array('onUserAdd', 0), - UserEvents::USER_EDIT => array('onUserEdit', 0), - UserEvents::USER_DELETE => array('onUserDelete', 0), - ); - } + public static function getSubscribedEvents() + { + return array( + UserEvents::USER_ADD => array('onUserAdd', 0), + UserEvents::USER_EDIT => array('onUserEdit', 0), + UserEvents::USER_DELETE => array('onUserDelete', 0), + ); + } - public function onUserAdd(UserEvent $event) { - } + public function onUserAdd(UserEvent $event) + { + } - public function onUserEdit(UserEvent $event) { - } + public function onUserEdit(UserEvent $event) + { + } - public function onUserDelete(UserEvent $event) { - } -} \ No newline at end of file + public function onUserDelete(UserEvent $event) + { + } +} diff --git a/src/psm/Module/User/UserEvents.php b/src/psm/Module/User/UserEvents.php index f0816551..33767928 100644 --- a/src/psm/Module/User/UserEvents.php +++ b/src/psm/Module/User/UserEvents.php @@ -1,4 +1,5 @@ get('event'); - $event->addSubscriber(new EventListener\UserSubscriber); - } + public function load(ContainerBuilder $container) + { + $event = $container->get('event'); + $event->addSubscriber(new EventListener\UserSubscriber()); + } - public function getControllers() { - return array( - 'user' => __NAMESPACE__.'\Controller\UserController', - 'login' => __NAMESPACE__.'\Controller\LoginController', - 'profile' => __NAMESPACE__.'\Controller\ProfileController', - ); - - } -} \ No newline at end of file + public function getControllers() + { + return array( + 'user' => __NAMESPACE__ . '\Controller\UserController', + 'login' => __NAMESPACE__ . '\Controller\LoginController', + 'profile' => __NAMESPACE__ . '\Controller\ProfileController', + ); + } +} diff --git a/src/psm/Router.php b/src/psm/Router.php index 140d95fb..41533989 100644 --- a/src/psm/Router.php +++ b/src/psm/Router.php @@ -1,4 +1,5 @@ container = $this->buildServiceContainer(); + public function __construct() + { + $this->container = $this->buildServiceContainer(); - $mods = $this->container->getParameter('modules'); + $mods = $this->container->getParameter('modules'); - foreach ($mods as $mod) { - $mod_loader = $this->container->get($mod); - $mod_loader->load($this->container); - } - } + foreach ($mods as $mod) { + $mod_loader = $this->container->get($mod); + $mod_loader->load($this->container); + } + } - /** - * Run a module. - * - * The $mod param is in the format $module_$controller. - * If the "_$controller" part is omitted, it will attempt to load - * the controller with the same name as the module. - * - * @param string $mod - * @throws \InvalidArgumentException - * @throws \LogicException - */ - public function run($mod) { - if (strpos($mod, '_') !== false) { - list($mod, $controller) = explode('_', $mod); - } else { - $controller = $mod; - } - $this->buildTwigEnvironment(); + /** + * Run a module. + * + * The $mod param is in the format $module_$controller. + * If the "_$controller" part is omitted, it will attempt to load + * the controller with the same name as the module. + * + * @param string $mod + * @throws \InvalidArgumentException + * @throws \LogicException + */ + public function run($mod) + { + if (strpos($mod, '_') !== false) { + list($mod, $controller) = explode('_', $mod); + } else { + $controller = $mod; + } + $this->buildTwigEnvironment(); - $controller = $this->getController($mod, $controller); - $action = null; + $controller = $this->getController($mod, $controller); + $action = null; - try { - $this->validateRequest($controller); - } catch (\InvalidArgumentException $ex) { - switch ($ex->getMessage()) { - case 'login_required': - $controller = $this->getController('user', 'login'); - break; - case 'invalid_csrf_token': - case 'invalid_user_level': - default: - $controller = $this->getController('error'); - $action = '401'; - break; - } - } + try { + $this->validateRequest($controller); + } catch (\InvalidArgumentException $ex) { + switch ($ex->getMessage()) { + case 'login_required': + $controller = $this->getController('user', 'login'); + break; + case 'invalid_csrf_token': + case 'invalid_user_level': + default: + $controller = $this->getController('error'); + $action = '401'; + break; + } + } - $response = $controller->run($action); + $response = $controller->run($action); - if (!($response instanceof Response)) { - throw new \LogicException('Controller did not return a Response object.'); - } - $response->send(); - } + if (!($response instanceof Response)) { + throw new \LogicException('Controller did not return a Response object.'); + } + $response->send(); + } - /** - * Get an instance of the requested controller. - * @param string $module_id - * @param string $controller_id if NULL, default controller will be used - * @return \psm\Module\ControllerInterface - * @throws \InvalidArgumentException - */ - public function getController($module_id, $controller_id = null) { - if ($controller_id === null) { - // by default, we use the controller with the same id as the module. - $controller_id = $module_id; - } + /** + * Get an instance of the requested controller. + * @param string $module_id + * @param string $controller_id if NULL, default controller will be used + * @return \psm\Module\ControllerInterface + * @throws \InvalidArgumentException + */ + public function getController($module_id, $controller_id = null) + { + if ($controller_id === null) { + // by default, we use the controller with the same id as the module. + $controller_id = $module_id; + } - $module = $this->container->get('module.'.$module_id); - $controllers = $module->getControllers(); - if (!isset($controllers[$controller_id]) || !class_exists($controllers[$controller_id])) { - throw new \InvalidArgumentException('Controller "'.$controller_id.'" is not registered or does not exist.'); - } - $controller = new $controllers[$controller_id]( - $this->container->get('db'), - $this->container->get('twig') - ); + $module = $this->container->get('module.' . $module_id); + $controllers = $module->getControllers(); + if (!isset($controllers[$controller_id]) || !class_exists($controllers[$controller_id])) { + throw new \InvalidArgumentException('Controller "' . $controller_id . '" + is not registered or does not exist.'); + } + $controller = new $controllers[$controller_id]( + $this->container->get('db'), + $this->container->get('twig') + ); - if (!$controller instanceof \psm\Module\ControllerInterface) { - throw new \Exception('Controller does not implement ControllerInterface'); - } - $controller->setContainer($this->container); + if (!$controller instanceof \psm\Module\ControllerInterface) { + throw new \Exception('Controller does not implement ControllerInterface'); + } + $controller->setContainer($this->container); - return $controller; - } + return $controller; + } - /** - * Get service from container - * @param string $id - * @return mixed FALSE on failure, service otherwise - * @throws \InvalidArgumentException - */ - public function getService($id) { - return $this->container->get($id); - } + /** + * Get service from container + * @param string $id + * @return mixed FALSE on failure, service otherwise + * @throws \InvalidArgumentException + */ + public function getService($id) + { + return $this->container->get($id); + } - /** - * Validate requets before heading to a controller - * @param \psm\Module\ControllerInterface $controller - * @throws \InvalidArgumentException - */ - protected function validateRequest(\psm\Module\ControllerInterface $controller) { - $request = Request::createFromGlobals(); + /** + * Validate requets before heading to a controller + * @param \psm\Module\ControllerInterface $controller + * @throws \InvalidArgumentException + */ + protected function validateRequest(\psm\Module\ControllerInterface $controller) + { + $request = Request::createFromGlobals(); - if ($request->getMethod() == 'POST') { - // require CSRF token for all POST calls - $session = $this->container->get('user')->getSession(); - $token_in = $request->request->get('csrf', ''); - $csrf_key = $controller->getCSRFKey(); + if ($request->getMethod() == 'POST') { + // require CSRF token for all POST calls + $session = $this->container->get('user')->getSession(); + $token_in = $request->request->get('csrf', ''); + $csrf_key = $controller->getCSRFKey(); - if (empty($csrf_key)) { - if (!hash_equals($session->get('csrf_token'), $token_in)) { - throw new \InvalidArgumentException('invalid_csrf_token'); - } - } else { - if (!hash_equals( - hash_hmac('sha256', $csrf_key, $session->get('csrf_token2')), - $token_in - )) { - throw new \InvalidArgumentException('invalid_csrf_token'); - } - } - } + if (empty($csrf_key)) { + if (!hash_equals($session->get('csrf_token'), $token_in)) { + throw new \InvalidArgumentException('invalid_csrf_token'); + } + } else { + if ( + !hash_equals( + hash_hmac('sha256', $csrf_key, $session->get('csrf_token2')), + $token_in + ) + ) { + throw new \InvalidArgumentException('invalid_csrf_token'); + } + } + } - // get min required level for this controller and make sure the user matches - $min_lvl = $controller->getMinUserLevelRequired(); + // get min required level for this controller and make sure the user matches + $min_lvl = $controller->getMinUserLevelRequired(); - if ($min_lvl < PSM_USER_ANONYMOUS) { - // if user is not logged in, load login module - if (!$this->container->get('user')->isUserLoggedIn()) { - throw new \InvalidArgumentException('login_required'); - } elseif ($this->container->get('user')->getUserLevel() > $min_lvl) { - throw new \InvalidArgumentException('invalid_user_level'); - } - } - } + if ($min_lvl < PSM_USER_ANONYMOUS) { + // if user is not logged in, load login module + if (!$this->container->get('user')->isUserLoggedIn()) { + throw new \InvalidArgumentException('login_required'); + } elseif ($this->container->get('user')->getUserLevel() > $min_lvl) { + throw new \InvalidArgumentException('invalid_user_level'); + } + } + } - /** - * Build a new service container - * @return \Symfony\Component\DependencyInjection\ContainerBuilder - * @throws \InvalidArgumentException - */ - protected function buildServiceContainer() { - $builder = new ContainerBuilder(); - $loader = new XmlFileLoader($builder, new FileLocator(PSM_PATH_CONFIG)); - $loader->load('services.xml'); + /** + * Build a new service container + * @return \Symfony\Component\DependencyInjection\ContainerBuilder + * @throws \InvalidArgumentException + */ + protected function buildServiceContainer() + { + $builder = new ContainerBuilder(); + $loader = new XmlFileLoader($builder, new FileLocator(PSM_PATH_CONFIG)); + $loader->load('services.xml'); - return $builder; - } + return $builder; + } - /** - * Prepare twig environment - * @return \Twig_Environment - */ - protected function buildTwigEnvironment() { - $twig = $this->container->get('twig'); - $session = $this->container->get('user')->getSession(); - if (!$session->has('csrf_token')) { - $session->set('csrf_token', bin2hex(random_bytes(32))); - } - if (!$session->has('csrf_token2')) { - $session->set('csrf_token2', random_bytes(32)); - } + /** + * Prepare twig environment + * @return \Twig_Environment + */ + protected function buildTwigEnvironment() + { + $twig = $this->container->get('twig'); + $session = $this->container->get('user')->getSession(); + if (!$session->has('csrf_token')) { + $session->set('csrf_token', bin2hex(random_bytes(32))); + } + if (!$session->has('csrf_token2')) { + $session->set('csrf_token2', random_bytes(32)); + } - $twig->addFunction( - new \Twig_SimpleFunction( - 'csrf_token', - function($lock_to = null) use ($session) { - if (empty($lock_to)) { - return $session->get('csrf_token'); - } - return hash_hmac('sha256', $lock_to, $session->get('csrf_token2')); - } - ) - ); - $twig->addGlobal('direction_current', psm_get_lang('locale_dir')); - $twig->addGlobal('language_current', psm_get_lang('locale_tag')); - $twig->addGlobal('language', psm_get_lang('locale')[1]); + $twig->addFunction( + new \Twig_SimpleFunction( + 'csrf_token', + function ($lock_to = null) use ($session) { + if (empty($lock_to)) { + return $session->get('csrf_token'); + } + return hash_hmac('sha256', $lock_to, $session->get('csrf_token2')); + } + ) + ); + $twig->addGlobal('direction_current', psm_get_lang('locale_dir')); + $twig->addGlobal('language_current', psm_get_lang('locale_tag')); + $twig->addGlobal('language', psm_get_lang('locale')[1]); - return $twig; - } -} \ No newline at end of file + return $twig; + } +} diff --git a/src/psm/Service/Database.php b/src/psm/Service/Database.php index 82aaca68..5d69dd55 100644 --- a/src/psm/Service/Database.php +++ b/src/psm/Service/Database.php @@ -1,4 +1,5 @@ db_host = $host; - $this->db_port = $port; - $this->db_name = $db; - $this->db_user = $user; - $this->db_pass = $pass; - $this->connect(); - } - } + /** + * Constructor + * + * @param string $host + * @param string $user + * @param string $pass + * @param string $db + * @param string|integer $port + */ + public function __construct($host = null, $user = null, $pass = null, $db = null, $port = '') + { + if ($host != null && $user != null && $pass !== null && $db != null) { + $this->db_host = $host; + $this->db_port = $port; + $this->db_name = $db; + $this->db_user = $user; + $this->db_pass = $pass; + $this->connect(); + } + } - /** - * Exectues query and fetches result. - * - * If you dont want to fetch a result, use exec(). - * @param string $query SQL query - * @param boolean $fetch automatically fetch results, or return PDOStatement? - * @return \PDOStatement|int|bool|array object - */ - public function query($query, $fetch = true) { - // Execute query and process results - try { - $this->last = $this->pdo()->query($query); - } catch (\PDOException $e) { - $this->error($e); - } + /** + * Exectues query and fetches result. + * + * If you dont want to fetch a result, use exec(). + * @param string $query SQL query + * @param boolean $fetch automatically fetch results, or return PDOStatement? + * @return \PDOStatement|int|bool|array object + */ + public function query($query, $fetch = true) + { + // Execute query and process results + try { + $this->last = $this->pdo()->query($query); + } catch (\PDOException $e) { + $this->error($e); + } - if ($fetch && $this->last != false) { - $cmd = strtolower(substr($query, 0, 6)); + if ($fetch && $this->last != false) { + $cmd = strtolower(substr($query, 0, 6)); - switch ($cmd) { - case 'insert': - // insert query, return insert id - $result = $this->getLastInsertedId(); - break; - case 'update': - case 'delete': - // update/delete, returns rowCount - $result = $this->getNumRows(); - break; - default: - $result = $this->last->fetchAll(\PDO::FETCH_ASSOC); - break; - } - } else { - $result = $this->last; - } - return $result; - } + switch ($cmd) { + case 'insert': + // insert query, return insert id + $result = $this->getLastInsertedId(); + break; + case 'update': + case 'delete': + // update/delete, returns rowCount + $result = $this->getNumRows(); + break; + default: + $result = $this->last->fetchAll(\PDO::FETCH_ASSOC); + break; + } + } else { + $result = $this->last; + } + return $result; + } - /** - * Execute SQL statement and return number of affected rows - * @param string $query - * @return int - */ - public function exec($query) { - try { - $this->last = $this->pdo()->exec($query); - } catch (\PDOException $e) { - $this->error($e); - } + /** + * Execute SQL statement and return number of affected rows + * @param string $query + * @return int + */ + public function exec($query) + { + try { + $this->last = $this->pdo()->exec($query); + } catch (\PDOException $e) { + $this->error($e); + } - return $this->last; - } + return $this->last; + } - /** - * Prepare and execute SQL statement with parameters - * @param string $query SQL statement - * @param array $parameters An array of values with as many elements as there are bound parameters in the SQL statement - * @param boolean $fetch automatically fetch results, or return PDOStatement? - * @return array|\PDOStatement if $fetch = true, array, otherwise \PDOStatement - */ - public function execute($query, $parameters, $fetch = true) { - try { - $this->last = $this->pdo()->prepare($query); - $this->last->execute($parameters); - } catch (\PDOException $e) { - $this->error($e); - } + /** + * Prepare and execute SQL statement with parameters + * @param string $query SQL statement + * @param array $parameters An array of values with as many elements as there are + * bound parameters in the SQL statement + * @param boolean $fetch automatically fetch results, or return PDOStatement? + * @return array|\PDOStatement if $fetch = true, array, otherwise \PDOStatement + */ + public function execute($query, $parameters, $fetch = true) + { + try { + $this->last = $this->pdo()->prepare($query); + $this->last->execute($parameters); + } catch (\PDOException $e) { + $this->error($e); + } - if ($fetch && $this->last != false) { - $result = $this->last->fetchAll(\PDO::FETCH_ASSOC); - } else { - $result = $this->last; - } - return $result; - } + if ($fetch && $this->last != false) { + $result = $this->last->fetchAll(\PDO::FETCH_ASSOC); + } else { + $result = $this->last; + } + return $result; + } - /** - * Performs a select on the given table and returns an multi dimensional associative array with results - * @param string $table tablename - * @param mixed $where string or array with where data - * @param array $fields array with fields to be retrieved. if empty all fields will be retrieved - * @param string $limit limit. for example: 0,30 - * @param array $orderby fields for the orderby clause - * @param string $direction ASC or DESC. Defaults to ASC - * @return \PDOStatement array multi dimensional array with results - */ - public function select($table, $where = null, $fields = null, $limit = '', $orderby = null, $direction = 'ASC') { - // build query - $query_parts = array(); - $query_parts[] = 'SELECT SQL_CALC_FOUND_ROWS'; + /** + * Performs a select on the given table and returns an multi dimensional associative array with results + * @param string $table tablename + * @param mixed $where string or array with where data + * @param array $fields array with fields to be retrieved. if empty all fields will be retrieved + * @param string $limit limit. for example: 0,30 + * @param array $orderby fields for the orderby clause + * @param string $direction ASC or DESC. Defaults to ASC + * @return \PDOStatement array multi dimensional array with results + */ + public function select($table, $where = null, $fields = null, $limit = '', $orderby = null, $direction = 'ASC') + { + // build query + $query_parts = array(); + $query_parts[] = 'SELECT SQL_CALC_FOUND_ROWS'; - // Fields - if ($fields !== null && !empty($fields)) { - $query_parts[] = "`".implode('`,`', $fields)."`"; - } else { - $query_parts[] = ' * '; - } + // Fields + if ($fields !== null && !empty($fields)) { + $query_parts[] = "`" . implode('`,`', $fields) . "`"; + } else { + $query_parts[] = ' * '; + } - // From - $query_parts[] = "FROM `{$table}`"; + // From + $query_parts[] = "FROM `{$table}`"; - // Where clause - $query_parts[] = $this->buildSQLClauseWhere($table, $where); + // Where clause + $query_parts[] = $this->buildSQLClauseWhere($table, $where); - // Order by - if ($orderby) { - $query_parts[] = $this->buildSQLClauseOrderBy($orderby, $direction); - } + // Order by + if ($orderby) { + $query_parts[] = $this->buildSQLClauseOrderBy($orderby, $direction); + } - // Limit - if ($limit != '') { - $query_parts[] = 'LIMIT '.$limit; - } + // Limit + if ($limit != '') { + $query_parts[] = 'LIMIT ' . $limit; + } - $query = implode(' ', $query_parts); + $query = implode(' ', $query_parts); - return $this->query($query); - } + return $this->query($query); + } - /** - * Alias to select() but uses limit = 1 to return only one row. - * @param string $table tablename - * @param mixed $where string or array with where data - * @param array $fields array with fields to be retrieved. if empty all fields will be retrieved - * @param array $orderby fields for the orderby clause - * @param string $direction ASC or DESC. Defaults to ASC - * @return array - */ - public function selectRow($table, $where = null, $fields = null, $orderby = null, $direction = 'ASC') { - $result = $this->select($table, $where, $fields, '1', $orderby, $direction); + /** + * Alias to select() but uses limit = 1 to return only one row. + * @param string $table tablename + * @param mixed $where string or array with where data + * @param array $fields array with fields to be retrieved. if empty all fields will be retrieved + * @param array $orderby fields for the orderby clause + * @param string $direction ASC or DESC. Defaults to ASC + * @return array + */ + public function selectRow($table, $where = null, $fields = null, $orderby = null, $direction = 'ASC') + { + $result = $this->select($table, $where, $fields, '1', $orderby, $direction); - if (isset($result[0])) { - $result = $result[0]; - } + if (isset($result[0])) { + $result = $result[0]; + } - return $result; - } + return $result; + } - /** - * Remove a record from database - * @param string $table tablename - * @param mixed $where Where clause array or primary Id (string) or where clause (string) - * @return int number of affected rows - */ - public function delete($table, $where = null) { - $sql = 'DELETE FROM `'.$table.'` '.$this->buildSQLClauseWhere($table, $where); + /** + * Remove a record from database + * @param string $table tablename + * @param mixed $where Where clause array or primary Id (string) or where clause (string) + * @return int number of affected rows + */ + public function delete($table, $where = null) + { + $sql = 'DELETE FROM `' . $table . '` ' . $this->buildSQLClauseWhere($table, $where); - return $this->exec($sql); - } + return $this->exec($sql); + } - /** - * Insert or update data to the database - * @param string $table table name - * @param array $data data to save or insert - * @param string|array $where either string ('user_id=2' or just '2' (works only with primary field)) or array with where clause (only when updating) - * @return int|array|\PDOStatement - */ - public function save($table, array $data, $where = null) { - if ($where === null) { - // insert mode - $query = "INSERT INTO "; - $exec = false; - } else { - $query = "UPDATE "; - $exec = true; - } + /** + * Insert or update data to the database + * @param string $table table name + * @param array $data data to save or insert + * @param string|array $where either string ('user_id=2' or just '2' (works only with primary field)) or + * array with where clause (only when updating) + * @return int|array|\PDOStatement + */ + public function save($table, array $data, $where = null) + { + if ($where === null) { + // insert mode + $query = "INSERT INTO "; + $exec = false; + } else { + $query = "UPDATE "; + $exec = true; + } - $query .= "`{$table}` SET "; + $query .= "`{$table}` SET "; - foreach ($data as $field => $value) { - if (is_null($value)) { - $value = 'NULL'; - } else { - $value = $this->quote($value); - } - $query .= "`{$table}`.`{$field}`={$value}, "; - } + foreach ($data as $field => $value) { + if (is_null($value)) { + $value = 'NULL'; + } else { + $value = $this->quote($value); + } + $query .= "`{$table}`.`{$field}`={$value}, "; + } - $query = substr($query, 0, -2).' '.$this->buildSQLClauseWhere($table, $where); + $query = substr($query, 0, -2) . ' ' . $this->buildSQLClauseWhere($table, $where); - if ($exec) { - return $this->exec($query); - } - return $this->query($query); - } + if ($exec) { + return $this->exec($query); + } + return $this->query($query); + } - /** - * Insert multiple rows into a single table - * - * This method is preferred over calling the insert() lots of times - * so it can be optimized to be inserted with 1 query. - * It can only be used if all inserts have the same fields, records - * that do not match the fields provided in the first record will be - * skipped. - * - * @param string $table - * @param array $data - * @return \PDOStatement - * @see insert() - */ - public function insertMultiple($table, array $data) { - if (empty($data)) { - return false; - } + /** + * Insert multiple rows into a single table + * + * This method is preferred over calling the insert() lots of times + * so it can be optimized to be inserted with 1 query. + * It can only be used if all inserts have the same fields, records + * that do not match the fields provided in the first record will be + * skipped. + * + * @param string $table + * @param array $data + * @return \PDOStatement + * @see insert() + */ + public function insertMultiple($table, array $data) + { + if (empty($data)) { + return false; + } - // prepare first part - $query = "INSERT INTO `{$table}` "; - $fields = array_keys($data[0]); - $query .= "(`".implode('`,`', $fields)."`) VALUES "; + // prepare first part + $query = "INSERT INTO `{$table}` "; + $fields = array_keys($data[0]); + $query .= "(`" . implode('`,`', $fields) . "`) VALUES "; - // prepare all rows to be inserted with placeholders for vars (\?) - $q_part = array_fill(0, count($fields), '?'); - $q_part = "(".implode(',', $q_part).")"; + // prepare all rows to be inserted with placeholders for vars (\?) + $q_part = array_fill(0, count($fields), '?'); + $q_part = "(" . implode(',', $q_part) . ")"; - $q_part = array_fill(0, count($data), $q_part); - $query .= implode(',', $q_part); + $q_part = array_fill(0, count($data), $q_part); + $query .= implode(',', $q_part); - $pst = $this->pdo()->prepare($query); + $pst = $this->pdo()->prepare($query); - $i = 1; - foreach ($data as $row) { - // make sure the fields of this row are identical to first row - $diff_keys = array_diff_key($fields, array_keys($row)); + $i = 1; + foreach ($data as $row) { + // make sure the fields of this row are identical to first row + $diff_keys = array_diff_key($fields, array_keys($row)); - if (!empty($diff_keys)) { - continue; - } - foreach ($fields as $field) { - $pst->bindParam($i++, $row[$field]); - } - } + if (!empty($diff_keys)) { + continue; + } + foreach ($fields as $field) { + $pst->bindParam($i++, $row[$field]); + } + } - try { - $this->last = $pst->execute(); - } catch (\PDOException $e) { - $this->error($e); - } - return $this->last; - } + try { + $this->last = $pst->execute(); + } catch (\PDOException $e) { + $this->error($e); + } + return $this->last; + } - /** - * Check if a certain table exists. - * @param string $table - * @return boolean - */ - public function ifTableExists($table) { - $table = $this->quote($table); - $db = $this->quote($this->getDbName()); + /** + * Check if a certain table exists. + * @param string $table + * @return boolean + */ + public function ifTableExists($table) + { + $table = $this->quote($table); + $db = $this->quote($this->getDbName()); - $if_exists = "SELECT COUNT(*) AS `cnt` + $if_exists = "SELECT COUNT(*) AS `cnt` FROM `information_schema`.`tables` WHERE `table_schema` = {$db} AND `table_name` = {$table}; "; - $if_exists = $this->query($if_exists); + $if_exists = $this->query($if_exists); - if (isset($if_exists[0]['cnt']) && $if_exists[0]['cnt'] == 1) { - return true; - } else { - false; - } - } + if (isset($if_exists[0]['cnt']) && $if_exists[0]['cnt'] == 1) { + return true; + } else { + false; + } + } - /** - * Quote a string - * @param string $value - * @return string - */ - public function quote($value) { - return $this->pdo()->quote($value); - } + /** + * Quote a string + * @param string $value + * @return string + */ + public function quote($value) + { + return $this->pdo()->quote($value); + } - /** - * Get the PDO object - * @return \PDO - */ - public function pdo() { - return $this->pdo; - } + /** + * Get the PDO object + * @return \PDO + */ + public function pdo() + { + return $this->pdo; + } - /** - * Get number of rows of last statement - * @return int number of rows - */ - public function getNumRows() { - return $this->last->rowCount(); - } + /** + * Get number of rows of last statement + * @return int number of rows + */ + public function getNumRows() + { + return $this->last->rowCount(); + } - /** - * Get the last inserted id after an insert - * @return int - */ - public function getLastInsertedId() { - return $this->pdo()->lastInsertId(); - } + /** + * Get the last inserted id after an insert + * @return int + */ + public function getLastInsertedId() + { + return $this->pdo()->lastInsertId(); + } - /** - * Build WHERE clause for query - * @param string $table table name - * @param mixed $where can be primary id (eg '2'), can be string (eg 'name=pepe') or can be array - * @return string sql where clause - * @see buildSQLClauseOrderBy() - */ - public function buildSQLClauseWhere($table, $where = null) { + /** + * Build WHERE clause for query + * @param string $table table name + * @param mixed $where can be primary id (eg '2'), can be string (eg 'name=pepe') or can be array + * @return string sql where clause + * @see buildSQLClauseOrderBy() + */ + public function buildSQLClauseWhere($table, $where = null) + { - $query = ''; + $query = ''; - if ($where !== null) { - if (is_array($where)) { - $query .= " WHERE "; + if ($where !== null) { + if (is_array($where)) { + $query .= " WHERE "; - foreach ($where as $field => $value) { - $query .= "`{$table}`.`{$field}`={$this->quote($value)} AND "; - } - $query = substr($query, 0, -5); - } else { - if (strpos($where, '=') === false) { - // no field given, use primary field - $primary = $this->getPrimary($table); - $query .= " WHERE `{$table}`.`{$primary}`={$this->quote($where)}"; - } elseif (strpos(strtolower(trim($where)), 'where') === false) { - $query .= " WHERE {$where}"; - } else { - $query .= ' '.$where; - } - } - } - return $query; - } + foreach ($where as $field => $value) { + $query .= "`{$table}`.`{$field}`={$this->quote($value)} AND "; + } + $query = substr($query, 0, -5); + } else { + if (strpos($where, '=') === false) { + // no field given, use primary field + $primary = $this->getPrimary($table); + $query .= " WHERE `{$table}`.`{$primary}`={$this->quote($where)}"; + } elseif (strpos(strtolower(trim($where)), 'where') === false) { + $query .= " WHERE {$where}"; + } else { + $query .= ' ' . $where; + } + } + } + return $query; + } - /** - * Build ORDER BY clause for a query - * @param mixed $order_by can be string (with or without order by) or array - * @param string $direction - * @return string sql order by clause - * @see buildSQLClauseWhere() - */ - public function buildSQLClauseOrderBy($order_by, $direction) { - $query = ''; + /** + * Build ORDER BY clause for a query + * @param mixed $order_by can be string (with or without order by) or array + * @param string $direction + * @return string sql order by clause + * @see buildSQLClauseWhere() + */ + public function buildSQLClauseOrderBy($order_by, $direction) + { + $query = ''; - if ($order_by !== null) { - if (is_array($order_by)) { - $query .= " ORDER BY "; + if ($order_by !== null) { + if (is_array($order_by)) { + $query .= " ORDER BY "; - foreach ($order_by as $field) { - $query .= "`{$field}`, "; - } - // remove trailing ", " - $query = substr($query, 0, -2); - } else { - if (strpos(strtolower(trim($order_by)), 'order by') === false) { - $query .= " ORDER BY {$order_by}"; - } else { - $query .= ' '.$order_by; - } - } - } - if (strlen($query) > 0) { - // check if "ASC" or "DESC" is already in the order by clause - if (strpos(strtolower(trim($query)), 'asc') === false && strpos(strtolower(trim($query)), 'desc') === false) { - $query .= ' '.$direction; - } - } + foreach ($order_by as $field) { + $query .= "`{$field}`, "; + } + // remove trailing ", " + $query = substr($query, 0, -2); + } else { + if (strpos(strtolower(trim($order_by)), 'order by') === false) { + $query .= " ORDER BY {$order_by}"; + } else { + $query .= ' ' . $order_by; + } + } + } + if (strlen($query) > 0) { + // check if "ASC" or "DESC" is already in the order by clause + if ( + strpos(strtolower(trim($query)), 'asc') === false && + strpos(strtolower(trim($query)), 'desc') === false + ) { + $query .= ' ' . $direction; + } + } - return $query; - } + return $query; + } - /** - * Get the host of the current connection - * @return string - */ - public function getDbHost() { - return $this->db_host; - } + /** + * Get the host of the current connection + * @return string + */ + public function getDbHost() + { + return $this->db_host; + } - /** - * Get the db name of the current connection - * @return string - */ - public function getDbName() { - return $this->db_name; - } + /** + * Get the db name of the current connection + * @return string + */ + public function getDbName() + { + return $this->db_name; + } - /** - * Get the db user of the current connection - * @return string - */ - public function getDbUser() { - return $this->db_user; - } + /** + * Get the db user of the current connection + * @return string + */ + public function getDbUser() + { + return $this->db_user; + } - /** - * Get status of the connection - * @return boolean - */ - public function status() { - return $this->status; - } + /** + * Get status of the connection + * @return boolean + */ + public function status() + { + return $this->status; + } - /** - * Connect to the database. - * - * @return resource mysql resource - */ - protected function connect() { - // Initizale connection - try { - $this->pdo = new \PDO( - 'mysql:host='.$this->db_host.';port='.$this->db_port.';dbname='.$this->db_name.';charset=utf8', - $this->db_user, - $this->db_pass - ); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); - $this->status = true; - } catch (\PDOException $e) { - $this->status = false; - return $this->onConnectFailure($e); - } - return $this->pdo; - } + /** + * Connect to the database. + * + * @return resource mysql resource + */ + protected function connect() + { + // Initizale connection + try { + $this->pdo = new \PDO( + 'mysql:host=' . $this->db_host . + ';port=' . $this->db_port . + ';dbname=' . $this->db_name . + ';charset=utf8', + $this->db_user, + $this->db_pass + ); + $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); + $this->status = true; + } catch (\PDOException $e) { + $this->status = false; + return $this->onConnectFailure($e); + } + return $this->pdo; + } - /** - * Is called after connection failure - */ - protected function onConnectFailure(\PDOException $e) { - trigger_error('MySQL connection failed: '.$e->getMessage(), E_USER_WARNING); - return false; - } + /** + * Is called after connection failure + */ + protected function onConnectFailure(\PDOException $e) + { + trigger_error('MySQL connection failed: ' . $e->getMessage(), E_USER_WARNING); + return false; + } - /** - * Disconnect from current link - */ - protected function disconnect() { - $this->pdo = null; - } + /** + * Disconnect from current link + */ + protected function disconnect() + { + $this->pdo = null; + } - /** - * Handle a PDOException - * @param \PDOException $e - */ - protected function error(\PDOException $e) { - trigger_error('SQL error: '.$e->getMessage(), E_USER_WARNING); - } + /** + * Handle a PDOException + * @param \PDOException $e + */ + protected function error(\PDOException $e) + { + trigger_error('SQL error: ' . $e->getMessage(), E_USER_WARNING); + } } diff --git a/src/psm/Service/User.php b/src/psm/Service/User.php index 6906fd93..fb50e475 100644 --- a/src/psm/Service/User.php +++ b/src/psm/Service/User.php @@ -1,4 +1,5 @@ db_connection = $db->pdo(); + /** + * Open a new user service + * + * @param \psm\Service\Database $db + * @param \Symfony\Component\HttpFoundation\Session\SessionInterface $session if NULL, one will be created + */ + public function __construct(Database $db, SessionInterface $session = null) + { + $this->db_connection = $db->pdo(); - if (!psm_is_cli()) { - if ($session == null) { - $session = new Session(); - $session->start(); - } - $this->session = $session; + if (!psm_is_cli()) { + if ($session == null) { + $session = new Session(); + $session->start(); + } + $this->session = $session; - if ((!defined('PSM_INSTALL') || !PSM_INSTALL)) { - // check the possible login actions: - // 1. login via session data (happens each time user opens a page on your php project AFTER he has successfully logged in via the login form) - // 2. login via cookie + if ((!defined('PSM_INSTALL') || !PSM_INSTALL)) { + // check the possible login actions: + // 1. login via session data (happens each time user opens a page on your php project AFTER + // he has successfully logged in via the login form) + // 2. login via cookie - // if user has an active session on the server - if (!$this->loginWithSessionData()) { - $this->loginWithCookieData(); - } - } - } - } + // if user has an active session on the server + if (!$this->loginWithSessionData()) { + $this->loginWithCookieData(); + } + } + } + } - /** - * Get user by id, or get current user. - * @param int $user_id if null it will attempt current user id - * @param boolean $flush if TRUE it will query db regardless of whether we already have the data - * @return object|boolean FALSE if user not found, object otherwise - */ - public function getUser($user_id = null, $flush = false) { - if ($user_id == null) { - if (!$this->isUserLoggedIn()) { - return false; - } else { - $user_id = $this->getUserId(); - } - } + /** + * Get user by id, or get current user. + * @param int $user_id if null it will attempt current user id + * @param boolean $flush if TRUE it will query db regardless of whether we already have the data + * @return object|boolean FALSE if user not found, object otherwise + */ + public function getUser($user_id = null, $flush = false) + { + if ($user_id == null) { + if (!$this->isUserLoggedIn()) { + return false; + } else { + $user_id = $this->getUserId(); + } + } - if (!isset($this->user_data[$user_id]) || $flush) { - $query_user = $this->db_connection->prepare('SELECT * FROM '.PSM_DB_PREFIX.'users WHERE user_id = :user_id'); - $query_user->bindValue(':user_id', $user_id, \PDO::PARAM_INT); - $query_user->execute(); - // get result row (as an object) - $this->user_data[$user_id] = $query_user->fetchObject(); - } - return $this->user_data[$user_id]; - } + if (!isset($this->user_data[$user_id]) || $flush) { + $query_user = $this->db_connection->prepare('SELECT * FROM ' . + PSM_DB_PREFIX . 'users WHERE user_id = :user_id'); + $query_user->bindValue(':user_id', $user_id, \PDO::PARAM_INT); + $query_user->execute(); + // get result row (as an object) + $this->user_data[$user_id] = $query_user->fetchObject(); + } + return $this->user_data[$user_id]; + } - /** - * Search into database for the user data of user_name specified as parameter - * @return object|boolean user data as an object if existing user - */ - public function getUserByUsername($user_name) { - // database query, getting all the info of the selected user - $query_user = $this->db_connection->prepare('SELECT * FROM '.PSM_DB_PREFIX.'users WHERE user_name = :user_name'); - $query_user->bindValue(':user_name', $user_name, \PDO::PARAM_STR); - $query_user->execute(); - // get result row (as an object) - return $query_user->fetchObject(); - } + /** + * Search into database for the user data of user_name specified as parameter + * @return object|boolean user data as an object if existing user + */ + public function getUserByUsername($user_name) + { + // database query, getting all the info of the selected user + $query_user = $this->db_connection->prepare('SELECT * FROM ' . + PSM_DB_PREFIX . 'users WHERE user_name = :user_name'); + $query_user->bindValue(':user_name', $user_name, \PDO::PARAM_STR); + $query_user->execute(); + // get result row (as an object) + return $query_user->fetchObject(); + } - /** - * Logs in with SESSION data. - * - * @return boolean - */ - protected function loginWithSessionData() { - if (!$this->session->has('user_id')) { - return false; - } - $user = $this->getUser($this->session->get('user_id')); + /** + * Logs in with SESSION data. + * + * @return boolean + */ + protected function loginWithSessionData() + { + if (!$this->session->has('user_id')) { + return false; + } + $user = $this->getUser($this->session->get('user_id')); - if (!empty($user)) { - $this->setUserLoggedIn($user->user_id); - return true; - } else { - // user no longer exists in database - // call logout to clean up session vars - $this->doLogout(); - return false; - } - } + if (!empty($user)) { + $this->setUserLoggedIn($user->user_id); + return true; + } else { + // user no longer exists in database + // call logout to clean up session vars + $this->doLogout(); + return false; + } + } - /** - * Logs in via the Cookie - * @return bool success state of cookie login - */ - private function loginWithCookieData() { - if (isset($_COOKIE['rememberme'])) { - // extract data from the cookie - list ($user_id, $token, $hash) = explode(':', $_COOKIE['rememberme']); - // check cookie hash validity - if ($hash == hash('sha256', $user_id.':'.$token.PSM_LOGIN_COOKIE_SECRET_KEY) && !empty($token)) { - // cookie looks good, try to select corresponding user - // get real token from database (and all other data) - $user = $this->getUser($user_id); + /** + * Logs in via the Cookie + * @return bool success state of cookie login + */ + private function loginWithCookieData() + { + if (isset($_COOKIE['rememberme'])) { + // extract data from the cookie + list ($user_id, $token, $hash) = explode(':', $_COOKIE['rememberme']); + // check cookie hash validity + if ($hash == hash('sha256', $user_id . ':' . $token . PSM_LOGIN_COOKIE_SECRET_KEY) && !empty($token)) { + // cookie looks good, try to select corresponding user + // get real token from database (and all other data) + $user = $this->getUser($user_id); - if (!empty($user) && $token === $user->rememberme_token) { - $this->setUserLoggedIn($user->user_id, true); + if (!empty($user) && $token === $user->rememberme_token) { + $this->setUserLoggedIn($user->user_id, true); - // Cookie token usable only once - $this->newRememberMeCookie(); - return true; - } - } - // call logout to remove invalid cookie - $this->doLogout(); - } - return false; - } + // Cookie token usable only once + $this->newRememberMeCookie(); + return true; + } + } + // call logout to remove invalid cookie + $this->doLogout(); + } + return false; + } - /** - * Logs in with the data provided in $_POST, coming from the login form - * @param string $user_name - * @param string $user_password - * @param boolean $user_rememberme - * @return boolean - */ - public function loginWithPostData($user_name, $user_password, $user_rememberme = false) { - $user_name = trim($user_name); - $user_password = trim($user_password); + /** + * Logs in with the data provided in $_POST, coming from the login form + * @param string $user_name + * @param string $user_password + * @param boolean $user_rememberme + * @return boolean + */ + public function loginWithPostData($user_name, $user_password, $user_rememberme = false) + { + $user_name = trim($user_name); + $user_password = trim($user_password); - if (empty($user_name) && empty($user_password)) { - return false; - } - $user = $this->getUserByUsername($user_name); + if (empty($user_name) && empty($user_password)) { + return false; + } + $user = $this->getUserByUsername($user_name); - // using PHP 5.5's password_verify() function to check if the provided passwords fits to the hash of that user's password - if (!isset($user->user_id)) { - password_verify($user_password, 'dummy_call_against_timing'); - return false; - } else if (!password_verify($user_password, $user->password)) { - return false; - } + // using PHP 5.5's password_verify() function to check if the provided passwords + // fits to the hash of that user's password + if (!isset($user->user_id)) { + password_verify($user_password, 'dummy_call_against_timing'); + return false; + } elseif (!password_verify($user_password, $user->password)) { + return false; + } - $this->setUserLoggedIn($user->user_id, true); + $this->setUserLoggedIn($user->user_id, true); - // if user has check the "remember me" checkbox, then generate token and write cookie - if ($user_rememberme) { - $this->newRememberMeCookie(); - } + // if user has check the "remember me" checkbox, then generate token and write cookie + if ($user_rememberme) { + $this->newRememberMeCookie(); + } - // recalculate the user's password hash - // DELETE this if-block if you like, it only exists to recalculate users's hashes when you provide a cost factor, - // by default the script will use a cost factor of 10 and never change it. - // check if the have defined a cost factor in config/hashing.php - if (defined('PSM_LOGIN_HASH_COST_FACTOR')) { - // check if the hash needs to be rehashed - if (password_needs_rehash($user->password, PASSWORD_DEFAULT, array('cost' => PSM_LOGIN_HASH_COST_FACTOR))) { - $this->changePassword($user->user_id, $user_password); - } - } - return true; - } + // recalculate the user's password hash + // DELETE this if-block if you like, it only exists to recalculate + // users's hashes when you provide a cost factor, + // by default the script will use a cost factor of 10 and never change it. + // check if the have defined a cost factor in config/hashing.php + if (defined('PSM_LOGIN_HASH_COST_FACTOR')) { + // check if the hash needs to be rehashed + if (password_needs_rehash($user->password, PASSWORD_DEFAULT, array('cost' => PSM_LOGIN_HASH_COST_FACTOR))) { + $this->changePassword($user->user_id, $user_password); + } + } + return true; + } - /** - * Set the user logged in - * @param int $user_id - * @param boolean $regenerate regenerate session id against session fixation? - */ - protected function setUserLoggedIn($user_id, $regenerate = false) { - if ($regenerate) { - $this->session->invalidate(); - } - $this->session->set('user_id', $user_id); - $this->session->set('user_logged_in', 1); + /** + * Set the user logged in + * @param int $user_id + * @param boolean $regenerate regenerate session id against session fixation? + */ + protected function setUserLoggedIn($user_id, $regenerate = false) + { + if ($regenerate) { + $this->session->invalidate(); + } + $this->session->set('user_id', $user_id); + $this->session->set('user_logged_in', 1); - // declare user id, set the login status to true - $this->user_id = $user_id; - $this->user_is_logged_in = true; - } + // declare user id, set the login status to true + $this->user_id = $user_id; + $this->user_is_logged_in = true; + } - /** - * Create all data needed for remember me cookie connection on client and server side - */ - protected function newRememberMeCookie() { - // generate 64 char random string and store it in current user data - $random_token_string = hash('sha256', mt_rand()); - $sth = $this->db_connection->prepare('UPDATE '.PSM_DB_PREFIX.'users SET rememberme_token = :user_rememberme_token WHERE user_id = :user_id'); - $sth->execute(array(':user_rememberme_token' => $random_token_string, ':user_id' => $this->getUserId())); + /** + * Create all data needed for remember me cookie connection on client and server side + */ + protected function newRememberMeCookie() + { + // generate 64 char random string and store it in current user data + $random_token_string = hash('sha256', mt_rand()); + $sth = $this->db_connection->prepare('UPDATE ' . + PSM_DB_PREFIX . 'users SET rememberme_token = :user_rememberme_token WHERE user_id = :user_id'); + $sth->execute(array(':user_rememberme_token' => $random_token_string, ':user_id' => $this->getUserId())); - // generate cookie string that consists of userid, randomstring and combined hash of both - $cookie_string_first_part = $this->getUserId().':'.$random_token_string; - $cookie_string_hash = hash('sha256', $cookie_string_first_part.PSM_LOGIN_COOKIE_SECRET_KEY); - $cookie_string = $cookie_string_first_part.':'.$cookie_string_hash; + // generate cookie string that consists of userid, randomstring and combined hash of both + $cookie_string_first_part = $this->getUserId() . ':' . $random_token_string; + $cookie_string_hash = hash('sha256', $cookie_string_first_part . PSM_LOGIN_COOKIE_SECRET_KEY); + $cookie_string = $cookie_string_first_part . ':' . $cookie_string_hash; - // set cookie - setcookie('rememberme', $cookie_string, time() + PSM_LOGIN_COOKIE_RUNTIME, "/", PSM_LOGIN_COOKIE_DOMAIN); - } + // set cookie + setcookie('rememberme', $cookie_string, time() + PSM_LOGIN_COOKIE_RUNTIME, "/", PSM_LOGIN_COOKIE_DOMAIN); + } - /** - * Delete all data needed for remember me cookie connection on client and server side - */ - protected function deleteRememberMeCookie() { - // Reset rememberme token - if ($this->session->has('user_id')) { - $sth = $this->db_connection->prepare('UPDATE '.PSM_DB_PREFIX.'users SET rememberme_token = NULL WHERE user_id = :user_id'); - $sth->execute(array(':user_id' => $this->session->get('user_id'))); - } + /** + * Delete all data needed for remember me cookie connection on client and server side + */ + protected function deleteRememberMeCookie() + { + // Reset rememberme token + if ($this->session->has('user_id')) { + $sth = $this->db_connection->prepare('UPDATE ' . + PSM_DB_PREFIX . 'users SET rememberme_token = NULL WHERE user_id = :user_id'); + $sth->execute(array(':user_id' => $this->session->get('user_id'))); + } - // set the rememberme-cookie to ten years ago (3600sec * 365 days * 10). - // that's obivously the best practice to kill a cookie via php - // @see http://stackoverflow.com/a/686166/1114320 - setcookie('rememberme', false, time() - (3600 * 3650), '/', PSM_LOGIN_COOKIE_DOMAIN); - } + // set the rememberme-cookie to ten years ago (3600sec * 365 days * 10). + // that's obivously the best practice to kill a cookie via php + // @see http://stackoverflow.com/a/686166/1114320 + setcookie('rememberme', false, time() - (3600 * 3650), '/', PSM_LOGIN_COOKIE_DOMAIN); + } - /** - * Perform the logout, resetting the session - */ - public function doLogout() { - $this->deleteRememberMeCookie(); + /** + * Perform the logout, resetting the session + */ + public function doLogout() + { + $this->deleteRememberMeCookie(); - $this->session->clear(); - $this->session->invalidate(); + $this->session->clear(); + $this->session->invalidate(); - $this->user_is_logged_in = false; - } + $this->user_is_logged_in = false; + } - /** - * Simply return the current state of the user's login - * @return bool user's login status - */ - public function isUserLoggedIn() { - return $this->user_is_logged_in; - } + /** + * Simply return the current state of the user's login + * @return bool user's login status + */ + public function isUserLoggedIn() + { + return $this->user_is_logged_in; + } - /** - * Sets a random token into the database (that will verify the user when he/she comes back via the link - * in the email) and returns it - * @param int $user_id - * @return string|boolean FALSE on error, string otherwise - */ - public function generatePasswordResetToken($user_id) { - $user_id = intval($user_id); + /** + * Sets a random token into the database (that will verify the user when he/she comes back via the link + * in the email) and returns it + * @param int $user_id + * @return string|boolean FALSE on error, string otherwise + */ + public function generatePasswordResetToken($user_id) + { + $user_id = intval($user_id); - if ($user_id == 0) { - return false; - } - // generate timestamp (to see when exactly the user (or an attacker) requested the password reset mail) - $temporary_timestamp = time(); - // generate random hash for email password reset verification (40 char string) - $user_password_reset_hash = sha1(uniqid(mt_rand(), true)); + if ($user_id == 0) { + return false; + } + // generate timestamp (to see when exactly the user (or an attacker) requested the password reset mail) + $temporary_timestamp = time(); + // generate random hash for email password reset verification (40 char string) + $user_password_reset_hash = sha1(uniqid(mt_rand(), true)); - $query_update = $this->db_connection->prepare('UPDATE '.PSM_DB_PREFIX.'users SET password_reset_hash = :user_password_reset_hash, - password_reset_timestamp = :user_password_reset_timestamp - WHERE user_id = :user_id'); - $query_update->bindValue(':user_password_reset_hash', $user_password_reset_hash, \PDO::PARAM_STR); - $query_update->bindValue(':user_password_reset_timestamp', $temporary_timestamp, \PDO::PARAM_INT); - $query_update->bindValue(':user_id', $user_id, \PDO::PARAM_INT); - $query_update->execute(); + $query_update = $this->db_connection->prepare('UPDATE ' . + PSM_DB_PREFIX . 'users SET password_reset_hash = :user_password_reset_hash, + password_reset_timestamp = :user_password_reset_timestamp + WHERE user_id = :user_id'); + $query_update->bindValue(':user_password_reset_hash', $user_password_reset_hash, \PDO::PARAM_STR); + $query_update->bindValue(':user_password_reset_timestamp', $temporary_timestamp, \PDO::PARAM_INT); + $query_update->bindValue(':user_id', $user_id, \PDO::PARAM_INT); + $query_update->execute(); - // check if exactly one row was successfully changed: - if ($query_update->rowCount() == 1) { - return $user_password_reset_hash; - } else { - return false; - } - } + // check if exactly one row was successfully changed: + if ($query_update->rowCount() == 1) { + return $user_password_reset_hash; + } else { + return false; + } + } - /** - * Checks if the verification string in the account verification mail is valid and matches to the user. - * - * Please note it is valid for 1 hour. - * @param int $user_id - * @param string $token - * @return boolean - */ - public function verifyPasswordResetToken($user_id, $token) { - $user_id = intval($user_id); + /** + * Checks if the verification string in the account verification mail is valid and matches to the user. + * + * Please note it is valid for 1 hour. + * @param int $user_id + * @param string $token + * @return boolean + */ + public function verifyPasswordResetToken($user_id, $token) + { + $user_id = intval($user_id); - if (empty($user_id) || empty($token)) { - return false; - } - $user = $this->getUser($user_id); + if (empty($user_id) || empty($token)) { + return false; + } + $user = $this->getUser($user_id); - if (isset($user->user_id) && $user->password_reset_hash == $token) { - $runtime = (defined('PSM_LOGIN_RESET_RUNTIME')) ? PSM_LOGIN_RESET_RUNTIME : 3600; - $timestamp_max_interval = time() - $runtime; + if (isset($user->user_id) && $user->password_reset_hash == $token) { + $runtime = (defined('PSM_LOGIN_RESET_RUNTIME')) ? PSM_LOGIN_RESET_RUNTIME : 3600; + $timestamp_max_interval = time() - $runtime; - if ($user->password_reset_timestamp > $timestamp_max_interval) { - return true; - } - } - return false; - } + if ($user->password_reset_timestamp > $timestamp_max_interval) { + return true; + } + } + return false; + } - /** - * Change the password of a user - * @param int|\PDOStatement $user_id - * @param string $password - * @return boolean TRUE on success, FALSE on failure - */ - public function changePassword($user_id, $password) { - $user_id = intval($user_id); + /** + * Change the password of a user + * @param int|\PDOStatement $user_id + * @param string $password + * @return boolean TRUE on success, FALSE on failure + */ + public function changePassword($user_id, $password) + { + $user_id = intval($user_id); - if (empty($user_id) || empty($password)) { - return false; - } - // now it gets a little bit crazy: check if we have a constant PSM_LOGIN_HASH_COST_FACTOR defined (in src/includes/psmconfig.inc.php), - // if so: put the value into $hash_cost_factor, if not, make $hash_cost_factor = null - $hash_cost_factor = (defined('PSM_LOGIN_HASH_COST_FACTOR') ? PSM_LOGIN_HASH_COST_FACTOR : null); + if (empty($user_id) || empty($password)) { + return false; + } + // now it gets a little bit crazy: check if we have a constant + // PSM_LOGIN_HASH_COST_FACTOR defined (in src/includes/psmconfig.inc.php), + // if so: put the value into $hash_cost_factor, if not, make $hash_cost_factor = null + $hash_cost_factor = (defined('PSM_LOGIN_HASH_COST_FACTOR') ? PSM_LOGIN_HASH_COST_FACTOR : null); - // crypt the user's password with the PHP 5.5's password_hash() function, results in a 60 character hash string - // the PASSWORD_DEFAULT constant is defined by the PHP 5.5, or if you are using PHP 5.3/5.4, by the password hashing - // compatibility library. the third parameter looks a little bit shitty, but that's how those PHP 5.5 functions - // want the parameter: as an array with, currently only used with 'cost' => XX. - $user_password_hash = password_hash($password, PASSWORD_DEFAULT, array('cost' => $hash_cost_factor)); + // crypt the user's password with the PHP 5.5's password_hash() function, results in a 60 character hash string + // the PASSWORD_DEFAULT constant is defined by the PHP 5.5, + // or if you are using PHP 5.3/5.4, by the password hashing + // compatibility library. the third parameter looks a little bit shitty, but that's how those PHP 5.5 functions + // want the parameter: as an array with, currently only used with 'cost' => XX. + $user_password_hash = password_hash($password, PASSWORD_DEFAULT, array('cost' => $hash_cost_factor)); - // write users new hash into database - $query_update = $this->db_connection->prepare('UPDATE '.PSM_DB_PREFIX.'users SET password = :user_password_hash, - password_reset_hash = NULL, password_reset_timestamp = NULL - WHERE user_id = :user_id'); - $query_update->bindValue(':user_password_hash', $user_password_hash, \PDO::PARAM_STR); - $query_update->bindValue(':user_id', $user_id, \PDO::PARAM_STR); - $query_update->execute(); + // write users new hash into database + $query_update = $this->db_connection->prepare('UPDATE ' . + PSM_DB_PREFIX . 'users SET password = :user_password_hash, + password_reset_hash = NULL, password_reset_timestamp = NULL + WHERE user_id = :user_id'); + $query_update->bindValue(':user_password_hash', $user_password_hash, \PDO::PARAM_STR); + $query_update->bindValue(':user_id', $user_id, \PDO::PARAM_STR); + $query_update->execute(); - // check if exactly one row was successfully changed: - if ($query_update->rowCount() == 1) { - return true; - } else { - return false; - } - } + // check if exactly one row was successfully changed: + if ($query_update->rowCount() == 1) { + return true; + } else { + return false; + } + } - /** - * Gets the user id - * @return int - */ - public function getUserId() { - return $this->user_id; - } + /** + * Gets the user id + * @return int + */ + public function getUserId() + { + return $this->user_id; + } - /** - * Gets the username - * @return string - */ - public function getUsername() { - $user = $this->getUser(); - return (isset($user->user_name) ? $user->user_name : null); - } + /** + * Gets the username + * @return string + */ + public function getUsername() + { + $user = $this->getUser(); + return (isset($user->user_name) ? $user->user_name : null); + } - /** - * Gets the user level - * @return int - */ - public function getUserLevel() { - $user = $this->getUser(); + /** + * Gets the user level + * @return int + */ + public function getUserLevel() + { + $user = $this->getUser(); - if (isset($user->level)) { - return $user->level; - } else { - return PSM_USER_ANONYMOUS; - } - } + if (isset($user->level)) { + return $user->level; + } else { + return PSM_USER_ANONYMOUS; + } + } - /** - * read current user preferences from the database - * @return boolean return false is user not connected - */ - protected function loadPreferences() { - if ($this->user_preferences === null) { - if (!$this->getUser()) { - return false; - } + /** + * read current user preferences from the database + * @return boolean return false is user not connected + */ + protected function loadPreferences() + { + if ($this->user_preferences === null) { + if (!$this->getUser()) { + return false; + } - $this->user_preferences = array(); - foreach ($this->db_connection->query('SELECT `key`,`value` FROM `'.PSM_DB_PREFIX.'users_preferences` WHERE `user_id` = '.$this->user_id) as $row) { - $this->user_preferences[$row['key']] = $row['value']; - } - } - return true; - } + $this->user_preferences = array(); + foreach ( + $this->db_connection->query('SELECT `key`,`value` FROM `' . + PSM_DB_PREFIX . 'users_preferences` WHERE `user_id` = ' . $this->user_id) as $row + ) { + $this->user_preferences[$row['key']] = $row['value']; + } + } + return true; + } - /** - * Get a user preference value - * @param string $key - * @param mixed $default - * @return mixed - */ - public function getUserPref($key, $default = '') { - if (!$this->loadPreferences() || !isset($this->user_preferences[$key])) { - return $default; - } + /** + * Get a user preference value + * @param string $key + * @param mixed $default + * @return mixed + */ + public function getUserPref($key, $default = '') + { + if (!$this->loadPreferences() || !isset($this->user_preferences[$key])) { + return $default; + } - $value = $this->user_preferences[$key]; - settype($value, gettype($default)); - return $value; - } + $value = $this->user_preferences[$key]; + settype($value, gettype($default)); + return $value; + } - /** - * Set a user preference value - * @param string $key - * @param mixed $value - */ - public function setUserPref($key, $value) { - if ($this->loadPreferences()) { - if (isset($this->user_preferences[$key])) { - if ($this->user_preferences[$key] == $value) { - return; // no change - } - $sql = 'UPDATE `'.PSM_DB_PREFIX.'users_preferences` SET `key` = ?, `value` = ? WHERE `user_id` = ?'; - } else { - $sql = 'INSERT INTO `'.PSM_DB_PREFIX.'users_preferences` SET `key` = ?, `value` = ?, `user_id` = ?'; - } - $sth = $this->db_connection->prepare($sql); - $sth->execute(array($key, $value, $this->user_id)); - $this->user_preferences[$key] = $value; - } - } + /** + * Set a user preference value + * @param string $key + * @param mixed $value + */ + public function setUserPref($key, $value) + { + if ($this->loadPreferences()) { + if (isset($this->user_preferences[$key])) { + if ($this->user_preferences[$key] == $value) { + return; // no change + } + $sql = 'UPDATE `' . PSM_DB_PREFIX . 'users_preferences` SET `key` = ?, `value` = ? WHERE `user_id` = ?'; + } else { + $sql = 'INSERT INTO `' . PSM_DB_PREFIX . 'users_preferences` SET `key` = ?, `value` = ?, `user_id` = ?'; + } + $sth = $this->db_connection->prepare($sql); + $sth->execute(array($key, $value, $this->user_id)); + $this->user_preferences[$key] = $value; + } + } - /** - * Get session object - * @return \Symfony\Component\HttpFoundation\Session\SessionInterface - */ - public function getSession() { - return $this->session; - } + /** + * Get session object + * @return \Symfony\Component\HttpFoundation\Session\SessionInterface + */ + public function getSession() + { + return $this->session; + } } diff --git a/src/psm/Txtmsg/CMBulkSMS.php b/src/psm/Txtmsg/CMBulkSMS.php index 3ee1a83a..a009d252 100644 --- a/src/psm/Txtmsg/CMBulkSMS.php +++ b/src/psm/Txtmsg/CMBulkSMS.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Axel Wehner - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.2.1 + * @package phpservermon + * @author Axel Wehner + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.2.1 **/ namespace psm\Txtmsg; @@ -36,195 +37,200 @@ namespace psm\Txtmsg; * * Requirements: cURL v7.18.1+ and OpenSSL 0.9.8j+ */ -class CMBulkSMS extends Core { - /** @var bool True when cURL request succeeded */ - public $result = true; +class CMBulkSMS extends Core +{ + /** @var bool True when cURL request succeeded */ + public $result = true; - /** @var string Contains error message if cURL request failed */ - public $error = ''; + /** @var string Contains error message if cURL request failed */ + public $error = ''; - /** @var bool Set to true for debug output/logging */ - protected $debug = false; + /** @var bool Set to true for debug output/logging */ + protected $debug = false; - /** @var bool Set to false if your operator isn't able to handle multipart messages */ - protected $multipartMessage = true; + /** @var bool Set to false if your operator isn't able to handle multipart messages */ + protected $multipartMessage = true; - /** @var string|null Gateway API URL uses const GATEWAY_URL_XML or GATEWAY_URL_JSON */ - protected $apiUrl; + /** @var string|null Gateway API URL uses const GATEWAY_URL_XML or GATEWAY_URL_JSON */ + protected $apiUrl; - /** @var string Gateway API Type: Use 'json' (default) or 'xml' */ - protected $apiType = 'json'; + /** @var string Gateway API Type: Use 'json' (default) or 'xml' */ + protected $apiType = 'json'; - /** @var string|null JSON or XML message for cURL request */ - protected $request; + /** @var string|null JSON or XML message for cURL request */ + protected $request; - /** @var string|null HTTP Content-Type for cURL request */ - protected $contentType; + /** @var string|null HTTP Content-Type for cURL request */ + protected $contentType; - /** @var string|null Raw sms text message */ - protected $messageBody; + /** @var string|null Raw sms text message */ + protected $messageBody; - /** @var string JSON Gateway API URL */ - const GATEWAY_URL_JSON = "https://gw.cmtelecom.com/v1.0/message"; + /** @var string JSON Gateway API URL */ + public const GATEWAY_URL_JSON = "https://gw.cmtelecom.com/v1.0/message"; - /** @var string XML Gateway API URL */ - const GATEWAY_URL_XML = "https://sgw01.cm.nl/gateway.ashx"; + /** @var string XML Gateway API URL */ + public const GATEWAY_URL_XML = "https://sgw01.cm.nl/gateway.ashx"; - /** - * Build the message and send cURL request to the sms gateway - * - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests - * @param string $message Your text message - * @return bool|string true when cURL request was successful, otherwise string with error message - */ - public function sendSMS($message) { - // Check if recipient and text message are available - if (count($this->recipients) < 1 || empty($message)) { - return false; - } + /** + * Build the message and send cURL request to the sms gateway + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @param string $message Your text message + * @return bool|string true when cURL request was successful, otherwise string with error message + */ + public function sendSMS($message) + { + // Check if recipient and text message are available + if (count($this->recipients) < 1 || empty($message)) { + return false; + } - // Prepare the message in CM's XML or JSON format - switch ($this->apiType) { - case 'xml': - $this->request = $this->buildMessageXml(); - $this->contentType = 'Content-Type: application/xml'; - $this->apiUrl = self::GATEWAY_URL_XML; - break; + // Prepare the message in CM's XML or JSON format + switch ($this->apiType) { + case 'xml': + $this->request = $this->buildMessageXml(); + $this->contentType = 'Content-Type: application/xml'; + $this->apiUrl = self::GATEWAY_URL_XML; + break; - case 'json': - default: - $this->request = $this->buildMessageJson(); - $this->contentType = 'Content-Type: application/json'; - $this->apiUrl = self::GATEWAY_URL_JSON; - break; - } + case 'json': + default: + $this->request = $this->buildMessageJson(); + $this->contentType = 'Content-Type: application/json'; + $this->apiUrl = self::GATEWAY_URL_JSON; + break; + } - $request = $this->executeCurlRequest(); + $request = $this->executeCurlRequest(); - return $request; - } + return $request; + } - /** - * Create a JSON batch sms message using CM's format - * - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart - * @return string JSON message object - */ - protected function buildMessageJson() { - // Prepare recipient array for batch message - $recipients = array(); - foreach ($this->recipients as $recipient) { - $recipients[] = array('number' => $recipient); - } + /** + * Create a JSON batch sms message using CM's format + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart + * @return string JSON message object + */ + protected function buildMessageJson() + { + // Prepare recipient array for batch message + $recipients = array(); + foreach ($this->recipients as $recipient) { + $recipients[] = array('number' => $recipient); + } - // Build message array in CM's Bulk SMS format - $msgArray = array( - 'messages' => array( - 'authentication' => array( - 'producttoken' => $this->password - ), - 'msg' => array( - array( - 'from' => substr($this->originator, 0, 11), - 'to' => $recipients, - 'body' => array( - 'content' => $message - ) - ) - ) - ) - ); + // Build message array in CM's Bulk SMS format + $msgArray = array( + 'messages' => array( + 'authentication' => array( + 'producttoken' => $this->password + ), + 'msg' => array( + array( + 'from' => substr($this->originator, 0, 15), + 'to' => $recipients, + 'body' => array( + 'content' => $message + ) + ) + ) + ) + ); - // Multipart message - if ($this->multipartMessage) { - $msgArray['messages']['msg'][0]['minimumNumberOfMessageParts'] = 1; - $msgArray['messages']['msg'][0]['maximumNumberOfMessageParts'] = 8; - } + // Multipart message + if ($this->multipartMessage) { + $msgArray['messages']['msg'][0]['minimumNumberOfMessageParts'] = 1; + $msgArray['messages']['msg'][0]['maximumNumberOfMessageParts'] = 8; + } - // Convert array in JSON object - return json_encode($msgArray); - } + // Convert array in JSON object + return json_encode($msgArray); + } - /** - * Create a XML batch sms message in CM's format - * - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests - * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart - * @return string XML message - */ - protected function buildMessageXml() { - // Create XML string - $xml = new \SimpleXMLElement(''); + /** + * Create a XML batch sms message in CM's format + * + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cbatch_messages + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Csample_requests + * @see https://docs.cmtelecom.com/bulk-sms/v1.0#/send_a_message%7Cmultipart + * @return string XML message + */ + protected function buildMessageXml() + { + // Create XML string + $xml = new \SimpleXMLElement(''); - // API-Token - $auth = $xml->addChild('AUTHENTICATION'); - $auth->addChild('PRODUCTTOKEN', $this->password); + // API-Token + $auth = $xml->addChild('AUTHENTICATION'); + $auth->addChild('PRODUCTTOKEN', $this->password); - // Message - $msg = $xml->addChild('MSG'); + // Message + $msg = $xml->addChild('MSG'); - // From - $msg->addChild('FROM', substr($this->originator, 0, 11)); + // From + $msg->addChild('FROM', substr($this->originator, 0, 15)); - // Recipients - foreach ($this->recipients as $recipient) { - $msg->addChild('TO', $recipient); - } + // Recipients + foreach ($this->recipients as $recipient) { + $msg->addChild('TO', $recipient); + } - // Multipart message - if ($this->multipartMessage) { - $msg->addChild('MINIMUMNUMBEROFMESSAGEPARTS', 1); - $msg->addChild('MAXIMUMNUMBEROFMESSAGEPARTS', 8); - } + // Multipart message + if ($this->multipartMessage) { + $msg->addChild('MINIMUMNUMBEROFMESSAGEPARTS', 1); + $msg->addChild('MAXIMUMNUMBEROFMESSAGEPARTS', 8); + } - // Add body text - $msg->addChild('BODY', $message); + // Add body text + $msg->addChild('BODY', $message); - return $xml->asXML(); - } + return $xml->asXML(); + } - /** - * Create and execute the curl request - * - * @return boolean|string boolean if message is sent, else string - */ + /** + * Create and execute the curl request + * + * @return boolean|string boolean if message is sent, else string + */ - protected function executeCurlRequest() { - $cr = curl_init(); - curl_setopt_array($cr, array( - CURLOPT_URL => $this->apiUrl, - CURLOPT_HTTPHEADER => array($this->contentType), - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => $this->request, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_FAILONERROR => true - ) - ); + protected function executeCurlRequest() + { + $cr = curl_init(); + curl_setopt_array($cr, array( + CURLOPT_URL => $this->apiUrl, + CURLOPT_HTTPHEADER => array($this->contentType), + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => $this->request, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FAILONERROR => true + )); - // execute curl request and fetch the response/error - $cResponse = curl_exec($cr); - $cError = curl_error($cr); - $cErrorCode = curl_errno($cr); - curl_close($cr); + // execute curl request and fetch the response/error + $cResponse = curl_exec($cr); + $cError = curl_error($cr); + $cErrorCode = curl_errno($cr); + curl_close($cr); - // set result and log error if needed - if ($cError) { - $this->error = 'Response: CM SMS API:'.$cResponse.' cURL Error Code: '.$cErrorCode.'"'.$cError.'"'; - error_log($this->error, E_USER_ERROR); - $this->result = false; - } + // set result and log error if needed + if ($cError) { + $this->error = 'Response: CM SMS API:' . $cResponse . ' cURL Error Code: ' . + $cErrorCode . '"' . $cError . '"'; + error_log($this->error, E_USER_ERROR); + $this->result = false; + } - // Debug output - // Note: CM's XML gateway gives no response when message is sent successfully :/ - if ($this->debug || PSM_DEBUG) { - $debug = '
    Request: '.$this->request.'
    Response: '.$cResponse.'
    '; - error_log("Request: $this->request\r\nResponse: $cResponse", E_USER_NOTICE); - echo $debug; - } + // Debug output + // Note: CM's XML gateway gives no response when message is sent successfully :/ + if ($this->debug || PSM_DEBUG) { + $debug = '
    Request: ' . $this->request . '
    Response: ' . $cResponse . '
    '; + error_log("Request: $this->request\r\nResponse: $cResponse", E_USER_NOTICE); + echo $debug; + } - return $this->result ? $this->result : $this->error; - } + return $this->result ? $this->result : $this->error; + } } diff --git a/src/psm/Txtmsg/Callr.php b/src/psm/Txtmsg/Callr.php index 71311e48..524d62d2 100644 --- a/src/psm/Txtmsg/Callr.php +++ b/src/psm/Txtmsg/Callr.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.3.0 + * @package phpservermon + * @author Ward Pieters + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.3.0 **/ namespace psm\Txtmsg; -class Callr extends Core { +class Callr extends Core +{ - /** - * Send sms using the Callr API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipient - * - * @var mixed $result - * @var array $headers - * - * @var resource $curl - * @var string $err - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - foreach ($this->recipients as $recipient) { - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => "https://api.callr.com/rest/v1.1/sms", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => json_encode( - array( - "to" => $recipient, - "from" => $this->originator, - "body" => urlencode($message), - "options" => null, - ) - ), - CURLOPT_HTTPHEADER => array( - "authorization: Basic ".base64_encode($this->username.":".$this->password), - "content-type: application/json" - ), - )); - - $result = json_decode(curl_exec($curl), true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); + /** + * Send sms using the Callr API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipient + * + * @var mixed $result + * @var array $headers + * + * @var resource $curl + * @var string $err + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + foreach ($this->recipients as $recipient) { + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_URL => "https://api.callr.com/rest/v1.1/sms", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => json_encode( + array( + "to" => $recipient, + "from" => $this->originator, + "body" => urlencode($message), + "options" => null, + ) + ), + CURLOPT_HTTPHEADER => array( + "authorization: Basic " . base64_encode($this->username . ":" . $this->password), + "content-type: application/json" + ), + )); + + $result = json_decode(curl_exec($curl), true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); - if ($err != 0 || $httpcode != 200 || $result['status'] == "error") { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". Result: ".$result['data']['code']." - ".$result['data']['message']; - } - curl_close($curl); - } - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($err != 0 || $httpcode != 200 || $result['status'] == "error") { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . curl_strerror($err) . + ". Result: " . $result['data']['code'] . " - " . $result['data']['message']; + } + curl_close($curl); + } + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/ClickSend.php b/src/psm/Txtmsg/ClickSend.php index fe116a30..b62261a0 100644 --- a/src/psm/Txtmsg/ClickSend.php +++ b/src/psm/Txtmsg/ClickSend.php @@ -1,4 +1,5 @@ password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipients - * - * @var resource $curl - * @var string $err - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - if (empty($this->recipients)) { - return false; - } - - $data = array('messages' => array()); - foreach ($this->recipients as $recipient) { - $data['messages'][] = array( - 'source' => 'phpservermon', - 'from' => substr($this->originator, 0, 11), - 'to' => $recipient, - 'body' => $message, - ); - } - - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => "https://rest.clicksend.com/v3/sms/send", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => "", - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => json_encode($data), - CURLOPT_HTTPHEADER => array( - "authorization: Basic ".base64_encode($this->username.":".$this->password), - "content-type: application/json" - ), - )); - - $result = json_decode(curl_exec($curl), true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - - if ($err != 0 || ($httpcode != '200' && $httpcode != '201' && $httpcode != '202' && $result['response_code'] != "SUCCESS")) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". Result: ".$result.""; - } - curl_close($curl); - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file +class ClickSend extends Core +{ + + /** + * Send sms using the SMSgw.NET API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipients + * + * @var resource $curl + * @var string $err + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + if (empty($this->recipients)) { + return false; + } + + $data = array('messages' => array()); + foreach ($this->recipients as $recipient) { + $data['messages'][] = array( + 'source' => 'phpservermon', + 'from' => substr($this->originator, 0, 15), + 'to' => $recipient, + 'body' => $message, + ); + } + + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_URL => "https://rest.clicksend.com/v3/sms/send", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => json_encode($data), + CURLOPT_HTTPHEADER => array( + "authorization: Basic " . base64_encode($this->username . ":" . $this->password), + "content-type: application/json" + ), + )); + + $result = json_decode(curl_exec($curl), true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + + if ( + $err != 0 || + ($httpcode != '200' && $httpcode != '201' && $httpcode != '202' && $result['response_code'] != "SUCCESS") + ) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". Result: " . $result . ""; + } + curl_close($curl); + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Clickatell.php b/src/psm/Txtmsg/Clickatell.php index 8d26ca8f..655a7a24 100644 --- a/src/psm/Txtmsg/Clickatell.php +++ b/src/psm/Txtmsg/Clickatell.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Pepijn Over - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2018 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link https://www.phpservermonitor.org/ + * @package phpservermon + * @author Pepijn Over + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2018 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link https://www.phpservermonitor.org/ **/ namespace psm\Txtmsg; -class Clickatell extends Core { +class Clickatell extends Core +{ - /** - * Send sms using the Clickatell API - * @var string $message - * @var array $this->recipients - * @var string $recipient - * @var string $this->password - * @var string $this->originator - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ''; - foreach ($this->recipients as $recipient) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, "https://platform.clickatell.com/messages/http/send?apiKey=".urlencode($this->password)."&to=".urlencode($recipient)."&content=".urlencode($message)); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $headers = array(); - $headers[] = "Content-Type: application/x-www-form-urlencoded"; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $result = curl_exec($ch); - curl_close($ch); + /** + * Send sms using the Clickatell API + * @var string $message + * @var array $this->recipients + * @var string $recipient + * @var string $this->password + * @var string $this->originator + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ''; + foreach ($this->recipients as $recipient) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://platform.clickatell.com/messages/http/send?apiKey=" . + urlencode($this->password) . "&to=" . urlencode($recipient) . "&content=" . urlencode($message)); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $headers = array(); + $headers[] = "Content-Type: application/x-www-form-urlencoded"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $result = curl_exec($ch); + curl_close($ch); - // Check on error - if (strpos($result, ",\"errorCode\":null,\"error\":null,\"errorDescription\":null") === False) { - $error = $result; - $success = 0; - } - } - if ($success) { - return 1; - } - return $error; - } + // Check on error + if (strpos($result, ",\"errorCode\":null,\"error\":null,\"errorDescription\":null") === false) { + $error = $result; + $success = 0; + } + } + if ($success) { + return 1; + } + return $error; + } } diff --git a/src/psm/Txtmsg/Core.php b/src/psm/Txtmsg/Core.php index b14fe1de..de49dd25 100644 --- a/src/psm/Txtmsg/Core.php +++ b/src/psm/Txtmsg/Core.php @@ -1,4 +1,5 @@ username = $username; - $this->password = $password; - } + /** + * Define login information for the gateway + * + * @param string $username + * @param string $password + */ + public function setLogin($username, $password) + { + $this->username = $username; + $this->password = $password; + } - /** - * Set the mobile number the text message will be send from - * - * @param string $originator - */ - public function setOriginator($originator) { - $this->originator = $originator; - } + /** + * Set the mobile number the text message will be send from + * + * @param string $originator + */ + public function setOriginator($originator) + { + $this->originator = $originator; + } - /** - * Add new recipient to the list - * - * @param string|int $recipient - */ - public function addRecipients($recipient) { - array_push($this->recipients, $recipient); - } + /** + * Add new recipient to the list + * + * @param string|int $recipient + */ + public function addRecipients($recipient) + { + array_push($this->recipients, $recipient); + } } diff --git a/src/psm/Txtmsg/FreeMobileSMS.php b/src/psm/Txtmsg/FreeMobileSMS.php index ea008012..43a7d2c0 100644 --- a/src/psm/Txtmsg/FreeMobileSMS.php +++ b/src/psm/Txtmsg/FreeMobileSMS.php @@ -1,4 +1,5 @@ password - * @var string $this->username - * - * @var resource $curl - * @var string $err - * @var int $success - * @var string $error - * @var string $http_code - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ""; - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_URL, "https://smsapi.free-mobile.fr/sendmsg?".http_build_query( - array( - "user" => $this->username, - "pass" => $this->password, - "msg" => urlencode($message), - ) - ) - ); +class FreeMobileSMS extends Core +{ + + /** + * Send sms using the FreeMobileSMS API + * + * @var string $message + * @var string $this->password + * @var string $this->username + * + * @var resource $curl + * @var string $err + * @var int $success + * @var string $error + * @var string $http_code + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ""; + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, "https://smsapi.free-mobile.fr/sendmsg?" . http_build_query( + array( + "user" => $this->username, + "pass" => $this->password, + "msg" => urlencode($message), + ) + )); - $result = curl_exec($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - - if ($err != 0 || $httpcode != 200) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err); - } - curl_close($curl); - - if ($success) { - return 1; - } - return $error; - } + $result = curl_exec($curl); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + + if ($err != 0 || $httpcode != 200) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . curl_strerror($err); + } + curl_close($curl); + + if ($success) { + return 1; + } + return $error; + } } diff --git a/src/psm/Txtmsg/FreeVoipDeal.php b/src/psm/Txtmsg/FreeVoipDeal.php old mode 100755 new mode 100644 index 1bd6e559..7decf766 --- a/src/psm/Txtmsg/FreeVoipDeal.php +++ b/src/psm/Txtmsg/FreeVoipDeal.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.1 + * @package phpservermon + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.1 **/ namespace psm\Txtmsg; -class FreeVoipDeal extends Core { - - /** - * Send sms using the FreeVoipDeal API - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * - * @var resource $curl - * @var string $err - * @var string $recipient - * @var string $from - * @var mixed $result - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - $message = rawurlencode($message); - - foreach ($this->recipients as $recipient) { - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, "https://www.freevoipdeal.com/myaccount/sendsms.php?".http_build_query( - array( - "username" => $this->username, - "password" => $this->password, - "from" => substr($this->originator, 0, 11), - "to" => $recipient, - "text" => $message, - ) - ) - ); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - - $result = curl_exec($curl); - $err = curl_errno($curl); - curl_close($curl); - - if ($err != 0 || is_numeric(strpos($result, "failure"))) { - $success = 0; - $error = $result; - } - } - - if ($success) { - return 1; - } - return $error; - } +class FreeVoipDeal extends Core +{ + + /** + * Send sms using the FreeVoipDeal API + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * + * @var resource $curl + * @var string $err + * @var string $recipient + * @var string $from + * @var mixed $result + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + $message = rawurlencode($message); + + foreach ($this->recipients as $recipient) { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, "https://www.freevoipdeal.com/myaccount/sendsms.php?" . http_build_query( + array( + "username" => $this->username, + "password" => $this->password, + "from" => substr($this->originator, 0, 15), + "to" => $recipient, + "text" => $message, + ) + )); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + + $result = curl_exec($curl); + $err = curl_errno($curl); + curl_close($curl); + + if ($err != 0 || is_numeric(strpos($result, "failure"))) { + $success = 0; + $error = $result; + } + } + + if ($success) { + return 1; + } + return $error; + } } diff --git a/src/psm/Txtmsg/GatewayAPI.php b/src/psm/Txtmsg/GatewayAPI.php index a07a527d..4ea2ef39 100644 --- a/src/psm/Txtmsg/GatewayAPI.php +++ b/src/psm/Txtmsg/GatewayAPI.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.3.0 + * @package phpservermon + * @author Ward Pieters + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.3.0 **/ namespace psm\Txtmsg; -class GatewayAPI extends Core { +class GatewayAPI extends Core +{ - /** - * Send sms using the GatewayAPI API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipient - * @var mixed $result - * - * @var resource $curl - * @var string $err - * @var int $success - * @var string $error - * - * @return bool|string - */ + /** + * Send sms using the GatewayAPI API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipient + * @var mixed $result + * + * @var resource $curl + * @var string $err + * @var int $success + * @var string $error + * + * @return bool|string + */ - public function sendSMS($message) { - $error = ""; - $success = 1; + public function sendSMS($message) + { + $error = ""; + $success = 1; - if (empty($this->recipients)) { - return false; - } + if (empty($this->recipients)) { + return false; + } - $json = [ - 'sender' => isset($this->originator) ? $this->originator : "PHPServerMon", - 'message' => $message, - 'recipients' => [], - ]; + $json = [ + 'sender' => isset($this->originator) ? $this->originator : "PHPServerMon", + 'message' => $message, + 'recipients' => [], + ]; - foreach ($this->recipients as $recipient) { - $json['recipients'][] = ['msisdn' => $recipient]; - } + foreach ($this->recipients as $recipient) { + $json['recipients'][] = ['msisdn' => $recipient]; + } - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, "https://gatewayapi.com/rest/mtsms"); - curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); - curl_setopt($curl, CURLOPT_USERPWD, $this->password.":"); - curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json)); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, "https://gatewayapi.com/rest/mtsms"); + curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); + curl_setopt($curl, CURLOPT_USERPWD, $this->password . ":"); + curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json)); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - $result = json_decode(curl_exec($curl), true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - curl_close($curl); + $result = json_decode(curl_exec($curl), true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + curl_close($curl); - if ($err != 0 || $httpcode != 200) { - $success = 0; - $error = $result['code']." - ".$result['message']; - } + if ($err != 0 || $httpcode != 200) { + $success = 0; + $error = $result['code'] . " - " . $result['message']; + } - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Inetworx.php b/src/psm/Txtmsg/Inetworx.php index 7a09a921..21fde105 100644 --- a/src/psm/Txtmsg/Inetworx.php +++ b/src/psm/Txtmsg/Inetworx.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ + * @package phpservermon + * @author Ward Pieters + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ **/ namespace psm\Txtmsg; -class Inetworx extends Core { +class Inetworx extends Core +{ - /** - * Send sms using the Inetworx API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * - * @var resource $curl - * @var string $err - * @var string $recipient - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ + /** + * Send sms using the Inetworx API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * + * @var resource $curl + * @var string $err + * @var string $recipient + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ - public function sendSMS($message) { - $error = ""; - $success = 1; + public function sendSMS($message) + { + $error = ""; + $success = 1; - foreach ($this->recipients as $recipient) { - $curl = curl_init(); + foreach ($this->recipients as $recipient) { + $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => "https://sms.inetworx.ch/smsapp/sendsms.php", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => "", - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => http_build_query( - array( - "user" => $this->username, - "pass" => $this->password, - "sender" => $this->originator, - "rcpt" => $recipient, - "msgbody" => $message, - ) - ), - CURLOPT_HTTPHEADER => array( - "authorization: Basic ".base64_encode("inetworxag:conn2smsapp"), - "content-type: application/x-www-form-urlencoded" - ), - )); + curl_setopt_array($curl, array( + CURLOPT_URL => "https://sms.inetworx.ch/smsapp/sendsms.php", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => http_build_query( + array( + "user" => $this->username, + "pass" => $this->password, + "sender" => $this->originator, + "rcpt" => $recipient, + "msgbody" => $message, + ) + ), + CURLOPT_HTTPHEADER => array( + "authorization: Basic " . base64_encode("inetworxag:conn2smsapp"), + "content-type: application/x-www-form-urlencoded" + ), + )); - $result = curl_exec($curl); - $err = curl_errno($curl); + $result = curl_exec($curl); + $err = curl_errno($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - if ($err != 0 || $httpcode != 200 || strpos($result, "200") === false) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". \nResult: ".$result; - } - curl_close($curl); - } + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + if ($err != 0 || $httpcode != 200 || strpos($result, "200") === false) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". \nResult: " . $result; + } + curl_close($curl); + } - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Messagebird.php b/src/psm/Txtmsg/Messagebird.php index 3463c7d2..76f1d737 100644 --- a/src/psm/Txtmsg/Messagebird.php +++ b/src/psm/Txtmsg/Messagebird.php @@ -1,4 +1,5 @@ recipients - * @var array $this->originator (Max 11 characters) - * @var array $recipients_chunk - * @var string $this->password - * - * @var mixed $result - * @var array $headers - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ''; + /** + * Send sms using the Messagebird API + * @var string $message + * @var array $this->recipients + * @var array $this->originator (Max 11 characters) + * @var array $recipients_chunk + * @var string $this->password + * + * @var mixed $result + * @var array $headers + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ''; - // Maximum of 50 users a time. - $recipients_chunk = array_chunk($this->recipients, ceil(count($this->recipients) / 50)); + // Maximum of 50 users a time. + $recipients_chunk = array_chunk($this->recipients, ceil(count($this->recipients) / 50)); - foreach ($recipients_chunk as $recipients) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, "https://rest.messagebird.com/messages"); - curl_setopt($ch, CURLOPT_POSTFIELDS, - "originator=".urlencode($this->originator == '' ? 'PSM' : $this->originator). - "&body=".urlencode($message). - "&recipients=".implode(",", $recipients)); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $headers = array(); - $headers[] = "Authorization: AccessKey ".$this->password; - $headers[] = "Content-Type: application/x-www-form-urlencoded"; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $result = curl_exec($ch); - curl_close($ch); + foreach ($recipients_chunk as $recipients) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "https://rest.messagebird.com/messages"); + curl_setopt( + $ch, + CURLOPT_POSTFIELDS, + "originator=" . urlencode($this->originator == '' ? 'PSM' : $this->originator) . + "&body=" . urlencode($message) . + "&recipients=" . implode(",", $recipients) + ); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $headers = array(); + $headers[] = "Authorization: AccessKey " . $this->password; + $headers[] = "Content-Type: application/x-www-form-urlencoded"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $result = curl_exec($ch); + curl_close($ch); - // Check on error - if (is_numeric(strpos($result, "{\"errors\":"))) { - $error = $result; - $success = 0; - } - } - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + // Check on error + if (is_numeric(strpos($result, "{\"errors\":"))) { + $error = $result; + $success = 0; + } + } + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Mosms.php b/src/psm/Txtmsg/Mosms.php index 28420d5d..ffcf15d0 100644 --- a/src/psm/Txtmsg/Mosms.php +++ b/src/psm/Txtmsg/Mosms.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 2.1 + * @package phpservermon + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 2.1 **/ namespace psm\Txtmsg; -class Mosms extends Core { +class Mosms extends Core +{ - /** - * Send sms using the Mosms API - * - * @var string $message - * @var array $this->username - * @var string $this->password - * @var array $this->recipients - * @var string $recipient - * @var array $this->originator (Max 11 characters) - * - * @var resource $curl - * @var string $err - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - $message = rawurlencode($message); - - foreach ($this->recipients as $recipient) { - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, "https://www.mosms.com/se/sms-send.php?".http_build_query( - array( - "username" => $this->username, - "password" => $this->password, - "customsender" => substr($this->originator, 0, 11), - "nr" => $recipient, - "type" => "text", - "data" => $message, - ) - ) - ); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - - $result = curl_exec($curl); - $err = curl_errno($curl); - - if ($err != 0 || $httpcode != 200 || $result == 2 || $result == 5) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".$err.". \nResult: ".$result; - } - curl_close($curl); - - } - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + /** + * Send sms using the Mosms API + * + * @var string $message + * @var array $this->username + * @var string $this->password + * @var array $this->recipients + * @var string $recipient + * @var array $this->originator (Max 11 characters) + * + * @var resource $curl + * @var string $err + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + $message = rawurlencode($message); + + foreach ($this->recipients as $recipient) { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, "https://www.mosms.com/se/sms-send.php?" . http_build_query( + array( + "username" => $this->username, + "password" => $this->password, + "customsender" => substr($this->originator, 0, 15), + "nr" => $recipient, + "type" => "text", + "data" => $message, + ) + )); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + $result = curl_exec($curl); + $err = curl_errno($curl); + + if ($err != 0 || $httpcode != 200 || $result == 2 || $result == 5) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . $err . ". \nResult: " . $result; + } + curl_close($curl); + } + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Nexmo.php b/src/psm/Txtmsg/Nexmo.php index a4bf51ff..2d185574 100644 --- a/src/psm/Txtmsg/Nexmo.php +++ b/src/psm/Txtmsg/Nexmo.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.1.1 + * @package phpservermon + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.1.1 **/ namespace psm\Txtmsg; -class Nexmo extends Core { - - - /** - * Send sms using the GatewayAPI API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipient - * - * @var resource $curl - * @var string $err - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ""; +class Nexmo extends Core +{ + + + /** + * Send sms using the GatewayAPI API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipient + * + * @var resource $curl + * @var string $err + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ""; - foreach ($this->recipients as $recipient) { - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_URL, "https://rest.nexmo.com/sms/json?".http_build_query( - array( - "api_key" => $this->username, - "api_secret" => $this->password, - "from" => $this->originator, - "to" => $recipient, - "text" => $message, - ) - ) - ); - - $result = json_decode(curl_exec($curl), true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - - if ($err != 0 || $httpcode != 200 || $result['messages'][0]['status'] != "0") { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". \nResult: ".$result['messages'][0]['error-text']; - } - curl_close($curl); - - } - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + foreach ($this->recipients as $recipient) { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, "https://rest.nexmo.com/sms/json?" . http_build_query( + array( + "api_key" => $this->username, + "api_secret" => $this->password, + "from" => $this->originator, + "to" => $recipient, + "text" => $message, + ) + )); + + $result = json_decode(curl_exec($curl), true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + + if ($err != 0 || $httpcode != 200 || $result['messages'][0]['status'] != "0") { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . curl_strerror($err) . + ". \nResult: " . $result['messages'][0]['error-text']; + } + curl_close($curl); + } + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Octopush.php b/src/psm/Txtmsg/Octopush.php index b515f7c2..942f91b5 100644 --- a/src/psm/Txtmsg/Octopush.php +++ b/src/psm/Txtmsg/Octopush.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Alexis Urien - * @Author Tim Zandbergen - * @author Ward Pieters - * @copyright Copyright (c) 2016 Alexis Urien - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 2.1 + * @package phpservermon + * @author Alexis Urien + * @Author Tim Zandbergen + * @author Ward Pieters + * @copyright Copyright (c) 2016 Alexis Urien + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 2.1 **/ namespace psm\Txtmsg; -class Octopush extends Core { - - /** - * Send sms using the Octopush API - * @var string $message - * @var string $this->username - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * - * @var resource $curl - * @var SimpleXMLElement $xmlResults - * @var string $err - * @var string $recipient - * @var string $smsType - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - $smsType = "XXX"; //FR = premium, WWW = world, XXX = Low cost - - $recipients = join(',', $this->recipients); - - $message = ($smsType == "FR") ? urlencode($message." STOP au XXXX") : urlencode($message); +class Octopush extends Core +{ + + /** + * Send sms using the Octopush API + * @var string $message + * @var string $this->username + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * + * @var resource $curl + * @var SimpleXMLElement $xmlResults + * @var string $err + * @var string $recipient + * @var string $smsType + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + $smsType = "XXX"; //FR = premium, WWW = world, XXX = Low cost + + $recipients = join(',', $this->recipients); + + $message = ($smsType == "FR") ? urlencode($message . " STOP au XXXX") : urlencode($message); - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, "http://www.octopush-dm.com/api/sms/?".http_build_query( - array( - "user_login" => $this->username, - "api_key" => $this->password, - "sms_recipients" => $recipients, - "sms_type" => $smsType, - "sms_sender" => substr($this->originator, 0, 11), - "sms_text" => $message, - ) - ) - ); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - - $result = curl_exec($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $xmlResults = simplexml_load_string($result); - $err = curl_errno($curl); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, "http://www.octopush-dm.com/api/sms/?" . http_build_query( + array( + "user_login" => $this->username, + "api_key" => $this->password, + "sms_recipients" => $recipients, + "sms_type" => $smsType, + "sms_sender" => substr($this->originator, 0, 15), + "sms_text" => $message, + ) + )); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + + $result = curl_exec($curl); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $xmlResults = simplexml_load_string($result); + $err = curl_errno($curl); - if ($err != 0 || $httpcode != 200 || $xmlResults === false || $xmlResults->error_code != '000') { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". \nResult: ".$xmlResults->error_code.". Look at http://www.octopush-dm.com/en/errors for the error description."; - } - curl_close($curl); - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($err != 0 || $httpcode != 200 || $xmlResults === false || $xmlResults->error_code != '000') { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . curl_strerror($err) . + ". \nResult: " . $xmlResults->error_code . + ". Look at http://www.octopush-dm.com/en/errors for the error description."; + } + curl_close($curl); + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Plivo.php b/src/psm/Txtmsg/Plivo.php index f4790cf1..e2eec00f 100644 --- a/src/psm/Txtmsg/Plivo.php +++ b/src/psm/Txtmsg/Plivo.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Tim Zandbergen - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.3.0 + * @package phpservermon + * @author Tim Zandbergen + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.3.0 **/ namespace psm\Txtmsg; -class Plivo extends Core { - - /** - * Send sms using the Plivo API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipients - * - * @var resource $curl - * @var string $err - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - if (empty($this->recipients)) { - return false; - } - - $recipients = join('<', $this->recipients); - - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => "https://api.plivo.com/v1/Account/".$this->username."/Message/", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => "", - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => json_encode( - array( - "src" => $this->originator, - "dst" => $recipients, - "text" => urlencode($message) - ) - ), - CURLOPT_HTTPHEADER => array( - "authorization: Basic ".base64_encode($this->username.":".$this->password), - "content-type: application/json" - ), - )); - - $result = curl_exec($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - - if ($err != 0 || ($httpcode != '200' && $httpcode != '201' && $httpcode != '202')) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". Result: ".$result.""; - } - curl_close($curl); - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file +class Plivo extends Core +{ + + /** + * Send sms using the Plivo API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipients + * + * @var resource $curl + * @var string $err + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + if (empty($this->recipients)) { + return false; + } + + $recipients = join('<', $this->recipients); + + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_URL => "https://api.plivo.com/v1/Account/" . $this->username . "/Message/", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => json_encode( + array( + "src" => $this->originator, + "dst" => $recipients, + "text" => urlencode($message) + ) + ), + CURLOPT_HTTPHEADER => array( + "authorization: Basic " . base64_encode($this->username . ":" . $this->password), + "content-type: application/json" + ), + )); + + $result = curl_exec($curl); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + + if ($err != 0 || ($httpcode != '200' && $httpcode != '201' && $httpcode != '202')) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". Result: " . $result . ""; + } + curl_close($curl); + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Smsglobal.php b/src/psm/Txtmsg/Smsglobal.php index 7cd3da47..174fc0bb 100644 --- a/src/psm/Txtmsg/Smsglobal.php +++ b/src/psm/Txtmsg/Smsglobal.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.1 + * @package phpservermon + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.1 **/ namespace psm\Txtmsg; -class Smsglobal extends Core { +class Smsglobal extends Core +{ - /** - * Send sms using the Smsglobal API - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * - * @var resource $curl - * @var string $err - * @var string $recipient - * @var string $from - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; - - $recipients = join(',', $this->recipients); - - $from = substr($this->originator, 0, 11); // Max 11 Characters - $message = substr(rawurlencode($message), 0, 153); - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_TIMEOUT, 30); - curl_setopt($curl, CURLOPT_URL, "https://www.smsglobal.com/http-api.php?".http_build_query( - array( - "action" => "sendsms", - "user" => $this->username, - "password" => $this->password, - "from" => $from, - "to" => $recipients, - "clientcharset" => "ISO-8859-1", - "text" => $message, - ) - )); - - $result = curl_exec($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - - $err = curl_errno($curl); - - if ($err != 0 || substr($result, 0, 5) != "OK: 0") { - $success = 0; - $result = ($result == '') ? 'Wrong input, please check if all values are correct!' : $result; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". \nResult: ".$result; - } - curl_close($curl); - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + /** + * Send sms using the Smsglobal API + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * + * @var resource $curl + * @var string $err + * @var string $recipient + * @var string $from + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; + + $recipients = join(',', $this->recipients); + + $from = substr($this->originator, 0, 15); // Max 15 Characters + $message = substr(rawurlencode($message), 0, 153); + + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_TIMEOUT, 30); + curl_setopt($curl, CURLOPT_URL, "https://www.smsglobal.com/http-api.php?" . http_build_query( + array( + "action" => "sendsms", + "user" => $this->username, + "password" => $this->password, + "from" => $from, + "to" => $recipients, + "clientcharset" => "ISO-8859-1", + "text" => $message, + ) + )); + + $result = curl_exec($curl); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + $err = curl_errno($curl); + + if ($err != 0 || substr($result, 0, 5) != "OK: 0") { + $success = 0; + $result = ($result == '') ? 'Wrong input, please check if all values are correct!' : $result; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". \nResult: " . $result; + } + curl_close($curl); + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Smsgw.php b/src/psm/Txtmsg/Smsgw.php index 67fb22d9..2267a54d 100644 --- a/src/psm/Txtmsg/Smsgw.php +++ b/src/psm/Txtmsg/Smsgw.php @@ -1,4 +1,5 @@ password - * @var array $this->recipients - * @var array $this->originator - * @var string $recipients - * - * @var resource $curl - * @var string $err - * @var int $success - * @var string $error - * - * @return bool|string - */ + /** + * Send sms using the SMSgw.NET API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * @var string $recipients + * + * @var resource $curl + * @var string $err + * @var int $success + * @var string $error + * + * @return bool|string + */ - public function sendSMS($message) { - $error = ""; - $success = 1; + public function sendSMS($message) + { + $error = ""; + $success = 1; - $recipients = join(';', $this->recipients); + $recipients = join(';', $this->recipients); - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => "https://api.smsgw.net/SendBulkSMS", - CURLOPT_RETURNTRANSFER => true, - CURLOPT_ENCODING => "", - CURLOPT_MAXREDIRS => 10, - CURLOPT_TIMEOUT => 30, - CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, - CURLOPT_CUSTOMREQUEST => "POST", - CURLOPT_POSTFIELDS => array( - 'strUserName' => $this->username, - 'strPassword' => $this->password, - "strTagName" => $this->originator, - "strRecepientNumbers" => $recipients, - "strMessage" => urlencode($message), - ), - )); + $curl = curl_init(); + curl_setopt_array($curl, array( + CURLOPT_URL => "https://api.smsgw.net/SendBulkSMS", + CURLOPT_RETURNTRANSFER => true, + CURLOPT_ENCODING => "", + CURLOPT_MAXREDIRS => 10, + CURLOPT_TIMEOUT => 30, + CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, + CURLOPT_CUSTOMREQUEST => "POST", + CURLOPT_POSTFIELDS => array( + 'strUserName' => $this->username, + 'strPassword' => $this->password, + "strTagName" => $this->originator, + "strRecepientNumbers" => $recipients, + "strMessage" => urlencode($message), + ), + )); - $result = curl_exec($curl); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); - - if ($err != 0 || ($httpcode != '200' && $httpcode != '201' && $httpcode != '202' && $result != "1")) { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". Result: ".$result.""; - } - curl_close($curl); + $result = curl_exec($curl); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); + + if ($err != 0 || ($httpcode != '200' && $httpcode != '201' && $httpcode != '202' && $result != "1")) { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". Result: " . $result . ""; + } + curl_close($curl); - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Smsit.php b/src/psm/Txtmsg/Smsit.php index 5b8f61b8..58e6a53b 100644 --- a/src/psm/Txtmsg/Smsit.php +++ b/src/psm/Txtmsg/Smsit.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.1 + * @package phpservermon + * @author Ward Pieters + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.1 **/ namespace psm\Txtmsg; -class Smsit extends Core { - - /** - * Send sms using the Smsit API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var array $this->originator - * - * @var resource $curl - * @var string $err - * @var String $recipient - * @var mixed $result - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ""; - - foreach ($this->recipients as $recipient) { - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_setopt($curl, CURLOPT_URL, "https://www.smsit.dk/api/v2?".http_build_query( - array( - "apiKey" => $this->password, - "mobile" => $recipient, - "message" => urlencode($message), - "senderId" => substr($this->originator, 0, 11), - ) - ) - ); - - $result = curl_exec($curl); - $err = curl_errno($curl); - curl_close($curl); - - if ($err != 0 || is_numeric(strpos($result, "{\"errors\":[{\"code\":"))) { - $success = 0; - $error = $result; - } - } - - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file +class Smsit extends Core +{ + + /** + * Send sms using the Smsit API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var array $this->originator + * + * @var resource $curl + * @var string $err + * @var String $recipient + * @var mixed $result + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ""; + + foreach ($this->recipients as $recipient) { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_URL, "https://www.smsit.dk/api/v2?" . http_build_query( + array( + "apiKey" => $this->password, + "mobile" => $recipient, + "message" => urlencode($message), + "senderId" => substr($this->originator, 0, 15), + ) + )); + + $result = curl_exec($curl); + $err = curl_errno($curl); + curl_close($curl); + + if ($err != 0 || is_numeric(strpos($result, "{\"errors\":[{\"code\":"))) { + $success = 0; + $error = $result; + } + } + + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/SolutionsInfini.php b/src/psm/Txtmsg/SolutionsInfini.php index 46091dd8..bc1e8196 100644 --- a/src/psm/Txtmsg/SolutionsInfini.php +++ b/src/psm/Txtmsg/SolutionsInfini.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Ward Pieters - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 3.3.0 + * @package phpservermon + * @author Ward Pieters + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 3.3.0 **/ namespace psm\Txtmsg; -class SolutionsInfini extends Core { +class SolutionsInfini extends Core +{ - /** - * Send sms using the SolutionsInfini API - * - * @var string $message - * @var string $this->password - * @var array $this->recipients - * @var string $recipients - * @var array $this->originator (Max 11 characters) - * - * @var resource $curl - * @var string $err - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $error = ""; - $success = 1; + /** + * Send sms using the SolutionsInfini API + * + * @var string $message + * @var string $this->password + * @var array $this->recipients + * @var string $recipients + * @var array $this->originator (Max 11 characters) + * + * @var resource $curl + * @var string $err + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $error = ""; + $success = 1; - $message = urlencode($message); + $message = urlencode($message); - $recipients = join(',', $this->recipients); + $recipients = join(',', $this->recipients); - $curl = curl_init(); - curl_setopt($curl, CURLOPT_URL, "https://api-alerts.solutionsinfini.com/v4/?".http_build_query( - array( - "api_key" => $this->password, - "method" => "sms", - "to" => $recipients, - "sender" => substr($this->originator, 0, 11), - "message" => $message, - ) - ) - ); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, "https://api-alerts.solutionsinfini.com/v4/?" . http_build_query( + array( + "api_key" => $this->password, + "method" => "sms", + "to" => $recipients, + "sender" => substr($this->originator, 0, 15), + "message" => $message, + ) + )); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - $result = json_decode(curl_exec($curl), true); - $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $err = curl_errno($curl); + $result = json_decode(curl_exec($curl), true); + $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $err = curl_errno($curl); - if ($err != 0 || $httpcode != 200 || $result['status'] != "OK") { - $success = 0; - $error = "HTTP_code: ".$httpcode.".\ncURL error (".$err."): ".curl_strerror($err).". Result: ".$result['status']." - ".$result['message']."."; - } - curl_close($curl); - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + if ($err != 0 || $httpcode != 200 || $result['status'] != "OK") { + $success = 0; + $error = "HTTP_code: " . $httpcode . ".\ncURL error (" . $err . "): " . + curl_strerror($err) . ". Result: " . $result['status'] . " - " . $result['message'] . "."; + } + curl_close($curl); + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/Spryng.php b/src/psm/Txtmsg/Spryng.php index df3eddb1..de148eab 100644 --- a/src/psm/Txtmsg/Spryng.php +++ b/src/psm/Txtmsg/Spryng.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Pepijn Over - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ + * @package phpservermon + * @author Pepijn Over + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ **/ namespace psm\Txtmsg; -class Spryng extends Core { +class Spryng extends Core +{ - /** - * Send sms using the Spryngsms API - * @var string $message - * @var array $this->recipients - * @var string $this->username - * @var string $this->password - * @var string $this->originator - * @var mixed $result - * @var array $headers - * - * @var int $success - * @var string $error - * - * @return bool|string - */ + /** + * Send sms using the Spryngsms API + * @var string $message + * @var array $this->recipients + * @var string $this->username + * @var string $this->password + * @var string $this->originator + * @var mixed $result + * @var array $headers + * + * @var int $success + * @var string $error + * + * @return bool|string + */ - public function sendSMS($message) { - $recipients = implode(",", $this->recipients); + public function sendSMS($message) + { + $recipients = implode(",", $this->recipients); - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, "https://api.spryngsms.com/api/send.php?OPERATION=send&USERNAME=".urlencode($this->username)."&PASSWORD=".urlencode($this->password)."&DESTINATION=".urlencode($recipients)."&SENDER=".urlencode($this->originator)."&BODY=".urlencode($message)."&SMSTYPE=BUSINESS"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $headers = array(); - $headers[] = "Content-Type: application/x-www-form-urlencoded"; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $result = curl_exec($ch); - curl_close($ch); + $ch = curl_init(); + curl_setopt( + $ch, + CURLOPT_URL, + "https://api.spryngsms.com/api/send.php?OPERATION=send&USERNAME=" . + urlencode($this->username) . + "&PASSWORD=" . urlencode($this->password) . + "&DESTINATION=" . urlencode($recipients) . + "&SENDER=" . urlencode($this->originator) . + "&BODY=" . urlencode($message) . "&SMSTYPE=BUSINESS" + ); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $headers = array(); + $headers[] = "Content-Type: application/x-www-form-urlencoded"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $result = curl_exec($ch); + curl_close($ch); - // Check on error - if ($result != 1) { - return "Error ".$result.": see http://www.spryng.nl/en/developers/http-api/ for the description."; - } - return 1; - } + // Check on error + if ($result != 1) { + return "Error " . $result . ": see http://www.spryng.nl/en/developers/http-api/ for the description."; + } + return 1; + } } diff --git a/src/psm/Txtmsg/Textmarketer.php b/src/psm/Txtmsg/Textmarketer.php index 5efbf621..94bb4a2f 100644 --- a/src/psm/Txtmsg/Textmarketer.php +++ b/src/psm/Txtmsg/Textmarketer.php @@ -1,4 +1,5 @@ . * - * @package phpservermon - * @author Perri Vardy-Mason - * @author Tim Zandbergen - * @copyright Copyright (c) 2008-2017 Pepijn Over - * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 - * @version Release: @package_version@ - * @link http://www.phpservermonitor.org/ - * @since phpservermon 2.1 + * @package phpservermon + * @author Perri Vardy-Mason + * @author Tim Zandbergen + * @copyright Copyright (c) 2008-2017 Pepijn Over + * @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3 + * @version Release: @package_version@ + * @link http://www.phpservermonitor.org/ + * @since phpservermon 2.1 **/ namespace psm\Txtmsg; -class Textmarketer extends Core { +class Textmarketer extends Core +{ - /** - * Send sms using the Textmarketer API - * @var string $message - * @var array $this->recipients - * @var string $recipient - * @var string $this->username - * @var string $this->password - * @var mixed $result - * @var array $headers - * - * @var int $success - * @var string $error - * - * @return bool|string - */ + /** + * Send sms using the Textmarketer API + * @var string $message + * @var array $this->recipients + * @var string $recipient + * @var string $this->username + * @var string $this->password + * @var mixed $result + * @var array $headers + * + * @var int $success + * @var string $error + * + * @return bool|string + */ - public function sendSMS($message) { - $success = 1; - $error = ''; - foreach ($this->recipients as $recipient) { + public function sendSMS($message) + { + $success = 1; + $error = ''; + foreach ($this->recipients as $recipient) { + $ch = curl_init(); + curl_setopt( + $ch, + CURLOPT_URL, + "https://api.textmarketer.co.uk/gateway/?username=" . $this->username . + "&password=" . $this->password . + "&to=" . $recipient . + "&message=" . urlencode($message) . + "&orig=SERVERALERT" + ); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + $headers = array(); + $headers[] = "Content-Type: application/x-www-form-urlencoded"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $result = curl_exec($ch); + curl_close($ch); - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, "https://api.textmarketer.co.uk/gateway/?username=".$this->username."&password=".$this->password."&to=".$recipient."&message=".urlencode($message)."&orig=SERVERALERT"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - $headers = array(); - $headers[] = "Content-Type: application/x-www-form-urlencoded"; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $result = curl_exec($ch); - curl_close($ch); - - // Check on error - if (is_numeric(strpos($result, "FAILED"))) { - $error = $result; - $success = 0; - } - } - if ($success == 1) { - return 1; - } - return $error; - } + // Check on error + if (is_numeric(strpos($result, "FAILED"))) { + $error = $result; + $success = 0; + } + } + if ($success == 1) { + return 1; + } + return $error; + } } diff --git a/src/psm/Txtmsg/Twilio.php b/src/psm/Txtmsg/Twilio.php index 1d37c220..34490366 100644 --- a/src/psm/Txtmsg/Twilio.php +++ b/src/psm/Txtmsg/Twilio.php @@ -1,4 +1,5 @@ recipients - * @var string $recipient - * @var string $this->username - * @var string $this->password - * @var string $this->originator - * @var mixed $result - * @var array $headers - * - * @var int $success - * @var string $error - * - * @return bool|string - */ - - public function sendSMS($message) { - $success = 1; - $error = ''; + /** + * Send sms using the Twilio API + * https://www.twilio.com/docs/sms/api#send-an-sms-with-the-sms-api + * @var string $message + * @var array $this->recipients + * @var string $recipient + * @var string $this->username + * @var string $this->password + * @var string $this->originator + * @var mixed $result + * @var array $headers + * + * @var int $success + * @var string $error + * + * @return bool|string + */ + + public function sendSMS($message) + { + $success = 1; + $error = ''; - foreach ($this->recipients as $recipient) { - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, "https://api.twilio.com/2010-04-01/Accounts/".$this->username."/Messages.json"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_POSTFIELDS, "From=".urlencode($this->originator)."&Body=".urlencode($message)."&To=".urlencode($recipient)); - curl_setopt($ch, CURLOPT_POST, 1); - curl_setopt($ch, CURLOPT_USERPWD, $this->username.":".$this->password); + foreach ($this->recipients as $recipient) { + $ch = curl_init(); + curl_setopt( + $ch, + CURLOPT_URL, + "https://api.twilio.com/2010-04-01/Accounts/" . $this->username . "/Messages.json" + ); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt( + $ch, + CURLOPT_POSTFIELDS, + "From=" . urlencode($this->originator) . + "&Body=" . urlencode($message) . + "&To=" . urlencode($recipient) + ); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password); - $headers = array(); - $headers[] = "Content-Type: application/x-www-form-urlencoded"; - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + $headers = array(); + $headers[] = "Content-Type: application/x-www-form-urlencoded"; + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - $result = curl_exec($ch); - curl_close($ch); + $result = curl_exec($ch); + curl_close($ch); - // When the result string starts with {"code": there is a problem - if (strpos($result, "{\"code\":") === 0) { - $error = $result; - $success = 0; - } - } - if ($success) { - return 1; - } - return $error; - } -} \ No newline at end of file + // When the result string starts with {"code": there is a problem + if (strpos($result, "{\"code\":") === 0) { + $error = $result; + $success = 0; + } + } + if ($success) { + return 1; + } + return $error; + } +} diff --git a/src/psm/Txtmsg/TxtmsgInterface.php b/src/psm/Txtmsg/TxtmsgInterface.php index eed3441a..e96e74af 100644 --- a/src/psm/Txtmsg/TxtmsgInterface.php +++ b/src/psm/Txtmsg/TxtmsgInterface.php @@ -1,4 +1,5 @@ db = $db; - $this->logger = $logger; - } + /** + * Open a new installer instance + * @param \psm\Service\Database $db + * @param callable $logger + */ + public function __construct(\psm\Service\Database $db, $logger = null) + { + $this->db = $db; + $this->logger = $logger; + } - /** - * Check if an upgrade is required for the current version. - * @return boolean - * @see upgrade() - */ - public function isUpgradeRequired() { - $version_db = psm_get_conf('version'); + /** + * Check if an upgrade is required for the current version. + * @return boolean + * @see upgrade() + */ + public function isUpgradeRequired() + { + $version_db = psm_get_conf('version'); - if (version_compare(PSM_VERSION, $version_db, '==')) { - // version is up to date - return false; - } + if (version_compare(PSM_VERSION, $version_db, '==')) { + // version is up to date + return false; + } - // different DB version, check if the version requires any changes - if (version_compare($version_db, PSM_VERSION, '<')) { - return true; - } else { - // change database version to current version so this check won't be required next time - psm_update_conf('version', PSM_VERSION); - } - return false; - } + // different DB version, check if the version requires any changes + if (version_compare($version_db, PSM_VERSION, '<')) { + return true; + } else { + // change database version to current version so this check won't be required next time + psm_update_conf('version', PSM_VERSION); + } + return false; + } - /** - * Log a message to the logger callable (if any) - * @param string|array $msg - * @return \psm\Util\Install\Installer - */ - protected function log($msg) { - if (is_callable($this->logger)) { - $msg = (!is_array($msg)) ? array($msg) : $msg; + /** + * Log a message to the logger callable (if any) + * @param string|array $msg + * @return \psm\Util\Install\Installer + */ + protected function log($msg) + { + if (is_callable($this->logger)) { + $msg = (!is_array($msg)) ? array($msg) : $msg; - foreach ($msg as $m) { - call_user_func($this->logger, $m); - } - } - return $this; - } + foreach ($msg as $m) { + call_user_func($this->logger, $m); + } + } + return $this; + } - /** - * Execute one or more queries. Does no fetching or anything, so execute only. - * @param string|array $query - * @return \psm\Util\Install\Installer - */ - protected function execSQL($query) { - $query = (!is_array($query)) ? array($query) : $query; + /** + * Execute one or more queries. Does no fetching or anything, so execute only. + * @param string|array $query + * @return \psm\Util\Install\Installer + */ + protected function execSQL($query) + { + $query = (!is_array($query)) ? array($query) : $query; - foreach ($query as $q) { - $this->queries[] = $q; - $this->db->exec($q); - } - return $this; - } + foreach ($query as $q) { + $this->queries[] = $q; + $this->db->exec($q); + } + return $this; + } - /** - * Retrieve table queries for install - */ - public function install() { - $this->installTables(); + /** + * Retrieve table queries for install + */ + public function install() + { + $this->installTables(); - $this->log('Populating database...'); - $queries = array(); - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."servers` (`ip`, `port`, `label`, `type`, `pattern`, `pattern_online`, `redirect_check`, `status`, `rtime`, `active`, `email`, `sms`, `pushover`, `telegram`) VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', 'yes', 'bad', 'on', '0.0000000', 'yes', 'yes', 'yes', 'yes', 'yes'), ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', 'yes', 'bad','on', '0.0000000', 'yes', 'yes', 'yes', 'yes', 'yes')"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."users_servers` (`user_id`,`server_id`) VALUES (1, 1), (1, 2);"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUE - ('language', 'en_US'), - ('proxy', '0'), - ('proxy_url', ''), - ('proxy_user', ''), - ('proxy_password', ''), - ('email_status', '1'), - ('email_from_email', 'monitor@example.org'), - ('email_from_name', 'Server Monitor'), - ('email_smtp', ''), - ('email_smtp_host', ''), - ('email_smtp_port', ''), - ('email_smtp_security', ''), - ('email_smtp_username', ''), - ('email_smtp_password', ''), - ('sms_status', '0'), - ('sms_gateway', 'messagebird'), - ('sms_gateway_username', 'username'), - ('sms_gateway_password', 'password'), - ('sms_from', '1234567890'), - ('pushover_status', '0'), - ('pushover_api_token', ''), - ('telegram_status', '0'), - ('telegram_api_token', ''), - ('password_encrypt_key', '".sha1(microtime())."'), - ('alert_type', 'status'), - ('log_status', '1'), - ('log_email', '1'), - ('log_sms', '1'), - ('log_pushover', '1'), - ('log_telegram', '1'), - ('log_retention_period', '365'), - ('version', '".PSM_VERSION."'), - ('version_update_check', '".PSM_VERSION."'), - ('auto_refresh_servers', '0'), - ('show_update', '1'), - ('last_update_check', '0'), - ('cron_running', '0'), - ('cron_running_time', '0');"; - $this->execSQL($queries); - } + $this->log('Populating database...'); + $queries = array(); + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "servers` ( + `ip`, `port`, `label`, `type`, `pattern`, `pattern_online`, `redirect_check`, + `status`, `rtime`, `active`, `email`, `sms`, `pushover`, `telegram`, `jabber`) + VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', + 'yes', 'bad', 'on', '0.0000000', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes'), + ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', + 'yes', 'bad','on', '0.0000000', 'yes', 'yes', 'yes', 'yes', 'yes', 'yes')"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "users_servers` (`user_id`,`server_id`) VALUES (1, 1), (1, 2);"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE + ('language', 'en_US'), + ('proxy', '0'), + ('proxy_url', ''), + ('proxy_user', ''), + ('proxy_password', ''), + ('email_status', '1'), + ('email_from_email', 'monitor@example.org'), + ('email_from_name', 'Server Monitor'), + ('email_smtp', ''), + ('email_smtp_host', ''), + ('email_smtp_port', ''), + ('email_smtp_security', ''), + ('email_smtp_username', ''), + ('email_smtp_password', ''), + ('sms_status', '0'), + ('sms_gateway', 'messagebird'), + ('sms_gateway_username', 'username'), + ('sms_gateway_password', 'password'), + ('sms_from', '1234567890'), + ('pushover_status', '0'), + ('pushover_api_token', ''), + ('telegram_status', '0'), + ('telegram_api_token', ''), + ('jabber_status', '1'), + ('jabber_host', ''), + ('jabber_port', ''), + ('jabber_username', ''), + ('jabber_domain', ''), + ('jabber_password', ''), + ('password_encrypt_key', '" . sha1(microtime()) . "'), + ('alert_type', 'status'), + ('log_status', '1'), + ('log_email', '1'), + ('log_sms', '1'), + ('log_pushover', '1'), + ('log_telegram', '1'), + ('log_jabber', '1'), + ('log_retention_period', '365'), + ('version', '" . PSM_VERSION . "'), + ('version_update_check', '" . PSM_VERSION . "'), + ('auto_refresh_servers', '0'), + ('show_update', '1'), + ('last_update_check', '0'), + ('cron_running', '0'), + ('cron_running_time', '0'), + ('cron_off_running', '0'), + ('cron_off_running_time', '0');"; + $this->execSQL($queries); + } - /** - * Install the tables for the monitor - */ - protected function installTables() { - $tables = array( - PSM_DB_PREFIX.'config' => "CREATE TABLE `".PSM_DB_PREFIX."config` ( - `key` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'users' => "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."users` ( - `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `user_name` varchar(64) NOT NULL COMMENT 'user''s name, unique', - `password` varchar(255) NOT NULL COMMENT 'user''s password in salted and hashed format', - `password_reset_hash` char(40) DEFAULT NULL COMMENT 'user''s password reset code', - `password_reset_timestamp` bigint(20) DEFAULT NULL COMMENT 'timestamp of the password reset request', - `rememberme_token` varchar(64) DEFAULT NULL COMMENT 'user''s remember-me cookie token', - `level` tinyint(2) unsigned NOT NULL DEFAULT '20', - `name` varchar(255) NOT NULL, - `mobile` varchar(15) NOT NULL, - `pushover_key` varchar(255) NOT NULL, - `pushover_device` varchar(255) NOT NULL, - `telegram_id` varchar(255) NOT NULL, - `email` varchar(255) NOT NULL, - PRIMARY KEY (`user_id`), - UNIQUE KEY `unique_username` (`user_name`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'users_preferences' => "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."users_preferences` ( - `user_id` int(11) unsigned NOT NULL, - `key` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`user_id`, `key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'users_servers' => "CREATE TABLE `".PSM_DB_PREFIX."users_servers` ( - `user_id` INT( 11 ) UNSIGNED NOT NULL , - `server_id` INT( 11 ) UNSIGNED NOT NULL , - PRIMARY KEY ( `user_id` , `server_id` ) - ) ENGINE = MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'log' => "CREATE TABLE `".PSM_DB_PREFIX."log` ( - `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `server_id` int(11) unsigned NOT NULL, - `type` enum('status','email','sms','pushover','telegram') NOT NULL, - `message` varchar(255) NOT NULL, - `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, - PRIMARY KEY (`log_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'log_users' => "CREATE TABLE `".PSM_DB_PREFIX."log_users` ( - `log_id` int(11) UNSIGNED NOT NULL , - `user_id` int(11) UNSIGNED NOT NULL , - PRIMARY KEY (`log_id`, `user_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'servers' => "CREATE TABLE `".PSM_DB_PREFIX."servers` ( - `server_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `ip` varchar(500) NOT NULL, - `port` int(5) NOT NULL, - `request_method` varchar(50) NULL, - `label` varchar(255) NOT NULL, - `type` enum('ping','service','website') NOT NULL default 'service', - `pattern` varchar(255) NOT NULL default '', - `pattern_online` enum('yes','no') NOT NULL default 'yes', - `post_field` varchar(255) NULL, - `redirect_check` enum('ok','bad') NOT NULL default 'bad', - `allow_http_status` varchar(255) NOT NULL default '', - `header_name` varchar(255) NOT NULL default '', - `header_value` varchar(255) NOT NULL default '', - `status` enum('on','off') NOT NULL default 'on', - `error` varchar(255) NULL, - `rtime` FLOAT(9, 7) NULL, - `last_online` datetime NULL, - `last_offline` datetime NULL, - `last_offline_duration` varchar(255) NULL, - `last_check` datetime NULL, - `active` enum('yes','no') NOT NULL default 'yes', - `email` enum('yes','no') NOT NULL default 'yes', - `sms` enum('yes','no') NOT NULL default 'no', - `pushover` enum('yes','no') NOT NULL default 'yes', - `telegram` enum('yes','no') NOT NULL default 'yes', - `warning_threshold` mediumint(1) unsigned NOT NULL DEFAULT '1', - `warning_threshold_counter` mediumint(1) unsigned NOT NULL DEFAULT '0', - `timeout` smallint(1) unsigned NULL DEFAULT NULL, - `website_username` varchar(255) DEFAULT NULL, - `website_password` varchar(255) DEFAULT NULL, - `last_error` varchar(255) DEFAULT NULL, - `last_error_output` varchar(255) DEFAULT NULL, - `last_output` varchar(255) DEFAULT NULL, - PRIMARY KEY (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'servers_uptime' => "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."servers_uptime` ( - `servers_uptime_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `server_id` int(11) unsigned NOT NULL, - `date` datetime NOT NULL, - `status` tinyint(1) unsigned NOT NULL, - `latency` float(9,7) DEFAULT NULL, - PRIMARY KEY (`servers_uptime_id`), - KEY `server_id` (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - PSM_DB_PREFIX.'servers_history' => "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."servers_history` ( - `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `server_id` int(11) unsigned NOT NULL, - `date` date NOT NULL, - `latency_min` float(9,7) NOT NULL, - `latency_avg` float(9,7) NOT NULL, - `latency_max` float(9,7) NOT NULL, - `checks_total` int(11) unsigned NOT NULL, - `checks_failed` int(11) unsigned NOT NULL, - PRIMARY KEY (`servers_history_id`), - UNIQUE KEY `server_id_date` (`server_id`,`date`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", - ); + /** + * Install the tables for the monitor + */ + protected function installTables() + { + $tables = array( + PSM_DB_PREFIX . 'config' => "CREATE TABLE `" . PSM_DB_PREFIX . "config` ( + `key` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`key`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'users' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users` ( + `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `user_name` varchar(64) NOT NULL COMMENT 'user''s name, unique', + `password` varchar(255) NOT NULL COMMENT 'user''s password in salted and hashed format', + `password_reset_hash` char(40) DEFAULT NULL COMMENT 'user''s password reset code', + `password_reset_timestamp` bigint(20) DEFAULT NULL COMMENT 'timestamp of the password reset request', + `rememberme_token` varchar(64) DEFAULT NULL COMMENT 'user''s remember-me cookie token', + `level` tinyint(2) unsigned NOT NULL DEFAULT '20', + `name` varchar(255) NOT NULL, + `mobile` varchar(15) NOT NULL, + `pushover_key` varchar(255) NOT NULL, + `pushover_device` varchar(255) NOT NULL, + `telegram_id` varchar(255) NOT NULL, + `jabber` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + PRIMARY KEY (`user_id`), + UNIQUE KEY `unique_username` (`user_name`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . + 'users_preferences' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users_preferences` ( + `user_id` int(11) unsigned NOT NULL, + `key` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`user_id`, `key`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'users_servers' => "CREATE TABLE `" . PSM_DB_PREFIX . "users_servers` ( + `user_id` INT( 11 ) UNSIGNED NOT NULL , + `server_id` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY ( `user_id` , `server_id` ) + ) ENGINE = MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'log' => "CREATE TABLE `" . PSM_DB_PREFIX . "log` ( + `log_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `server_id` int(11) unsigned NOT NULL, + `type` enum('status','email','sms','pushover','telegram', 'jabber') NOT NULL, + `message` TEXT NOT NULL, + `datetime` timestamp NOT NULL default CURRENT_TIMESTAMP, + PRIMARY KEY (`log_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'log_users' => "CREATE TABLE `" . PSM_DB_PREFIX . "log_users` ( + `log_id` int(11) UNSIGNED NOT NULL , + `user_id` int(11) UNSIGNED NOT NULL , + PRIMARY KEY (`log_id`, `user_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'servers' => "CREATE TABLE `" . PSM_DB_PREFIX . "servers` ( + `server_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `ip` varchar(500) NOT NULL, + `port` int(5) NOT NULL, + `request_method` varchar(50) NULL, + `label` varchar(255) NOT NULL, + `type` enum('ping','service','website') NOT NULL default 'service', + `pattern` varchar(255) NOT NULL default '', + `pattern_online` enum('yes','no') NOT NULL default 'yes', + `post_field` varchar(255) NULL, + `redirect_check` enum('ok','bad') NOT NULL default 'bad', + `allow_http_status` varchar(255) NOT NULL default '', + `header_name` varchar(255) NOT NULL default '', + `header_value` varchar(255) NOT NULL default '', + `status` enum('on','off') NOT NULL default 'on', + `error` varchar(255) NULL, + `rtime` FLOAT(9, 7) NULL, + `last_online` datetime NULL, + `last_offline` datetime NULL, + `last_offline_duration` varchar(255) NULL, + `last_check` datetime NULL, + `active` enum('yes','no') NOT NULL default 'yes', + `email` enum('yes','no') NOT NULL default 'yes', + `sms` enum('yes','no') NOT NULL default 'no', + `pushover` enum('yes','no') NOT NULL default 'yes', + `telegram` enum('yes','no') NOT NULL default 'yes', + `jabber` enum('yes','no') NOT NULL default 'yes', + `warning_threshold` mediumint(1) unsigned NOT NULL DEFAULT '1', + `warning_threshold_counter` mediumint(1) unsigned NOT NULL DEFAULT '0', + `ssl_cert_expiry_days` mediumint(1) unsigned NOT NULL DEFAULT '0', + `ssl_cert_expired_time` varchar(255) NULL, + `timeout` smallint(1) unsigned NULL DEFAULT NULL, + `website_username` varchar(255) DEFAULT NULL, + `website_password` varchar(255) DEFAULT NULL, + `last_error` varchar(255) DEFAULT NULL, + `last_error_output` TEXT, + `last_output` TEXT, + PRIMARY KEY (`server_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'servers_uptime' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_uptime` ( + `servers_uptime_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `server_id` int(11) unsigned NOT NULL, + `date` datetime NOT NULL, + `status` tinyint(1) unsigned NOT NULL, + `latency` float(9,7) DEFAULT NULL, + PRIMARY KEY (`servers_uptime_id`), + KEY `server_id` (`server_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + PSM_DB_PREFIX . 'servers_history' => "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_history` ( + `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `server_id` int(11) unsigned NOT NULL, + `date` date NOT NULL, + `latency_min` float(9,7) NOT NULL, + `latency_avg` float(9,7) NOT NULL, + `latency_max` float(9,7) NOT NULL, + `checks_total` int(11) unsigned NOT NULL, + `checks_failed` int(11) unsigned NOT NULL, + PRIMARY KEY (`servers_history_id`), + UNIQUE KEY `server_id_date` (`server_id`,`date`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", + ); - foreach ($tables as $name => $sql) { - $if_table_exists = $this->db->query("SHOW TABLES LIKE '{$name}'"); + foreach ($tables as $name => $sql) { + $if_table_exists = $this->db->query("SHOW TABLES LIKE '{$name}'"); - if (!empty($if_table_exists)) { - $this->log('Table '.$name.' already exists in your database!'); - } else { - $this->execSQL($sql); - $this->log('Table '.$name.' added.'); - } - } - } + if (!empty($if_table_exists)) { + $this->log('Table ' . $name . ' already exists in your database!'); + } else { + $this->execSQL($sql); + $this->log('Table ' . $name . ' added.'); + } + } + } - /** - * Populate the tables and perform upgrades if necessary - * @param string $version_from - * @param string $version_to - * @see isUpgradeRequired() - */ - public function upgrade($version_from, $version_to) { - if (version_compare($version_from, '2.1.0', '<')) { - $this->upgrade210(); - } - if (version_compare($version_from, '3.0.0', '<')) { - $this->upgrade300(); - } - if (version_compare($version_from, '3.1.0', '<')) { - $this->upgrade310(); - } - if (version_compare($version_from, '3.2.0', '<')) { - $this->upgrade320(); - } - if (version_compare($version_from, '3.2.1', '<')) { - $this->upgrade321(); - } - if (version_compare($version_from, '3.2.2', '<')) { - $this->upgrade322(); - } - if (version_compare($version_from, '3.3.0', '<')) { - $this->upgrade330(); - } - if (version_compare($version_from, '3.4.0', '<')) { - $this->upgrade340(); - } - if (version_compare($version_from, '3.4.2', '<')) { - $this->upgrade342(); - } - psm_update_conf('version', $version_to); - } + /** + * Populate the tables and perform upgrades if necessary + * @param string $version_from + * @param string $version_to + * @see isUpgradeRequired() + */ + public function upgrade($version_from, $version_to) + { + if (version_compare($version_from, '2.1.0', '<')) { + $this->upgrade210(); + } + if (version_compare($version_from, '3.0.0', '<')) { + $this->upgrade300(); + } + if (version_compare($version_from, '3.1.0', '<')) { + $this->upgrade310(); + } + if (version_compare($version_from, '3.2.0', '<')) { + $this->upgrade320(); + } + if (version_compare($version_from, '3.2.1', '<')) { + $this->upgrade321(); + } + if (version_compare($version_from, '3.2.2', '<')) { + $this->upgrade322(); + } + if (version_compare($version_from, '3.3.0', '<')) { + $this->upgrade330(); + } + if (version_compare($version_from, '3.4.0', '<')) { + $this->upgrade340(); + } + if (version_compare($version_from, '3.4.2', '<')) { + $this->upgrade342(); + } + if (version_compare($version_from, '3.5.0', '<')) { + $this->upgrade350(); + } + psm_update_conf('version', $version_to); + } - /** - * Upgrade for v2.1.0 release - */ - protected function upgrade210() { - $queries = array(); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."config` DROP `config_id`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."config` ADD PRIMARY KEY ( `key` );"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."config` DROP INDEX `key`;"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('cron_running', '0');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('cron_running_time', '0');"; + /** + * Upgrade for v2.1.0 release + */ + protected function upgrade210() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "config` DROP `config_id`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "config` ADD PRIMARY KEY ( `key` );"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "config` DROP INDEX `key`;"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('cron_running', '0');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('cron_running_time', '0');"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `error` `error` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `rtime` `rtime` FLOAT( 9, 7 ) NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `last_online` `last_online` DATETIME NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `last_check` `last_check` DATETIME NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `pattern` VARCHAR( 255 ) NOT NULL AFTER `type`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline` DATETIME NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline_duration` varchar(255) NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `error` `error` VARCHAR( 255 ) + CHARACTER SET utf8 COLLATE utf8_general_ci NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `rtime` `rtime` FLOAT( 9, 7 ) NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `last_online` `last_online` DATETIME NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `last_check` `last_check` DATETIME NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pattern` VARCHAR( 255 ) NOT NULL AFTER `type`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline` DATETIME NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline_duration` varchar(255) NULL;"; - $this->execSQL($queries); - } + $this->execSQL($queries); + } - /** - * Upgrade for v3.0.0 release - */ - protected function upgrade300() { - $queries = array(); - // language is now stored as language code (ISO 639-1) + country code (ISO 3166-1) - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='bg_BG' WHERE `key`='language' AND `value`='bg';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='de_DE' WHERE `key`='language' AND `value`='de';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='en_US' WHERE `key`='language' AND `value`='en';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='fr_FR' WHERE `key`='language' AND `value`='fr';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='ko_KR' WHERE `key`='language' AND `value`='kr';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='nl_NL' WHERE `key`='language' AND `value`='nl';"; - $queries[] = "UPDATE `".PSM_DB_PREFIX."config` SET `value`='pt_BR' WHERE `key`='language' AND `value`='br';"; + /** + * Upgrade for v3.0.0 release + */ + protected function upgrade300() + { + $queries = array(); + // language is now stored as language code (ISO 639-1) + country code (ISO 3166-1) + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='bg_BG' + WHERE `key`='language' AND `value`='bg';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='de_DE' + WHERE `key`='language' AND `value`='de';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='en_US' + WHERE `key`='language' AND `value`='en';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='fr_FR' + WHERE `key`='language' AND `value`='fr';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='ko_KR' + WHERE `key`='language' AND `value`='kr';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='nl_NL' + WHERE `key`='language' AND `value`='nl';"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` SET `value`='pt_BR' + WHERE `key`='language' AND `value`='br';"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('version_update_check', '".PSM_VERSION."');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('email_smtp', '');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('email_smtp_host', '');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('email_smtp_port', '');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('email_smtp_username', '');"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('email_smtp_password', '');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES + ('version_update_check', '" . PSM_VERSION . "');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('email_smtp', '');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('email_smtp_host', '');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('email_smtp_port', '');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('email_smtp_username', '');"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUES ('email_smtp_password', '');"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."log` CHANGE `log_id` `log_id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."log` CHANGE `server_id` `server_id` INT( 11 ) UNSIGNED NOT NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` CHANGE `log_id` `log_id` INT( 11 ) + UNSIGNED NOT NULL AUTO_INCREMENT;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` CHANGE `server_id` `server_id` INT( 11 ) + UNSIGNED NOT NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `server_id` `server_id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `warning_threshold` MEDIUMINT( 1 ) UNSIGNED NOT NULL DEFAULT '1';"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `warning_threshold_counter` MEDIUMINT( 1 ) UNSIGNED NOT NULL DEFAULT '0';"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline` DATETIME NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline_duration` varchar(255) NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `server_id` `server_id` INT( 11 ) + UNSIGNED NOT NULL AUTO_INCREMENT;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `warning_threshold` MEDIUMINT( 1 ) + UNSIGNED NOT NULL DEFAULT '1';"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `warning_threshold_counter` MEDIUMINT( 1 ) + UNSIGNED NOT NULL DEFAULT '0';"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline` DATETIME NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline_duration` varchar(255) NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` CHANGE `user_id` `user_id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` - ADD `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL COMMENT 'user\'s name, unique' AFTER `user_id`, - ADD `password` varchar(255) COLLATE utf8_general_ci NOT NULL COMMENT 'user\'s password in salted and hashed format' AFTER `user_name`, - ADD `password_reset_hash` char(40) COLLATE utf8_general_ci DEFAULT NULL COMMENT 'user\'s password reset code' AFTER `password`, - ADD `password_reset_timestamp` bigint(20) DEFAULT NULL COMMENT 'timestamp of the password reset request' AFTER `password_reset_hash`, - ADD `rememberme_token` varchar(64) COLLATE utf8_general_ci DEFAULT NULL COMMENT 'user\'s remember-me cookie token' AFTER `password_reset_timestamp`, - ADD `level` TINYINT( 2 ) UNSIGNED NOT NULL DEFAULT '20' AFTER `rememberme_token`;"; - // make sure all current users are admins (previously we didnt have non-admins): - $queries[] = "UPDATE `".PSM_DB_PREFIX."users` SET `user_name`=`email`, `level`=10;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` ADD UNIQUE `unique_username` ( `user_name` );"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` CHANGE `user_id` `user_id` INT( 11 ) + UNSIGNED NOT NULL AUTO_INCREMENT;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` + ADD `user_name` varchar(64) COLLATE utf8_general_ci NOT NULL + COMMENT 'user\'s name, unique' AFTER `user_id`, + ADD `password` varchar(255) COLLATE utf8_general_ci NOT NULL + COMMENT 'user\'s password in salted and hashed format' AFTER `user_name`, + ADD `password_reset_hash` char(40) COLLATE utf8_general_ci DEFAULT NULL + COMMENT 'user\'s password reset code' AFTER `password`, + ADD `password_reset_timestamp` bigint(20) DEFAULT NULL + COMMENT 'timestamp of the password reset request' AFTER `password_reset_hash`, + ADD `rememberme_token` varchar(64) COLLATE utf8_general_ci DEFAULT NULL + COMMENT 'user\'s remember-me cookie token' AFTER `password_reset_timestamp`, + ADD `level` TINYINT( 2 ) UNSIGNED NOT NULL DEFAULT '20' AFTER `rememberme_token`;"; + // make sure all current users are admins (previously we didnt have non-admins): + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "users` SET `user_name`=`email`, `level`=10;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD UNIQUE `unique_username` ( `user_name` );"; - $queries[] = "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."servers_uptime` ( - `servers_uptime_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `server_id` int(11) unsigned NOT NULL, - `date` datetime NOT NULL, - `status` tinyint(1) unsigned NOT NULL, - `latency` float(9,7) DEFAULT NULL, - PRIMARY KEY (`servers_uptime_id`), - KEY `server_id` (`server_id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + $queries[] = "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_uptime` ( + `servers_uptime_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `server_id` int(11) unsigned NOT NULL, + `date` datetime NOT NULL, + `status` tinyint(1) unsigned NOT NULL, + `latency` float(9,7) DEFAULT NULL, + PRIMARY KEY (`servers_uptime_id`), + KEY `server_id` (`server_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; - $queries[] = "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."servers_history` ( - `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `server_id` int(11) unsigned NOT NULL, - `date` date NOT NULL, - `latency_min` float(9,7) NOT NULL, - `latency_avg` float(9,7) NOT NULL, - `latency_max` float(9,7) NOT NULL, - `checks_total` int(11) unsigned NOT NULL, - `checks_failed` int(11) unsigned NOT NULL, - PRIMARY KEY (`servers_history_id`), - UNIQUE KEY `server_id_date` (`server_id`,`date`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + $queries[] = "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "servers_history` ( + `servers_history_id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `server_id` int(11) unsigned NOT NULL, + `date` date NOT NULL, + `latency_min` float(9,7) NOT NULL, + `latency_avg` float(9,7) NOT NULL, + `latency_max` float(9,7) NOT NULL, + `checks_total` int(11) unsigned NOT NULL, + `checks_failed` int(11) unsigned NOT NULL, + PRIMARY KEY (`servers_history_id`), + UNIQUE KEY `server_id_date` (`server_id`,`date`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; - $queries[] = "CREATE TABLE `".PSM_DB_PREFIX."users_servers` ( - `user_id` INT( 11 ) UNSIGNED NOT NULL , - `server_id` INT( 11 ) UNSIGNED NOT NULL , - PRIMARY KEY ( `user_id` , `server_id` ) - ) ENGINE = MYISAM ;"; - $this->execSQL($queries); + $queries[] = "CREATE TABLE `" . PSM_DB_PREFIX . "users_servers` ( + `user_id` INT( 11 ) UNSIGNED NOT NULL , + `server_id` INT( 11 ) UNSIGNED NOT NULL , + PRIMARY KEY ( `user_id` , `server_id` ) + ) ENGINE = MYISAM ;"; + $this->execSQL($queries); - // from 3.0 all user-server relations are in a separate table - $users = $this->db->select(PSM_DB_PREFIX.'users', null, array('user_id', 'server_id')); - foreach ($users as $user) { - $idc = array(); - if ($user['server_id'] == '') { - continue; - } - if (strpos($user['server_id'], ',') === false) { - $idc[] = $user['server_id']; - } else { - $idc = explode(',', $user['server_id']); - } - foreach ($idc as $id) { - $this->db->save(PSM_DB_PREFIX.'users_servers', array( - 'user_id' => $user['user_id'], - 'server_id' => $id, - )); - } - } - $this->execSQL("ALTER TABLE `".PSM_DB_PREFIX."users` DROP `server_id`;"); - } + // from 3.0 all user-server relations are in a separate table + $users = $this->db->select(PSM_DB_PREFIX . 'users', null, array('user_id', 'server_id')); + foreach ($users as $user) { + $idc = array(); + if ($user['server_id'] == '') { + continue; + } + if (strpos($user['server_id'], ',') === false) { + $idc[] = $user['server_id']; + } else { + $idc = explode(',', $user['server_id']); + } + foreach ($idc as $id) { + $this->db->save(PSM_DB_PREFIX . 'users_servers', array( + 'user_id' => $user['user_id'], + 'server_id' => $id, + )); + } + } + $this->execSQL("ALTER TABLE `" . PSM_DB_PREFIX . "users` DROP `server_id`;"); + } - /** - * Upgrade for v3.1.0 release - */ - protected function upgrade310() { - $queries = array(); - psm_update_conf('log_retention_period', '365'); + /** + * Upgrade for v3.1.0 release + */ + protected function upgrade310() + { + $queries = array(); + psm_update_conf('log_retention_period', '365'); - psm_update_conf('pushover_status', 0); - psm_update_conf('log_pushover', 1); - psm_update_conf('pushover_api_token', ''); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` ADD `pushover_key` VARCHAR( 255 ) NOT NULL AFTER `mobile`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` ADD `pushover_device` VARCHAR( 255 ) NOT NULL AFTER `pushover_key`;"; + psm_update_conf('pushover_status', 0); + psm_update_conf('log_pushover', 1); + psm_update_conf('pushover_api_token', ''); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_key` VARCHAR( 255 ) + NOT NULL AFTER `mobile`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `pushover_device` VARCHAR( 255 ) + NOT NULL AFTER `pushover_key`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `pushover` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `sms`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pushover` ENUM( 'yes','no' ) + NOT NULL DEFAULT 'yes' AFTER `sms`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . + "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover' ) + CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `timeout` smallint(1) unsigned NULL DEFAULT NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline` DATETIME NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `last_offline_duration` varchar(255) NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `timeout` smallint(1) unsigned NULL DEFAULT NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline` DATETIME NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `last_offline_duration` varchar(255) NULL;"; - $queries[] = "CREATE TABLE IF NOT EXISTS `".PSM_DB_PREFIX."users_preferences` ( - `user_id` int(11) unsigned NOT NULL, - `key` varchar(255) NOT NULL, - `value` varchar(255) NOT NULL, - PRIMARY KEY (`user_id`, `key`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; + $queries[] = "CREATE TABLE IF NOT EXISTS `" . PSM_DB_PREFIX . "users_preferences` ( + `user_id` int(11) unsigned NOT NULL, + `key` varchar(255) NOT NULL, + `value` varchar(255) NOT NULL, + PRIMARY KEY (`user_id`, `key`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"; - $this->execSQL($queries); - } + $this->execSQL($queries); + } - /** - * Upgrade for v3.2.0 release - */ - protected function upgrade320() { - $queries = array(); + /** + * Upgrade for v3.2.0 release + */ + protected function upgrade320() + { + $queries = array(); - psm_update_conf('password_encrypt_key', sha1(microtime())); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `ip` `ip` VARCHAR(500) NOT NULL;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `website_username` varchar(255) NULL, ADD `website_password` varchar(255) NULL AFTER `website_username`;"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUE - ('proxy', '0'), - ('proxy_url', ''), - ('proxy_user', ''), - ('proxy_password', '');"; + psm_update_conf('password_encrypt_key', sha1(microtime())); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `ip` `ip` VARCHAR(500) NOT NULL;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `website_username` varchar(255) NULL, + ADD `website_password` varchar(255) NULL AFTER `website_username`;"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE + ('proxy', '0'), + ('proxy_url', ''), + ('proxy_user', ''), + ('proxy_password', '');"; - $this->execSQL($queries); + $this->execSQL($queries); - // Create log_users table - $this->execSQL("CREATE TABLE `".PSM_DB_PREFIX."log_users` ( + // Create log_users table + $this->execSQL("CREATE TABLE `" . PSM_DB_PREFIX . "log_users` ( `log_id` int(11) UNSIGNED NOT NULL , `user_id` int(11) UNSIGNED NOT NULL , PRIMARY KEY (`log_id`, `user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); - // Migrate the data - $logs = $this->db->select(PSM_DB_PREFIX.'log', null, array('log_id', 'user_id')); - foreach ($logs as $log) { - // Validation - if (empty($log['user_id']) || trim($log['user_id']) == '') { - continue; - } + // Migrate the data + $logs = $this->db->select(PSM_DB_PREFIX . 'log', null, array('log_id', 'user_id')); + foreach ($logs as $log) { + // Validation + if (empty($log['user_id']) || trim($log['user_id']) == '') { + continue; + } - // Insert into new table - foreach (explode(',', $log['user_id']) as $user_id) { - psm_add_log_user($log['log_id'], $user_id); - } - } + // Insert into new table + foreach (explode(',', $log['user_id']) as $user_id) { + psm_add_log_user($log['log_id'], $user_id); + } + } - // Drop old user_id('s) column - $this->execSQL("ALTER TABLE `".PSM_DB_PREFIX."log` DROP COLUMN `user_id`;"); - } + // Drop old user_id('s) column + $this->execSQL("ALTER TABLE `" . PSM_DB_PREFIX . "log` DROP COLUMN `user_id`;"); + } - /** - * Upgrade for v3.2.1 release - */ - protected function upgrade321() { - $queries = array(); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `header_name` VARCHAR(255) AFTER `pattern`, ADD COLUMN `header_value` VARCHAR(255) AFTER `header_name`"; - $this->execSQL($queries); - } + /** + * Upgrade for v3.2.1 release + */ + protected function upgrade321() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD COLUMN `header_name` VARCHAR(255) AFTER `pattern`, + ADD COLUMN `header_value` VARCHAR(255) AFTER `header_name`"; + $this->execSQL($queries); + } - /** - * Upgrade for v3.2.2 release - */ - protected function upgrade322() { - $queries = array(); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."users` ADD `telegram_id` VARCHAR( 255 ) NOT NULL AFTER `pushover_device`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `telegram` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `pushover`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUE - ('telegram_status', '0'), - ('log_telegram', '1'), - ('telegram_api_token', '');"; - $this->execSQL($queries); - } + /** + * Upgrade for v3.2.2 release + */ + protected function upgrade322() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "users` ADD `telegram_id` VARCHAR( 255 ) + NOT NULL AFTER `pushover_device`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `telegram` ENUM( 'yes','no' ) + NOT NULL DEFAULT 'yes' AFTER `pushover`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . + "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram' ) + CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE + ('telegram_status', '0'), + ('log_telegram', '1'), + ('telegram_api_token', '');"; + $this->execSQL($queries); + } - /** - * Upgrade for v3.3.0 release - */ - protected function upgrade330() { - $queries = array(); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `last_offline` DATETIME NULL AFTER `last_online`, ADD COLUMN `last_offline_duration` varchar(255) NULL AFTER `last_offline`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `pattern_online` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `pattern`;"; - $this->execSQL($queries); - if (psm_get_conf('sms_gateway') == 'mollie') { - psm_update_conf('sms_gateway', 'messagebird'); - } - } + /** + * Upgrade for v3.3.0 release + */ + protected function upgrade330() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD COLUMN `last_offline` DATETIME + NULL AFTER `last_online`, ADD COLUMN `last_offline_duration` varchar(255) NULL AFTER `last_offline`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `pattern_online` ENUM( 'yes','no' ) + NOT NULL DEFAULT 'yes' AFTER `pattern`;"; + $this->execSQL($queries); + if (psm_get_conf('sms_gateway') == 'mollie') { + psm_update_conf('sms_gateway', 'messagebird'); + } + } - /** - * Upgrade for v3.4.0 release - */ - protected function upgrade340() { - $queries = array(); - /** - * Redirect_check is first set to default ok. - * If you have a lot of server that are redirecting, - * this will make sure you're servers stay online. - */ - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `allow_http_status` VARCHAR(255) NOT NULL DEFAULT '' AFTER `pattern_online`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD `redirect_check` ENUM( 'ok','bad' ) NOT NULL DEFAULT 'ok' AFTER `allow_http_status`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `redirect_check` `redirect_check` ENUM('ok','bad') NOT NULL DEFAULT 'bad';"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `last_error` VARCHAR(255) NULL AFTER `website_password`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `last_error_output` TEXT NULL AFTER `last_error`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `last_output` TEXT NULL AFTER `last_error_output`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `request_method` varchar(50) NULL AFTER `port`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` ADD COLUMN `post_field` varchar(255) NULL AFTER `pattern_online`;"; - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."log` CHANGE `message` `message` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; - $queries[] = "INSERT INTO `".PSM_DB_PREFIX."config` (`key`, `value`) VALUES ('combine_notifications', '1');"; - $this->execSQL($queries); - $this->log('Combined notifications enabled. Check out the config page for more info.'); - } - - /** - * Patch for v3.4.2 release - * Version_compare was forgotten in v3.4.1 and query failed. - * Fixed in v3.4.2, 3.4.1 has been removed. - */ - protected function upgrade342() { - $queries = array(); - $queries[] = "ALTER TABLE `".PSM_DB_PREFIX."servers` CHANGE `last_output` `last_output` TEXT;"; - $this->execSQL($queries); - } + /** + * Upgrade for v3.4.0 release + */ + protected function upgrade340() + { + $queries = array(); + /** + * Redirect_check is first set to default ok. + * If you have a lot of server that are redirecting, + * this will make sure you're servers stay online. + */ + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `allow_http_status` VARCHAR(255) NOT NULL DEFAULT '' AFTER `pattern_online`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD `redirect_check` ENUM( 'ok','bad' ) NOT NULL DEFAULT 'ok' AFTER `allow_http_status`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + CHANGE `redirect_check` `redirect_check` ENUM('ok','bad') NOT NULL DEFAULT 'bad';"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `last_error` VARCHAR(255) NULL AFTER `website_password`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `last_error_output` TEXT AFTER `last_error`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `last_output` TEXT AFTER `last_error_output`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `request_method` varchar(50) NULL AFTER `port`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD COLUMN `post_field` varchar(255) NULL AFTER `pattern_online`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "log` + CHANGE `message` `message` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) + VALUES ('combine_notifications', '1');"; + $this->execSQL($queries); + $this->log('Combined notifications enabled. Check out the config page for more info.'); + } + + /** + * Patch for v3.4.2 release + * Version_compare was forgotten in v3.4.1 and query failed. + * Fixed in v3.4.2, 3.4.1 has been removed. + */ + protected function upgrade342() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` CHANGE `last_output` `last_output` TEXT;"; + $this->execSQL($queries); + } + + /** + * Upgrade for v3.5.0 release + */ + protected function upgrade350() + { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD `ssl_cert_expiry_days` MEDIUMINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `warning_threshold_counter`"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` + ADD `ssl_cert_expired_time` VARCHAR(255) NULL AFTER `ssl_cert_expiry_days`"; + + if ( + @psm_password_decrypt( + psm_get_conf('password_encrypt_key'), + psm_get_conf('email_smtp_password') + ) === false + ) { + // Prevents encrypting the password multiple times. + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "config` + SET `value` = '" . + psm_password_encrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('email_smtp_password')) . + "' WHERE `key` = 'email_smtp_password'"; + $this->log('SMTP password is now encrypted.'); + } + + $queries[] = 'ALTER TABLE `' . PSM_DB_PREFIX . 'users` ADD `jabber` VARCHAR( 255 ) + NOT NULL AFTER `telegram_id`;'; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD `jabber` ENUM( 'yes','no' ) + NOT NULL DEFAULT 'yes' AFTER `telegram`;"; + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . + "log` CHANGE `type` `type` ENUM( 'status', 'email', 'sms', 'pushover', 'telegram', 'jabber' ) + CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE + ('jabber_status', '0'), + ('log_jabber', '1'), + ('jabber_host', ''), + ('jabber_port', ''), + ('jabber_username', ''), + ('jabber_domain', ''), + ('jabber_password', '');"; + + $this->execSQL($queries); + } } diff --git a/src/psm/Util/Module/Modal.php b/src/psm/Util/Module/Modal.php index 014b6325..76d27ee6 100644 --- a/src/psm/Util/Module/Modal.php +++ b/src/psm/Util/Module/Modal.php @@ -1,4 +1,5 @@ modal_id = $modal_id; - $this->twig = $twig; - $this->type = $type; - } + public function __construct(\Twig_Environment $twig, $modal_id = 'main', $type = self::MODAL_TYPE_OK) + { + $this->modal_id = $modal_id; + $this->twig = $twig; + $this->type = $type; + } - /** - * get the modal dialog box element prefix - * @return string - */ - public function getModalID() { - return $this->modal_id; - } + /** + * get the modal dialog box element prefix + * @return string + */ + public function getModalID() + { + return $this->modal_id; + } - /** - * Set the modal dialog type - * @param int $type - * @return \psm\Util\Module\Modal - */ - public function setType($type) { - if (in_array($type, array(self::MODAL_TYPE_OK, self::MODAL_TYPE_OKCANCEL, self::MODAL_TYPE_DANGER))) { - $this->type = $type; - } - return $this; - } + /** + * Set the modal dialog type + * @param int $type + * @return \psm\Util\Module\Modal + */ + public function setType($type) + { + if (in_array($type, array(self::MODAL_TYPE_OK, self::MODAL_TYPE_OKCANCEL, self::MODAL_TYPE_DANGER))) { + $this->type = $type; + } + return $this; + } - /** - * Set the modal dialog title - * @param string $title - * @return \psm\Util\Module\Modal - */ - public function setTitle($title) { - $this->title = $title; - return $this; - } + /** + * Set the modal dialog title + * @param string $title + * @return \psm\Util\Module\Modal + */ + public function setTitle($title) + { + $this->title = $title; + return $this; + } - /** - * Set the modal dialog message - * @param string $message - * @return \psm\Util\Module\Modal - */ - public function setMessage($message) { - $this->message = $message; - return $this; - } + /** + * Set the modal dialog message + * @param string $message + * @return \psm\Util\Module\Modal + */ + public function setMessage($message) + { + $this->message = $message; + return $this; + } - public function setOKButtonLabel($label) { - $this->ok_label = $label; - return $this; - } + public function setOKButtonLabel($label) + { + $this->ok_label = $label; + return $this; + } - public function createHTML() { - $has_cancel = ($this->type == self::MODAL_TYPE_OK) ? false : true; - $button_type = ($this->type == self::MODAL_TYPE_DANGER) ? 'danger' : 'primary'; - $button_label = empty($this->ok_label) ? psm_get_lang('system', 'ok') : $this->ok_label; - $message = !empty($this->message) ? $this->message : ''; + public function createHTML() + { + $has_cancel = ($this->type == self::MODAL_TYPE_OK) ? false : true; + $button_type = ($this->type == self::MODAL_TYPE_DANGER) ? 'danger' : 'primary'; + $button_label = empty($this->ok_label) ? psm_get_lang('system', 'ok') : $this->ok_label; + $message = !empty($this->message) ? $this->message : ''; - $matches = array(); - if (preg_match_all('/%(\d)/', $message, $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - $message = str_replace($match[0], '', $message); - } - } + $matches = array(); + if (preg_match_all('/%(\d)/', $message, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $message = str_replace($match[0], '', $message); + } + } - $tpl = $this->twig->loadTemplate('util/module/modal.tpl.html'); - $html = $tpl->render(array( - 'modal_id' => $this->modal_id, - 'modal_title' => !empty($this->title) ? $this->title : psm_get_lang('system', 'title'), - 'modal_body' => $message, - 'has_cancel' => $has_cancel, - 'label_cancel' => psm_get_lang('system', 'cancel'), - 'modal_button_type' => $button_type, - 'modal_button_label'=> $button_label, - )); + $tpl = $this->twig->loadTemplate('util/module/modal.tpl.html'); + $html = $tpl->render(array( + 'modal_id' => $this->modal_id, + 'modal_title' => !empty($this->title) ? $this->title : psm_get_lang('system', 'title'), + 'modal_body' => $message, + 'has_cancel' => $has_cancel, + 'label_cancel' => psm_get_lang('system', 'cancel'), + 'modal_button_type' => $button_type, + 'modal_button_label' => $button_label, + )); - return $html; - } + return $html; + } } diff --git a/src/psm/Util/Module/ModalInterface.php b/src/psm/Util/Module/ModalInterface.php index d4cd0576..a7d79bb3 100644 --- a/src/psm/Util/Module/ModalInterface.php +++ b/src/psm/Util/Module/ModalInterface.php @@ -1,4 +1,5 @@ twig = $twig; - } + public function __construct(\Twig_Environment $twig) + { + $this->twig = $twig; + } - /** - * Set active item - * @param string $id - * @return \psm\Util\Module\Sidebar - */ - public function setActiveItem($id) { - $this->active_id = $id; - return $this; - } + /** + * Set active item + * @param string $id + * @return \psm\Util\Module\Sidebar + */ + public function setActiveItem($id) + { + $this->active_id = $id; + return $this; + } - /** - * Set a custom subtitle (default is module subitle) - * @param string $title - * @return \psm\Util\Module\Sidebar - */ - public function setSubtitle($title) { - $this->subtitle = $title; - return $this; - } + /** + * Set a custom subtitle (default is module subitle) + * @param string $title + * @return \psm\Util\Module\Sidebar + */ + public function setSubtitle($title) + { + $this->subtitle = $title; + return $this; + } - /** - * Add new link to sidebar - * @param string $id - * @param string $label - * @param string $url - * @param string $icon - * @return \psm\Util\Module\Sidebar - */ - public function addLink($id, $label, $url, $icon = null) { - if (!isset($this->items['link'])) { - $this->items['link'] = array(); - } + /** + * Add new link to sidebar + * @param string $id + * @param string $label + * @param string $url + * @param string $icon + * @return \psm\Util\Module\Sidebar + */ + public function addLink($id, $label, $url, $icon = null) + { + if (!isset($this->items['link'])) { + $this->items['link'] = array(); + } - $this->items['link'][$id] = array( - 'id' => $id, - 'label' => $label, - 'url' => str_replace('"', '\"', $url), - 'icon' => $icon, - ); - return $this; - } + $this->items['link'][$id] = array( + 'id' => $id, + 'label' => $label, + 'url' => str_replace('"', '\"', $url), + 'icon' => $icon, + ); + return $this; + } - /** - * Add a new button to the sidebar - * @param string $id - * @param string $label - * @param string $url - * @param string $icon - * @param string $btn_class - * @param boolean $url_is_onclick if you want onclick rather than url, change this to true - * @return \psm\Util\Module\Sidebar - */ - public function addButton($id, $label, $url, $icon = null, $btn_class = 'link', $title = '', $modal_id = null) { - if (!isset($this->items['button'])) { - $this->items['button'] = array(); - } + /** + * Add a new button to the sidebar + * @param string $id + * @param string $label + * @param string $url + * @param string $icon + * @param string $btn_class + * @param boolean $url_is_onclick if you want onclick rather than url, change this to true + * @return \psm\Util\Module\Sidebar + */ + public function addButton($id, $label, $url, $icon = null, $btn_class = 'link', $title = '', $modal_id = null) + { + if (!isset($this->items['button'])) { + $this->items['button'] = array(); + } - $this->items['button'][$id] = array( - 'id' => $id, - 'label' => $label, - 'url' => str_replace('"', '\"', $url), - 'icon' => $icon, - 'btn_class'=> $btn_class, - 'title'=> $title, - 'modal_id'=> $modal_id - ); - return $this; - } + $this->items['button'][$id] = array( + 'id' => $id, + 'label' => $label, + 'url' => str_replace('"', '\"', $url), + 'icon' => $icon, + 'btn_class' => $btn_class, + 'title' => $title, + 'modal_id' => $modal_id + ); + return $this; + } - /** - * Add dropdown button - * @param string $id - * @param string $label - * @param array $options - * @param string $icon - * @param string $btn_class - * @return \psm\Util\Module\Sidebar - */ - public function addDropdown($id, $label, $options, $icon = null, $btn_class = null) { - if (!isset($this->items['dropdown'])) { - $this->items['dropdown'] = array(); - } - $this->items['dropdown'][$id] = array( - 'id' => $id, - 'label' => $label, - 'options' => $options, - 'icon' => $icon, - 'btn_class' => $btn_class, - ); - return $this; - } + /** + * Add dropdown button + * @param string $id + * @param string $label + * @param array $options + * @param string $icon + * @param string $btn_class + * @return \psm\Util\Module\Sidebar + */ + public function addDropdown($id, $label, $options, $icon = null, $btn_class = null) + { + if (!isset($this->items['dropdown'])) { + $this->items['dropdown'] = array(); + } + $this->items['dropdown'][$id] = array( + 'id' => $id, + 'label' => $label, + 'options' => $options, + 'icon' => $icon, + 'btn_class' => $btn_class, + ); + return $this; + } - public function createHTML() { - $tpl_data = array( - 'subtitle' => $this->subtitle, - ); - $types = array('dropdown', 'button', 'link'); - $tpl_data['items'] = array(); + public function createHTML() + { + $tpl_data = array( + 'subtitle' => $this->subtitle, + ); + $types = array('dropdown', 'button', 'link'); + $tpl_data['items'] = array(); - // loop through all types and build their html - foreach ($types as $type) { - if (empty($this->items[$type])) { - // no items for this type - continue; - } + // loop through all types and build their html + foreach ($types as $type) { + if (empty($this->items[$type])) { + // no items for this type + continue; + } - // build html for each individual item - foreach ($this->items[$type] as $id => $item) { - $item['type'] = $type; - $item['class_active'] = ($id === $this->active_id) ? 'active' : ''; - $tpl_data['items'][] = $item; - } - } + // build html for each individual item + foreach ($this->items[$type] as $id => $item) { + $item['type'] = $type; + $item['class_active'] = ($id === $this->active_id) ? 'active' : ''; + $tpl_data['items'][] = $item; + } + } - $tpl = $this->twig->loadTemplate('util/module/sidebar.tpl.html'); - $html = $tpl->render($tpl_data); + $tpl = $this->twig->loadTemplate('util/module/sidebar.tpl.html'); + $html = $tpl->render($tpl_data); - return $html; - } -} \ No newline at end of file + return $html; + } +} diff --git a/src/psm/Util/Module/SidebarInterface.php b/src/psm/Util/Module/SidebarInterface.php index 9102bfaf..f99775a7 100644 --- a/src/psm/Util/Module/SidebarInterface.php +++ b/src/psm/Util/Module/SidebarInterface.php @@ -1,4 +1,5 @@ db = $db; + public function __construct(\psm\Service\Database $db) + { + $this->db = $db; - $this->setRetentionPeriod(psm_get_conf('log_retention_period', 365)); + $this->setRetentionPeriod(psm_get_conf('log_retention_period', 365)); - $this->archivers[] = new Archiver\UptimeArchiver($db); - $this->archivers[] = new Archiver\LogsArchiver($db); - } + $this->archivers[] = new Archiver\UptimeArchiver($db); + $this->archivers[] = new Archiver\LogsArchiver($db); + } - /** - * Archive one or more servers. - * @param int $server_id - * @return boolean - */ - public function archive($server_id = null) { - $result = true; - foreach ($this->archivers as $archiver) { - if (!$archiver->archive($server_id)) { - $result = false; - } - } - return $result; - } + /** + * Archive one or more servers. + * @param int $server_id + * @return boolean + */ + public function archive($server_id = null) + { + $result = true; + foreach ($this->archivers as $archiver) { + if (!$archiver->archive($server_id)) { + $result = false; + } + } + return $result; + } - /** - * Cleanup old records for one or more servers - * @param int $server_id - * @return boolean - */ - public function cleanup($server_id = null) { - $result = true; - if (!$this->retention_period) { - // cleanup is disabled - return $result; - } - $retdate = new \DateTime(); - $retdate->sub($this->retention_period); + /** + * Cleanup old records for one or more servers + * @param int $server_id + * @return boolean + */ + public function cleanup($server_id = null) + { + $result = true; + if (!$this->retention_period) { + // cleanup is disabled + return $result; + } + $retdate = new \DateTime(); + $retdate->sub($this->retention_period); - foreach ($this->archivers as $archiver) { - if (!$archiver->cleanup($retdate, $server_id)) { - $result = false; - } - } - return $result; - } + foreach ($this->archivers as $archiver) { + if (!$archiver->cleanup($retdate, $server_id)) { + $result = false; + } + } + return $result; + } - /** - * Set retention period for this archive run. - * - * Set period to 0 to disable cleanup altogether. - * @param \DateInterval|int $period \DateInterval object or number of days (int) - * @return \psm\Util\Server\ArchiveManager - */ - public function setRetentionPeriod($period) { - if (is_object($period) && $period instanceof \DateInterval) { - $this->retention_period = $period; - } elseif (intval($period) == 0) { - // cleanup disabled - $this->retention_period = false; - } else { - $this->retention_period = new \DateInterval('P'.intval($period).'D'); - } - return $this; - } -} \ No newline at end of file + /** + * Set retention period for this archive run. + * + * Set period to 0 to disable cleanup altogether. + * @param \DateInterval|int $period \DateInterval object or number of days (int) + * @return \psm\Util\Server\ArchiveManager + */ + public function setRetentionPeriod($period) + { + if (is_object($period) && $period instanceof \DateInterval) { + $this->retention_period = $period; + } elseif (intval($period) == 0) { + // cleanup disabled + $this->retention_period = false; + } else { + $this->retention_period = new \DateInterval('P' . intval($period) . 'D'); + } + return $this; + } +} diff --git a/src/psm/Util/Server/Archiver/ArchiverInterface.php b/src/psm/Util/Server/Archiver/ArchiverInterface.php index 6007e1ad..8c46433e 100644 --- a/src/psm/Util/Server/Archiver/ArchiverInterface.php +++ b/src/psm/Util/Server/Archiver/ArchiverInterface.php @@ -1,4 +1,5 @@ db = $db; - } + public function __construct(Database $db) + { + $this->db = $db; + } - /** - * Currently there is not really a log archive. - * - * It stays in the log table until cleaned up. - * @param int $server_id - */ - public function archive($server_id = null) { - return true; - } + /** + * Currently there is not really a log archive. + * + * It stays in the log table until cleaned up. + * @param int $server_id + */ + public function archive($server_id = null) + { + return true; + } - public function cleanup(\DateTime $retention_date, $server_id = null) { - $sql_where_server = ($server_id !== null) - // this is obviously not the cleanest way to implement this when using paramter binding.. sorry. - ? ' `server_id` = '.intval($server_id).' AND ' - : ''; + public function cleanup(\DateTime $retention_date, $server_id = null) + { + $sql_where_server = ($server_id !== null) + // this is obviously not the cleanest way to implement this when using paramter binding.. sorry. + ? ' `server_id` = ' . intval($server_id) . ' AND ' + : ''; - $this->db->execute( - "DELETE FROM `".PSM_DB_PREFIX."log` WHERE {$sql_where_server} `datetime` < :latest_date", - array('latest_date' => $retention_date->format('Y-m-d 00:00:00')), - false - ); - return true; - } + $this->db->execute( + "DELETE FROM `" . PSM_DB_PREFIX . "log` WHERE {$sql_where_server} `datetime` < :latest_date", + array('latest_date' => $retention_date->format('Y-m-d 00:00:00')), + false + ); + return true; + } - /** - * Empty tables log and log_users - */ - public function cleanupall() { - $this->db->delete(PSM_DB_PREFIX."log"); - $this->db->delete(PSM_DB_PREFIX."log_users"); - return true; - } + /** + * Empty tables log and log_users + */ + public function cleanupall() + { + $this->db->delete(PSM_DB_PREFIX . "log"); + $this->db->delete(PSM_DB_PREFIX . "log_users"); + return true; + } } diff --git a/src/psm/Util/Server/Archiver/UptimeArchiver.php b/src/psm/Util/Server/Archiver/UptimeArchiver.php index d8ee9e2c..e7db3183 100644 --- a/src/psm/Util/Server/Archiver/UptimeArchiver.php +++ b/src/psm/Util/Server/Archiver/UptimeArchiver.php @@ -1,4 +1,5 @@ db = $db; - } + public function __construct(Database $db) + { + $this->db = $db; + } - /** - * Archive all server status records older than 1 week. - * - * Archiving means calculating averages per day, and storing 1 single - * history row for each day for each server. - * - * @param int $server_id - */ - public function archive($server_id = null) { - $latest_date = new \DateTime('-1 week 0:0:0'); + /** + * Archive all server status records older than 1 week. + * + * Archiving means calculating averages per day, and storing 1 single + * history row for each day for each server. + * + * @param int $server_id + */ + public function archive($server_id = null) + { + $latest_date = new \DateTime('-1 week 0:0:0'); - // Lock tables to prevent simultaneous archiving (by other sessions or the cron job) - try { - $this->db->pdo()->exec('LOCK TABLES '.PSM_DB_PREFIX.'servers_uptime WRITE, '.PSM_DB_PREFIX.'servers_history WRITE'); - $locked = true; - } catch (\PDOException $e) { - // user does not have lock rights, ignore - $locked = false; - } + // Lock tables to prevent simultaneous archiving (by other sessions or the cron job) + try { + $this->db->pdo()->exec('LOCK TABLES ' . PSM_DB_PREFIX . + 'servers_uptime WRITE, ' . PSM_DB_PREFIX . 'servers_history WRITE'); + $locked = true; + } catch (\PDOException $e) { + // user does not have lock rights, ignore + $locked = false; + } - $latest_date_str = $latest_date->format('Y-m-d 00:00:00'); + $latest_date_str = $latest_date->format('Y-m-d 00:00:00'); - $sql_where_server = $this->createSQLWhereServer($server_id); + $sql_where_server = $this->createSQLWhereServer($server_id); - $records = $this->db->execute( - "SELECT `server_id`,`date`,`status`,`latency` - FROM `".PSM_DB_PREFIX."servers_uptime` + $records = $this->db->execute( + "SELECT `server_id`,`date`,`status`,`latency` + FROM `" . PSM_DB_PREFIX . "servers_uptime` WHERE {$sql_where_server} `date` < :latest_date", - array('latest_date' => $latest_date_str)); + array('latest_date' => $latest_date_str) + ); - if (!empty($records)) { - // first group all records by day and server_id - $data_by_day = array(); - foreach ($records as $record) { - $server_id = (int) $record['server_id']; - $day = date('Y-m-d', strtotime($record['date'])); - if (!isset($data_by_day[$day][$server_id])) { - $data_by_day[$day][$server_id] = array(); - } - $data_by_day[$day][$server_id][] = $record; - } + if (!empty($records)) { + // first group all records by day and server_id + $data_by_day = array(); + foreach ($records as $record) { + $server_id = (int) $record['server_id']; + $day = date('Y-m-d', strtotime($record['date'])); + if (!isset($data_by_day[$day][$server_id])) { + $data_by_day[$day][$server_id] = array(); + } + $data_by_day[$day][$server_id][] = $record; + } - // now get history data day by day - $histories = array(); - foreach ($data_by_day as $day => $day_records) { - foreach ($day_records as $server_id => $server_day_records) { - $histories[] = $this->getHistoryForDay($day, $server_id, $server_day_records); - } - } + // now get history data day by day + $histories = array(); + foreach ($data_by_day as $day => $day_records) { + foreach ($day_records as $server_id => $server_day_records) { + $histories[] = $this->getHistoryForDay($day, $server_id, $server_day_records); + } + } - // Save all - $this->db->insertMultiple(PSM_DB_PREFIX.'servers_history', $histories); + // Save all + $this->db->insertMultiple(PSM_DB_PREFIX . 'servers_history', $histories); - // now remove all records from the uptime table - $this->db->execute( - "DELETE FROM `".PSM_DB_PREFIX."servers_uptime` WHERE {$sql_where_server} `date` < :latest_date", - array('latest_date' => $latest_date_str), - false - ); - } + // now remove all records from the uptime table + $this->db->execute( + "DELETE FROM `" . PSM_DB_PREFIX . "servers_uptime` WHERE {$sql_where_server} `date` < :latest_date", + array('latest_date' => $latest_date_str), + false + ); + } - if ($locked) { - $this->db->exec('UNLOCK TABLES'); - } + if ($locked) { + $this->db->exec('UNLOCK TABLES'); + } - return true; - } + return true; + } - public function cleanup(\DateTime $retention_date, $server_id = null) { - $sql_where_server = $this->createSQLWhereServer($server_id); - $this->db->execute( - "DELETE FROM `".PSM_DB_PREFIX."servers_history` WHERE {$sql_where_server} `date` < :latest_date", - array('latest_date' => $retention_date->format('Y-m-d 00:00:00')), - false - ); - return true; - } + public function cleanup(\DateTime $retention_date, $server_id = null) + { + $sql_where_server = $this->createSQLWhereServer($server_id); + $this->db->execute( + "DELETE FROM `" . PSM_DB_PREFIX . "servers_history` WHERE {$sql_where_server} `date` < :latest_date", + array('latest_date' => $retention_date->format('Y-m-d 00:00:00')), + false + ); + return true; + } - /** - * Build a history array for a day records - * @param string $day - * @param int $server_id - * @param array $day_records - * @return array - */ - protected function getHistoryForDay($day, $server_id, $day_records) { - $latencies = array(); - $checks_failed = 0; + /** + * Build a history array for a day records + * @param string $day + * @param int $server_id + * @param array $day_records + * @return array + */ + protected function getHistoryForDay($day, $server_id, $day_records) + { + $latencies = array(); + $checks_failed = 0; - foreach ($day_records as $day_record) { - $latencies[] = $day_record['latency']; + foreach ($day_records as $day_record) { + $latencies[] = $day_record['latency']; - if ($day_record['status'] == 0) { - $checks_failed++; - } - } - sort($latencies, SORT_NUMERIC); + if ($day_record['status'] == 0) { + $checks_failed++; + } + } + sort($latencies, SORT_NUMERIC); - $history = array( - 'date' => $day, - 'server_id' => $server_id, - 'latency_min' => min($latencies), - 'latency_avg' => array_sum($latencies) / count($latencies), - 'latency_max' => max($latencies), - 'checks_total' => count($day_records), - 'checks_failed' => $checks_failed, - ); - return $history; - } + $history = array( + 'date' => $day, + 'server_id' => $server_id, + 'latency_min' => min($latencies), + 'latency_avg' => array_sum($latencies) / count($latencies), + 'latency_max' => max($latencies), + 'checks_total' => count($day_records), + 'checks_failed' => $checks_failed, + ); + return $history; + } - protected function createSQLWhereServer($server_id) { - $sql_where_server = ($server_id !== null) - // this is obviously not the cleanest way to implement this when using paramter binding.. sorry. - ? ' `server_id` = '.intval($server_id).' AND ' - : ''; + protected function createSQLWhereServer($server_id) + { + $sql_where_server = ($server_id !== null) + // this is obviously not the cleanest way to implement this when using paramter binding.. sorry. + ? ' `server_id` = ' . intval($server_id) . ' AND ' + : ''; - return $sql_where_server; - } -} \ No newline at end of file + return $sql_where_server; + } +} diff --git a/src/psm/Util/Server/HistoryGraph.php b/src/psm/Util/Server/HistoryGraph.php index 42c0b052..8b5b8e38 100644 --- a/src/psm/Util/Server/HistoryGraph.php +++ b/src/psm/Util/Server/HistoryGraph.php @@ -1,4 +1,5 @@ db = $db; - $this->twig = $twig; - } + public function __construct(Database $db, \Twig_Environment $twig) + { + $this->db = $db; + $this->twig = $twig; + } - /** - * Prepare the HTML for the graph - * @return string - */ - public function createHTML($server_id) { - // Archive all records for this server to make sure we have up-to-date stats - $archive = new ArchiveManager($this->db); - $archive->archive($server_id); + /** + * Prepare the HTML for the graph + * @return string + */ + public function createHTML($server_id) + { + // Archive all records for this server to make sure we have up-to-date stats + $archive = new ArchiveManager($this->db); + $archive->archive($server_id); - $now = new \DateTime(); - $last_week = new \DateTime('-1 week 0:0:0'); - $last_year = new \DateTime('-1 year -1 week 0:0:0'); + $now = new \DateTime(); + $last_week = new \DateTime('-1 week 0:0:0'); + $last_year = new \DateTime('-1 year -1 week 0:0:0'); - $graphs = array( - 0 => $this->generateGraphUptime($server_id, $last_week, $now), - 1 => $this->generateGraphHistory($server_id, $last_year, $last_week), - ); - $info_fields = array( - 'latency_avg' => '%01.4f', - 'uptime' => '%01.3f%%', - ); + $graphs = array( + 0 => $this->generateGraphUptime($server_id, $last_week, $now), + 1 => $this->generateGraphHistory($server_id, $last_year, $last_week), + ); + $info_fields = array( + 'latency_avg' => '%01.4f', + 'uptime' => '%01.3f%%', + ); - foreach ($graphs as $i => &$graph) { - // add subarray for info fields - $graph['info'] = array(); + foreach ($graphs as $i => &$graph) { + // add subarray for info fields + $graph['info'] = array(); - foreach ($info_fields as $field => $format) { - if (!isset($graph[$field])) { - continue; - } - $graph['info'][] = array( - 'label' => psm_get_lang('servers', $field), - 'value' => sprintf($format, $graph[$field]), - ); - } - } - $tpl_data = array( - 'graphs' => $graphs, - ); - return $this->twig->render('module/server/history.tpl.html', $tpl_data); - } + foreach ($info_fields as $field => $format) { + if (!isset($graph[$field])) { + continue; + } + $graph['info'][] = array( + 'label' => psm_get_lang('servers', $field), + 'value' => sprintf($format, $graph[$field]), + ); + } + } + $tpl_data = array( + 'graphs' => $graphs, + ); + return $this->twig->render('module/server/history.tpl.html', $tpl_data); + } - /** - * Generate data for uptime graph - * @param int $server_id - * @param \DateTime $start_time Lowest DateTime of the graph - * @param \DateTime $end_time Highest DateTime of the graph - * @return array - */ - public function generateGraphUptime($server_id, $start_time, $end_time) { + /** + * Generate data for uptime graph + * @param int $server_id + * @param \DateTime $start_time Lowest DateTime of the graph + * @param \DateTime $end_time Highest DateTime of the graph + * @return array + */ + public function generateGraphUptime($server_id, $start_time, $end_time) + { - $lines = array( - 'latency' => array(), - ); + $lines = array( + 'latency' => array(), + ); - $hour = new \DateTime('-1 hour'); - $day = new \DateTime('-1 day'); - $week = new \DateTime('-1 week'); - - $records = $this->getRecords('uptime', $server_id, $start_time, $end_time); + $hour = new \DateTime('-1 hour'); + $day = new \DateTime('-1 day'); + $week = new \DateTime('-1 week'); + + $records = $this->getRecords('uptime', $server_id, $start_time, $end_time); - $data = $this->generateGraphLines($records, $lines, 'latency', $hour, $end_time, true); + $data = $this->generateGraphLines($records, $lines, 'latency', $hour, $end_time, true); - $data['title'] = psm_get_lang('servers', 'chart_last_week'); - $data['id'] = 'history_short'; - $data['unit'] = 'minute'; - $data['buttons'] = array(); - $data['button_name'] = 'timeframe_short'; - $data['buttons'][] = array('unit' => 'minute', 'time' => $hour->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'hour'), 'class_active' => 'active'); - $data['buttons'][] = array('unit' => 'hour', 'time' => $day->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'day')); - $data['buttons'][] = array('unit' => 'day', 'time' => $week->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'week')); + $data['title'] = psm_get_lang('servers', 'chart_last_week'); + $data['id'] = 'history_short'; + $data['unit'] = 'minute'; + $data['buttons'] = array(); + $data['button_name'] = 'timeframe_short'; + $data['buttons'][] = array( + 'unit' => 'minute', + 'time' => $hour->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'hour'), + 'class_active' => 'active' + ); + $data['buttons'][] = array( + 'unit' => 'hour', + 'time' => $day->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'day') + ); + $data['buttons'][] = array( + 'unit' => 'day', + 'time' => $week->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'week') + ); - return $data; - } + return $data; + } - /** - * Generate data for history graph - * @param int $server_id - * @param \DateTime $start_time Lowest DateTime of the graph - * @param \DateTime $end_time Highest DateTime of the graph - * @return array - */ - public function generateGraphHistory($server_id, $start_time, $end_time) { - $lines = array( - 'latency_min' => array(), - 'latency_avg' => array(), - 'latency_max' => array(), - ); + /** + * Generate data for history graph + * @param int $server_id + * @param \DateTime $start_time Lowest DateTime of the graph + * @param \DateTime $end_time Highest DateTime of the graph + * @return array + */ + public function generateGraphHistory($server_id, $start_time, $end_time) + { + $lines = array( + 'latency_min' => array(), + 'latency_avg' => array(), + 'latency_max' => array(), + ); - $week = new \DateTime('-2 week 0:0:0'); - $month = new \DateTime('-1 month -1 week 0:0:0'); - $year = new \DateTime('-1 year -1 week 0:0:0'); + $week = new \DateTime('-2 week 0:0:0'); + $month = new \DateTime('-1 month -1 week 0:0:0'); + $year = new \DateTime('-1 year -1 week 0:0:0'); - $records = $this->getRecords('history', $server_id, $year, $end_time); + $records = $this->getRecords('history', $server_id, $year, $end_time); - // dont add uptime for now because we have no way to calculate accurate uptimes for archived records - $data = $this->generateGraphLines($records, $lines, 'latency_avg', $start_time, $end_time, false); - $data['title'] = psm_get_lang('servers', 'chart_history'); - $data['id'] = 'history_long'; - $data['unit'] = 'week'; - $data['buttons'] = array(); - $data['button_name'] = 'timeframe_long'; - $data['buttons'][] = array('unit' => 'day', 'time' => $week->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'week')); - $data['buttons'][] = array('unit' => 'week', 'time' => $month->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'month'), 'class_active' => 'active'); - $data['buttons'][] = array('unit' => 'month', 'time' => $year->getTimestamp()*1000, 'label' => psm_get_lang('servers', 'year')); + // dont add uptime for now because we have no way to calculate accurate uptimes for archived records + $data = $this->generateGraphLines($records, $lines, 'latency_avg', $start_time, $end_time, false); + $data['title'] = psm_get_lang('servers', 'chart_history'); + $data['id'] = 'history_long'; + $data['unit'] = 'week'; + $data['buttons'] = array(); + $data['button_name'] = 'timeframe_long'; + $data['buttons'][] = array( + 'unit' => 'day', + 'time' => $week->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'week') + ); + $data['buttons'][] = array( + 'unit' => 'week', + 'time' => $month->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'month'), + 'class_active' => 'active' + ); + $data['buttons'][] = array( + 'unit' => 'month', + 'time' => $year->getTimestamp() * 1000, + 'label' => psm_get_lang('servers', 'year') + ); - return $data; - } + return $data; + } - /** - * Get all uptime/history records for a server - * @param string $type - * @param int $server_id - * @param \DateTime $start_time Lowest DateTime of the graph - * @param \DateTime $end_time Highest DateTime of the graph - * @return array - */ - protected function getRecords($type, $server_id, $start_time, $end_time) { - if (!in_array($type, array('history', 'uptime'))) { - return array(); - } + /** + * Get all uptime/history records for a server + * @param string $type + * @param int $server_id + * @param \DateTime $start_time Lowest DateTime of the graph + * @param \DateTime $end_time Highest DateTime of the graph + * @return array + */ + protected function getRecords($type, $server_id, $start_time, $end_time) + { + if (!in_array($type, array('history', 'uptime'))) { + return array(); + } - $records = $this->db->execute( - "SELECT * - FROM `".PSM_DB_PREFIX."servers_$type` + $records = $this->db->execute( + "SELECT * + FROM `" . PSM_DB_PREFIX . "servers_$type` WHERE `server_id` = :server_id AND `date` BETWEEN :start_time AND :end_time ORDER BY `date` ASC", - array( - 'server_id' => $server_id, - 'start_time' => $start_time->format('Y-m-d H:i:s'), - 'end_time' => $end_time->format('Y-m-d H:i:s'), - )); - return $records; - } + array( + 'server_id' => $server_id, + 'start_time' => $start_time->format('Y-m-d H:i:s'), + 'end_time' => $end_time->format('Y-m-d H:i:s'), + ) + ); + return $records; + } - /** - * Generate data arrays for graphs - * @param array $records All uptime records to parse, MUST BE SORTED BY DATE IN ASCENDING ORDER - * @param array $lines Array with keys as line ids to prepare (key must be available in uptime records) - * @param string $latency_avg_key which key from uptime records to use for calculating averages - * @param \DateTime $start_time Lowest DateTime of the graph - * @param \DateTime $end_time Highest DateTime of the graph - * @param boolean $add_uptime Add uptime calculation? - * @param array $prev Previous result - * @param int $downtime Total downtime - * @param int $prev_downtime Timestamp from last offline record. 0 when last record is uptime - * @return array - */ - protected function generateGraphLines($records, $lines, $latency_avg_key, $start_time, $end_time, $add_uptime = false) { - $now = new \DateTime(); - $data = array(); + /** + * Generate data arrays for graphs + * @param array $records All uptime records to parse, MUST BE SORTED BY DATE IN ASCENDING ORDER + * @param array $lines Array with keys as line ids to prepare (key must be available in uptime records) + * @param string $latency_avg_key which key from uptime records to use for calculating averages + * @param \DateTime $start_time Lowest DateTime of the graph + * @param \DateTime $end_time Highest DateTime of the graph + * @param boolean $add_uptime Add uptime calculation? + * @param array $prev Previous result + * @param int $downtime Total downtime + * @param int $prev_downtime Timestamp from last offline record. 0 when last record is uptime + * @return array + */ + protected function generateGraphLines( + $records, + $lines, + $latency_avg_key, + $start_time, + $end_time, + $add_uptime = false + ) { + $now = new \DateTime(); + $data = array(); - // PLEASE NOTE: all times are in microseconds! because of javascript. - $latency_avg = 0; + // PLEASE NOTE: all times are in microseconds! because of javascript. + $latency_avg = 0; - $prev = reset($records); + $prev = reset($records); - $prev_downtime = 0; - $downtime = 0; + $prev_downtime = 0; + $downtime = 0; - // Create the list of points and server down zones - foreach ($records as $record) { - $time = strtotime($record['date']); - // use the first line to calculate average latency - $latency_avg += (float) $record[$latency_avg_key]; + // Create the list of points and server down zones + foreach ($records as $record) { + $time = strtotime($record['date']); + // use the first line to calculate average latency + $latency_avg += (float) $record[$latency_avg_key]; - foreach ($lines as $key => $value) { - // add the value for each of the different lines - if (isset($record[$key])) { - if (isset($record['status'])){ - // down - if ($record['status'] == 0){ - $lines['online'][] = $prev['status'] - // Previous datapoint was online - ? '{ x: '.($time*1000).', y: '.$prev['latency'].'}' - // Previous datapoint was offline - : '{ x: '.($time*1000).', y: null}'; - // new outage start - $lines['offline'][] = '{ x: '.($time*1000).', y:0.1}'; + foreach ($lines as $key => $value) { + // add the value for each of the different lines + if (isset($record[$key])) { + if (isset($record['status'])) { + // down + if ($record['status'] == 0) { + $lines['online'][] = $prev['status'] + // Previous datapoint was online + ? '{ x: ' . ($time * 1000) . ', y: ' . $prev['latency'] . '}' + // Previous datapoint was offline + : '{ x: ' . ($time * 1000) . ', y: null}'; + // new outage start + $lines['offline'][] = '{ x: ' . ($time * 1000) . ', y:0.1}'; - $prev_downtime != 0 ?: $prev_downtime = $time; - } - // up - else { - // outage ends - $lines['offline'][] = $prev['status'] - // Previous datapoint was online - ? '{ x: '.($time*1000).', y:null}' - // Previous datapoint was offline - : '{ x: '.($time*1000).', y:0.1}'; - $lines['online'][] = '{ x: '.($time*1000).', y: '.round((float) $record[$key], 4).'}'; + $prev_downtime != 0 ?: $prev_downtime = $time; + } else { + // up + // outage ends + $lines['offline'][] = $prev['status'] + // Previous datapoint was online + ? '{ x: ' . ($time * 1000) . ', y:null}' + // Previous datapoint was offline + : '{ x: ' . ($time * 1000) . ', y:0.1}'; + $lines['online'][] = '{ x: ' . ($time * 1000) . ', y: ' . + round((float) $record[$key], 4) . '}'; - $prev_downtime == 0 ?: $downtime += ($time - $prev_downtime); - $prev_downtime = 0; - } - } - else { - $lines[$key][] = '{ x: \''.$record['date'].'\', y: '.$record[$key].'}'; - } - $prev = $record; - } - } - } - // Was down before. - // Record the first and last date as a string in the down array - $prev_downtime == 0 ?: $downtime += ($now->getTimestamp()-$prev_downtime); - if ($add_uptime) { - $prev['status'] ?: $lines['offline'][] = '{ x: '.($now->getTimestamp()*1000).', y:0.1}'; - $data['uptime'] = 100 - ($downtime / ($end_time->getTimestamp() - $start_time->getTimestamp())); - } + $prev_downtime == 0 ?: $downtime += ($time - $prev_downtime); + $prev_downtime = 0; + } + } else { + $lines[$key][] = '{ x: \'' . $record['date'] . '\', y: ' . $record[$key] . '}'; + } + $prev = $record; + } + } + } + // Was down before. + // Record the first and last date as a string in the down array + $prev_downtime == 0 ?: $downtime += ($now->getTimestamp() - $prev_downtime); + if ($add_uptime) { + $prev['status'] ?: $lines['offline'][] = '{ x: ' . ($now->getTimestamp() * 1000) . ', y:0.1}'; + $data['uptime'] = 100 - ($downtime / ($end_time->getTimestamp() - $start_time->getTimestamp())); + } - $lines_merged = array(); - foreach ($lines as $line_key => $line_value) { - - if (empty($line_value)) { - continue; - } - $lines_merged[$line_key]['value'] = implode(', ', $line_value); - $lines_merged[$line_key]['name'] = psm_get_lang('servers', $line_key); - } + $lines_merged = array(); + foreach ($lines as $line_key => $line_value) { + if (empty($line_value)) { + continue; + } + $lines_merged[$line_key]['value'] = implode(', ', $line_value); + $lines_merged[$line_key]['name'] = psm_get_lang('servers', $line_key); + } - $data['latency_avg'] = count($records) > 0 ? ($latency_avg / count($records)) : 0; - $data['lines'] = sizeof($lines_merged) ? $lines_merged : ''; - $data['end_timestamp'] = number_format($end_time->getTimestamp(), 0, '', '')*1000; - $data['start_timestamp'] = number_format($start_time->getTimestamp(), 0, '', '')*1000; - return $data; - } + $data['latency_avg'] = count($records) > 0 ? ($latency_avg / count($records)) : 0; + $data['lines'] = sizeof($lines_merged) ? $lines_merged : ''; + $data['end_timestamp'] = number_format($end_time->getTimestamp(), 0, '', '') * 1000; + $data['start_timestamp'] = number_format($start_time->getTimestamp(), 0, '', '') * 1000; + return $data; + } } diff --git a/src/psm/Util/Server/ServerValidator.php b/src/psm/Util/Server/ServerValidator.php index e2f72d7f..18dc658b 100644 --- a/src/psm/Util/Server/ServerValidator.php +++ b/src/psm/Util/Server/ServerValidator.php @@ -1,4 +1,5 @@ db = $db; - } + public function __construct(\psm\Service\Database $db) + { + $this->db = $db; + } - /** - * Check if the server id exists - * @param int|\PDOStatement $server_id - * @return boolean - * @throws \InvalidArgumentException - */ - public function serverId($server_id) { - $server = $this->db->selectRow(PSM_DB_PREFIX.'servers', array('server_id' => $server_id), array('server_id')); + /** + * Check if the server id exists + * @param int|\PDOStatement $server_id + * @return boolean + * @throws \InvalidArgumentException + */ + public function serverId($server_id) + { + $server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array('server_id' => $server_id), array('server_id')); - if (empty($server)) { - throw new \InvalidArgumentException('server_no_match'); - } - return true; - } + if (empty($server)) { + throw new \InvalidArgumentException('server_no_match'); + } + return true; + } - /** - * Check label - * @param string $label - * @return boolean - * @throws \InvalidArgumentException - */ - public function label($label) { - $label = trim($label); - if (empty($label) || strlen($label) > 255) { - throw new \InvalidArgumentException('server_label_bad_length'); - } - return true; - } + /** + * Check label + * @param string $label + * @return boolean + * @throws \InvalidArgumentException + */ + public function label($label) + { + $label = trim($label); + if (empty($label) || strlen($label) > 255) { + throw new \InvalidArgumentException('server_label_bad_length'); + } + return true; + } - /** - * Check server domain/ip - * @param string $value - * @param string $type if given, it can be checked for "website"/"ip" - * @return boolean - * @throws \InvalidArgumentException - */ - public function ip($value, $type = null) { - $value = trim($value); + /** + * Check server domain/ip + * @param string $value + * @param string $type if given, it can be checked for "website"/"ip" + * @return boolean + * @throws \InvalidArgumentException + */ + public function ip($value, $type = null) + { + $value = trim($value); - if (empty($value) || strlen($value) > 255) { - throw new \InvalidArgumentException('server_ip_bad_length'); - } + if (empty($value) || strlen($value) > 255) { + throw new \InvalidArgumentException('server_ip_bad_length'); + } - switch ($type) { - case 'website': - if (!filter_var($value, FILTER_VALIDATE_URL)) { - throw new \InvalidArgumentException('server_ip_bad_website'); - } - break; - case 'service': - case 'ping': - if (!filter_var($value, FILTER_VALIDATE_IP) - // domain regex as per http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address : - && !preg_match("/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/", $value) - ) {throw new \InvalidArgumentException('server_ip_bad_service'); } - break; - } + switch ($type) { + case 'website': + // url regex as per https://stackoverflow.com/a/3809435 + // Regex looks a bit weird, but otherwise it's more then 120 characters + if ( + !preg_match_all( + "/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\." . + "[a-z]{2,12}\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=]*)/", + $value + ) + ) { + throw new \InvalidArgumentException('server_ip_bad_website'); + } + break; + case 'service': + case 'ping': + if ( + !filter_var($value, FILTER_VALIDATE_IP) + // domain regex as per + // http://stackoverflow.com/questions/106179/regular-expression-to-match-hostname-or-ip-address + // Regex looks a bit weird, but otherwise it's more then 120 characters + && !preg_match( + "/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*" . + "([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/", + $value + ) + ) { + throw new \InvalidArgumentException('server_ip_bad_service'); + } + break; + } - return true; - } + return true; + } - /** - * Check server type - * @param string $type - * @return boolean - * @throws \InvalidArgumentException - */ - public function type($type) { - if (!in_array($type, array('ping', 'service', 'website'))) { - throw new \InvalidArgumentException('server_type_invalid'); - } - return true; - } + /** + * Check server type + * @param string $type + * @return boolean + * @throws \InvalidArgumentException + */ + public function type($type) + { + if (!in_array($type, array('ping', 'service', 'website'))) { + throw new \InvalidArgumentException('server_type_invalid'); + } + return true; + } - /** - * Check warning threshold - * @param int $value - * @return boolean - * @throws \InvalidArgumentException - */ - public function warningThreshold($value) { - if (!is_numeric($value) || intval($value) == 0) { - throw new \InvalidArgumentException('server_warning_threshold_invalid'); - } - return true; - } + /** + * Check warning threshold + * @param int $value + * @return boolean + * @throws \InvalidArgumentException + */ + public function warningThreshold($value) + { + if (!is_numeric($value) || intval($value) == 0) { + throw new \InvalidArgumentException('server_warning_threshold_invalid'); + } + return true; + } + + /** + * Check SSL expiry days + * @param int $value + * @return boolean + * @throws \InvalidArgumentException + */ + public function sslCertExpiryDays($value) + { + if (!is_numeric($value) || $value < 0) { + throw new \InvalidArgumentException('server_ssl_cert_expiry_days'); + } + return true; + } } diff --git a/src/psm/Util/Server/UpdateManager.php b/src/psm/Util/Server/UpdateManager.php index fe335f09..2e3ee42c 100644 --- a/src/psm/Util/Server/UpdateManager.php +++ b/src/psm/Util/Server/UpdateManager.php @@ -1,4 +1,5 @@ container = $container; + } - function __construct(ContainerInterface $container) { - $this->container = $container; - } + /** + * Go :-) + * + * @param boolean $skip_perms if TRUE, no user permissions will be taken in account and all servers will be updated + * @param string|null $status If all servers (null), or just `on` or `off` should be checked. + */ + public function run($skip_perms = false, $status = null) + { + if (false === in_array($status, ['on', 'off'], true)) { + $status = null; + } - /** - * Go :-) - * - * @param boolean $skip_perms if TRUE, no user permissions will be taken in account and all servers will be updated - */ - public function run($skip_perms = false) { - // check if we need to restrict the servers to a certain user - $sql_join = ''; + // check if we need to restrict the servers to a certain user + $sql_join = ''; - if (!$skip_perms && $this->container->get('user')->getUserLevel() > PSM_USER_ADMIN) { - // restrict by user_id - $sql_join = "JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( + if (!$skip_perms && $this->container->get('user')->getUserLevel() > PSM_USER_ADMIN) { + // restrict by user_id + $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( `us`.`user_id`={$this->container->get('user')->getUserId()} AND `us`.`server_id`=`s`.`server_id` )"; - } + } - $sql = "SELECT `s`.`server_id`,`s`.`ip`,`s`.`port`,`s`.`label`,`s`.`type`,`s`.`pattern`,`s`.`header_name`,`s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover`,`s`.`telegram` - FROM `".PSM_DB_PREFIX."servers` AS `s` + $sql = "SELECT `s`.`server_id`,`s`.`ip`,`s`.`port`,`s`.`label`,`s`.`type`,`s`.`pattern`,`s`.`header_name`, + `s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover`,`s`.`telegram`, + `s`.`jabber` + FROM `" . PSM_DB_PREFIX . "servers` AS `s` {$sql_join} - WHERE `active`='yes' "; + WHERE `active`='yes' " . ($status !== null ? ' AND `status` = \'' . $status . '\'' : ''); - $servers = $this->container->get('db')->query($sql); + $servers = $this->container->get('db')->query($sql); - $updater = new Updater\StatusUpdater($this->container->get('db')); - $notifier = new Updater\StatusNotifier($this->container->get('db')); + $updater = new Updater\StatusUpdater($this->container->get('db')); + $notifier = new Updater\StatusNotifier($this->container->get('db')); - foreach ($servers as $server) { - $status_old = ($server['status'] == 'on') ? true : false; - $status_new = $updater->update($server['server_id']); - // notify the nerds if applicable - $notifier->notify($server['server_id'], $status_old, $status_new); - // clean-up time!! archive all records - $archive = new ArchiveManager($this->container->get('db')); - $archive->archive($server['server_id']); - $archive->cleanup($server['server_id']); - } - if($notifier->combine){ - $notifier->notifyCombined(); - } - } + foreach ($servers as $server) { + $status_old = ($server['status'] == 'on') ? true : false; + $status_new = $updater-> + update($server['server_id']); + // notify the nerds if applicable + $notifier->notify($server['server_id'], $status_old, $status_new); + // clean-up time!! archive all records + $archive = new ArchiveManager($this->container->get('db')); + $archive->archive($server['server_id']); + $archive->cleanup($server['server_id']); + } + if ($notifier->combine) { + $notifier->notifyCombined(); + } + } } diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index 443a5cbc..5b0672a6 100644 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -1,4 +1,5 @@ array(), + 'users' => array(), + 'notifications' => array(), + 'userNotifications' => array() + ); - /** - * Send telegram? - * @var boolean $send_telegram - */ - protected $send_telegram = false; + /** + * Server id + * @var int $server_id + */ + protected $server_id; - /** - * Save log records? - * @var boolean $save_log - */ - protected $save_logs = false; + /** + * Server information + * @var array $server + */ + protected $server; - /** - * Send multiple notifications as one? - * @var boolean $combine - */ - public $combine = false; + /** + * Old status + * @var boolean $status_old + */ + protected $status_old; - /** - * Notification list - * @var array $combiNotification - */ - protected $combiNotification = array( - 'count' => array(), - 'users' => array(), - 'notifications' => array(), - 'userNotifications' => array() - ); + /** + * New status + * @var boolean $status_new + */ + protected $status_new; - /** - * Server id - * @var int $server_id - */ - protected $server_id; + public function __construct(Database $db) + { + $this->db = $db; - /** - * Server information - * @var array $server - */ - protected $server; - - /** - * Old status - * @var boolean $status_old - */ - protected $status_old; - - /** - * New status - * @var boolean $status_new - */ - protected $status_new; - - function __construct(Database $db) { - $this->db = $db; - - $this->send_emails = psm_get_conf('email_status'); - $this->send_sms = psm_get_conf('sms_status'); - $this->send_pushover = psm_get_conf('pushover_status'); - $this->send_telegram = psm_get_conf('telegram_status'); - $this->save_logs = psm_get_conf('log_status'); - $this->combine = psm_get_conf('combine_notifications'); - } + $this->send_emails = (bool)psm_get_conf('email_status'); + $this->send_sms = (bool)psm_get_conf('sms_status'); + $this->send_pushover = (bool)psm_get_conf('pushover_status'); + $this->send_telegram = (bool)psm_get_conf('telegram_status'); + $this->send_jabber = (bool)psm_get_conf('jabber_status'); + $this->save_logs = (bool)psm_get_conf('log_status'); + $this->combine = (bool)psm_get_conf('combine_notifications'); + } /** * This function initializes the sending (text msg, email, Pushover and Telegram) and logging @@ -133,107 +144,125 @@ class StatusNotifier { * @return boolean * @throws \PHPMailer\PHPMailer\Exception */ - public function notify($server_id, $status_old, $status_new) { - if ( - !$this->send_emails && - !$this->send_sms && - !$this->send_pushover && - !$this->send_telegram && - !$this->save_logs - ) { - // seems like we have nothing to do. skip the rest - return false; - } - - $this->server_id = $server_id; - $this->status_old = $status_old; - $this->status_new = $status_new; - - // get server info from db - // only get info that will be put into the notification - // or is needed to check if a notification need to be send - $this->server = $this->db->selectRow(PSM_DB_PREFIX.'servers', array( - 'server_id' => $server_id, - ), array( - 'server_id', 'ip', 'port', 'label', 'error', 'email', 'sms', 'pushover', 'telegram', 'last_online', 'last_offline', 'last_offline_duration', - )); - if (empty($this->server)) { - return false; - } - - $notify = false; - - // check which type of alert the user wants - switch (psm_get_conf('alert_type')) { - case 'always': - if ($status_new == false) { - // server is offline. we are in error state. - $notify = true; - } - break; - case 'offline': - // only send a notification if the server goes down for the first time! - if ($status_new == false && $status_old == true) { - $notify = true; - } - break; - case 'status': - if ($status_new != $status_old) { - // status has been changed! - $notify = true; - } - break; - } - - if (!$notify) { - return false; - } - - // first add to log (we use the same text as the SMS message because its short..) - if ($this->save_logs) { - psm_add_log( - $this->server_id, - 'status', - psm_parse_msg($status_new, 'sms', $this->server) - ); - } - - $users = $this->getUsers($this->server_id); - - if (empty($users)) { - return $notify; - } - - if($this->combine){ - $this->setCombi('init', $users); + public function notify($server_id, $status_old, $status_new) + { + if ( + !$this->send_emails && + !$this->send_sms && + !$this->send_pushover && + !$this->send_telegram && + !$this->send_jabber && + !$this->save_logs + ) { + // seems like we have nothing to do. skip the rest + return false; } - // check if email is enabled for this server - if ($this->send_emails && $this->server['email'] == 'yes') { - // send email - $this->combine ? $this->setCombi('email') : $this->notifyByEmail($users); - } + $this->server_id = $server_id; + $this->status_old = $status_old; + $this->status_new = $status_new; - // check if sms is enabled for this server - if ($this->send_sms && $this->server['sms'] == 'yes') { - // sms will not be send combined as some gateways don't support long sms / charge extra - // yay lets wake those nerds up! - $this->notifyByTxtMsg($users); - } + // get server info from db + // only get info that will be put into the notification + // or is needed to check if a notification need to be send + $this->server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array( + 'server_id' => $server_id, + ), array( + 'server_id', + 'ip', + 'port', + 'label', + 'error', + 'email', + 'sms', + 'pushover', + 'telegram', + 'jabber', + 'last_online', + 'last_offline', + 'last_offline_duration', + )); + if (empty($this->server)) { + return false; + } - // check if pushover is enabled for this server - if ($this->send_pushover && $this->server['pushover'] == 'yes') { - // yay lets wake those nerds up! - $this->combine ? $this->setCombi('pushover') : $this->notifyByPushover($users); - } + $notify = false; - // check if telegram is enabled for this server - if ($this->send_telegram && $this->server['telegram'] == 'yes') { - $this->combine ? $this->setCombi('telegram') : $this->notifyByTelegram($users); - } + // check which type of alert the user wants + switch (psm_get_conf('alert_type')) { + case 'always': + if ($status_new == false) { + // server is offline. we are in error state. + $notify = true; + } + break; + case 'offline': + // only send a notification if the server goes down for the first time! + if ($status_new == false && $status_old == true) { + $notify = true; + } + break; + case 'status': + if ($status_new != $status_old) { + // status has been changed! + $notify = true; + } + break; + } - return $notify; - } + if (!$notify) { + return false; + } + + // first add to log (we use the same text as the SMS message because its short..) + if ($this->save_logs) { + psm_add_log( + $this->server_id, + 'status', + psm_parse_msg($status_new, 'sms', $this->server) + ); + } + + $users = $this->getUsers($this->server_id); + + if (empty($users)) { + return $notify; + } + + if ($this->combine) { + $this->setCombi('init', $users); + } + + // check if email is enabled for this server + if ($this->send_emails && $this->server['email'] == 'yes') { + // send email + $this->combine ? $this->setCombi('email') : $this->notifyByEmail($users); + } + + // check if sms is enabled for this server + if ($this->send_sms && $this->server['sms'] == 'yes') { + // sms will not be send combined as some gateways don't support long sms / charge extra + // yay lets wake those nerds up! + $this->notifyByTxtMsg($users); + } + + // check if pushover is enabled for this server + if ($this->send_pushover && $this->server['pushover'] == 'yes') { + // yay lets wake those nerds up! + $this->combine ? $this->setCombi('pushover') : $this->notifyByPushover($users); + } + + // check if telegram is enabled for this server + if ($this->send_telegram && $this->server['telegram'] == 'yes') { + $this->combine ? $this->setCombi('telegram') : $this->notifyByTelegram($users); + } + + if ($this->send_jabber && $this->server['jaber'] == 'yes') { + $this->combine ? $this->setCombi('jabber') : $this->notifyByJabber($users); + } + + return $notify; + } /** * This functions collects all of the notifications @@ -242,71 +271,73 @@ class StatusNotifier { * @param array $users Users * @return void */ - public function setCombi($method, $users = array()) { - $status = $this->status_new ? 'on' : 'off'; + public function setCombi($method, $users = array()) + { + $status = $this->status_new ? 'on' : 'off'; - if ($method == 'init' && !empty($users)){ - foreach($users as $user) { - if(!isset($this->combiNotification['count'][$user['user_id']])){ + if ($method == 'init' && !empty($users)) { + foreach ($users as $user) { + if (!isset($this->combiNotification['count'][$user['user_id']])) { $this->combiNotification['count'][$user['user_id']] = array('on' => 0, 'off' => 0); } $this->combiNotification['userNotifications'][$user['user_id']][] = $this->server_id; $this->combiNotification['users'][$user['user_id']] = $user; $this->combiNotification['count'][$user['user_id']][$status] += 1; - } - return; - } - - $this->combiNotification['notifications'][$method][$status][$this->server_id] = - psm_parse_msg($this->status_new, $method.'_message', $this->server, true); - return; - } + } + return; + } + + $this->combiNotification['notifications'][$method][$status][$this->server_id] = + psm_parse_msg($this->status_new, $method . '_message', $this->server, true); + } /** * This functions returns the subject for a combined notification * * @return void */ - public function notifyCombined() { - if(empty($this->combiNotification['userNotifications'])){ - return; - } - // Get the servers the user will get notified of + public function notifyCombined() + { + if (empty($this->combiNotification['userNotifications'])) { + return; + } + // Get the servers the user will get notified of $this->status_new = true; - foreach ($this->combiNotification['userNotifications'] as $user => $servers) { - $notifications = array(); - // Combine all of the messages belonging to the server the user will get notification of - foreach ($servers as $server) { - foreach ($this->combiNotification['notifications'] as $method => $status){ + foreach ($this->combiNotification['userNotifications'] as $user => $servers) { + $notifications = array(); + // Combine all of the messages belonging to the server the user will get notification of + foreach ($servers as $server) { + foreach ($this->combiNotification['notifications'] as $method => $status) { foreach ($status as $the_status => $value) { - if(!key_exists($method, $notifications)){ + if (!key_exists($method, $notifications)) { $notifications[$method] = array('on' => '', 'off' => ''); - } - if(key_exists($server, $status[$the_status])){ - $notifications[$method][$the_status] .= $status[$the_status][$server]; - } - // Set $this->status_new to false if a server is down. + } + if (key_exists($server, $status[$the_status])) { + $notifications[$method][$the_status] .= $status[$the_status][$server]; + } + // Set $this->status_new to false if a server is down. // This is used by Pushover to determine the priority. - if(!empty($notifications[$method]['off'])){ + if (!empty($notifications[$method]['off'])) { $this->status_new = false; } } - } - } - // Send combined notification per user - foreach ($notifications as $method => $notification){ + } + } + // Send combined notification per user + foreach ($notifications as $method => $notification) { $finalNotification['message'] = $this->createCombiMessage($method, $notification); $subject = $this->createCombiSubject($method, $user); - if(!is_null($subject)){ + if (!is_null($subject)) { $finalNotification['subject'] = $subject; } - $this->{'notifyBy' . ucwords($method)} - (array($this->combiNotification['users'][$user]), $finalNotification); + $this->{'notifyBy' . ucwords($method)}( + array($this->combiNotification['users'][$user]), + $finalNotification + ); } - } - unset($notifications); - return; - } + } + unset($notifications); + } /** * This functions returns the message for a combined notification @@ -315,15 +346,16 @@ class StatusNotifier { * @param array $notification Notification * @return string */ - protected function createCombiMessage($method, $notification){ - if(empty($notification['off'])){ - $notification['off'] = "
    • ".psm_get_lang('system', 'none')."
    "; + protected function createCombiMessage($method, $notification) + { + if (empty($notification['off'])) { + $notification['off'] = "
    • " . psm_get_lang('system', 'none') . "
    "; } - if(empty($notification['on'])){ - $notification['on'] = "
    • ".psm_get_lang('system', 'none')."
    "; + if (empty($notification['on'])) { + $notification['on'] = "
    • " . psm_get_lang('system', 'none') . "
    "; } - $vars = array('DOWN_SERVERS' => $notification['off'], 'UP_SERVERS' => $notification['on']); - return psm_parse_msg(null, $method.'_message', $vars, true); + $vars = array('DOWN_SERVERS' => $notification['off'], 'UP_SERVERS' => $notification['on']); + return psm_parse_msg(null, $method . '_message', $vars, true); } /** @@ -333,10 +365,14 @@ class StatusNotifier { * @param integer $user_id User id * @return string|null */ - protected function createCombiSubject($method, $user_id){ - $vars = array('DOWN' => $this->combiNotification['count'][$user_id]['off'], 'UP' => $this->combiNotification['count'][$user_id]['on']); - $translation = isset($GLOBALS['sm_lang_default']['notifications']['combi_'.$method.'_subject']) ? - psm_parse_msg(null, $method.'_subject', $vars, true) : + protected function createCombiSubject($method, $user_id) + { + $vars = array( + 'DOWN' => $this->combiNotification['count'][$user_id]['off'], + 'UP' => $this->combiNotification['count'][$user_id]['on'] + ); + $translation = isset($GLOBALS['sm_lang_default']['notifications']['combi_' . $method . '_subject']) ? + psm_parse_msg(null, $method . '_subject', $vars, true) : null; return $translation; } @@ -349,143 +385,149 @@ class StatusNotifier { * @return void * @throws \PHPMailer\PHPMailer\Exception */ - protected function notifyByEmail($users, $combi = array()) { - // build mail object with some default values - $mail = psm_build_mail(); - $mail->Subject = key_exists('subject', $combi) ? - $combi['subject'] : - psm_parse_msg($this->status_new, 'email_subject', $this->server); - $mail->Priority = 1; + protected function notifyByEmail($users, $combi = array()) + { + // build mail object with some default values + $mail = psm_build_mail(); + $mail->Subject = key_exists('subject', $combi) ? + $combi['subject'] : + psm_parse_msg($this->status_new, 'email_subject', $this->server); + $mail->Priority = 1; - $body = key_exists('message', $combi) ? - $combi['message'] : - psm_parse_msg($this->status_new, 'email_body', $this->server); - $mail->Body = $body; - $mail->AltBody = str_replace('
    ', "\n", $body); + $body = key_exists('message', $combi) ? + $combi['message'] : + psm_parse_msg($this->status_new, 'email_body', $this->server); + $mail->Body = $body; + $mail->AltBody = str_replace('
    ', "\n", $body); - if (psm_get_conf('log_email')) { - $log_id = psm_add_log($this->server_id, 'email', $body); - } + if (psm_get_conf('log_email')) { + $log_id = psm_add_log($this->server_id, 'email', $body); + } - // go through empl - foreach ($users as $user) { - if (!empty($log_id)) { - psm_add_log_user($log_id, $user['user_id']); - } + // go through empl + foreach ($users as $user) { + if (!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } - // we sent a separate email to every single user. - $mail->AddAddress($user['email'], $user['name']); - $mail->Send(); - $mail->ClearAddresses(); - } - return; - } + // we sent a separate email to every single user. + $mail->AddAddress($user['email'], $user['name']); + $mail->Send(); + $mail->ClearAddresses(); + } + } - /** - * This functions performs the pushover notifications - * - * @param \PDOStatement $users + /** + * This functions performs the pushover notifications + * + * @param \PDOStatement $users * @param array $combi contains message and subject (optional) - * @return void - */ - protected function notifyByPushover($users, $combi = array()) { - // Remove users that have no pushover_key - foreach ($users as $k => $user) { - if (trim($user['pushover_key']) == '') { - unset($users[$k]); - } - } + * @return void + */ + protected function notifyByPushover($users, $combi = array()) + { + // Remove users that have no pushover_key + foreach ($users as $k => $user) { + if (trim($user['pushover_key']) == '') { + unset($users[$k]); + } + } - // Validation - if (empty($users)) { - return; - } + // Validation + if (empty($users)) { + return; + } - // Pushover - $message = key_exists('message', $combi) ? - $combi['message'] : - psm_parse_msg($this->status_new, 'pushover_message', $this->server); + // Pushover + $message = key_exists('message', $combi) ? + $combi['message'] : + psm_parse_msg($this->status_new, 'pushover_message', $this->server); - $pushover = psm_build_pushover(); - if ($this->status_new === true) { - $pushover->setPriority(0); - } else { - $pushover->setPriority(2); - $pushover->setRetry(300); //Used with Priority = 2; Pushover will resend the notification every 60 seconds until the user accepts. - $pushover->setExpire(3600); //Used with Priority = 2; Pushover will resend the notification every 60 seconds for 3600 seconds. After that point, it stops sending notifications. - } - $title = key_exists('subject', $combi) ? - $combi['subject'] : - psm_parse_msg($this->status_new, 'pushover_title', $this->server); - $pushover->setHtml(1); - $pushover->setTitle($title); - $pushover->setMessage(str_replace('
    ', "\n", $message)); - $pushover->setUrl(psm_build_url()); - $pushover->setUrlTitle(psm_get_lang('system', 'title')); + $pushover = psm_build_pushover(); + if ($this->status_new === true) { + $pushover->setPriority(0); + } else { + $pushover->setPriority(2); + //Used with Priority = 2; Pushover will resend the notification every 60 seconds until the user accepts. + $pushover->setRetry(300); + // Used with Priority = 2; Pushover will resend the notification every 60 seconds for 3600 seconds. + // After that point, it stops sending notifications. + $pushover->setExpire(3600); + } + $title = key_exists('subject', $combi) ? + $combi['subject'] : + psm_parse_msg($this->status_new, 'pushover_title', $this->server); + $pushover->setHtml(1); + $pushover->setTitle($title); + $pushover->setMessage(str_replace('
    ', "\n", $message)); + $pushover->setUrl(psm_build_url()); + $pushover->setUrlTitle(psm_get_lang('system', 'title')); - // Log - if (psm_get_conf('log_pushover')) { - $log_id = psm_add_log($this->server_id, 'pushover', $message); - } + // Log + if (psm_get_conf('log_pushover')) { + $log_id = psm_add_log($this->server_id, 'pushover', $message); + } - foreach ($users as $user) { - // Log - if (!empty($log_id)) { - psm_add_log_user($log_id, $user['user_id']); - } + foreach ($users as $user) { + // Log + if (!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } - // Set recipient + send - $pushover->setUser($user['pushover_key']); - if ($user['pushover_device'] != '') { - $pushover->setDevice($user['pushover_device']); - } - $pushover->send(); - } - } + // Set recipient + send + $pushover->setUser($user['pushover_key']); + if ($user['pushover_device'] != '') { + $pushover->setDevice($user['pushover_device']); + } + $pushover->send(); + } + } - /** - * This functions performs the text message notifications - * - * @param \PDOStatement $users - * @return boolean - */ - protected function notifyByTxtMsg($users) { - $sms = psm_build_sms(); - if (!$sms) { - return false; - } + /** + * This functions performs the text message notifications + * + * @param \PDOStatement $users + * @return boolean + */ + protected function notifyByTxtMsg($users) + { + $sms = psm_build_sms(); + if (!$sms) { + return false; + } - $message = psm_parse_msg($this->status_new, 'sms', $this->server); + $message = psm_parse_msg($this->status_new, 'sms', $this->server); - // Log - if (psm_get_conf('log_sms')) { - $log_id = psm_add_log($this->server_id, 'sms', $message); - } + // Log + if (psm_get_conf('log_sms')) { + $log_id = psm_add_log($this->server_id, 'sms', $message); + } - // add all users to the recipients list - foreach ($users as $user) { - // Log - if (!empty($log_id)) { - psm_add_log_user($log_id, $user['user_id']); - } + // add all users to the recipients list + foreach ($users as $user) { + // Log + if (!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } - $sms->addRecipients($user['mobile']); - } + $sms->addRecipients($user['mobile']); + } - // Send sms - $result = $sms->sendSMS($message); + // Send sms + $result = $sms->sendSMS($message); - return $result; - } + return $result; + } - /** - * This functions performs the telegram notifications - * - * @param \PDOStatement $users + /** + * This functions performs the telegram notifications + * + * @param \PDOStatement $users * @param array $combi contains message and subject (optional) - * @return void - */ - protected function notifyByTelegram($users, $combi = array()) { + * @return void + */ + protected function notifyByTelegram($users, $combi = array()) + { // Remove users that have no telegram_id foreach ($users as $k => $user) { if (trim($user['telegram_id']) == '') { @@ -500,16 +542,16 @@ class StatusNotifier { // Telegram $message = key_exists('message', $combi) ? - $combi['message'] : - psm_parse_msg($this->status_new, 'telegram_message', $this->server); + $combi['message'] : + psm_parse_msg($this->status_new, 'telegram_message', $this->server); $telegram = psm_build_telegram(); - $telegram->setMessage($message); - + $telegram->setMessage($message); + // Log if (psm_get_conf('log_telegram')) { $log_id = psm_add_log($this->server_id, 'telegram', $message); - } - + } + foreach ($users as $user) { // Log if (!empty($log_id)) { @@ -521,20 +563,71 @@ class StatusNotifier { } /** - * Get all users for the provided server id - * @param int $server_id - * @return \PDOStatement array + * @param array $users + * @param array $combi */ - public function getUsers($server_id) { - // find all the users with this server listed - $users = $this->db->query(" - SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, `u`.`pushover_device`, `u`.`telegram_id` - FROM `".PSM_DB_PREFIX."users` AS `u` - JOIN `".PSM_DB_PREFIX."users_servers` AS `us` ON ( + protected function notifyByJabber($users, $combi = []) + { + // Remove users that have no jabber + foreach ($users as $k => $user) { + if (trim($user['jabber']) === '') { + unset($users[$k]); + } + } + + // Validation + if (empty($users)) { + return; + } + + // Message + $message = key_exists('message', $combi) ? + $combi['message'] : + psm_parse_msg($this->status_new, 'jabber_message', $this->server); + + // Log + if (psm_get_conf('log_jabber')) { + $log_id = psm_add_log($this->server_id, 'jabber', $message); + } + + $usersJabber = []; + foreach ($users as $user) { + // Log + if (!empty($log_id)) { + psm_add_log_user($log_id, $user['user_id']); + } + $usersJabber[] = $user['jabber']; + } + // Jabber + psm_jabber_send_message( + psm_get_conf('jabber_host'), + psm_get_conf('jabber_username'), + psm_password_decrypt(psm_get_conf('password_encrypt_key'), psm_get_conf('jabber_password')), + $usersJabber, + $message, + (trim(psm_get_conf('jabber_port')) !== '' ? (int)psm_get_conf('jabber_port') : null), + (trim(psm_get_conf('jabber_domain')) !== '' ? psm_get_conf('jabber_domain') : null) + ); + } + + /** + * Get all users for the provided server id + * @param int $server_id + * @return \PDOStatement array + */ + public function getUsers($server_id) + { + // find all the users with this server listed + $users = $this->db->query(' + SELECT `u`.`user_id`, `u`.`name`,`u`.`email`, `u`.`mobile`, `u`.`pushover_key`, + `u`.`pushover_device`, `u`.`telegram_id`, + `u`.`jabber` + FROM `' . PSM_DB_PREFIX . 'users` AS `u` + JOIN `' . PSM_DB_PREFIX . "users_servers` AS `us` ON ( `us`.`user_id`=`u`.`user_id` AND `us`.`server_id` = {$server_id} ) "); - return $users; - } + return $users; + } } diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index 9588d4aa..6d6ff34b 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -1,4 +1,5 @@ db = $db; - } + /** + * Server information + * @var array $server + */ + protected $server; - /** - * The function its all about. This one checks whether the given ip and port are up and running! - * If the server check fails it will try one more time, depending on the $max_runs. - * - * Please note: if the server is down but has not met the warning threshold, this will return true - * to avoid any "we are down" events. - * - * @todo Get last_output when there is a HTTP 50x error. - * - * @param int $server_id - * @param int $max_runs how many times should the script recheck the server if unavailable. default is 2 - * @return boolean TRUE if server is up, FALSE otherwise - */ - public function update($server_id, $max_runs = 2) { - $this->server_id = $server_id; - $this->error = ''; - $this->header = ''; - $this->rtime = ''; + public function __construct(Database $db) + { + $this->db = $db; + } - // get server info from db - $this->server = $this->db->selectRow(PSM_DB_PREFIX.'servers', array( - 'server_id' => $server_id, - ), array( - 'server_id', 'ip', 'port', 'request_method', 'label', 'type', 'pattern', 'pattern_online', 'post_field', - 'allow_http_status', 'redirect_check', 'header_name', 'header_value', 'status', 'active', 'warning_threshold', - 'warning_threshold_counter', 'timeout', 'website_username', 'website_password', 'last_offline' - )); - if (empty($this->server)) { - return false; - } + /** + * The function its all about. This one checks whether the given ip and port are up and running! + * If the server check fails it will try one more time, depending on the $max_runs. + * + * Please note: if the server is down but has not met the warning threshold, this will return true + * to avoid any "we are down" events. + * + * @todo Get last_output when there is a HTTP 50x error. + * + * @param int $server_id + * @param int $max_runs how many times should the script recheck the server if unavailable. default is 2 + * @return boolean TRUE if server is up, FALSE otherwise + */ + public function update($server_id, $max_runs = 2) + { + $this->server_id = $server_id; + $this->error = ''; + $this->header = ''; + $this->curl_info = ''; + $this->rtime = ''; - switch ($this->server['type']) { - case 'ping': - $this->status_new = $this->updatePing($max_runs); - break; - case 'service': - $this->status_new = $this->updateService($max_runs); - break; - case 'website': - $this->status_new = $this->updateWebsite($max_runs); - break; - } + // get server info from db + $this->server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array( + 'server_id' => $server_id, + ), array( + 'server_id', 'ip', 'port', 'request_method', 'label', + 'type', 'pattern', 'pattern_online', 'post_field', + 'allow_http_status', 'redirect_check', 'header_name', + 'header_value', 'status', 'active', 'warning_threshold', + 'warning_threshold_counter', 'ssl_cert_expiry_days', 'ssl_cert_expired_time', 'timeout', 'website_username', + 'website_password', 'last_offline' + )); + if (empty($this->server)) { + return false; + } - // update server status - $save = array( - 'last_check' => date('Y-m-d H:i:s'), - 'error' => $this->error, - 'rtime' => $this->rtime - ); - if(!empty($this->error)){ - $save['last_error'] = $this->error; - } + switch ($this->server['type']) { + case 'ping': + $this->status_new = $this->updatePing($max_runs); + break; + case 'service': + $this->status_new = $this->updateService($max_runs); + break; + case 'website': + $this->status_new = $this->updateWebsite($max_runs); + break; + } - // log the uptime before checking the warning threshold, - // so that the warnings can still be reviewed in the server history. - psm_log_uptime($this->server_id, (int) $this->status_new, $this->rtime); + // update server status + $save = array( + 'last_check' => date('Y-m-d H:i:s'), + 'error' => $this->error, + 'rtime' => $this->rtime + ); + if (!empty($this->error)) { + $save['last_error'] = $this->error; + } - if ($this->status_new == true) { - // if the server is on, add the last_online value and reset the error threshold counter - $save['status'] = 'on'; - $save['last_online'] = date('Y-m-d H:i:s'); - $save['last_output'] = substr($this->header,0,5000); - $save['warning_threshold_counter'] = 0; - if ($this->server['status'] == 'off') { - $online_date = new \DateTime($save['last_online']); - $offline_date = new \DateTime($this->server['last_offline']); - $difference = $online_date->diff($offline_date); - $save['last_offline_duration'] = trim(psm_format_interval($difference)); - } - } else { - // server is offline, increase the error counter and set last offline - $save['warning_threshold_counter'] = $this->server['warning_threshold_counter'] + 1; - $save['last_offline'] = date('Y-m-d H:i:s'); - $save['last_error_output'] = empty($this->header) ? "Could not get headers. probably HTTP 50x error." : $this->header; + // log the uptime before checking the warning threshold, + // so that the warnings can still be reviewed in the server history. + psm_log_uptime($this->server_id, (int) $this->status_new, $this->rtime); - if ($save['warning_threshold_counter'] < $this->server['warning_threshold']) { - // the server is offline but the error threshold has not been met yet. - // so we are going to leave the status "on" for now while we are in a sort of warning state.. - $save['status'] = 'on'; - $this->status_new = true; - } else { - $save['status'] = 'off'; - if ($this->server['status'] == 'on') { - $save['last_offline'] = $save['last_check']; - } - } - } - $this->db->save(PSM_DB_PREFIX.'servers', $save, array('server_id' => $this->server_id)); + if ($this->status_new == true) { + // if the server is on, add the last_online value and reset the error threshold counter + $save['status'] = 'on'; + $save['last_online'] = date('Y-m-d H:i:s'); + $save['last_output'] = substr($this->header, 0, 5000); + $save['warning_threshold_counter'] = 0; + if ($this->server['status'] == 'off') { + $online_date = new \DateTime($save['last_online']); + $offline_date = new \DateTime($this->server['last_offline']); + $difference = $online_date->diff($offline_date); + $save['last_offline_duration'] = trim(psm_format_interval($difference)); + } + } else { + // server is offline, increase the error counter and set last offline + $save['warning_threshold_counter'] = $this->server['warning_threshold_counter'] + 1; + $save['last_error_output'] = empty($this->header) ? + "Could not get headers. probably HTTP 50x error." : $this->header; - return $this->status_new; + if ($save['warning_threshold_counter'] < $this->server['warning_threshold']) { + // the server is offline but the error threshold has not been met yet. + // so we are going to leave the status "on" for now while we are in a sort of warning state.. + $save['status'] = 'on'; + $this->status_new = true; + } else { + $save['status'] = 'off'; + if ($this->server['status'] == 'on') { + $save['last_offline'] = $save['last_check']; + } + } + } + $this->db->save(PSM_DB_PREFIX . 'servers', $save, array('server_id' => $this->server_id)); - } + return $this->status_new; + } - /** - * Check the current servers ping status - Code from http://stackoverflow.com/a/20467492 - * @param int $max_runs - * @param int $run - * @return boolean - */ - protected function updatePing($max_runs, $run = 1) { - // save response time - $starttime = microtime(true); - // set ping payload - $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost"; + /** + * Check the current servers ping status + * @param int $max_runs + * @param int $run + * @return boolean + */ + protected function updatePing($max_runs, $run = 1) + { + if ($max_runs == null || $max_runs > 1) { + $max_runs = 1; + } + $result = null; + // Execute ping + $pingCommand = 'ping6'; + $serverIp = $this->server['ip']; + if (filter_var($serverIp,FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false){ + $pingCommand = 'ping'; + } + $txt = exec($pingCommand . " -c " . $max_runs . " " . $serverIp . " 2>&1", $output); + // Non-greedy match on filler + $re1 = '.*?'; + // Uninteresting: float + $re2 = '[+-]?\\d*\\.\\d+(?![-+0-9\\.])'; + // Non-greedy match on filler + $re3 = '.*?'; + // Float 1 + $re4 = '([+-]?\\d*\\.\\d+)(?![-+0-9\\.])'; + if (preg_match_all("/" . $re1 . $re2 . $re3 . $re4 . "/is", $txt, $matches)) { + $result = $matches[1][0]; + } + if (substr($output[0],0,4) == 'PING' && strpos($output[count($output)-2],'packets transmitted')){ + $result = 0; + } + if (!is_null($result)) { + $this->header = $output[0]; + $status = true; + } else { + $this->header = "-"; + $this->error = $output[0]; + $status = false; + } + //Divide by a thousand to convert to milliseconds + $this->rtime = $result / 1000; - $socket = socket_create(AF_INET, SOCK_RAW, 1); - socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 10, 'usec' => 0)); - socket_connect($socket, $this->server['ip'], null); + // check if server is available and rerun if asked. + if (!$status && $run < $max_runs) { + return $this->updatePing($max_runs, $run + 1); + } + return $status; + } - socket_send($socket, $package, strLen($package), 0); - if (socket_read($socket, 255)) { - $status = true; - } else { - $status = false; + /** + * Check the current server as a service + * @param int $max_runs + * @param int $run + * @return boolean + */ + protected function updateService($max_runs, $run = 1) + { + $timeout = ($this->server['timeout'] === null || $this->server['timeout'] > 0) ? + PSM_CURL_TIMEOUT : intval($this->server['timeout']); + $errno = 0; + // save response time + $starttime = microtime(true); - // set error message - $errorcode = socket_last_error(); - $this->error = "Couldn't create socket [".$errorcode."]: ".socket_strerror($errorcode); - } - $this->rtime = microtime(true) - $starttime; - socket_close($socket); + $serverIp = $this->server['ip']; + if (filter_var($serverIp,FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false){ + $serverIp = "[$serverIp]"; + } + $fp = @fsockopen($serverIp, $this->server['port'], $errno, $this->error, $timeout); - // check if server is available and rerun if asked. - if (!$status && $run < $max_runs) { - return $this->updatePing($max_runs, $run + 1); - } + $status = ($fp === false) ? false : true; + $this->rtime = (microtime(true) - $starttime); - return $status; - } + if (is_resource($fp)) { + fclose($fp); + } - /** - * Check the current server as a service - * @param int $max_runs - * @param int $run - * @return boolean - */ - protected function updateService($max_runs, $run = 1) { - $errno = 0; - // save response time - $starttime = microtime(true); + // check if server is available and rerun if asked. + if (!$status && $run < $max_runs) { + return $this->updateService($max_runs, $run + 1); + } - $fp = @fsockopen($this->server['ip'], $this->server['port'], $errno, $this->error, $this->server['timeout']); + return $status; + } - $status = ($fp === false) ? false : true; - $this->rtime = (microtime(true) - $starttime); + /** + * Check the current server as a website + * @param int $max_runs + * @param int $run + * @return boolean + */ + protected function updateWebsite($max_runs, $run = 1) + { + $starttime = microtime(true); - if (is_resource($fp)) { - fclose($fp); - } + // We're only interested in the header, because that should tell us plenty! + // unless we have a pattern to search for! + $curl_result = psm_curl_get( + $this->server['ip'], + true, + ($this->server['pattern'] == '' ? false : true), + $this->server['timeout'], + true, + $this->server['website_username'], + psm_password_decrypt($this->server['server_id'] . + psm_get_conf('password_encrypt_key'), $this->server['website_password']), + $this->server['request_method'], + $this->server['post_field'] + ); + $this->header = $curl_result['exec']; + $this->curl_info = $curl_result['info']; - // check if server is available and rerun if asked. - if (!$status && $run < $max_runs) { - return $this->updateService($max_runs, $run + 1); - } + $this->rtime = (microtime(true) - $starttime); - return $status; - } + // the first line would be the status code.. + $status_code = strtok($curl_result['exec'], "\r\n"); + // keep it general + // $code[2][0] = status code + // $code[3][0] = name of status code + $code_matches = array(); + preg_match_all("/[A-Z]{2,5}\/\d(\.\d)?\s(\d{3})\s?(.*)/", $status_code, $code_matches); - /** - * Check the current server as a website - * @param int $max_runs - * @param int $run - * @return boolean - */ - protected function updateWebsite($max_runs, $run = 1) { - $starttime = microtime(true); + if (empty($code_matches[0])) { + // somehow we dont have a proper response. + $this->error = 'TIMEOUT ERROR: no response from server'; + $result = false; + } else { + $code = $code_matches[2][0]; + $msg = $code_matches[3][0]; - // We're only interested in the header, because that should tell us plenty! - // unless we have a pattern to search for! - $curl_result = psm_curl_get( - $this->server['ip'], - true, - ($this->server['pattern'] == '' ? false : true), - $this->server['timeout'], - true, - $this->server['website_username'], - psm_password_decrypt($this->server['server_id'].psm_get_conf('password_encrypt_key'), $this->server['website_password']), - $this->server['request_method'], - $this->server['post_field'] - ); - $this->header = $curl_result; + $allow_http_status = explode("|", $this->server['allow_http_status']); + // All status codes starting with a 4 or higher mean trouble! + if (substr($code, 0, 1) >= '4' && !in_array($code, $allow_http_status)) { + $this->error = "HTTP STATUS ERROR: " . $code . ' ' . $msg; + $result = false; + } else { + $result = true; - $this->rtime = (microtime(true) - $starttime); + // Okay, the HTTP status is good : 2xx or 3xx. Now we have to test the pattern if it's set up + if ($this->server['pattern'] != '') { + // Check to see if the body should not contain specified pattern + // Check to see if the pattern was [not] found. + if ( + ($this->server['pattern_online'] == 'yes') == + !preg_match( + "/{$this->server['pattern']}/i", + $curl_result['exec'] + ) + ) { + $this->error = "TEXT ERROR : Pattern '{$this->server['pattern']}' " . + ($this->server['pattern_online'] == 'yes' ? 'not' : 'was') . + ' found.'; + $result = false; + } + } - // the first line would be the status code.. - $status_code = strtok($curl_result, "\r\n"); - // keep it general - // $code[2][0] = status code - // $code[3][0] = name of status code - $code_matches = array(); - preg_match_all("/[A-Z]{2,5}\/\d(\.\d)?\s(\d{3})\s?(.*)/", $status_code, $code_matches); - - if(empty($code_matches[0])) { - // somehow we dont have a proper response. - $this->error = 'TIMEOUT ERROR: no response from server'; - $result = false; - } else { - $code = $code_matches[2][0]; - $msg = $code_matches[3][0]; - - $allow_http_status = explode("|", $this->server['allow_http_status']); - // All status codes starting with a 4 or higher mean trouble! - if (substr($code, 0, 1) >= '4' && !in_array($code ,$allow_http_status)) { - $this->error = "HTTP STATUS ERROR: ".$code.' '.$msg; - $result = false; - } else { - $result = true; - - // Okay, the HTTP status is good : 2xx or 3xx. Now we have to test the pattern if it's set up - if ($this->server['pattern'] != '') { - // Check to see if the body should not contain specified pattern - // Check to see if the pattern was [not] found. - if (($this->server['pattern_online'] == 'yes') == !preg_match("/{$this->server['pattern']}/i", $curl_result)) { - $this->error = "TEXT ERROR : Pattern '{$this->server['pattern']}' ". - ($this->server['pattern_online'] == 'yes' ? 'not' : 'was'). - ' found.'; - $result = false; - } - } - - // Check if the website redirects to another domain - if ($this->server['redirect_check'] == 'bad'){ - $location_matches = array(); - preg_match('/([Ll]ocation: )(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)/', $curl_result, $location_matches); - if(!empty($location_matches)) { + // Check if the website redirects to another domain + if ($this->server['redirect_check'] == 'bad') { + $location_matches = array(); + preg_match( + '/([Ll]ocation: )(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)/', + $curl_result['exec'], + $location_matches + ); + if (!empty($location_matches)) { $ip_matches = array(); - preg_match('/(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)?/', $this->server['ip'], $ip_matches); + preg_match( + '/(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)?/', + $this->server['ip'], + $ip_matches + ); if (strtolower($location_matches[4]) !== strtolower($ip_matches[3])) { $this->error = "The IP/URL redirects to another domain."; $result = false; } } - } + } - // Should we check a header ? - if ($this->server['header_name'] != '' && $this->server['header_value'] != '') { - $header_flag = false; - $header_text = substr($curl_result, 0, strpos($curl_result, "\r\n\r\n")); // Only get the header text if the result also includes the body - foreach (explode("\r\n", $header_text) as $i => $line) { - if ($i === 0 || strpos($line, ':') == false) { - continue; // We skip the status code & other non-header lines. Needed for proxy or redirects - } else { - list ($key, $value) = explode(': ', $line); - if (strcasecmp($key, $this->server['header_name']) == 0) { // Header found (case-insensitive) - if (!preg_match("/{$this->server['header_value']}/i", $value)) { // The value doesn't match what we needed - $result = false; - } else { - $header_flag = true; - break; // No need to go further - } - } - } - } + // Should we check a header ? + if ($this->server['header_name'] != '' && $this->server['header_value'] != '') { + $header_flag = false; + // Only get the header text if the result also includes the body + $header_text = substr($curl_result['exec'], 0, strpos($curl_result['exec'], "\r\n\r\n")); + foreach (explode("\r\n", $header_text) as $i => $line) { + if ($i === 0 || strpos($line, ':') == false) { + continue; // We skip the status code & other non-header lines. Needed for proxy or redirects + } else { + list ($key, $value) = explode(': ', $line); + // Header found (case-insensitive) + if (strcasecmp($key, $this->server['header_name']) == 0) { + // The value doesn't match what we needed + if (!preg_match("/{$this->server['header_value']}/i", $value)) { + $result = false; + } else { + $header_flag = true; + break; // No need to go further + } + } + } + } - if (!$header_flag) { - // Header was not present - $result = false; - } - } - } - } + if (!$header_flag) { + // Header was not present + $result = false; + } + } + } + } - // check if server is available and rerun if asked. - if (!$result && $run < $max_runs) { - return $this->updateWebsite($max_runs, $run + 1); - } + // Check ssl cert just when other error is not already in... + if ($result !== false) { + $this->checkSsl($this->server, $this->error, $result); + } - return $result; - } + // check if server is available and rerun if asked. + if (!$result && $run < $max_runs) { + return $this->updateWebsite($max_runs, $run + 1); + } - /** - * Get the error returned by the update function - * - * @return string - */ - public function getError() { - return $this->error; - } + return $result; + } - /** - * Get the response time of the server - * - * @return string - */ - public function getRtime() { - return $this->rtime; - } + /** + * Get the error returned by the update function + * + * @return string + */ + public function getError() + { + return $this->error; + } + + /** + * Get the response time of the server + * + * @return string + */ + public function getRtime() + { + return $this->rtime; + } + + /** + * Check if a server speaks SSL and if the certificate is not expired. + * @param string $error + * @param bool $result + */ + private function checkSsl($server, &$error, &$result) + { + if (version_compare(PHP_VERSION, '7.1', '<')) { + $error = "The server you're running PSM on must use PHP 7.1 or higher to test the SSL expiration."; + return; + } + if ( + !empty($this->curl_info['certinfo']) && + $server['ssl_cert_expiry_days'] > 0 + ) { + $cert_expiration_date = strtotime($this->curl_info['certinfo'][0]['Expire date']); + $expiration_time = + round((int)($cert_expiration_date - time()) / 86400); + $latest_time = time() + (86400 * $server['ssl_cert_expiry_days']); + + if ($expiration_time - $server['ssl_cert_expiry_days'] < 0) { + // Cert is not expired, but date is withing user set range + $this->header = psm_get_lang('servers', 'ssl_cert_expiring') . " " . + psm_date($this->curl_info['certinfo'][0]['Expire date']) . + "\n\n" . $this->header; + $save['ssl_cert_expired_time'] = $expiration_time - $server['ssl_cert_expiry_days']; + } elseif ($expiration_time >= 0) { + // Cert is not expired + $save['ssl_cert_expired_time'] = null; + } else { + // Cert is expired + $error = psm_get_lang('servers', 'ssl_cert_expired') . " " . + psm_timespan($cert_expiration_date) . ".\n\n" . + $error; + $save['ssl_cert_expired_time'] = $expiration_time; + } + $this->db->save(PSM_DB_PREFIX . 'servers', $save, array('server_id' => $this->server_id)); + } + } } diff --git a/src/psm/Util/User/UserValidator.php b/src/psm/Util/User/UserValidator.php index 67c12ac0..65f322e0 100644 --- a/src/psm/Util/User/UserValidator.php +++ b/src/psm/Util/User/UserValidator.php @@ -1,4 +1,5 @@ user = $user; - } + public function __construct(\psm\Service\User $user) + { + $this->user = $user; + } - /** - * Check if the user id exists - * @param int $user_id - * @return boolean - * @throws \InvalidArgumentException - */ - public function userId($user_id) { - $user = $this->user->getUser($user_id); - if (empty($user)) { - throw new \InvalidArgumentException('user_no_match'); - } - return true; - } + /** + * Check if the user id exists + * @param int $user_id + * @return boolean + * @throws \InvalidArgumentException + */ + public function userId($user_id) + { + $user = $this->user->getUser($user_id); + if (empty($user)) { + throw new \InvalidArgumentException('user_no_match'); + } + return true; + } - /** - * Check username on: - * - * - Length (2-64 chars) - * - Contents (alphabetic chars and digits only) - * - Unique - * @param string $username - * @param int $user_id to check whether the username is unique - * @return boolean - * @throws \InvalidArgumentException - */ - public function username($username, $user_id = 0) { - if (strlen($username) > 64 || strlen($username) < 2) { - throw new \InvalidArgumentException('user_name_bad_length'); - } - if (!preg_match('/^[a-zA-Z\d_\.]{2,64}$/i', $username)) { - throw new \InvalidArgumentException('user_name_invalid'); - } - $user_exists = $this->user->getUserByUsername($username); + /** + * Check username on: + * + * - Length (2-64 chars) + * - Contents (alphabetic chars and digits only) + * - Unique + * @param string $username + * @param int $user_id to check whether the username is unique + * @return boolean + * @throws \InvalidArgumentException + */ + public function username($username, $user_id = 0) + { + if (strlen($username) > 64 || strlen($username) < 2) { + throw new \InvalidArgumentException('user_name_bad_length'); + } + if (!preg_match('/^[a-zA-Z\d_\.]{2,64}$/i', $username)) { + throw new \InvalidArgumentException('user_name_invalid'); + } + $user_exists = $this->user->getUserByUsername($username); - if (!empty($user_exists) && ($user_id == 0 || $user_id != $user_exists->user_id)) { - throw new \InvalidArgumentException('user_name_exists'); - } - return true; - } + if (!empty($user_exists) && ($user_id == 0 || $user_id != $user_exists->user_id)) { + throw new \InvalidArgumentException('user_name_exists'); + } + return true; + } - /** - * Check user password - * @param string $password - * @param string $password_repeat - * @return boolean - * @throws \InvalidArgumentException - */ - public function password($password, $password_repeat) { - if (empty($password) || empty($password_repeat)) { - throw new \InvalidArgumentException('user_password_invalid'); - } - if ($password !== $password_repeat) { - throw new \InvalidArgumentException('user_password_no_match'); - } - return true; - } + /** + * Check user password + * @param string $password + * @param string $password_repeat + * @return boolean + * @throws \InvalidArgumentException + */ + public function password($password, $password_repeat) + { + if (empty($password) || empty($password_repeat)) { + throw new \InvalidArgumentException('user_password_invalid'); + } + if ($password !== $password_repeat) { + throw new \InvalidArgumentException('user_password_no_match'); + } + return true; + } - /** - * Install only; Check username on: - * - * - Length (2-64 chars) - * - Contents (alphabetic chars and digits only) - * @param string $username - * @return boolean - * @throws \InvalidArgumentException - */ - public function username_new($username) { - if (strlen($username) > 64 || strlen($username) < 2) { - throw new \InvalidArgumentException('user_name_bad_length'); - } - if (!preg_match('/^[a-zA-Z\d_\.]{2,64}$/i', $username)) { - throw new \InvalidArgumentException('user_name_invalid'); - } - return true; - } + /** + * Install only; Check username on: + * + * - Length (2-64 chars) + * - Contents (alphabetic chars and digits only) + * @param string $username + * @return boolean + * @throws \InvalidArgumentException + */ + public function usernameNew($username) + { + if (strlen($username) > 64 || strlen($username) < 2) { + throw new \InvalidArgumentException('user_name_bad_length'); + } + if (!preg_match('/^[a-zA-Z\d_\.]{2,64}$/i', $username)) { + throw new \InvalidArgumentException('user_name_invalid'); + } + return true; + } - /** - * Check email - * @param string $email - * @return boolean - * @throws \InvalidArgumentException - */ - public function email($email) { - if (strlen($email) > 255 || strlen($email) < 5) { - throw new \InvalidArgumentException('user_email_bad_length'); - } - if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { - throw new \InvalidArgumentException('user_email_invalid'); - } - return true; - } + /** + * Check email + * @param string $email + * @return boolean + * @throws \InvalidArgumentException + */ + public function email($email) + { + if (strlen($email) > 255 || strlen($email) < 5) { + throw new \InvalidArgumentException('user_email_bad_length'); + } + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + throw new \InvalidArgumentException('user_email_invalid'); + } + return true; + } - /** - * Check user level - * @param int $level - * @return boolean - * @throws \InvalidArgumentException - */ - public function level($level) { - if (!in_array($level, $this->user_levels)) { - throw new \InvalidArgumentException('user_level_invalid'); - } - return true; - } + /** + * Check user level + * @param int $level + * @return boolean + * @throws \InvalidArgumentException + */ + public function level($level) + { + if (!in_array($level, $this->user_levels)) { + throw new \InvalidArgumentException('user_level_invalid'); + } + return true; + } - /** - * Get list of all available user levels - * @return array - */ - public function getUserLevels() { - return $this->user_levels; - } + /** + * Get list of all available user levels + * @return array + */ + public function getUserLevels() + { + return $this->user_levels; + } } diff --git a/src/templates/default/main/body.tpl.html b/src/templates/default/main/body.tpl.html index beff84e0..7a1c3523 100644 --- a/src/templates/default/main/body.tpl.html +++ b/src/templates/default/main/body.tpl.html @@ -3,7 +3,7 @@ - {{ title }} + {{ title }}{% if subtitle %} - {{ subtitle }}{% endif %} @@ -48,7 +48,7 @@ Javascript is disabled! PHP Server Monitor works best with JavaScript enabled! - {% if not user_level %}

    {{ subtitle }}

    {% endif %} + {% if not user_level and subtitle %}

    {{ subtitle }}

    {% endif %}
    {{ header_accessories|raw }}
    {% for msg in messages %} {% endblock %} \ No newline at end of file diff --git a/src/templates/default/module/server/server/list.tpl.html b/src/templates/default/module/server/server/list.tpl.html index 17c6262d..110c1261 100644 --- a/src/templates/default/module/server/server/list.tpl.html +++ b/src/templates/default/module/server/server/list.tpl.html @@ -5,17 +5,17 @@ - {{ label_label }} - {{ label_domain }} - {{ label_port }} - {{ label_type }} - {{ label_rtime }} - {{ label_last_online }} - {{ label_last_offline }} - {{ label_monitoring }} - {% if user_level == 10 %} - - {% endif %} + {{ label_label }} + {{ label_domain }} + {{ label_port }} + {{ label_type }} + {{ label_rtime }} + {{ label_last_online }} + {{ label_last_offline }} + {{ label_monitoring }} + {% if user_level == 10 %} + + {% endif %} No result @@ -50,24 +50,30 @@ {% else %} {% endif %} - {% if server.email|lower == 'yes'%} + {% if server.email|lower == 'yes' and config.email|lower%} {% endif %} - {% if server.sms|lower == 'yes'%} + {% if server.sms|lower == 'yes' and config.sms|lower%} {% endif %} - {% if server.pushover|lower == 'yes'%} + {% if server.pushover|lower == 'yes'and config.pushover|lower %} P {% endif %} - {% if server.telegram|lower == 'yes'%} + {% if server.telegram|lower == 'yes' and config.telegram|lower%} T {% endif %} + {% if server.jabber|lower == 'yes'%} + + + J + + {% endif %} {% if user_level == 10 %} @@ -81,7 +87,7 @@ {{ label_edit }} + data-modal-param="{{ server.label }}"> {{ label_delete }} diff --git a/src/templates/default/module/server/server/update.tpl.html b/src/templates/default/module/server/server/update.tpl.html index e137f4a3..38292434 100644 --- a/src/templates/default/module/server/server/update.tpl.html +++ b/src/templates/default/module/server/server/update.tpl.html @@ -46,7 +46,9 @@ - {{ macro.input_field("number", "port", "port types typeService", "port", label_custom_port, edit_value_port, null, "5") }} + {{ macro.input_field("number", "port", "port types typeService", "port", label_custom_port, edit_value_port, null, "5") }} + + {{ macro.input_field("number", "ssl_cert_expiry_days", "types typeWebsite", "ssl_cert_expiry_days", label_ssl_cert_expiry_days, edit_value_ssl_cert_expiry_days, 0, "5", 'ssl_cert_help', label_ssl_cert_expiry_days_description) }}
    @@ -115,7 +117,7 @@ {{ macro.input_field("number", "warning_threshold", null, "warning_threshold", label_warning_threshold, edit_value_warning_threshold, "0", "5", 'warning_threshold_help', label_warning_threshold_description) }} - {{ macro.input_field("number", "timeout", null, "timeout", label_timeout, edit_value_timeout, null, "10", 'timeout_help', label_timeout_description) }} + {{ macro.input_field("number", "timeout", null, "timeout", label_timeout, edit_value_timeout, default_value_timeout, "10", 'timeout_help', label_timeout_description) }}
    @@ -124,7 +126,7 @@ {{ macro.input_field("text", "website_username", null, "website_username", label_website_username, edit_value_website_username, null, "255", 'website_username_help', label_website_username_description, null, true, null, null, true) }} - {{ macro.input_field("password", "website_password", null, "website_password", label_website_password, edit_value_website_password, null, "10", 'website_password_help', label_website_password_description, null, true, null, null, true) }} + {{ macro.input_field("password", "website_password", null, "website_password", label_website_password, edit_value_website_password, null, "255", 'website_password_help', label_website_password_description, null, true, null, null, true) }}
    @@ -140,14 +142,28 @@ {{ macro.input_select_monitoring("pushover", "pushover", label_send_pushover, edit_pushover_selected, label_yes, label_no, warning_pushover, label_warning_pushover) }} {{ macro.input_select_monitoring("telegram", "telegram", label_send_telegram, edit_telegram_selected, label_yes, label_no, warning_telegram, label_warning_telegram) }} + + {{ macro.input_select_monitoring("jabber", "jabber", label_send_jabber, edit_jabber_selected, label_yes, label_no, warning_jabber, label_warning_jabber) }} -
    +
    {{ label_fieldset_permissions }} {{ macro.input_select_multiple("user_id", "user_id[]", label_permissions, label_search, users, label_please_select) }} - {{ macro.button_save(null, label_save) }} - {{ label_go_back }} -
    + +
    + {{ label_save }} + {{ macro.button_save(null, label_save) }} + {{ label_go_back }} +
    + {% if edit_server_id > 0 %} +
    + {{ label_delete }} + + {{ label_delete }} + +
    + {% endif %} {{ macro.input_csrf() }} - \ No newline at end of file + diff --git a/src/templates/default/module/server/server/view.tpl.html b/src/templates/default/module/server/server/view.tpl.html index ff8783a6..20218480 100644 --- a/src/templates/default/module/server/server/view.tpl.html +++ b/src/templates/default/module/server/server/view.tpl.html @@ -27,7 +27,11 @@
  • {{ label_domain }}:
    -
    {{ ip|raw }}
    +
    + + {{ ip|raw }} + +
  • {% if type|lower == 'service' %} @@ -227,13 +231,13 @@
  • {{ label_last_error }}:
    -
    {{ last_error }}
    +
    {{ last_error|nl2br }}
  • {{ label_last_output }}:
    -
    {{ last_output_truncated }}
    +
    {{ last_output_truncated|nl2br }}
    {% if last_output_truncated != last_output %}
    @@ -247,7 +251,7 @@
  • {{ label_last_error_output }}:
    -
    {{ last_error_output_truncated }}
    +
    {{ last_error_output_truncated|nl2br }}
    {% if last_error_output_truncated != last_error_output %}
    @@ -331,6 +335,19 @@ {% endif %}
  • +
  • + {{ label_jabber }}: + {% if jabber|lower == 'yes' %} + + + {% elseif jabber|lower == 'no' %} + + + {% else %} + + + {% endif %} +
  • diff --git a/src/templates/default/module/server/status/index.tpl.html b/src/templates/default/module/server/status/index.tpl.html index 37927a09..7a564127 100644 --- a/src/templates/default/module/server/status/index.tpl.html +++ b/src/templates/default/module/server/status/index.tpl.html @@ -5,9 +5,21 @@
    {% for server in servers_offline %}
    -
    -
    {{ server.label }} ({{ label_offline }})
    +
    +
    +

    + {{ label_last_online }}: {{ server.last_online_nice }}
    + {{ label_last_check }}: {{ server.last_checked_nice }} +

    +
    +
    +
    + {% endfor %} + {% for server in servers_warning %} +
    +
    +

    {{ label_last_online }}: {{ server.last_online_nice }}
    @@ -15,14 +27,12 @@

    -
    {% endfor %} {% for server in servers_online %}
    -
    -
    {{ server.label }} ({{ label_online }})
    +

    {{ label_last_online }}: {{ server.last_online_nice }}
    @@ -31,10 +41,9 @@

    -
    {% endfor %} - {% if not servers_offline and not servers_online %} + {% if not servers_offline and not servers_warning and not servers_online %} {{ label_none }}
    @@ -43,9 +52,9 @@