diff --git a/composer.json b/composer.json index de87087718e..4347967b196 100644 --- a/composer.json +++ b/composer.json @@ -25,7 +25,7 @@ "symfony/console": ">=v2.3.5", "tedivm/jshrink": "v0.5.1", "mustangostang/spyc": "0.5.*", - "piwik/device-detector": "1.0" + "piwik/device-detector": "2.*" }, "require-dev": { "phpunit/phpunit": "4.*" diff --git a/composer.lock b/composer.lock index e6d9aecfb62..d4813ca0996 100644 --- a/composer.lock +++ b/composer.lock @@ -3,7 +3,7 @@ "This file locks the dependencies of your project to a known state", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ], - "hash": "6d358fe10eaef73ee1323cb06cd0e5c8", + "hash": "016b7b6646d1d3ec6d8b574b5a6c5561", "packages": [ { "name": "leafo/lessphp", @@ -95,27 +95,30 @@ }, { "name": "piwik/device-detector", - "version": "1.0", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/piwik/device-detector.git", - "reference": "ea7c5d8b76def0d8345a4eba59c5f98ec0109de6" + "reference": "863ae43f5c68c15ce110516a0f7b11477e2a01c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/piwik/device-detector/zipball/ea7c5d8b76def0d8345a4eba59c5f98ec0109de6", - "reference": "ea7c5d8b76def0d8345a4eba59c5f98ec0109de6", + "url": "https://api.github.com/repos/piwik/device-detector/zipball/863ae43f5c68c15ce110516a0f7b11477e2a01c0", + "reference": "863ae43f5c68c15ce110516a0f7b11477e2a01c0", "shasum": "" }, "require": { "mustangostang/spyc": "*", "php": ">=5.3.1" }, + "require-dev": { + "phpunit/phpunit": "4.0.*" + }, "type": "library", "autoload": { - "files": [ - "DeviceDetector.php" - ] + "psr-4": { + "DeviceDetector\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -135,36 +138,38 @@ "parser", "useragent" ], - "time": "2014-04-03 08:59:48" + "time": "2014-05-29 20:51:28" }, { "name": "symfony/console", - "version": "v2.4.4", + "version": "v2.5.0", "target-dir": "Symfony/Component/Console", "source": { "type": "git", "url": "https://github.com/symfony/Console.git", - "reference": "2e452005b1e1d003d23702d227e23614679eb5ca" + "reference": "ef4ca73b0b3a10cbac653d3ca482d0cdd4502b2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/2e452005b1e1d003d23702d227e23614679eb5ca", - "reference": "2e452005b1e1d003d23702d227e23614679eb5ca", + "url": "https://api.github.com/repos/symfony/Console/zipball/ef4ca73b0b3a10cbac653d3ca482d0cdd4502b2c", + "reference": "ef4ca73b0b3a10cbac653d3ca482d0cdd4502b2c", "shasum": "" }, "require": { "php": ">=5.3.3" }, "require-dev": { + "psr/log": "~1.0", "symfony/event-dispatcher": "~2.1" }, "suggest": { + "psr/log": "For using the console logger", "symfony/event-dispatcher": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -190,7 +195,7 @@ ], "description": "Symfony Console Component", "homepage": "http://symfony.com", - "time": "2014-04-27 13:34:57" + "time": "2014-05-22 08:54:24" }, { "name": "tedivm/jshrink", @@ -294,16 +299,16 @@ "packages-dev": [ { "name": "phpunit/php-code-coverage", - "version": "2.0.6", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "bccecf50645068b44f49a84009e2a0499a500b99" + "reference": "58401826c8cfc8fd689b60026e91c337df374bca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/bccecf50645068b44f49a84009e2a0499a500b99", - "reference": "bccecf50645068b44f49a84009e2a0499a500b99", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/58401826c8cfc8fd689b60026e91c337df374bca", + "reference": "58401826c8cfc8fd689b60026e91c337df374bca", "shasum": "" }, "require": { @@ -355,7 +360,7 @@ "testing", "xunit" ], - "time": "2014-04-30 09:01:21" + "time": "2014-05-26 14:55:24" }, { "name": "phpunit/php-file-iterator", @@ -542,16 +547,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.1.0", + "version": "4.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "efb1b1334605594417a3bd466477772d06d460a8" + "reference": "939cb801b3b2aa253aedd0b279f40bb8f35cec91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/efb1b1334605594417a3bd466477772d06d460a8", - "reference": "efb1b1334605594417a3bd466477772d06d460a8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/939cb801b3b2aa253aedd0b279f40bb8f35cec91", + "reference": "939cb801b3b2aa253aedd0b279f40bb8f35cec91", "shasum": "" }, "require": { @@ -612,20 +617,20 @@ "testing", "xunit" ], - "time": "2014-05-02 07:13:40" + "time": "2014-06-11 14:15:47" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.1.0", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "da0eb04d8ee95ec2898187e407e519c118d3d27c" + "reference": "1a894a16b6c15fcdc5ef2b110f0e6233952c9b0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/da0eb04d8ee95ec2898187e407e519c118d3d27c", - "reference": "da0eb04d8ee95ec2898187e407e519c118d3d27c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/1a894a16b6c15fcdc5ef2b110f0e6233952c9b0f", + "reference": "1a894a16b6c15fcdc5ef2b110f0e6233952c9b0f", "shasum": "" }, "require": { @@ -669,7 +674,7 @@ "mock", "xunit" ], - "time": "2014-05-02 07:04:11" + "time": "2014-06-07 16:22:57" }, { "name": "sebastian/comparator", @@ -940,17 +945,17 @@ }, { "name": "symfony/yaml", - "version": "v2.4.4", + "version": "v2.5.0", "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff" + "reference": "b4b09c68ec2f2727574544ef0173684281a5033c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/65539ecde838f9c0d18b006b2101e3deb4b5c9ff", - "reference": "65539ecde838f9c0d18b006b2101e3deb4b5c9ff", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/b4b09c68ec2f2727574544ef0173684281a5033c", + "reference": "b4b09c68ec2f2727574544ef0173684281a5033c", "shasum": "" }, "require": { @@ -959,7 +964,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -985,7 +990,7 @@ ], "description": "Symfony Yaml Component", "homepage": "http://symfony.com", - "time": "2014-04-18 20:37:09" + "time": "2014-05-16 14:25:18" } ], "aliases": [ diff --git a/core/CliMulti.php b/core/CliMulti.php index af576f685db..8085631feb9 100644 --- a/core/CliMulti.php +++ b/core/CliMulti.php @@ -7,6 +7,7 @@ */ namespace Piwik; +use Piwik\CliMulti\CliPhp; use Piwik\CliMulti\Output; use Piwik\CliMulti\Process; @@ -157,11 +158,17 @@ private function generateCommandId($command) * What is missing under windows? Detection whether a process is still running in Process::isProcessStillRunning * and how to send a process into background in start() */ - private function supportsAsync() + public function supportsAsync() { return Process::isSupported() && $this->findPhpBinary(); } + private function findPhpBinary() + { + $cliPhp = new CliPhp(); + return $cliPhp->findPhpBinary(); + } + private function cleanup() { foreach ($this->processes as $pid) { @@ -204,36 +211,6 @@ public static function getTmpPath() return SettingsPiwik::rewriteTmpPathWithInstanceId($dir); } - private function findPhpBinary() - { - if (defined('PHP_BINARY') && $this->isValidPhpType(PHP_BINARY)) { - return PHP_BINARY; - } - - $bin = ''; - - if (!empty($_SERVER['_']) && Common::isPhpCliMode()) { - $bin = $this->getPhpCommandIfValid($_SERVER['_']); - } - - if (empty($bin) && !empty($_SERVER['argv'][0]) && Common::isPhpCliMode()) { - $bin = $this->getPhpCommandIfValid($_SERVER['argv'][0]); - } - - if (!$this->isValidPhpType($bin)) { - $bin = shell_exec('which php'); - } - - if (!$this->isValidPhpType($bin)) { - $bin = shell_exec('which php5'); - } - - if ($this->isValidPhpType($bin)) { - return trim($bin); - } - - return false; - } private function executeAsyncCli($url, Output $output, $cmdId) { @@ -280,23 +257,6 @@ private function appendTestmodeParamToUrlIfNeeded($url) return $url; } - private function isValidPhpType($path) - { - return !empty($path) - && false === strpos($path, 'fpm') - && false === strpos($path, 'cgi') - && false === strpos($path, 'phpunit'); - } - - private function getPhpCommandIfValid($path) - { - if (!empty($path) && is_executable($path)) { - if (0 === strpos($path, PHP_BINDIR) && $this->isValidPhpType($path)) { - return $path; - } - } - } - /** * @param array $piwikUrls * @return array @@ -316,4 +276,5 @@ private function requestUrls(array $piwikUrls) return $results; } + } diff --git a/core/CliMulti/CliPhp.php b/core/CliMulti/CliPhp.php new file mode 100644 index 00000000000..c7dd2884ec2 --- /dev/null +++ b/core/CliMulti/CliPhp.php @@ -0,0 +1,99 @@ +isValidPhpType(PHP_BINARY)) { + return PHP_BINARY; + } + + if($this->isHhvmBinary(PHP_BINARY)) { + return PHP_BINARY . ' --php'; + } + } + + $bin = ''; + + if (!empty($_SERVER['_']) && Common::isPhpCliMode()) { + $bin = $this->getPhpCommandIfValid($_SERVER['_']); + } + + if (empty($bin) && !empty($_SERVER['argv'][0]) && Common::isPhpCliMode()) { + $bin = $this->getPhpCommandIfValid($_SERVER['argv'][0]); + } + + if (!$this->isValidPhpType($bin)) { + $bin = shell_exec('which php'); + } + + if (!$this->isValidPhpType($bin)) { + $bin = shell_exec('which php5'); + } + + if (!$this->isValidPhpType($bin)) { + return false; + } + + $bin = trim($bin); + + if (!$this->isValidPhpVersion($bin)) { + return false; + } + return $bin; + } + + private function isHhvmBinary($bin) + { + return false !== strpos($bin, 'hhvm'); + } + + private function isValidPhpVersion($bin) + { + $cliVersion = $this->getPhpVersion($bin); + $isCliVersionValid = SystemCheck::isPhpVersionValid($cliVersion); + return $isCliVersionValid; + } + + private function isValidPhpType($path) + { + return !empty($path) + && false === strpos($path, 'fpm') + && false === strpos($path, 'cgi') + && false === strpos($path, 'phpunit'); + } + + private function getPhpCommandIfValid($path) + { + if (!empty($path) && is_executable($path)) { + if (0 === strpos($path, PHP_BINDIR) && $this->isValidPhpType($path)) { + return $path; + } + } + } + + /** + * @param $bin PHP binary + * @return string + */ + private function getPhpVersion($bin) + { + $command = sprintf("%s -r 'echo phpversion();'", $bin); + $version = shell_exec($command); + return $version; + } +} diff --git a/core/CronArchive.php b/core/CronArchive.php index 0a2903ac576..e9392298dc8 100644 --- a/core/CronArchive.php +++ b/core/CronArchive.php @@ -731,7 +731,7 @@ private function initCheckCli() return; } $token_auth = Common::getRequestVar('token_auth', '', 'string'); - if ($token_auth != $this->token_auth + if ($token_auth !== $this->token_auth || strlen($token_auth) != 32 ) { die('You must specify the Super User token_auth as a parameter to this script, eg. ?token_auth=XYZ if you wish to run this script through the browser.
diff --git a/core/DataAccess/ArchiveSelector.php b/core/DataAccess/ArchiveSelector.php index cd7d0a044c2..72fb0faeb3e 100644 --- a/core/DataAccess/ArchiveSelector.php +++ b/core/DataAccess/ArchiveSelector.php @@ -146,9 +146,14 @@ protected static function getMostRecentIdArchiveFromResults(Segment $segment, $r * '2010-01-01' => array(1,2,3) * ) * ) + * @throws */ static public function getArchiveIds($siteIds, $periods, $segment, $plugins, $isSkipAggregationOfSubTables = false) { + if(empty($siteIds)) { + throw new \Exception("Website IDs could not be read from the request, ie. idSite="); + } + $getArchiveIdsSql = "SELECT idsite, name, date1, date2, MAX(idarchive) as idarchive FROM %s WHERE %s diff --git a/core/DeviceDetectorCache.php b/core/DeviceDetectorCache.php new file mode 100644 index 00000000000..70a6f68bb7d --- /dev/null +++ b/core/DeviceDetectorCache.php @@ -0,0 +1,65 @@ +cleanupId($id); + + if (array_key_exists($id, self::$staticCache)) { + return self::$staticCache[$id]; + } + + return parent::get($id); + } + + + /** + * A function to store content a cache entry. + * + * @param string $id The cache entry ID + * @param array $content The cache content + * @throws \Exception + * @return bool True if the entry was succesfully stored + */ + public function set($id, $content) + { + if (empty($id)) { + return false; + } + + $id = $this->cleanupId($id); + + self::$staticCache[$id] = $content; + + return parent::set($id, $content); + } +} diff --git a/core/DeviceDetectorFactory.php b/core/DeviceDetectorFactory.php new file mode 100644 index 00000000000..c61da87a140 --- /dev/null +++ b/core/DeviceDetectorFactory.php @@ -0,0 +1,39 @@ +discardBotInformation(); + $deviceDetector->setCache(new DeviceDetectorCache('tracker', 86400)); + $deviceDetector->parse(); + + self::$deviceDetectorInstances[$userAgent] = $deviceDetector; + + return $deviceDetector; + } + +} diff --git a/core/Filechecks.php b/core/Filechecks.php index ddfade4e6e3..ab25ae7d9d6 100644 --- a/core/Filechecks.php +++ b/core/Filechecks.php @@ -84,11 +84,11 @@ public static function dieIfDirectoriesNotWritable($directoriesToCheck = null) // Also give the chown since the chmod is only 755 if (!SettingsServer::isWindows()) { $realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/'); - $directoryList = "chown -R www-data:www-data " . $realpath . "
" . $directoryList; + $directoryList = "chown -R ". self::getUserAndGroup() ." " . $realpath . "
" . $directoryList; } if(function_exists('shell_exec')) { - $currentUser = trim(shell_exec('whoami')); + $currentUser = self::getUser(); if(!empty($currentUser)) { $optionalUserInfo = " (running as user '" . $currentUser . "')"; } @@ -178,7 +178,7 @@ public static function getAutoUpdateMakeWritableMessage() { $realpath = Filesystem::realpath(PIWIK_INCLUDE_PATH . '/'); $message = ''; - $message .= "chown -R www-data:www-data " . $realpath . "
"; + $message .= "chown -R ". self::getUserAndGroup() ." " . $realpath . "
"; $message .= "chmod -R 0755 " . $realpath . "
"; $message .= 'After you execute these commands (or change permissions via your FTP software), refresh the page and you should be able to use the "Automatic Update" feature.'; return $message; @@ -198,9 +198,10 @@ public static function getErrorMessageMissingPermissions($path) $message .= "On Windows, check that the folder is not read only and is writable.\n You can try to execute:
"; } else { - $message .= "For example, on a GNU/Linux server if your Apache httpd user - is www-data, you can try to execute:
\n" - . "chown -R www-data:www-data " . $path . "
"; + $message .= "For example, on a GNU/Linux server if your Apache httpd user is " + . self::getUser() + . ", you can try to execute:
\n" + . "chown -R ". self::getUserAndGroup() ." " . $path . "
"; } $message .= self::getMakeWritableCommand($path); @@ -208,6 +209,29 @@ public static function getErrorMessageMissingPermissions($path) return $message; } + private static function getUserAndGroup() + { + $user = self::getUser(); + if(!function_exists('shell_exec')) { + return $user . ':' . $user; + } + + $group = trim(shell_exec('groups '. $user .' | cut -f3 -d" "')); + + if(empty($group)) { + $group = 'www-data'; + } + return $user . ':' . $group; + } + + private static function getUser() + { + if(!function_exists('shell_exec')) { + return 'www-data'; + } + return trim(shell_exec('whoami')); + } + /** * Returns the help text displayed to suggest which command to run to give writable access to a file or directory * diff --git a/core/Plugin.php b/core/Plugin.php index e9cbe2feaeb..967d23b0ec3 100644 --- a/core/Plugin.php +++ b/core/Plugin.php @@ -383,12 +383,29 @@ public static function getPluginNameFromBacktrace($backtrace) { foreach ($backtrace as $tracepoint) { // try and discern the plugin name - if (isset($tracepoint['class']) - && preg_match("/Piwik\\\\Plugins\\\\([a-zA-Z_0-9]+)\\\\/", $tracepoint['class'], $matches) - ) { - return $matches[1]; + if (isset($tracepoint['class'])) { + $className = self::getPluginNameFromNamespace($tracepoint['class']); + if ($className) { + return $className; + } } } return false; } + + /** + * Extracts the plugin name from a namespace name or a fully qualified class name. Returns `false` + * if we can't find one. + * + * @param string $namespaceOrClassName The namespace or class string. + * @return string|false + */ + public static function getPluginNameFromNamespace($namespaceOrClassName) + { + if (preg_match("/Piwik\\\\Plugins\\\\([a-zA-Z_0-9]+)\\\\/", $namespaceOrClassName, $matches)) { + return $matches[1]; + } else { + return false; + } + } } diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php index 43e385f2639..b65823be58d 100644 --- a/core/Plugin/Controller.php +++ b/core/Plugin/Controller.php @@ -828,7 +828,9 @@ public function redirectToIndex($moduleToRedirect, $actionToRedirect, $websiteId */ protected function checkTokenInUrl() { - if (Common::getRequestVar('token_auth', false) != Piwik::getCurrentUserTokenAuth()) { + $requestTokenAuth = Common::getRequestVar('token_auth', false); + $currentUserTokenAuth = Piwik::getCurrentUserTokenAuth(); + if ($requestTokenAuth !== $currentUserTokenAuth) { throw new NoAccessException(Piwik::translate('General_ExceptionInvalidToken')); } } diff --git a/core/Plugin/ControllerAdmin.php b/core/Plugin/ControllerAdmin.php index 4254cdbb2c3..0212a3769c7 100644 --- a/core/Plugin/ControllerAdmin.php +++ b/core/Plugin/ControllerAdmin.php @@ -56,6 +56,7 @@ private static function notifyAnyInvalidPlugin() $invalidPluginsWarning = Piwik::translate('CoreAdminHome_InvalidPluginsWarning', array( self::getPiwikVersion(), '' . implode('', $missingPlugins) . '')) + . "
" . Piwik::translate('CoreAdminHome_InvalidPluginsYouCanUninstall', array( '', '' diff --git a/core/Plugin/Widgets.php b/core/Plugin/Widgets.php index c2ea16f7cfd..201fe743f6f 100644 --- a/core/Plugin/Widgets.php +++ b/core/Plugin/Widgets.php @@ -1,6 +1,6 @@ socket = $dbInfo['port']; } else { $this->host = $dbInfo['host']; - $this->port = $dbInfo['port']; + $this->port = (int)$dbInfo['port']; $this->socket = null; } $this->dbname = $dbInfo['dbname']; diff --git a/core/Tracker/VisitExcluded.php b/core/Tracker/VisitExcluded.php index 19fa96dc4f0..586c874a0c7 100644 --- a/core/Tracker/VisitExcluded.php +++ b/core/Tracker/VisitExcluded.php @@ -8,8 +8,10 @@ */ namespace Piwik\Tracker; +use DeviceDetector\Parser\Bot; use Piwik\Common; use Piwik\Config; +use Piwik\DeviceDetectorFactory; use Piwik\IP; use Piwik\Piwik; @@ -73,9 +75,9 @@ public function isExcluded() /** * Triggered on every tracking request. - * + * * This event can be used to tell the Tracker not to record this particular action or visit. - * + * * @param bool &$excluded Whether the request should be excluded or not. Initialized * to `false`. Event subscribers should set it to `true` in * order to exclude the request. @@ -147,32 +149,18 @@ protected function isPrefetchDetected() * As a result, these sophisticated bots exhibit characteristics of * browsers (cookies enabled, executing JavaScript, etc). * + * @see \DeviceDetector\Parser\Bot + * * @return boolean */ protected function isNonHumanBot() { $allowBots = $this->request->getParam('bots'); - return !$allowBots - // Seen in the wild - && (strpos($this->userAgent, 'Googlebot') !== false // Googlebot - || strpos($this->userAgent, 'Google Web Preview') !== false // Google Instant - || strpos($this->userAgent, 'AdsBot-Google') !== false // Google Adwords landing pages - || strpos($this->userAgent, 'Google Page Speed Insights') !== false // #4049 - || strpos($this->userAgent, 'Google (+https://developers.google.com') !== false // Google Snippet https://developers.google.com/+/web/snippet/ - || strpos($this->userAgent, 'facebookexternalhit') !== false // http://www.facebook.com/externalhit_uatext.php - || strpos($this->userAgent, 'baidu') !== false // Baidu - || strpos($this->userAgent, 'bingbot') !== false // Bingbot - || strpos($this->userAgent, 'BingPreview') !== false // BingPreview - || strpos($this->userAgent, 'YottaaMonitor') !== false // Yottaa - || strpos($this->userAgent, 'CloudFlare') !== false // CloudFlare-AlwaysOnline + $deviceDetector = DeviceDetectorFactory::getInstance($this->userAgent); - // Added as they are popular bots - || strpos($this->userAgent, 'pingdom') !== false // pingdom - || strpos($this->userAgent, 'yandex') !== false // yandex - || strpos($this->userAgent, 'exabot') !== false // Exabot - || strpos($this->userAgent, 'sogou') !== false // Sogou - || strpos($this->userAgent, 'soso') !== false // Soso + return !$allowBots + && ($deviceDetector->isBot() || IP::isIpInRange($this->ip, $this->getBotIpRanges())); } diff --git a/core/testMinimumPhpVersion.php b/core/testMinimumPhpVersion.php index 206ebd08c08..589ffbaaa6a 100644 --- a/core/testMinimumPhpVersion.php +++ b/core/testMinimumPhpVersion.php @@ -66,6 +66,8 @@ } } +define('PAGE_TITLE_WHEN_ERROR', 'Piwik › Error'); + if (!function_exists('Piwik_ExitWithMessage')) { /** * Returns true if Piwik should print the backtrace with error messages. @@ -111,7 +113,7 @@ function Piwik_ExitWithMessage($message, $optionalTrace = false, $optionalLinks $headerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutHeader.tpl'); $footerPage = file_get_contents(PIWIK_INCLUDE_PATH . '/plugins/Morpheus/templates/simpleLayoutFooter.tpl'); - $headerPage = str_replace('{$HTML_TITLE}', 'Piwik › Error', $headerPage); + $headerPage = str_replace('{$HTML_TITLE}', PAGE_TITLE_WHEN_ERROR, $headerPage); $content = '

' . $message . '

' diff --git a/lang/am.json b/lang/am.json index 20666521684..45e288cc74d 100644 --- a/lang/am.json +++ b/lang/am.json @@ -196,7 +196,6 @@ "ColumnConversions": "ልወጣዎች" }, "Installation": { - "CommunityNewsletter": "ከማህበረሰብ አልቅ ጋር ኢ-ሜይል አድርግልኝ(አዲስ ተሰኪዎች, አዲስ ባህርይዎች, ወዘተ.)", "ConfirmDeleteExistingTables": "እርግጠኛ ነህ ይህንን ሰንጠረዥ ከውሂብ ጎታህ ውስጥ : %s መሰረዝ ትፈልጋለህ? ማስጠንቀቂያ: ከዚህ ሰንጠረዥ ውስጥ የጠፉ ውሂቦች ተመልሰው ሊገኙ አይችሉም!", "Congratulations": "እንኳን ደስያለዎ", "CongratulationsHelp": "

እንኳን ደስያለዎ! የፒዊክ መጫንዎ ተሳክቷል።<\/p>

የጃቫ ስክሪፕትዎ ቾድ በሁሉ ገፆች ላይ መግባቱን ያረጋግጡና የመጀመሪያ ጎበኚዎችዎን ይጠብቁ!<\/p>", @@ -209,7 +208,6 @@ "PasswordDoNotMatch": "የይለፍ ቃሉ አቻ አይደለም", "PasswordRepeat": "የይለፍ ቃል (ድገም)", "PercentDone": "%s %% አልቋል", - "SecurityNewsletter": "ከዋነኛ የፒዊክ ማላቂያዎች እና የጥበቃ ማስጠንቀቂያዎች ጋር ኢ-ሜይል አድርግልኝ", "SetupWebsite": "ድር ጣቢያ ጫን", "SetupWebsiteError": "ድር ጣቢያውን በመጫን ጊዜ ስህተት አጋጥሟል", "SuperUserLogin": "ሊቀ ተገልጋይ ግባ", diff --git a/lang/ar.json b/lang/ar.json index 230701c33f0..826e89c6bfb 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -683,7 +683,6 @@ "WhereVisitedPageManuallyCallsJavascriptTrackerLearnMore": "حيث تكون الصفحة تحتوي على استدعاء لجافاسكريبت piwikTracker.trackGoal() (%sتعرف على المزيد%s)" }, "Installation": { - "CommunityNewsletter": "راسلني عند وجود تحديثات (إضافات جديدة، خصائص جديدة، وغيرها)", "ConfigurationHelp": "يبدو أن ملف الإعدادات الخاص بك به خطأ. يمكنك إما حذف config\/config.ini.php ومتابعة التثبيت أو تصحيح إعدادات الاتصال بقاعدة البيانات.", "ConfirmDeleteExistingTables": "هل ترغب حقاً في حذف الجداول: %s من قاعدة بياناتك؟ تنبيه: لن يمكن إستعادة البيانات من هذه الجداول!", "Congratulations": "مبروك", @@ -713,7 +712,6 @@ "PleaseFixTheFollowingErrors": "الرجاء إصلاح الأخطاء التالية", "PluginDescription": "عملية تثبيت Piwik. عملية التثبيت تتم مرة واحدة عادة. إذا تم حذف ملف الإعدادات config\/config.inc.php فستبدأ عملية التثبيت مرة أخرى.", "Requirements": "متطلبات Piwik", - "SecurityNewsletter": "راسلني عند وجود ترقيات وتنبيهات أمنية في Piwik", "SetupWebsite": "إعداد موقع ويب", "SetupWebsiteError": "حدث خطأ ما أثناء إضافة الموقع", "SetupWebSiteName": "اسم موقع ويب", diff --git a/lang/be.json b/lang/be.json index 89aa18d13d0..d0f450385a4 100644 --- a/lang/be.json +++ b/lang/be.json @@ -583,7 +583,6 @@ "YouCanEnableEcommerceReports": "Вы можаце ўключыць %s для гэтага вэб-сайта ў %s старонкі." }, "Installation": { - "CommunityNewsletter": "паведамляць мне пра абнаўленні супольнасці (новыя ўбудовы, новыя функцыі і г.д.) па email", "ConfigurationHelp": "Ваш Piwik канфігурацыйны файл, няправільна зканфігураваны. Вы можаце альбо выдаліць config\/config.ini.php і працягнуць усталёўку або правільна наладзіць злучэнне з базай дадзеных.", "ConfirmDeleteExistingTables": "Вы сапраўды жадаеце выдаліць табліцы: %s з базы дадзеных? УВАГА: ВЫДАЛЕНЫЯ ДАДЗЕНЫЯ НЕМАГЧЫМА АДНАВІЦЬ!", "Congratulations": "Віншуем", @@ -613,7 +612,6 @@ "PleaseFixTheFollowingErrors": "Калі ласка, выпраўце наступныя памылкі", "PluginDescription": "Працэс усталёўкі Piwik. Усталёўка звычайна адбывацца толькі адзін раз. Калі канфігурацыйны файл config\/config.inc.php выдалены, ўстаноўка пачнецца зноў.", "Requirements": "Патрабаванні Piwik", - "SecurityNewsletter": "паведамляць мяне пра значныя абнаўленні Piwik і памылках бяспекі па email", "SetupWebsite": "Дадаць сайт", "SetupWebsiteError": "Паўстала памылка пры даданні сайта", "SetupWebSiteName": "імя вэб-сайта", diff --git a/lang/bg.json b/lang/bg.json index 0239c7e0d67..98e95f17574 100644 --- a/lang/bg.json +++ b/lang/bg.json @@ -103,6 +103,7 @@ "CustomLogoFeedbackInfo": "Ако модифицирате Piwik логото, може също да пожелаете да скриете %s връзката в главното меню. За да направите това, можете да изключите добавката за обратна връзка в страницата %sУправление на добавки%s.", "CustomLogoHelpText": "Можете да модифицирате логото на Piwik, което да се показва в интерфейса на потребителя и имейлите с отчети.", "EmailServerSettings": "Настройки сървър на е-поща", + "FaviconUpload": "Изберете Favicon за качване", "ForBetaTestersOnly": "Само за бета тестери", "ImageTracking": "Проследяване на изображенията", "ImageTrackingIntro1": "Когато посетителят е изключил JavaScript или когато JavaScript не може да бъде използван, може да се използва проследяващата връзка към изображение, за да бъдат проследени посетителите.", @@ -190,6 +191,8 @@ "InjectedHostSuperUserWarning": "Възможно е конфигурацията на Piwik да е неправилна (това се случва когато Piwik е бил изместен на нов сървър или друг адрес). Вие можете или %1$sда щракнете тук и да добавите %2$s като валиден Piwik адрес (ако сте сигурни в достоверността му)%3$s, или %4$sда щракнете тук и да посетите %5$s, за да достъпите Piwik безпасно%6$s.", "InjectedHostWarningIntro": "В момента достъпвате Piwik от %1$s, но Piwik е настроен да работи чрез този адрес: %2$s.", "JavascriptDisabled": "JavaScript трябва да бъде разрешен за да използвате Piwik в стандартен изглед.
Същото е ако JavaScript не е разрешен или браузъра не го поддържа.
За да използвате стандартен изглед разрешете JavaScript от настройките на Вашия браузър и %1$sопитайте отново%2$s.
", + "LongMonthFormat": "%longYear%, %longMonth%", + "LongWeekFormat": "%dayFrom% %longMonthFrom% - %dayTo% %longMonthTo% %longYearTo%", "MakeADifference": "Открийте разликата: %1$sДарете%2$s за фонд Piwik 2.0!", "MakeOneTimeDonation": "Направете еднократно дарение", "NoPrivilegesAskPiwikAdmin": "Вие се логнахте в като '%s' но изглежда че нямате разрешение от Piwik. %s Попитайте Вашият Piwik администратор (клик на email)%s да Ви даде \"поглед\" достъп до сайта.", @@ -209,6 +212,10 @@ "SharePiwikLong": "Здравейте! Туко-що открих прекрасен софтуер с отворен код: Piwik! Piwik позволява проследяването на посетителите на даден сайт безплатно. Задължително трябва да го пробвате!", "SharePiwikShort": "Piwik! Софтуер с отворен код за уеб анализ. Притежавайте вашите собствени данни.", "ShareThis": "Сподели това", + "ShortDateFormat": "%shortDay% %day% %shortMonth%", + "ShortDateFormatWithYear": "%day% %shortMonth% %shortYear%", + "ShortMonthFormat": "%shortMonth% %longYear%", + "ShortWeekFormat": "%dayFrom% %shortMonthFrom% - %dayTo% %shortMonthTo% %shortYearTo%", "ShowJSCode": "Покажи JavaScript кода за вмъкване в сайта", "SubscribeAndBecomePiwikSupporter": "Пристъпете към сигурната страница за плащане (PayPal) за да станете Piwik Supporter!", "SupportPiwik": "Подкрепи Piwik!", @@ -246,6 +253,7 @@ "Developer": "Разработчик", "DoMoreContactPiwikAdmins": "За да се инсталира нова добавка или нова тема, трябва да се свържете с вашия администратор, който отговаря за Piwik.", "DownloadAndInstallPluginsFromMarketplace": "Можете автоматично да свалите и инсталирате нови добавки от %sмагазина за приложения%s.", + "EmailToEnquireUpdatedVersion": "Моля, пишете до %1$s и изискайте актуална версия на %2$s.", "EnjoyAnotherLookAndFeelOfThemes": "Насладете се на друг изглед и усещане", "FeaturedPlugin": "Препоръчана добавка", "GetEarlyAccessForPaidPlugins": "Забележка: всички от наличните добавки са безплатни за използване; в бъдеще ще има платена секция в магазина за приложения (%sсвържете се с нас%s за предварителен достъп).", @@ -435,7 +443,8 @@ "SpecialRequest": "Имате ли специална молба към екипа на Piwik?", "ThankYou": "Благодаря, че помогнахте да направим Piwik по-добър!", "TopLinkTooltip": "Може да ни кажете какво мислите, както и да изискате професионална помощ.", - "VisitTheForums": "Посетете нашият %sФорум%s" + "VisitTheForums": "Посетете нашият %sФорум%s", + "WantToThankConsiderDonating": "Смятате, че Piwik е страхотен и искате да ни благодарите?" }, "General": { "AbandonedCarts": "Отказани колички", @@ -969,15 +978,16 @@ "PluginDescription": "Генерирайте красиви статични PNG графични изображения за всеки Piwik доклад." }, "Insights": { + "ControlComparedToDescription": "Ръст спрямо", "DayComparedToPreviousDay": "предишен ден", "Filter": "Филтър", "FilterOnlyNew": "Само нови", + "TitleRowDisappearedDetails": "'%1$s' намалял с %2$s и изчезна в %3$s сравнено с %4$s.", "WeekComparedToPreviousWeek": "предишна седмица", "YearComparedToPreviousYear": "предишна година" }, "Installation": { "CollaborativeProject": "Piwik е съвместен проект, изграден с много любов от хора от всички краища на света.", - "CommunityNewsletter": "изпращай по пощата информация за нови добавки, функции и др.", "ConfigurationHelp": "Вашият Piwik конфигурационен файл изглежда не добре конфигуриран. Можете да премахнете config\/config.ini.php и да започнете инсталирането, или да поправите настройките за връзка към БД-то.", "ConfirmDeleteExistingTables": "Наистина ли искате да изтриете следните таблици: %s от базата от данни (БД)? ПРЕДУПРЕЖДЕНИЕ: ДАННИТЕ ОТ ТАЗИ ТАБЛИЦА НЕ МОГАТ ДА БЪДАТ ВЪЗСТАНОВЕНИ!!!", "Congratulations": "Поздравления", @@ -1009,6 +1019,7 @@ "NfsFilesystemWarning": "Вашият сървър ползва NFS файлова система.", "NfsFilesystemWarningSuffixAdmin": "Това означава, че Piwik ще бъде изключително бавен, когато използвате файлови базирани сесии.", "NoConfigFound": "Piwik конфигурационният файл не е открит.
  » Можете да инсталирате Piwik сега<\/a><\/b>
Ако преди това сте инсталирали Piwik и имате в базата от данни (БД) таблици - можете да запазите Вашите данни!<\/small>", + "NotSupported": "не се поддържа", "Optional": "По избор", "Password": "парола", "PasswordDoNotMatch": "паролата не съвпада", @@ -1018,7 +1029,6 @@ "PluginDescription": "Инсталационния процес на Piwik. Инсталацията обикновено се прави само веднъж. Ако конфигурационния файл config\/ config.inc.php е изтрит, инсталацията ще започне отново.", "Requirements": "Piwik Изисквания", "RestartWebServer": "След като направите промените, рестартирайте уеб сървара.", - "SecurityNewsletter": "изпращай на имейл информация за обновленията и сигнали относно сигурността", "SeeBelowForMoreInfo": "Вижте по-долу за повече информация.", "SetupWebsite": "Настройки на сайт", "SetupWebsiteError": "Възникнала е грешка при добавянето на сайт", @@ -1170,6 +1180,7 @@ "HowtoDeleteAnAccount": "Натиснете продължително, за да изтриете профил.", "HowtoDeleteAnAccountOniOS": "Плъзнете от ляво на дясно за да изтриете акаунта", "HowtoLoginAnonymous": "Оставете потребителско име и парола празно за анонимен вход", + "HttpTimeout": "HTTP сесията изтече", "IncompatiblePiwikVersion": "Piwik версията, която използвате не е съвместима с Piwik Mobile 2. Обновете вашата инсталация на Piwik и пробвайте отново или инсталирайте Piwik Mobile 1.", "LastUpdated": "Последна актуализация: %s", "LoadingReport": "Зарежда се %s", @@ -1244,6 +1255,7 @@ "MultiSites": { "Evolution": "Развитие", "LoadingWebsites": "Зарежда сайтовете", + "Pagination": "%s - %s като %s", "PluginDescription": "Показва обобщена статистика\/резюме. В момента се поддържа като основна добавка в Piwik.", "TopLinkTooltip": "Сравнете статистиката за всички ваши уебсайтове." }, diff --git a/lang/ca.json b/lang/ca.json index ff8fad2447f..cc3ac28576b 100644 --- a/lang/ca.json +++ b/lang/ca.json @@ -777,7 +777,6 @@ "PluginDescription": "Generar belles imatges estàtiques en gràfic PNG per qualsevol informe del Piwik." }, "Installation": { - "CommunityNewsletter": "Envieu-me correus-e amb les actualitzacions de la comunitat (nous connectors, funcionalitats, etc.)", "ConfigurationHelp": "Sembla que el vostre fitxer de configuració del Piwik no està definit correctament. Podeu eliminar el fitxer confi\/config.ini.php i torna a començar la instal·lació o corregir les preferències de connexió a la Base de dades.", "ConfirmDeleteExistingTables": "Realment voleu esborrar les taules %s de la base de dades? AVÍS: NO ES PODRAN RECUPERAR LES DADES!", "Congratulations": "Felicitats", @@ -816,7 +815,6 @@ "PluginDescription": "Procès d'instal·lació del Piwik. El procès d'instal·lació només es dur a temre una vegada. Si el fitxer de configuració config\/config.inc.php s'esborrà es tornarà a iniciar la instal·lació.", "Requirements": "Requeriments del Piwik", "RestartWebServer": "Desprès de fer aquest canvi, reinicieu el vostre servidor web.", - "SecurityNewsletter": "Envieu-me correus-e sobre les actualitzacions grans del Piwik i les alertes de seguretat", "SeeBelowForMoreInfo": "Llegiu a continuació per més informació.", "SetupWebsite": "Configura un lloc", "SetupWebsiteError": "Hi ha hagut un problema en el moment d'afegir el lloc.", diff --git a/lang/cs.json b/lang/cs.json index 8b259f7ef90..3e5612f1117 100644 --- a/lang/cs.json +++ b/lang/cs.json @@ -718,7 +718,6 @@ "PluginDescription": "Generuje nádherné statické PNG grafy pro jakékoli Piwik hlášení." }, "Installation": { - "CommunityNewsletter": "pošli mi e mail s komunitními aktualizacem (nové zásuvné moduly, nové funkce, atd.)", "ConfigurationHelp": "Váš konfigurační soubor Piwiku je špatně nastavený. Můžete buď odstranit soubor config\/config.ini a znovu začít instalaci, nebo opravit nastavení databáze.", "ConfirmDeleteExistingTables": "Jste si jistí, že chcete vymazat tabulky: %s z vaší databáze? UPOZORNĚNÍ: DATA Z TĚCHTO TABULEK NEPŮJDOU OBNOVIT!", "Congratulations": "Gratulujeme", @@ -752,7 +751,6 @@ "PluginDescription": "Instalační proces Piwiku. Instalace se obvykle používá jednou. V případě vymazání konfiguračního souboru config\/config.inc.php se instalace zahájí znovu", "Requirements": "Požadavky Piwiku", "RestartWebServer": "Po uložení změn restartujte Vás web server.", - "SecurityNewsletter": "pošli mi e-mail při hlavních aktualizacích a bezpečnostních oznámeních Piwiku", "SetupWebsite": "Nastavit Web", "SetupWebsiteError": "Při přidávání Webu se vyskytla chyba", "SetupWebSiteName": "jméno webu", diff --git a/lang/da.json b/lang/da.json index dc3f57fe5c3..0bec0dcb26b 100644 --- a/lang/da.json +++ b/lang/da.json @@ -104,6 +104,7 @@ "CustomLogoHelpText": "Du kan tilpasse Piwik logo, der bliver vist i brugergrænsefladen og e-mail rapporter.", "DevelopmentProcess": "Mens vores%s udviklingsproces%s omfatter tusindvis af automatiske tests, spiller betatestere en nøglerolle i at opnå \"ingen fejl politikken\" i Piwik.", "EmailServerSettings": "E-mail-server indstillinger", + "FaviconUpload": "Vælg Favicon til overførelse", "ForBetaTestersOnly": "Kun for beta testere", "ImageTracking": "Sporing vha. et billede", "ImageTrackingIntro1": "Når en besøgende har deaktiveret JavaScript, eller når JavaScript kan ikke bruges, kan sporing vha. et billede bruges til at spore besøgende.", @@ -154,11 +155,12 @@ "PiwikIsInstalledAt": "Piwik er installeret på", "PluginDescription": "Piwik administration.", "PluginSettingChangeNotAllowed": "Du må ikke ændre værdien \"%s\" i udvidelse \"%s\"", + "PluginSettingReadNotAllowed": "Du har ikke tilladelse til at læse værdien af ​​indstillingen \"%s\" i udvidelsen \"%s\"", "PluginSettings": "Programudvidelses indstilinger", "PluginSettingsIntro": "Her kan du ændre indstillingerne for følgende 3. parts udvidelsesmoduler:", "PluginSettingsValueNotAllowed": "Værdien for feltet \"%s\" i udvidelsen \"%s\" er ikke tilladt", - "SendPluginUpdateCommunication": "Send mig en e-mail når der er en ny opdatering af denne plugin.", - "SendPluginUpdateCommunicationHelp": "En e-mail vil blive sendt til Superbrugere, når der er en ny version tilgængelig for dette plugin.", + "SendPluginUpdateCommunication": "Send mig en e-mail når der er en ny opdatering af denne programudvidelse.", + "SendPluginUpdateCommunicationHelp": "En e-mail vil blive sendt til Superbrugere, når der er en ny version tilgængelig for denne programudvidelse.", "StableReleases": "Hvis Piwik er en kritisk del af virksomheden, anbefaler vi at man bruger den nyeste stabile udgave. Hvis man bruger den nyeste beta, og finder en fejl eller har et forslag, %sse her%s.", "TrackAGoal": "Spor et mål", "TrackingCode": "Sporingskode", @@ -188,6 +190,7 @@ "DonateCall3": "Synes du, at Piwik har tilføjet væsentlig merværdi til dig eller din virksomhed, %1$s overvej at donere!%2$s", "DonateFormInstructions": "Klik på skyderen for at vælge et beløb, og klik derefter på vælg at donere.", "ExcludeRowsWithLowPopulation": "Alle rækker vises %s Udeluk lav population", + "ExternalHelp": "Hjælp (åbnes i en ny fane)", "FlattenDataTable": "Rapporten er hierarkisk %s lav den ikke hierakisk", "HowMuchIsPiwikWorth": "Hvor meget er Piwik værd for dig?", "IncludeRowsWithLowPopulation": "Rækker med lav population er skjult %s Vis alle rækker", @@ -260,6 +263,7 @@ "Developer": "Udvikler", "DoMoreContactPiwikAdmins": "For at installere en ny programudvidelse eller et nyt tema, kontakt Piwik administratoren.", "DownloadAndInstallPluginsFromMarketplace": "Du kan automatisk hente og installere nye programudvidelser fra %smarkedspladsen%s.", + "EmailToEnquireUpdatedVersion": "Send e-mail til %1$s og forespørg om en opdateret version af %2$s.", "EnjoyAnotherLookAndFeelOfThemes": "Nyd et andet udseende", "FeaturedPlugin": "Udvalgte programudvidelser", "GetEarlyAccessForPaidPlugins": "Bemærk: alle programudvidelser er tilgængelige gratis på nuværende tidspunkt; i fremtiden vil vi sætte betalte programudvidelser på markedspladsen (%skontakt os%s for tidlig adgang).", @@ -297,6 +301,7 @@ "PluginKeywords": "Nøgleord", "PluginNotCompatibleWith": "%1$s udvidelsesmodul er ikke kompatibelt med %2$s.", "PluginNotWorkingAlternative": "Hvis du har brugt programudvidelsen,kan du måske finde en nyere version på markedspladen. Hvis ikke, kan du afinstallere den.", + "PluginRequirement": "%1$s kræver %2$s", "PluginsManagement": "Udvidelsesmodul administration", "PluginUpdateAvailable": "Du bruger version %s en ny version %s er tilgængelig.", "PluginVersionInfo": "%1$s fra %2$s", @@ -339,6 +344,7 @@ "CreatingBackupOfConfigurationFile": "Opretter sikkerhedskopi af konfigurationsfiler i %s", "CriticalErrorDuringTheUpgradeProcess": "Kritisk fejl under opdateringen:", "DatabaseUpgradeRequired": "Database opdatering er nødvendig", + "DisablingIncompatiblePlugins": "Deaktivere inkompatible programudvidelsen: %s", "DownloadingUpdateFromX": "Henter opdatering fra %s", "DownloadX": "Hent %s", "EmptyDatabaseError": "Databasen %s er tom. Redigere eller fjern Piwiks konfigurationsfil.", @@ -358,22 +364,23 @@ "HelpMessageIntroductionWhenError": "Ovenstående vises fejlmeddelelsen. Den bør hjælpe med at forklare årsagen, men hvis der behøves mere hjælp:", "HelpMessageIntroductionWhenWarning": "Opdateringen er fuldført, men det var nogle småproblemer under processen. Læs detaljerne ovenfor. For yderligere hjælp:", "HighTrafficPiwikServerEnableMaintenance": "Hvis du administrerer en Piwik server med høj trafik, anbefaler vi at du %s midlertidigt deaktivere sporing af besøgende og sætte Piwik brugergrænseflade i vedligeholdelsestilstand%s", + "IncompatbilePluginsWillBeDisabledInfo": "Bemærk: Nogle udvidelsesmoduler er ikke kompatible med Piwik %s. De vil blive deaktiveret, når du opgraderer:", "InstallingTheLatestVersion": "Installerer den seneste version", "MajorUpdateWarning1": "Dette er en stor opdatering! Den vil tage længere tid end normalt.", "MajorUpdateWarning2": "Det følgende råd er især vigtigt for store installationer.", "NoteForLargePiwikInstances": "Vigtig bemærkning til store Piwik installationer", "NoteItIsExpectedThatQueriesFail": "Bemærk: Hvis du manuelt udfører disse forespørgsler, forventes det, at nogle af dem mislykkes. I så fald ignoreres fejlene blot, og køre den næste forespørgsel på listen.", - "NotificationClickToUpdatePlugins": "Klik her for at opdatere dit plugins nu:", + "NotificationClickToUpdatePlugins": "Klik her for at opdatere dit programudvidelser nu:", "NotificationClickToUpdateThemes": "Klik her for at opdatere dine temaer nu:", "NotificationSubjectAvailableCoreUpdate": "Ny Piwik %s er nu tilgængelig", - "NotificationSubjectAvailablePluginUpdate": "En opdatering til tilgængelig for dine Piwik plugins", + "NotificationSubjectAvailablePluginUpdate": "En opdatering til tilgængelig for dine Piwik programudvidelser", "PiwikHasBeenSuccessfullyUpgraded": "Piwik blev opdateret!", "PiwikUpdatedSuccessfully": "Piwik er opdateret!", "PiwikWillBeUpgradedFromVersionXToVersionY": "Piwik vil blive opgraderet fra version %1$s til den nye version %2$s.", "PluginDescription": "Piwik ajourføringsmekanisme", "ReadyToGo": "Klar, parat, start?", "TheFollowingPluginsWillBeUpgradedX": "Følgende udvidelsesmoduler vil blive opgraderet: %s.", - "ThereIsNewPluginVersionAvailableForUpdate": "Nogle plugins du bruger er blevet opdateret på markedspladsen:", + "ThereIsNewPluginVersionAvailableForUpdate": "Nogle programudvidelser du bruger er blevet opdateret på markedspladsen:", "ThereIsNewVersionAvailableForUpdate": "Ny version af Piwik er tilgængelig", "TheUpgradeProcessMayFailExecuteCommand": "Hvis du har en stor Piwik database, kan opdateringer tage for lang tid at køre i browseren. I denne situation, kan du udføre opdateringen fra kommandolinjen: %s", "TheUpgradeProcessMayTakeAWhilePleaseBePatient": "Database opgraderingen kan tage lidt tid, vær tålmodig.", @@ -442,6 +449,7 @@ "ContactThePiwikTeam": "Kontakt Piwik holdet", "DoYouHaveBugReportOrFeatureRequest": "Har du en fejlrapport eller en anmodning om en funktion?", "GetInTouch": "Vi værdsætter din feedback og læser altid alle meddelelser uanset om du har en forretningsidé, ønsker at finde en Piwik konsulent, fortæl os en succeshistorie eller blot sige hej!", + "HowToCreateIssue": "Læs anbefalingerne om at skrive en god %1$sfejlrapport%2$s eller %3$sfunktionsforslag%4$s. Derefter %5$sregister%6$s eller %7$slogind%8$s på vores emne tracker og opret en %9$snyt emne%10$s.", "IWantTo": "Jeg ønsker at:", "LearnWaysToParticipate": "Lær om alle de måder, du kan %s bidrage%s", "ManuallySendEmailTo": "Send din besked manuelt til", @@ -451,10 +459,13 @@ "RateFeatureLeaveMessageLike": "Vi er glad for du kan lide det! Fortæl os hvad du kan lide mest eller hvis du har forslag til en ny funktion.", "RateFeatureSendFeedbackInformation": "Piwik vil sende Piwik holdet en e-mail (med din e-mail-adresse), så vi kan komme i kontakt med dig, hvis du har nogen spørgsmål.", "RateFeatureThankYouTitle": "Tak for din bedømmelse '%s'!", + "RateFeatureTitle": "Kan du lide '%s' funktionen? Bedøm og efterlade en kommentar", "SendFeedback": "Send tilbagemelding", "SpecialRequest": "Har du en speciel anmodning til Piwik holdet?", "ThankYou": "Tak, fordi du hjælper med at gøre Piwik bedre!", "TopLinkTooltip": "Fortæl os hvad du mener eller anmod om professionel support", + "ViewAnswersToFAQ": "Se svarene på %sOfte stillede spørgsmål%s", + "ViewUserGuides": "Lær at konfigurere Piwik og hvordan man effektivt analyserer data med vores %1$sbrugervejledninger%2$s", "VisitTheForums": "Besøg %s Forum%s", "WantToThankConsiderDonating": "Synes du at Piwik er fantastisk og ønsker du at takke os?" }, @@ -624,6 +635,7 @@ "ExceptionUnableToStartSession": "Kan ikke starte sessionen.", "ExceptionUndeletableFile": "Kunne ikke slette %s", "ExceptionUnreadableFileDisabledMethod": "Konfigurationsfilen (%s) kunne ikke læses. Udbyderen kan have deaktiveret %s.", + "ExpandDataTableFooter": "Ændre visualiseringen eller konfigurer rapporten", "Export": "Eksporter", "ExportAsImage": "Eksporter som billede", "ExportThisReport": "Eksporter datasættet i andre formater", @@ -757,6 +769,7 @@ "Password": "Adgangskode", "Period": "Periode", "Piechart": "Cirkeldiagram", + "PiwikIsACollaborativeProjectYouCanContributeAndDonate": "%1$sPiwik%2$s er et samarbejdsprojekt af %7$sPiwik holdets%8$s medlemmer samt mange andre bidragydere i hele verden. Hvis du er en fan af Piwik, kan du hjælpe med: at finde ud af %3$shvordan du hjælper Piwik%4$s eller %5$sdoner nu%6$s til at hjælpe med at finansiere Piwik 3.0!", "PiwikXIsAvailablePleaseNotifyPiwikAdmin": "%1$s er tilængelig. Kontakt venligst %2$sPiwik administrator%3$s.", "PiwikXIsAvailablePleaseUpdateNow": "Piwik %1$s er tilgængelig. %2$sOpdater nu!%3$s (se %4$sændringer%5$s).", "PleaseSpecifyValue": "Angiv værdi for '%s'.", @@ -840,6 +853,7 @@ "Table": "Tabel", "TagCloud": "Emne sky", "Tax": "Moms", + "TimeAgo": "%s siden", "TimeOnPage": "Tid på siden", "Today": "I dag", "Total": "Total", @@ -998,6 +1012,7 @@ "PluginDescription": "Generere flotte statiske PNG diagrammer til Piwik rapporter." }, "Insights": { + "ControlComparedToDescription": "Vækst i forhold til", "ControlFilterByDescription": "Vis alle, kun ændringer, kun nye eller kun forsvundne", "DatePeriodCombinationNotSupported": "Det er ikke muligt at generere rapporter til disse datoer og kombination af perioder.", "DayComparedToPreviousDay": "Foregående dag", @@ -1012,11 +1027,24 @@ "FilterOnlyNew": "Kun nye", "IgnoredChanges": "Ændringer, der påvirker mindre end %s besøgende bliver ignoreret", "MonthComparedToPreviousMonth": "forrige måned", - "MonthComparedToPreviousYear": "samme måned forrige år" + "MonthComparedToPreviousYear": "samme måned forrige år", + "MoversAndShakersWidgetTitle": "Op- og Nedgang", + "NoResultMatchesCriteria": "Ingen rækker svarer til kriteriet", + "OverviewWidgetTitle": "Indsigtsoversigt", + "TitleConsideredInsightsChanges": "Rækkerne steget eller faldet med mindst %1$s besøg (%2$s%% af %3$s samlede antal besøg).", + "TitleConsideredInsightsGrowth": "Følgende rækker har en vækst på mindst %1$s%% i forhold til %2$s.", + "TitleConsideredMoversAndShakersChanges": "Betragtes kun ændringer, hvis de voksede med mere end %1$s%% besøg eller faldt med mindre end %2$s%% besøg, nye poster hvis de er steget med mere end %3$s%% besøg (%4$s), og er forsvundne rækker, hvis de faldt med mindre end %5$s%% besøg (%6$s).", + "TitleConsideredMoversAndShakersGrowth": "%1$s ændret fra %2$s til %3$s i forhold til %4$s. Baseret på dette forventes en videreudvikling for hver række på %5$s%%.", + "TitleRowChangeDetails": "'%1$s' ændres fra %2$s (%3$s) til %4$s (%5$s) %6$s.", + "TitleRowDisappearedDetails": "'%1$s' faldt med %2$s og er forsvand i %3$s i forhold til %4$s.", + "TitleRowMoverAndShaker": "Denne række havde en større effekt end gennemsnittet.", + "TitleRowNewDetails": "'%1$s' øget med %2$s og er ny i forhold til %3$s.", + "WeekComparedToPreviousWeek": "forrige uge", + "WidgetCategory": "Indsigt", + "YearComparedToPreviousYear": "forrige år" }, "Installation": { "CollaborativeProject": "Piwik er et samarbejdsprojekt, bygget med kærlighed af folk fra hele verden.", - "CommunityNewsletter": "send e-mail med opdateringer (nye udvidelsesmoduler, nye muligheder m.m.)", "ConfigurationHelp": "Piwik konfigurationsfil synes at være konfigureret forkert. Fjern enten config\/config.ini.php og genoptage installation eller ret database forbindelsesindstillinger.", "ConfirmDeleteExistingTables": "Bekræft sletning af tabellerne: %s fra databasen? ADVARSEL: DATA FRA DISSE TABELLER KAN IKKE GENSKABES!", "Congratulations": "Tillykke", @@ -1052,6 +1080,7 @@ "NfsFilesystemWarningSuffixAdmin": "Det betyder at Piwik vil være ekstremt langsom når der benyttes filbaserede sessioner.", "NfsFilesystemWarningSuffixInstall": "Brug af filbaserede sessioner på et NFS filsystem er ekstrem langsomt, så Piwik vil benytte database sessioner. Hvis du har mange samtidige kontrolpanelsbrugere, vil du muligvis være nødt til at hæve det maksimale antal af klient forbindelser til database serveren.", "NoConfigFound": "Piwik-konfigurationsfil blev ikke fundet og du prøver at få adgang til Piwik.