diff --git a/.gitmodules b/.gitmodules index d209a1bd03b61f7d9bb43603816e74ea1c5b5c8a..6f50e7405e51ff1d7cdc44a0b1b3fdcf7f826365 100644 --- a/.gitmodules +++ b/.gitmodules @@ -37,7 +37,13 @@ path = plugins/LogViewer url = https://github.com/piwik/plugin-LogViewer.git branch = master +[submodule "plugins/AnonymousPiwikUsageMeasurement"] + path = plugins/AnonymousPiwikUsageMeasurement + url = https://github.com/piwik/plugin-AnonymousPiwikUsageMeasurement.git + +# Add new Plugin submodule above this line ^ +# # Note: when you add a submodule that SHOULD be left in the packaged release such as the few submodules below, # then you MUST add these submodules names in the SUBMODULES_PACKAGED_WITH_CORE variable in: # https://github.com/piwik/piwik-package/blob/master/scripts/build-package.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 30dae0e20ff521b2978b29c37b16dde47390bc03..1360b440f43375150632fbb72020498857b824e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,13 +39,19 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API' * Support for IE8 was dropped. This affects only the Piwik UI, not the Piwik.js Tracker. * Required PHP version was changed from 5.3 to 5.4 -## Piwik 2.15.0 +## Piwik 2.15.0 + +### New commands + * New diagnostic command `diagnostics:analyze-archive-table` that analyzes archive tables + * New command `database:optimize-archive-tables` to optimize archive tables and possibly save disk space (even if on InnoDB) + * New Command `core:invalidate-report-data` to invalidate archive data (w/ period cascading) ([FAQ](https://piwik.org/faq/how-to/faq_155/)) ### Breaking Changes * The method `Dimension::getId()` has been set as `final`. It is not allowed to overwrite this method. * We fixed a bug where the API method `Sites.getPatternMatchSites` only returned a very limited number of websites by default. We now return all websites by default unless a limit is specified specifically. * Handling of localized date, time and range formats has been changed. Patterns no longer contain placeholders like %shortDay%, but work with CLDR pattern instead. You can use one of the predefined format constants in Date class for using getLocalized(). * As we are now using CLDR formats for all languages, some time formats were even changed in english. Attributes like prettyDate in API responses might so have been changed slightly. +* The config `enable_measure_piwik_usage_in_idsite` which is used to track the Piwik usage with Piwik was removed and replaced by a new plugin `AnonymousPiwikUsageMeasurement` ### Deprecations * The HTTP API method `SitesManager.getSitesIdWithVisits` has been deprecated and will be removed in Piwik 3.0 @@ -61,17 +67,14 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API' * `Tracker.recordStandardGoals` ### Internal change +* `piwik.js` can now be configured with "Content Security Policy" ([CSP FAQ](https://piwik.org/faq/general/faq_20904/)) * In `piwik.js` we replaced [JSON2](https://github.com/douglascrockford/JSON-js) with [JSON3](https://bestiejs.github.io/json3/) to implement CSP (Content Security Policy) as JSON3 does not use `eval()`. JSON3 will be used if a browser does not provide a native JSON API. We are using `JSON3` in a way that it will not conflict if your website is using `JSON3` as well. - +* The option `branch` of the console command `development:sync-system-test-processed` was removed as it is no longer needed. ### New APIs * The JavaScript Tracker `piwik.js` got a new method `logAllContentBlocksOnPage` to log all found content blocks within a page to the console. This is useful to debug / test content tracking. It can be triggered via `_paq.push(['logAllContentBlocksOnPage'])` * The Class `Piwik\Plugins\Login\Controller` is now considered a public API. - -### Internal Change -* The option `branch` of the console command `development:sync-system-test-processed` was removed as it is no longer needed. - -### APIs +* The new method `Piwik\Menu\MenuAbstract::registerMenuIcon()` can be used to define an icon for a menu category to replace the default arrow icon. * New event `CronArchive.getIdSitesNotUsingTracker` that allows you to set a list of idSites that do not use the Tracker API to make sure we archive these sites if needed. * New events `CronArchive.init.start` which is triggered when the CLI archiver starts and `CronArchive.end` when the archiver ended. diff --git a/composer.lock b/composer.lock index a86ee1f2f8e78427203de4f7a267133b7702a18c..acb0776a049f0a4dac1c54fb05a45e139ec6b094 100644 --- a/composer.lock +++ b/composer.lock @@ -937,16 +937,16 @@ }, { "name": "piwik/referrer-spam-blacklist", - "version": "1.0.5", + "version": "1.0.6", "source": { "type": "git", "url": "https://github.com/piwik/referrer-spam-blacklist.git", - "reference": "ee310007ebfe07ac7f502d85948edc56c49563c3" + "reference": "5414a855511c7bc761347a3091276c30ba30311d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/ee310007ebfe07ac7f502d85948edc56c49563c3", - "reference": "ee310007ebfe07ac7f502d85948edc56c49563c3", + "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/5414a855511c7bc761347a3091276c30ba30311d", + "reference": "5414a855511c7bc761347a3091276c30ba30311d", "shasum": "" }, "type": "library", @@ -955,7 +955,7 @@ "Public Domain" ], "description": "Community-contributed list of referrer spammers", - "time": "2015-07-06 09:15:56" + "time": "2015-10-07 10:17:59" }, { "name": "psr/log", diff --git a/config/global.ini.php b/config/global.ini.php index 2b86a1c131325c149abd8bc7b275eee43ae785d1..7dd55d37190af4c857f4ac68efaac28f1c2d0da2 100644 --- a/config/global.ini.php +++ b/config/global.ini.php @@ -107,11 +107,6 @@ always_archive_data_range = 0; ; NOTE: you must also set [log] log_writers[] = "screen" to enable the profiler to print on screen enable_sql_profiler = 0 -; if set to > 0, a Piwik tracking code will be included in the Piwik UI footer and will track visits, pages, etc. -; data will be stored for idSite = enable_measure_piwik_usage_in_idsite -; this is useful for Piwik developers as an easy way to create data in their local Piwik -enable_measure_piwik_usage_in_idsite = 0 - ; If set to 1, all requests to piwik.php will be forced to be 'new visitors' tracker_always_new_visitor = 0 @@ -132,6 +127,7 @@ enabled = 0 ; if set to 1, javascript files will be included individually and neither merged nor minified. ; this option must be set to 1 when adding, removing or modifying javascript files +; Note that for quick debugging, instead of using below setting, you can add `&disable_merged_assets=1` to the Piwik URL disable_merged_assets = 0 [General] @@ -780,8 +776,6 @@ Plugins[] = MobileMessaging Plugins[] = Overlay Plugins[] = SegmentEditor Plugins[] = Insights -Plugins[] = ZenMode -Plugins[] = LeftMenu Plugins[] = Morpheus Plugins[] = Contents Plugins[] = TestRunner diff --git a/core/Archive.php b/core/Archive.php index 54133939724fc1917868e2060e48f75390282bba..80ef151f388792b03bd89454cb268c0be29d1da8 100644 --- a/core/Archive.php +++ b/core/Archive.php @@ -11,6 +11,7 @@ namespace Piwik; use Piwik\Archive\Parameters; use Piwik\ArchiveProcessor\Rules; use Piwik\Archive\ArchiveInvalidator; +use Piwik\Container\StaticContainer; use Piwik\DataAccess\ArchiveSelector; use Piwik\Period\Factory as PeriodFactory; @@ -166,6 +167,11 @@ class Archive */ private static $cache; + /** + * @var ArchiveInvalidator + */ + private $invalidator; + /** * @param Parameters $params * @param bool $forceIndexedBySite Whether to force index the result of a query by site ID. @@ -177,6 +183,8 @@ class Archive $this->params = $params; $this->forceIndexedBySite = $forceIndexedBySite; $this->forceIndexedByDate = $forceIndexedByDate; + + $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); } /** @@ -539,8 +547,7 @@ class Archive return; // all requested site ids were already handled } - $invalidator = new ArchiveInvalidator(); - $sitesPerDays = $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated(); + $sitesPerDays = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated(); foreach ($sitesPerDays as $date => $siteIds) { if (empty($siteIds)) { @@ -554,7 +561,7 @@ class Archive } try { - $invalidator->markArchivesAsInvalidated($siteIdsToActuallyInvalidate, array(Date::factory($date)), false); + $this->invalidator->markArchivesAsInvalidated($siteIdsToActuallyInvalidate, array(Date::factory($date)), false); } catch (\Exception $e) { Site::clearCache(); throw $e; diff --git a/core/Archive/ArchiveInvalidator.php b/core/Archive/ArchiveInvalidator.php index d89a2911e91fa10ba6867a1dc7f329c3cf78faac..6ecc5b8734765791df966cee4160ed54c745b43b 100644 --- a/core/Archive/ArchiveInvalidator.php +++ b/core/Archive/ArchiveInvalidator.php @@ -9,16 +9,16 @@ namespace Piwik\Archive; +use Piwik\Archive\ArchiveInvalidator\InvalidationResult; use Piwik\CronArchive\SitesToReprocessDistributedList; use Piwik\DataAccess\ArchiveTableCreator; use Piwik\DataAccess\Model; use Piwik\Date; use Piwik\Option; -use Piwik\Piwik; use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList; use Piwik\Plugins\PrivacyManager\PrivacyManager; use Piwik\Period; -use Piwik\Period\Week; +use Piwik\Segment; /** * Service that can be used to invalidate archives or add archive references to a list so they will @@ -45,12 +45,18 @@ use Piwik\Period\Week; */ class ArchiveInvalidator { - private $warningDates = array(); - private $processedDates = array(); - private $minimumDateWithLogs = false; - private $rememberArchivedReportIdStart = 'report_to_invalidate_'; + /** + * @var Model + */ + private $model; + + public function __construct(Model $model) + { + $this->model = $model; + } + public function rememberToInvalidateArchivedReportsLater($idSite, Date $date) { $key = $this->buildRememberArchivedReportId($idSite, $date->toString()); @@ -120,17 +126,30 @@ class ArchiveInvalidator * @param $idSites int[] * @param $dates Date[] * @param $period string - * @return array + * @param $segment Segment + * @param bool $cascadeDown + * @return InvalidationResult * @throws \Exception */ - public function markArchivesAsInvalidated(array $idSites, $dates, $period) + public function markArchivesAsInvalidated(array $idSites, array $dates, $period, Segment $segment = null, $cascadeDown = false) { - $dates = $this->removeDatesThatHaveBeenPurged($dates); + $invalidationInfo = new InvalidationResult(); + + $datesToInvalidate = $this->removeDatesThatHaveBeenPurged($dates, $invalidationInfo); + + if (empty($period)) { + // if the period is empty, we don't need to cascade in any way, since we'll remove all periods + $periodDates = $this->getDatesByYearMonthAndPeriodType($dates); + } else { + $periods = $this->getPeriodsToInvalidate($datesToInvalidate, $period, $cascadeDown); + $periodDates = $this->getPeriodDatesByYearMonthAndPeriodType($periods); + } - $datesByMonth = $this->getDatesByYearMonth($dates); + $periodDates = $this->getUniqueDates($periodDates); + $this->markArchivesInvalidated($idSites, $periodDates, $segment); - $this->markArchivesInvalidatedFor($idSites, $period, $datesByMonth); - $this->persistInvalidatedArchives($idSites, $datesByMonth); + $yearMonths = array_keys($periodDates); + $this->markInvalidatedArchivesForReprocessAndPurge($idSites, $yearMonths); foreach ($idSites as $idSite) { foreach ($dates as $date) { @@ -138,148 +157,161 @@ class ArchiveInvalidator } } - return $this->makeOutputLogs(); + return $invalidationInfo; } /** - * @param $idSites - * @param $period string - * @param $datesByMonth array - * @throws \Exception + * @param string[][][] $periodDates + * @return string[][][] */ - private function markArchivesInvalidatedFor($idSites, $period, $datesByMonth) + private function getUniqueDates($periodDates) { - $invalidateForPeriodId = $this->getPeriodId($period); - - // In each table, invalidate day/week/month/year containing this date - $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled(); - - $archiveNumericTables = array_filter($archiveTables, function ($name) { - return ArchiveTableCreator::getTypeFromTableName($name) == ArchiveTableCreator::NUMERIC_TABLE; - }); - - foreach ($archiveNumericTables as $table) { - // Extract Y_m from table name - $suffix = ArchiveTableCreator::getDateFromTableName($table); - if (!isset($datesByMonth[$suffix])) { - continue; + $result = array(); + foreach ($periodDates as $yearMonth => $periodsByYearMonth) { + foreach ($periodsByYearMonth as $periodType => $periods) { + $result[$yearMonth][$periodType] = array_unique($periods); } - // Dates which are to be deleted from this table - $datesToDelete = $datesByMonth[$suffix]; - self::getModel()->updateArchiveAsInvalidated($table, $idSites, $invalidateForPeriodId, $datesToDelete); } + return $result; } /** * @param Date[] $dates - * @return Date[] + * @param string $periodType + * @param bool $cascadeDown + * @return Period[] */ - private function removeDatesThatHaveBeenPurged($dates) + private function getPeriodsToInvalidate($dates, $periodType, $cascadeDown) { - $this->findOlderDateWithLogs(); + $periodsToInvalidate = array(); - $result = array(); foreach ($dates as $date) { - // we should only delete reports for dates that are more recent than N days - if ($this->minimumDateWithLogs - && $date->isEarlier($this->minimumDateWithLogs) - ) { - $this->warningDates[] = $date->toString(); - continue; + if ($periodType == 'range') { + $date = $date . ',' . $date; } - $result[] = $date; + $period = Period\Factory::build($periodType, $date); + $periodsToInvalidate[] = $period; + + if ($cascadeDown) { + $periodsToInvalidate = array_merge($periodsToInvalidate, $period->getAllOverlappingChildPeriods()); + } + + if ($periodType != 'year' + && $periodType != 'range' + ) { + $periodsToInvalidate[] = Period\Factory::build('year', $date); + } } - return $result; + + return $periodsToInvalidate; } - private function findOlderDateWithLogs() + /** + * @param Period[] $periods + * @return string[][][] + */ + private function getPeriodDatesByYearMonthAndPeriodType($periods) { - // If using the feature "Delete logs older than N days"... - $purgeDataSettings = PrivacyManager::getPurgeDataSettings(); - $logsDeletedWhenOlderThanDays = $purgeDataSettings['delete_logs_older_than']; - $logsDeleteEnabled = $purgeDataSettings['delete_logs_enable']; + $result = array(); + foreach ($periods as $period) { + $date = $period->getDateStart(); + $periodType = $period->getId(); - if ($logsDeleteEnabled - && $logsDeletedWhenOlderThanDays - ) { - $this->minimumDateWithLogs = Date::factory('today')->subDay($logsDeletedWhenOlderThanDays); + $yearMonth = ArchiveTableCreator::getTableMonthFromDate($date); + $result[$yearMonth][$periodType][] = $date->toString(); } + return $result; } /** - * Given the list of dates, process which tables YYYY_MM we should delete from + * Called when deleting all periods. * - * @param $datesToInvalidate Date[] - * @return array + * @param Date[] $dates + * @return string[][][] */ - private function getDatesByYearMonth(array $datesToInvalidate) + private function getDatesByYearMonthAndPeriodType($dates) { - $datesByMonth = array(); - foreach ($datesToInvalidate as $date) { - $this->processedDates[] = $date->toString(); - - $month = $date->toString('Y_m'); - // For a given date, we must invalidate in the monthly archive table - $datesByMonth[$month][] = $date->toString(); - - // But also the year stored in January - $year = $date->toString('Y_01'); - $datesByMonth[$year][] = $date->toString(); - - // but also weeks overlapping several months stored in the month where the week is starting - /* @var $week Week */ - $week = Period\Factory::build('week', $date); - $weekAsString = $week->getDateStart()->toString('Y_m'); - $datesByMonth[$weekAsString][] = $date->toString(); + $result = array(); + foreach ($dates as $date) { + $yearMonth = ArchiveTableCreator::getTableMonthFromDate($date); + $result[$yearMonth][null][] = $date->toString(); + + // since we're removing all periods, we must make sure to remove year periods as well. + // this means we have to make sure the january table is processed. + $janYearMonth = $date->toString('Y') . '_01'; + $result[$janYearMonth][null][] = $date->toString(); } - return $datesByMonth; + return $result; } /** - * @return array + * @param int[] $idSites + * @param string[][][] $dates + * @throws \Exception */ - private function makeOutputLogs() + private function markArchivesInvalidated($idSites, $dates, Segment $segment = null) { - $output = array(); - if ($this->warningDates) { - $output[] = 'Warning: the following Dates have not been invalidated, because they are earlier than your Log Deletion limit: ' . - implode(", ", $this->warningDates) . - "\n The last day with logs is " . $this->minimumDateWithLogs . ". " . - "\n Please disable 'Delete old Logs' or set it to a higher deletion threshold (eg. 180 days or 365 years).'."; - } + $archiveNumericTables = ArchiveTableCreator::getTablesArchivesInstalled($type = ArchiveTableCreator::NUMERIC_TABLE); + foreach ($archiveNumericTables as $table) { + $tableDate = ArchiveTableCreator::getDateFromTableName($table); + if (empty($dates[$tableDate])) { + continue; + } - $output[] = "Success. The following dates were invalidated successfully: " . implode(", ", $this->processedDates); - return $output; + $this->model->updateArchiveAsInvalidated($table, $idSites, $dates[$tableDate], $segment); + } } /** - * @param $period - * @return int|null + * @param Date[] $dates + * @param InvalidationResult $invalidationInfo + * @return \Piwik\Date[] */ - private function getPeriodId($period) + private function removeDatesThatHaveBeenPurged($dates, InvalidationResult $invalidationInfo) { - return isset(Piwik::$idPeriods[$period]) ? Piwik::$idPeriods[$period] : null; + $this->findOlderDateWithLogs($invalidationInfo); + + $result = array(); + foreach ($dates as $date) { + // we should only delete reports for dates that are more recent than N days + if ($invalidationInfo->minimumDateWithLogs + && $date->isEarlier($invalidationInfo->minimumDateWithLogs) + ) { + $invalidationInfo->warningDates[] = $date->toString(); + continue; + } + + $result[] = $date; + $invalidationInfo->processedDates[] = $date->toString(); + } + return $result; + } + + private function findOlderDateWithLogs(InvalidationResult $info) + { + // If using the feature "Delete logs older than N days"... + $purgeDataSettings = PrivacyManager::getPurgeDataSettings(); + $logsDeletedWhenOlderThanDays = (int)$purgeDataSettings['delete_logs_older_than']; + $logsDeleteEnabled = $purgeDataSettings['delete_logs_enable']; + + if ($logsDeleteEnabled + && $logsDeletedWhenOlderThanDays + ) { + $info->minimumDateWithLogs = Date::factory('today')->subDay($logsDeletedWhenOlderThanDays); + } } /** * @param array $idSites - * @param $datesByMonth + * @param array $yearMonths */ - private function persistInvalidatedArchives(array $idSites, $datesByMonth) + private function markInvalidatedArchivesForReprocessAndPurge(array $idSites, $yearMonths) { - $yearMonths = array_keys($datesByMonth); - $yearMonths = array_unique($yearMonths); - $store = new SitesToReprocessDistributedList(); $store->add($idSites); $archivesToPurge = new ArchivesToPurgeDistributedList(); $archivesToPurge->add($yearMonths); } - - private static function getModel() - { - return new Model(); - } } diff --git a/core/Archive/ArchiveInvalidator/InvalidationResult.php b/core/Archive/ArchiveInvalidator/InvalidationResult.php new file mode 100644 index 0000000000000000000000000000000000000000..517e113841329a860d3ec671c4f15b04a63bb340 --- /dev/null +++ b/core/Archive/ArchiveInvalidator/InvalidationResult.php @@ -0,0 +1,56 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Archive\ArchiveInvalidator; + +use Piwik\Date; + +/** + * Information about the result of an archive invalidation operation. + */ +class InvalidationResult +{ + /** + * Dates that couldn't be invalidated because they are earlier than the configured log + * deletion limit. + * + * @var array + */ + public $warningDates = array(); + + /** + * Dates that were successfully invalidated. + * + * @var array + */ + public $processedDates = array(); + + /** + * The day of the oldest log entry. + * + * @var Date|bool + */ + public $minimumDateWithLogs = false; + + /** + * @return string[] + */ + public function makeOutputLogs() + { + $output = array(); + if ($this->warningDates) { + $output[] = 'Warning: the following Dates have not been invalidated, because they are earlier than your Log Deletion limit: ' . + implode(", ", $this->warningDates) . + "\n The last day with logs is " . $this->minimumDateWithLogs . ". " . + "\n Please disable 'Delete old Logs' or set it to a higher deletion threshold (eg. 180 days or 365 years).'."; + } + + $output[] = "Success. The following dates were invalidated successfully: " . implode(", ", $this->processedDates); + return $output; + } +} \ No newline at end of file diff --git a/core/ArchiveProcessor/Rules.php b/core/ArchiveProcessor/Rules.php index caa5a627fb4c85736543ae94cf0906a292b8df57..0ec92f75907dd623c015a08256e3c7dcb3c3a053 100644 --- a/core/ArchiveProcessor/Rules.php +++ b/core/ArchiveProcessor/Rules.php @@ -86,7 +86,7 @@ class Rules return 'done' . $segment->getHash() . '.' . $plugin ; } - private static function getDoneFlagArchiveContainsAllPlugins(Segment $segment) + public static function getDoneFlagArchiveContainsAllPlugins(Segment $segment) { return 'done' . $segment->getHash(); } diff --git a/core/AssetManager.php b/core/AssetManager.php index a1a1762a4b6c7034c722983316ec873ba7928441..407a2058c05aa1a0afa7c47360a6b799a7def447 100644 --- a/core/AssetManager.php +++ b/core/AssetManager.php @@ -260,7 +260,15 @@ class AssetManager extends Singleton */ public function isMergedAssetsDisabled() { - return Config::getInstance()->Development['disable_merged_assets']; + if (Config::getInstance()->Development['disable_merged_assets'] == 1) { + return true; + } + + if (isset($_GET['disable_merged_assets']) && $_GET['disable_merged_assets'] == 1) { + return true; + } + + return false; } /** diff --git a/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php b/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php index d8ec05ca53cd023a92ca7f24acf7f200f7e84355..aed319253fa8cfbf50161096e9055086dea55aee 100644 --- a/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php +++ b/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php @@ -72,6 +72,8 @@ class JScriptUIAssetFetcher extends UIAssetFetcher 'libs/bower_components/jquery-ui/ui/minified/jquery-ui.min.js', 'libs/jquery/jquery.browser.js', 'libs/', + 'js/', + 'piwik.js', 'plugins/CoreHome/javascripts/require.js', 'plugins/Morpheus/javascripts/piwikHelper.js', 'plugins/Morpheus/javascripts/jquery.icheck.min.js', diff --git a/core/Category/Category.php b/core/Category/Category.php index cda49032e0c7e8efc77185e6a27ece84d4845992..9694054d11497ca076556533800c483c7fa6d03e 100644 --- a/core/Category/Category.php +++ b/core/Category/Category.php @@ -36,6 +36,12 @@ class Category */ protected $order = 99; + /** + * The icon for this category, eg 'icon-user' + * @var int + */ + protected $icon = ''; + /** * @param int $order * @return static @@ -97,4 +103,16 @@ class Category { return !empty($this->subcategories); } + + public function setIcon($icon) + { + $this->icon = $icon; + return $this; + } + + public function getIcon() + { + return $this->icon; + } + } \ No newline at end of file diff --git a/core/Columns/Updater.php b/core/Columns/Updater.php index a29ed16330cd38e951df9a3d2792390630f547df..8dea10ded7ef4fed09595f4373e6305d05454508 100644 --- a/core/Columns/Updater.php +++ b/core/Columns/Updater.php @@ -47,9 +47,9 @@ class Updater extends \Piwik\Updates */ public function __construct(array $visitDimensions = null, array $actionDimensions = null, array $conversionDimensions = null) { - $this->visitDimensions = $visitDimensions === null ? VisitDimension::getAllDimensions() : $visitDimensions; - $this->actionDimensions = $actionDimensions === null ? ActionDimension::getAllDimensions() : $actionDimensions; - $this->conversionDimensions = $conversionDimensions === null ? ConversionDimension::getAllDimensions() : $conversionDimensions; + $this->visitDimensions = $visitDimensions; + $this->actionDimensions = $actionDimensions; + $this->conversionDimensions = $conversionDimensions; } public function getMigrationQueries(PiwikUpdater $updater) @@ -74,6 +74,36 @@ class Updater extends \Piwik\Updates $updater->executeMigrationQueries(__FILE__, $this->getMigrationQueries($updater)); } + private function getVisitDimensions() + { + // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance + if (!isset($this->visitDimensions)) { + $this->visitDimensions = VisitDimension::getAllDimensions(); + } + + return $this->visitDimensions; + } + + private function getActionDimensions() + { + // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance + if (!isset($this->actionDimensions)) { + $this->actionDimensions = ActionDimension::getAllDimensions(); + } + + return $this->actionDimensions; + } + + private function getConversionDimensions() + { + // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance + if (!isset($this->conversionDimensions)) { + $this->conversionDimensions = ConversionDimension::getAllDimensions(); + } + + return $this->conversionDimensions; + } + private function getUpdates(PiwikUpdater $updater) { $visitColumns = DbHelper::getTableColumns(Common::prefixTable('log_visit')); @@ -82,17 +112,17 @@ class Updater extends \Piwik\Updates $allUpdatesToRun = array(); - foreach ($this->visitDimensions as $dimension) { + foreach ($this->getVisitDimensions() as $dimension) { $updates = $this->getUpdatesForDimension($updater, $dimension, 'log_visit.', $visitColumns, $conversionColumns); $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates); } - foreach ($this->actionDimensions as $dimension) { + foreach ($this->getActionDimensions() as $dimension) { $updates = $this->getUpdatesForDimension($updater, $dimension, 'log_link_visit_action.', $actionColumns); $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates); } - foreach ($this->conversionDimensions as $dimension) { + foreach ($this->getConversionDimensions() as $dimension) { $updates = $this->getUpdatesForDimension($updater, $dimension, 'log_conversion.', $conversionColumns); $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates); } @@ -162,15 +192,15 @@ class Updater extends \Piwik\Updates $actionColumns = DbHelper::getTableColumns(Common::prefixTable('log_link_visit_action')); $conversionColumns = DbHelper::getTableColumns(Common::prefixTable('log_conversion')); - foreach ($this->visitDimensions as $dimension) { + foreach ($this->getVisitDimensions() as $dimension) { $versions = $this->mixinVersions($updater, $dimension, VisitDimension::INSTALLER_PREFIX, $visitColumns, $versions); } - foreach ($this->actionDimensions as $dimension) { + foreach ($this->getActionDimensions() as $dimension) { $versions = $this->mixinVersions($updater, $dimension, ActionDimension::INSTALLER_PREFIX, $actionColumns, $versions); } - foreach ($this->conversionDimensions as $dimension) { + foreach ($this->getConversionDimensions() as $dimension) { $versions = $this->mixinVersions($updater, $dimension, ConversionDimension::INSTALLER_PREFIX, $conversionColumns, $versions); } diff --git a/core/CronArchive.php b/core/CronArchive.php index e33b918154e2b87ea8bcf98f9ccbefe50aacd94c..4b9d3556d3f43413918c9e9967dd8afa12ca429f 100644 --- a/core/CronArchive.php +++ b/core/CronArchive.php @@ -237,6 +237,11 @@ class CronArchive */ private $urlToPiwik = null; + /** + * @var ArchiveInvalidator + */ + private $invalidator; + /** * Returns the option name of the option that stores the time core:archive was last executed. * @@ -262,6 +267,8 @@ class CronArchive $processNewSegmentsFrom = $processNewSegmentsFrom ?: StaticContainer::get('ini.General.process_new_segments_from'); $this->segmentArchivingRequestUrlProvider = new SegmentArchivingRequestUrlProvider($processNewSegmentsFrom); + + $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); } /** @@ -1069,8 +1076,7 @@ class CronArchive public function invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain() { - $invalidator = new ArchiveInvalidator(); - $sitesPerDays = $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated(); + $sitesPerDays = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated(); foreach ($sitesPerDays as $date => $siteIds) { $listSiteIds = implode(',', $siteIds); diff --git a/core/DataAccess/ArchiveTableCreator.php b/core/DataAccess/ArchiveTableCreator.php index ca94b7239997b0b19a027fd0d1901119e66bf188..ad95863da48ec61c97d745489b76e3e27efd2439 100644 --- a/core/DataAccess/ArchiveTableCreator.php +++ b/core/DataAccess/ArchiveTableCreator.php @@ -71,24 +71,27 @@ class ArchiveTableCreator /** * Returns all table names archive_* * + * @param string $type The type of table to return. Either `self::NUMERIC_TABLE` or `self::BLOB_TABLE`. * @return array */ - public static function getTablesArchivesInstalled() + public static function getTablesArchivesInstalled($type = null) { if (is_null(self::$tablesAlreadyInstalled)) { self::refreshTableList(); } - $archiveTables = array(); + if (empty($type)) { + $tableMatchRegex = '/archive_(numeric|blob)_/'; + } else { + $tableMatchRegex = '/archive_' . preg_quote($type) . '_/'; + } + $archiveTables = array(); foreach (self::$tablesAlreadyInstalled as $table) { - if (strpos($table, 'archive_numeric_') !== false - || strpos($table, 'archive_blob_') !== false - ) { + if (preg_match($tableMatchRegex, $table)) { $archiveTables[] = $table; } } - return $archiveTables; } diff --git a/core/DataAccess/Model.php b/core/DataAccess/Model.php index a83db1317a5c99be3fa466563d1351089b6cebb7..4213cd203950c1f1ea06e9332e61e3dfec0ed154 100644 --- a/core/DataAccess/Model.php +++ b/core/DataAccess/Model.php @@ -9,10 +9,13 @@ namespace Piwik\DataAccess; use Exception; +use Piwik\ArchiveProcessor\Rules; use Piwik\Common; use Piwik\Container\StaticContainer; use Piwik\Db; use Piwik\DbHelper; +use Piwik\Period; +use Piwik\Segment; use Piwik\Sequence; use Psr\Log\LoggerInterface; @@ -95,39 +98,55 @@ class Model } /** - * @param $archiveTable - * @param $idSites - * @param $periodId - * @param $datesToDelete + * @param string $archiveTable Prefixed table name + * @param int[] $idSites + * @param string[][] $datesByPeriodType + * @param Segment $segment + * @return \Zend_Db_Statement * @throws Exception */ - public function updateArchiveAsInvalidated($archiveTable, $idSites, $periodId, $datesToDelete) + public function updateArchiveAsInvalidated($archiveTable, $idSites, $datesByPeriodType, Segment $segment = null) { - $sql = $bind = array(); - $datesToDelete = array_unique($datesToDelete); - foreach ($datesToDelete as $dateToDelete) { - $sql[] = '(date1 <= ? AND ? <= date2 AND name LIKE \'done%\')'; - $bind[] = $dateToDelete; - $bind[] = $dateToDelete; - } - $sql = implode(" OR ", $sql); + $idSites = array_map('intval', $idSites); + + $bind = array(); - $idSites = array_values($idSites); - $sqlSites = " AND idsite IN (" . Common::getSqlStringFieldsArray($idSites) . ")"; - $bind = array_merge($bind, $idSites); + $periodConditions = array(); + foreach ($datesByPeriodType as $periodType => $dates) { + $dateConditions = array(); - $sqlPeriod = ""; - if ($periodId) { - $sqlPeriod = " AND period = ? "; - $bind[] = $periodId; + foreach ($dates as $date) { + $dateConditions[] = "(date1 <= ? AND ? <= date2)"; + $bind[] = $date; + $bind[] = $date; + } + + $dateConditionsSql = implode(" OR ", $dateConditions); + if (empty($periodType) + || $periodType == Period\Day::PERIOD_ID + ) { + // invalidate all periods if no period supplied or period is day + $periodConditions[] = "($dateConditionsSql)"; + } else if ($periodType == Period\Range::PERIOD_ID) { + $periodConditions[] = "(period = " . Period\Range::PERIOD_ID . " AND ($dateConditionsSql))"; + } else { + // for non-day periods, invalidate greater periods, but not range periods + $periodConditions[] = "(period >= " . (int)$periodType . " AND period < " . Period\Range::PERIOD_ID . " AND ($dateConditionsSql))"; + } + } + + if ($segment) { + $nameCondition = "name LIKE '" . Rules::getDoneFlagArchiveContainsAllPlugins($segment) . "%'"; + } else { + $nameCondition = "name LIKE 'done%'"; } - $query = "UPDATE $archiveTable " . - " SET value = " . ArchiveWriter::DONE_INVALIDATED . - " WHERE ( $sql ) " . - $sqlSites . - $sqlPeriod; - Db::query($query, $bind); + $sql = "UPDATE $archiveTable SET value = " . ArchiveWriter::DONE_INVALIDATED + . " WHERE $nameCondition + AND idsite IN (" . implode(", ", $idSites) . ") + AND (" . implode(" OR ", $periodConditions) . ")"; + + return Db::query($sql, $bind); } @@ -157,7 +176,7 @@ class Model // Individual blob tables could be missing $this->logger->debug("Unable to delete archives by period from {blobTable}.", array( 'blobTable' => $blobTable, - 'exception' => $e + 'exception' => $e, )); } @@ -179,7 +198,7 @@ class Model // Individual blob tables could be missing $this->logger->debug("Unable to delete archive IDs from {blobTable}.", array( 'blobTable' => $blobTable, - 'exception' => $e + 'exception' => $e, )); } diff --git a/core/DataTable/Filter/CalculateEvolutionFilter.php b/core/DataTable/Filter/CalculateEvolutionFilter.php index 5af658bad6de2a4058019b51d8ff033684f8fad0..73274c537dc9e6ea3728b070cc90cfc3d0e76814 100755 --- a/core/DataTable/Filter/CalculateEvolutionFilter.php +++ b/core/DataTable/Filter/CalculateEvolutionFilter.php @@ -11,6 +11,7 @@ namespace Piwik\DataTable\Filter; use Piwik\Common; use Piwik\DataTable; use Piwik\DataTable\Row; +use Piwik\NumberFormatter; use Piwik\Site; /** @@ -157,10 +158,10 @@ class CalculateEvolutionFilter extends ColumnCallbackAddColumnPercentage { $number = self::getPercentageValue($currentValue - $pastValue, $pastValue, $quotientPrecision); if ($appendPercentSign) { - $number = self::appendPercentSign($number); + return NumberFormatter::getInstance()->formatPercent($number, $quotientPrecision); } - return $number; + return NumberFormatter::getInstance()->format($number, $quotientPrecision); } public static function appendPercentSign($number) diff --git a/core/Db.php b/core/Db.php index 8a18f558d82787ccee363cb5ed1a9cd2e4d2ae88..12798d2ff5215da72b360c7e0febe1f6a5945ca4 100644 --- a/core/Db.php +++ b/core/Db.php @@ -33,7 +33,7 @@ use Piwik\Db\Adapter; */ class Db { - const SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE'; + const SQL_MODE = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE'; private static $connection = null; diff --git a/core/Intl/Locale.php b/core/Intl/Locale.php index 0c7676569af4e306c2649bbfe8bbd34bd93bda33..05cf51a8e39f9616b077302257a9f9ff51683b4a 100644 --- a/core/Intl/Locale.php +++ b/core/Intl/Locale.php @@ -31,6 +31,8 @@ class Locale setlocale(LC_ALL, $newLocale); setlocale(LC_CTYPE, ''); + // Always use english for numbers. otherwise the decimal separator might get localized when casting a float to string + setlocale(LC_NUMERIC, array('en_US.UTF-8', 'en-US')); } public static function setDefaultLocale() diff --git a/core/Menu/MenuAbstract.php b/core/Menu/MenuAbstract.php index 7651a1199d3a0323acefb332815efc8d43f10451..777d97b523736b34a1eec8d5025e518dae2aec30 100644 --- a/core/Menu/MenuAbstract.php +++ b/core/Menu/MenuAbstract.php @@ -30,6 +30,7 @@ abstract class MenuAbstract extends Singleton protected $edits = array(); protected $renames = array(); protected $orderingApplied = false; + protected $menuIcons = array(); protected static $menus = array(); /** @@ -48,6 +49,17 @@ abstract class MenuAbstract extends Singleton return $this->menu; } + /** + * Let's you register a menu icon for a certain menu category to replace the default arrow icon. + * + * @param string $menuName The translation key of a main menu category, eg 'Dashboard_Dashboard' + * @param string $iconCssClass The css class name of an icon, eg 'icon-user' + */ + public function registerMenuIcon($menuName, $iconCssClass) + { + $this->menuIcons[$menuName] = $iconCssClass; + } + /** * Returns a list of available plugin menu instances. * @@ -164,6 +176,11 @@ abstract class MenuAbstract extends Singleton $this->menu[$menuName]['_order'] = $order; $this->menu[$menuName]['_name'] = $menuName; $this->menu[$menuName]['_tooltip'] = $tooltip; + if (!empty($this->menuIcons[$menuName])) { + $this->menu[$menuName]['_icon'] = $this->menuIcons[$menuName]; + } else { + $this->menu[$menuName]['_icon'] = ''; + } } if (!empty($subMenuName)) { $this->menu[$menuName][$subMenuName]['_url'] = $url; diff --git a/core/Metrics/Formatter.php b/core/Metrics/Formatter.php index c2b8a1062d2fddb33f20e29f68065b127ff2cb6a..8fbe5cbb89c7b0b37f06a232fd8f8858ee80484c 100644 --- a/core/Metrics/Formatter.php +++ b/core/Metrics/Formatter.php @@ -11,6 +11,7 @@ use Piwik\Common; use Piwik\Container\StaticContainer; use Piwik\DataTable; use Piwik\Intl\Data\Provider\CurrencyDataProvider; +use Piwik\NumberFormatter; use Piwik\Piwik; use Piwik\Plugin\Metric; use Piwik\Plugin\ProcessedMetric; @@ -98,7 +99,7 @@ class Formatter $seconds = $minusDaysAndHours - $minutes * 60; $precision = ($seconds > 0 && $seconds < 0.01 ? 3 : 2); - $seconds = round($seconds, $precision); + $seconds = NumberFormatter::getInstance()->formatNumber(round($seconds, $precision), $precision); if ($years > 0) { $return = sprintf(Piwik::translate('General_YearsDays'), $years, $days); @@ -149,21 +150,16 @@ class Formatter public function getPrettyMoney($value, $idSite) { $space = ' '; - $currencySymbol = self::getCurrencySymbol($idSite); - $currencyBefore = $currencySymbol . $space; $currencyAfter = ''; - // (maybe more currencies prefer this notation?) $currencySymbolToAppend = array('€', 'kr', 'zÅ‚'); - // manually put the currency symbol after the amount if (in_array($currencySymbol, $currencySymbolToAppend)) { $currencyAfter = $space . $currencySymbol; $currencyBefore = ''; } - // if the input is a number (it could be a string or INPUT form), // and if this number is not an int, we round to precision 2 if (is_numeric($value)) { @@ -175,7 +171,6 @@ class Formatter $value = sprintf("%01." . $precision . "f", $value); } } - $prettyMoney = $currencyBefore . $value . $currencyAfter; return $prettyMoney; } diff --git a/core/NumberFormatter.php b/core/NumberFormatter.php new file mode 100644 index 0000000000000000000000000000000000000000..ad030400f4ad77ac987dce0d430c8a7df6cc9827 --- /dev/null +++ b/core/NumberFormatter.php @@ -0,0 +1,305 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik; + +/** + * Class NumberFormatter + * + * Used to format numbers according to current language + */ +class NumberFormatter extends Singleton +{ + /** @var string language specific patterns for numbers */ + protected $patternNumber; + + /** @var string language specific pattern for percent numbers */ + protected $patternPercent; + + /** @var string language specific pattern for currency numbers */ + protected $patternCurrency; + + /** @var string language specific plus sign */ + protected $symbolPlus; + + /** @var string language specific minus sign */ + protected $symbolMinus; + + /** @var string language specific percent sign */ + protected $symbolPercent; + + /** @var string language specific symbol used as decimal separator */ + protected $symbolDecimal; + + /** @var string language specific symbol used as group separator */ + protected $symbolGroup; + + /** @var bool indicates if language uses grouping for numbers */ + protected $usesGrouping; + + /** @var int language specific size for primary group numbers */ + protected $primaryGroupSize; + + /** @var int language specific size for secondary group numbers */ + protected $secondaryGroupSize; + + /** + * Loads all required data from Intl plugin + */ + public function __construct() + { + $this->patternNumber = Piwik::translate('Intl_NumberFormatNumber'); + $this->patternCurrency = Piwik::translate('Intl_NumberFormatCurrency'); + $this->patternPercent = Piwik::translate('Intl_NumberFormatPercent'); + $this->symbolPlus = Piwik::translate('Intl_NumberSymbolPlus'); + $this->symbolMinus = Piwik::translate('Intl_NumberSymbolMinus'); + $this->symbolPercent = Piwik::translate('Intl_NumberSymbolPercent'); + $this->symbolGroup = Piwik::translate('Intl_NumberSymbolGroup'); + $this->symbolDecimal = Piwik::translate('Intl_NumberSymbolDecimal'); + } + + /** + * Parses the given pattern and returns patterns for positive and negative numbers + * + * @param string $pattern + * @return array + */ + protected function parsePattern($pattern) + { + $patterns = explode(';', $pattern); + if (!isset($patterns[1])) { + // No explicit negative pattern was provided, construct it. + $patterns[1] = '-' . $patterns[0]; + } + return $patterns; + } + + /** + * Formats a given number or percent value (if $value starts or ends with a %) + * + * @param string|int|float $value + * @param int $maximumFractionDigits + * @param int $minimumFractionDigits + * @return mixed|string + */ + public function format($value, $maximumFractionDigits=0, $minimumFractionDigits=0) + { + if (trim($value, '%') != $value) { + return $this->formatPercent($value); + } + + return $this->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits); + } + + /** + * Formats a given number + * + * @see \Piwik\NumberFormatter::format() + * + * @param string|int|float $value + * @param int $maximumFractionDigits + * @param int $minimumFractionDigits + * @return mixed|string + */ + public function formatNumber($value, $maximumFractionDigits=0, $minimumFractionDigits=0) + { + + static $positivePattern, $negativePattern; + + if (empty($positivePatter) || empty($negativePattern)) { + list($positivePattern, $negativePattern) = $this->parsePattern($this->patternNumber); + } + $negative = $this->isNegative($value); + $pattern = $negative ? $negativePattern : $positivePattern; + + return $this->formatNumberWithPattern($pattern, $value, $maximumFractionDigits, $minimumFractionDigits); + } + + /** + * Formats given number as percent value + * @param string|int|float $value + * @param int $maximumFractionDigits + * @param int $minimumFractionDigits + * @return mixed|string + */ + public function formatPercent($value, $maximumFractionDigits=0, $minimumFractionDigits=0) + { + static $positivePattern, $negativePattern; + + if (empty($positivePatter) || empty($negativePattern)) { + list($positivePattern, $negativePattern) = $this->parsePattern($this->patternPercent); + } + + $newValue = trim($value, " \0\x0B%"); + if (!is_numeric($newValue)) { + return $value; + } + + $negative = $this->isNegative($value); + $pattern = $negative ? $negativePattern : $positivePattern; + + return $this->formatNumberWithPattern($pattern, $newValue, $maximumFractionDigits, $minimumFractionDigits); + } + + + /** + * Formats given number as percent value, but keep the leading + sign if found + * + * @param $value + * @return string + */ + public function formatPercentEvolution($value) + { + $isPositiveEvolution = !empty($value) && ($value > 0 || $value[0] == '+'); + + $formatted = self::formatPercent($value); + + if($isPositiveEvolution) { + return $this->symbolPlus . $formatted; + } + return $formatted; + } + + /** + * Formats given number as percent value + * @param string|int|float $value + * @param string $currency + * @param int $precision + * @return mixed|string + */ + public function formatCurrency($value, $currency, $precision=2) + { + static $positivePattern, $negativePattern; + + if (empty($positivePatter) || empty($negativePattern)) { + list($positivePattern, $negativePattern) = $this->parsePattern($this->patternCurrency); + } + + $newValue = trim($value, " \0\x0B$currency"); + if (!is_numeric($newValue)) { + return $value; + } + + $negative = $this->isNegative($value); + $pattern = $negative ? $negativePattern : $positivePattern; + + if ($newValue == round($newValue)) { + // if no fraction digits available, don't show any + $value = $this->formatNumberWithPattern($pattern, $newValue, 0, 0); + } else { + // show given count of fraction digits otherwise + $value = $this->formatNumberWithPattern($pattern, $newValue, $precision, $precision); + } + + return str_replace('¤', $currency, $value); + } + + /** + * Formats the given number with the given pattern + * + * @param string $pattern + * @param string|int|float $value + * @param int $maximumFractionDigits + * @param int $minimumFractionDigits + * @return mixed|string + */ + protected function formatNumberWithPattern($pattern, $value, $maximumFractionDigits=0, $minimumFractionDigits=0) + { + if (!is_numeric($value)) { + return $value; + } + + $this->usesGrouping = (strpos($pattern, ',') !== false); + // if pattern has number groups, parse them. + if ($this->usesGrouping) { + preg_match('/#+0/', $pattern, $primaryGroupMatches); + $this->primaryGroupSize = $this->secondaryGroupSize = strlen($primaryGroupMatches[0]); + $numberGroups = explode(',', $pattern); + // check for distinct secondary group size. + if (count($numberGroups) > 2) { + $this->secondaryGroupSize = strlen($numberGroups[1]); + } + } + + // Ensure that the value is positive and has the right number of digits. + $negative = $this->isNegative($value); + $signMultiplier = $negative ? '-1' : '1'; + $value = $value / $signMultiplier; + $value = round($value, $maximumFractionDigits); + // Split the number into major and minor digits. + $valueParts = explode('.', $value); + $majorDigits = $valueParts[0]; + // Account for maximumFractionDigits = 0, where the number won't + // have a decimal point, and $valueParts[1] won't be set. + $minorDigits = isset($valueParts[1]) ? $valueParts[1] : ''; + if ($this->usesGrouping) { + // Reverse the major digits, since they are grouped from the right. + $majorDigits = array_reverse(str_split($majorDigits)); + // Group the major digits. + $groups = array(); + $groups[] = array_splice($majorDigits, 0, $this->primaryGroupSize); + while (!empty($majorDigits)) { + $groups[] = array_splice($majorDigits, 0, $this->secondaryGroupSize); + } + // Reverse the groups and the digits inside of them. + $groups = array_reverse($groups); + foreach ($groups as &$group) { + $group = implode(array_reverse($group)); + } + // Reconstruct the major digits. + $majorDigits = implode(',', $groups); + } + if ($minimumFractionDigits < $maximumFractionDigits) { + // Strip any trailing zeroes. + $minorDigits = rtrim($minorDigits, '0'); + if (strlen($minorDigits) < $minimumFractionDigits) { + // Now there are too few digits, re-add trailing zeroes + // until the desired length is reached. + $neededZeroes = $minimumFractionDigits - strlen($minorDigits); + $minorDigits .= str_repeat('0', $neededZeroes); + } + } + // Assemble the final number and insert it into the pattern. + $value = $minorDigits ? $majorDigits . '.' . $minorDigits : $majorDigits; + $value = preg_replace('/#(?:[\.,]#+)*0(?:[,\.][0#]+)*/', $value, $pattern); + // Localize the number. + $value = $this->replaceSymbols($value); + return $value; + } + + + /** + * Replaces number symbols with their localized equivalents. + * + * @param string $value The value being formatted. + * + * @return string + * + * @see http://cldr.unicode.org/translation/number-symbols + */ + protected function replaceSymbols($value) + { + $replacements = array( + '.' => $this->symbolDecimal, + ',' => $this->symbolGroup, + '+' => $this->symbolPlus, + '-' => $this->symbolMinus, + '%' => $this->symbolPercent, + ); + return strtr($value, $replacements); + } + + /** + * @param $value + * @return bool + */ + protected function isNegative($value) + { + return $value < 0; + } +} \ No newline at end of file diff --git a/core/Period.php b/core/Period.php index 11ddb9c7c215f724d06879a7069edf7826c623df..70a47d29055c8fdb8bc2eacea58780f98fee4da3 100644 --- a/core/Period.php +++ b/core/Period.php @@ -9,6 +9,7 @@ namespace Piwik; use Piwik\Container\StaticContainer; +use Piwik\Period\Factory; use Piwik\Period\Range; use Piwik\Translation\Translator; @@ -104,6 +105,7 @@ abstract class Period if (self::isMultiplePeriod($dateString, 'day')) { return; } + Date::factory($dateString); } @@ -277,6 +279,31 @@ abstract class Period */ abstract public function getLocalizedLongString(); + /** + * Returns the label of the period type that is one size smaller than this one, or null if + * it's the smallest. + * + * Range periods and other such 'period collections' are not considered as separate from + * the value type of the collection. So a range period will return the result of the + * subperiod's `getImmediateChildPeriodLabel()` method. + * + * @ignore + * @return string|null + */ + abstract public function getImmediateChildPeriodLabel(); + + /** + * Returns the label of the period type that is one size bigger than this one, or null + * if it's the biggest. + * + * Range periods and other such 'period collections' are not considered as separate from + * the value type of the collection. So a range period will return the result of the + * subperiod's `getParentPeriodLabel()` method. + * + * @ignore + */ + abstract public function getParentPeriodLabel(); + /** * Returns the date range string comprising two dates * @@ -290,7 +317,6 @@ abstract class Period return $dateStart->toString("Y-m-d") . "," . $dateEnd->toString("Y-m-d"); } - /** * @param string $format * @@ -352,4 +378,33 @@ abstract class Period $maxDifference )); } + + /** + * Returns all child periods that exist within this periods entire date range. Cascades + * downwards over all period types that are smaller than this one. For example, month periods + * will cascade to week and day periods and year periods will cascade to month, week and day + * periods. + * + * The method will not return periods that are outside the range of this period. + * + * @return Period[] + * @ignore + */ + public function getAllOverlappingChildPeriods() + { + return $this->getAllOverlappingChildPeriodsInRange($this->getDateStart(), $this->getDateEnd()); + } + + private function getAllOverlappingChildPeriodsInRange(Date $dateStart, Date $dateEnd) + { + $result = array(); + + $childPeriodType = $this->getImmediateChildPeriodLabel(); + if (empty($childPeriodType)) { + return $result; + } + + $childPeriods = Factory::build($childPeriodType, $dateStart->toString() . ',' . $dateEnd->toString()); + return array_merge($childPeriods->getSubperiods(), $childPeriods->getAllOverlappingChildPeriodsInRange($dateStart, $dateEnd)); + } } diff --git a/core/Period/Day.php b/core/Period/Day.php index 4ce864df8a73d7ed65eb8081040a7dc0a887a665..108d42e277f9fa9e03beb31ef4137da1e8e3e0ab 100644 --- a/core/Period/Day.php +++ b/core/Period/Day.php @@ -16,6 +16,8 @@ use Piwik\Period; */ class Day extends Period { + const PERIOD_ID = 1; + protected $label = 'day'; /** @@ -98,4 +100,14 @@ class Day extends Period { return $this->toString(); } + + public function getImmediateChildPeriodLabel() + { + return null; + } + + public function getParentPeriodLabel() + { + return 'week'; + } } diff --git a/core/Period/Month.php b/core/Period/Month.php index 4c779e48537b9c7bfa2a33ac19afab995eba7bbd..7a52bd06f8096e849cf83e53e356ed567b1e9327 100644 --- a/core/Period/Month.php +++ b/core/Period/Month.php @@ -15,6 +15,8 @@ use Piwik\Period; */ class Month extends Period { + const PERIOD_ID = 3; + protected $label = 'month'; /** @@ -111,4 +113,14 @@ class Month extends Period $startDate = $startDate->addDay(1); } } + + public function getImmediateChildPeriodLabel() + { + return 'week'; + } + + public function getParentPeriodLabel() + { + return 'year'; + } } diff --git a/core/Period/Range.php b/core/Period/Range.php index 1dff3f56ae0b9d1b6860f2255b1461b4a83ebe30..7073ad2c16f4c7bc759d4b887592a2484a3062b1 100644 --- a/core/Period/Range.php +++ b/core/Period/Range.php @@ -30,6 +30,8 @@ use Piwik\Period; */ class Range extends Period { + const PERIOD_ID = 5; + protected $label = 'range'; protected $today; @@ -512,4 +514,15 @@ class Range extends Period return $dateStart->toString("Y-m-d") . "," . $dateEnd->toString("Y-m-d"); } + + public function getImmediateChildPeriodLabel() + { + $subperiods = $this->getSubperiods(); + return reset($subperiods)->getImmediateChildPeriodLabel(); + } + + public function getParentPeriodLabel() + { + return null; + } } diff --git a/core/Period/Week.php b/core/Period/Week.php index d2724694dda48965f28107a60e3c0aa4ec68b8f7..0029855a3ce58579087540da72ebc49b6f4ec2f8 100644 --- a/core/Period/Week.php +++ b/core/Period/Week.php @@ -14,6 +14,8 @@ use Piwik\Period; */ class Week extends Period { + const PERIOD_ID = 2; + protected $label = 'week'; /** @@ -76,4 +78,14 @@ class Week extends Period $currentDay = $currentDay->addDay(1); } } + + public function getImmediateChildPeriodLabel() + { + return 'day'; + } + + public function getParentPeriodLabel() + { + return 'month'; + } } diff --git a/core/Period/Year.php b/core/Period/Year.php index cfda052bf575c98a8a7cc9f06052fa272a6e0154..208c6bbfac1858de4fcb63fb0540634b76b97ae2 100644 --- a/core/Period/Year.php +++ b/core/Period/Year.php @@ -15,6 +15,8 @@ use Piwik\Period; */ class Year extends Period { + const PERIOD_ID = 4; + protected $label = 'year'; /** @@ -87,4 +89,14 @@ class Year extends Period return $stringMonth; } + + public function getImmediateChildPeriodLabel() + { + return 'month'; + } + + public function getParentPeriodLabel() + { + return null; + } } diff --git a/core/Piwik.php b/core/Piwik.php index 5ad50713834ca6428a4c5a3e5872ba6189caf241..9545cff6c8e260c58a2c10cc8ac0e36599e66e59 100644 --- a/core/Piwik.php +++ b/core/Piwik.php @@ -10,6 +10,11 @@ namespace Piwik; use Exception; use Piwik\Container\StaticContainer; +use Piwik\Period\Day; +use Piwik\Period\Month; +use Piwik\Period\Range; +use Piwik\Period\Week; +use Piwik\Period\Year; use Piwik\Plugins\UsersManager\API as APIUsersManager; use Piwik\Translation\Translator; @@ -31,11 +36,11 @@ class Piwik * @var array */ public static $idPeriods = array( - 'day' => 1, - 'week' => 2, - 'month' => 3, - 'year' => 4, - 'range' => 5, + 'day' => Day::PERIOD_ID, + 'week' => Week::PERIOD_ID, + 'month' => Month::PERIOD_ID, + 'year' => Year::PERIOD_ID, + 'range' => Range::PERIOD_ID, ); /** diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php index 93f1b59195c5ea0c7f0407b68b8213a9f88884cd..e4c9380e2d5115c9ab39e9cd6008091818b60af0 100644 --- a/core/Plugin/Controller.php +++ b/core/Plugin/Controller.php @@ -15,7 +15,6 @@ use Piwik\API\Request; use Piwik\Common; use Piwik\Config as PiwikConfig; use Piwik\Config; -use Piwik\Container\StaticContainer; use Piwik\DataTable\Filter\CalculateEvolutionFilter; use Piwik\Date; use Piwik\Exception\NoPrivilegesException; @@ -25,6 +24,7 @@ use Piwik\Menu\MenuTop; use Piwik\Menu\MenuUser; use Piwik\NoAccessException; use Piwik\Notification\Manager as NotificationManager; +use Piwik\NumberFormatter; use Piwik\Period\Month; use Piwik\Period; use Piwik\Period\PeriodValidator; @@ -667,8 +667,6 @@ abstract class Controller * * The following variables assigned: * - * **enableMeasurePiwikForSiteId** - The value of the `[Debug] enable_measure_piwik_usage_in_idsite` - * INI config option. * **isSuperUser** - True if the current user is the Super User, false if otherwise. * **hasSomeAdminAccess** - True if the current user has admin access to at least one site, * false if otherwise. @@ -688,7 +686,6 @@ abstract class Controller protected function setBasicVariablesView($view) { $view->clientSideConfig = PiwikConfig::getInstance()->getClientSideOptions(); - $view->enableMeasurePiwikForSiteId = PiwikConfig::getInstance()->Debug['enable_measure_piwik_usage_in_idsite']; $view->isSuperUser = Access::getInstance()->hasSuperUserAccess(); $view->hasSomeAdminAccess = Piwik::isUserHasSomeAdminAccess(); $view->hasSomeViewAccess = Piwik::isUserHasSomeViewAccess(); diff --git a/core/ReportRenderer/Pdf.php b/core/ReportRenderer/Pdf.php index 0c4fb2f6a33e625dfc6ebc6c01979042527d36bb..59fb862650ff32f6bd4dc48aec76322d04ffb3ff 100644 --- a/core/ReportRenderer/Pdf.php +++ b/core/ReportRenderer/Pdf.php @@ -10,6 +10,7 @@ namespace Piwik\ReportRenderer; use Piwik\Common; use Piwik\Filesystem; +use Piwik\NumberFormatter; use Piwik\Piwik; use Piwik\Plugins\API\API; use Piwik\ReportRenderer; @@ -405,7 +406,7 @@ class Pdf extends ReportRenderer if (empty($rowMetrics[$columnId])) { $rowMetrics[$columnId] = 0; } - $this->TCPDF->Cell($this->cellWidth, $this->cellHeight, $rowMetrics[$columnId], 'LR', 0, 'L', $fill); + $this->TCPDF->Cell($this->cellWidth, $this->cellHeight, NumberFormatter::getInstance()->format($rowMetrics[$columnId]), 'LR', 0, 'L', $fill); } } diff --git a/core/Singleton.php b/core/Singleton.php index cde63cb744916a4eb560c3d1b24ab4587614ff8c..46e3c531d7e6f93b6bd56471f08ce16dba64040f 100644 --- a/core/Singleton.php +++ b/core/Singleton.php @@ -32,7 +32,7 @@ class Singleton * Returns the singleton instance for the derived class. If the singleton instance * has not been created, this method will create it. * - * @return Singleton + * @return static */ public static function getInstance() { diff --git a/core/Tracker/TableLogAction/Cache.php b/core/Tracker/TableLogAction/Cache.php index 598fae96400f116e1299046086ea6f74e675930a..ba078c570d6b43d8efba17b4599441607f6cc607 100644 --- a/core/Tracker/TableLogAction/Cache.php +++ b/core/Tracker/TableLogAction/Cache.php @@ -11,7 +11,6 @@ namespace Piwik\Tracker\TableLogAction; use Piwik\Common; use Piwik\Config; -use Piwik\Container\StaticContainer; use Psr\Log\LoggerInterface; class Cache @@ -32,19 +31,17 @@ class Cache private $logger; /** - * for tests - * - * @var int + * @var \Piwik\Cache\Lazy */ - static public $hits = 0; + private $cache; - public function __construct($logger = null, $config = null) + public function __construct(LoggerInterface $logger, Config $config, \Piwik\Cache\Lazy $cache) { - $config = $config ?: Config::getInstance(); $this->isEnabled = (bool)$config->General['enable_segments_subquery_cache']; $this->limitActionIds = $config->General['segments_subquery_cache_limit']; $this->lifetime = $config->General['segments_subquery_cache_ttl']; - $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface'); + $this->logger = $logger; + $this->cache = $cache; } /** @@ -96,24 +93,22 @@ class Cache */ private function getIdsFromCache($valueToMatch, $sql) { - $cache = $this->buildCache(); $cacheKey = $this->getCacheKey($valueToMatch, $sql); - if ($cache->contains($cacheKey) === true) { - self::$hits++; + if ($this->cache->contains($cacheKey) === true) { // TODO: hits $this->logger->debug("Segment subquery cache HIT (for '$valueToMatch' and SQL '$sql)"); - return $cache->fetch($cacheKey); + return $this->cache->fetch($cacheKey); } $ids = $this->fetchActionIdsFromDb($valueToMatch, $sql); if($this->isTooBigToCache($ids)) { $this->logger->debug("Segment subquery cache SKIPPED SAVE (too many IDs returned by subquery: %s ids)'", array(count($ids))); - $cache->save($cacheKey, $ids = null, $this->lifetime); + $this->cache->save($cacheKey, $ids = null, $this->lifetime); return null; } - $cache->save($cacheKey, $ids, $this->lifetime); + $this->cache->save($cacheKey, $ids, $this->lifetime); $this->logger->debug("Segment subquery cache SAVE (for '$valueToMatch' and SQL '$sql')'"); return $ids; @@ -154,14 +149,6 @@ class Cache return $ids; } - /** - * @return \Piwik\Cache\Lazy - */ - private function buildCache() - { - return \Piwik\Cache::getLazyCache(); - } - /** * @param $ids * @return bool diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php index fc11d0cc3f80c62ea858e88e2ae6b4ca8a88c667..84b702449e0b0083320e5b3bad74340ca8c4531f 100644 --- a/core/Tracker/Visit.php +++ b/core/Tracker/Visit.php @@ -69,12 +69,18 @@ class Visit implements VisitInterface */ private $visitorRecognizer; + /** + * @var ArchiveInvalidator + */ + private $invalidator; + public function __construct() { $this->requestProcessors = StaticContainer::get('tracker.request.processors'); $this->visitorRecognizer = StaticContainer::get('Piwik\Tracker\VisitorRecognizer'); $this->visitProperties = null; $this->userSettings = StaticContainer::get('Piwik\Tracker\Settings'); + $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); } /** @@ -566,8 +572,7 @@ class Visit implements VisitInterface $date = Date::factory((int)$time, $timezone); if (!$date->isToday()) { // we don't have to handle in case date is in future as it is not allowed by tracker - $invalidReport = new ArchiveInvalidator(); - $invalidReport->rememberToInvalidateArchivedReportsLater($idSite, $date); + $this->invalidator->rememberToInvalidateArchivedReportsLater($idSite, $date); } } diff --git a/core/Twig.php b/core/Twig.php index 09720eefddc4cb87076ece561e9232840730b0ca..c806dcf9bb516a9c30acc0b1d7db436e8ad0fe2d 100755 --- a/core/Twig.php +++ b/core/Twig.php @@ -12,6 +12,7 @@ use Exception; use Piwik\Container\StaticContainer; use Piwik\DataTable\Filter\SafeDecodeLabel; use Piwik\Metrics\Formatter; +use Piwik\Tracker\GoalManager; use Piwik\View\RenderTokenParser; use Piwik\Visualization\Sparkline; use Twig_Environment; @@ -84,8 +85,11 @@ class Twig $this->addFilter_truncate(); $this->addFilter_notification(); $this->addFilter_percentage(); + $this->addFilter_percent(); + $this->addFilter_percentEvolution(); $this->addFilter_prettyDate(); $this->addFilter_safeDecodeRaw(); + $this->addFilter_number(); $this->twig->addFilter(new Twig_SimpleFilter('implode', 'implode')); $this->twig->addFilter(new Twig_SimpleFilter('ucwords', 'ucwords')); $this->twig->addFilter(new Twig_SimpleFilter('lcfirst', 'lcfirst')); @@ -272,11 +276,39 @@ class Twig protected function addFilter_percentage() { $percentage = new Twig_SimpleFilter('percentage', function ($string, $totalValue, $precision = 1) { - return Piwik::getPercentageSafe($string, $totalValue, $precision) . '%'; + return NumberFormatter::getInstance()->formatPercent(Piwik::getPercentageSafe($string, $totalValue, $precision), $precision); }); $this->twig->addFilter($percentage); } + protected function addFilter_percent() + { + $percentage = new Twig_SimpleFilter('percent', function ($string, $precision = 1) { + return NumberFormatter::getInstance()->formatPercent($string, $precision); + }); + $this->twig->addFilter($percentage); + } + + protected function addFilter_percentEvolution() + { + $percentage = new Twig_SimpleFilter('percentEvolution', function ($string) { + return NumberFormatter::getInstance()->formatPercentEvolution($string); + }); + $this->twig->addFilter($percentage); + } + + protected function addFilter_number() + { + $formatter = new Twig_SimpleFilter('number', function ($string, $minFractionDigits = 0, $maxFractionDigits = 0) { + // if a leading/trailing percent sign is found, format as percent number + if ($string != trim($string, '%')) { + return NumberFormatter::getInstance()->formatPercent($string, $minFractionDigits, $maxFractionDigits); + } + return NumberFormatter::getInstance()->format($string, $minFractionDigits, $maxFractionDigits); + }); + $this->twig->addFilter($formatter); + } + protected function addFilter_truncate() { $truncateFilter = new Twig_SimpleFilter('truncate', function ($string, $size) { @@ -299,7 +331,8 @@ class Twig } $idSite = func_get_args(); $idSite = $idSite[1]; - return $formatter->getPrettyMoney($amount, $idSite); + $currencySymbol = Formatter::getCurrencySymbol($idSite); + return NumberFormatter::getInstance()->formatCurrency($amount, $currencySymbol, GoalManager::REVENUE_PRECISION); }); $this->twig->addFilter($moneyFilter); } diff --git a/core/Updates/2.15.0-b16.php b/core/Updates/2.15.0-b16.php new file mode 100644 index 0000000000000000000000000000000000000000..a37e621129ede6856d45c1d846eec8727fe3f70f --- /dev/null +++ b/core/Updates/2.15.0-b16.php @@ -0,0 +1,45 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ + +namespace Piwik\Updates; + +use Piwik\Plugin\Manager; +use Piwik\Updater; +use Piwik\Updates; + +class Updates_2_15_0_b16 extends Updates +{ + + public function doUpdate(Updater $updater) + { + $this->uninstallPlugin('LeftMenu'); + $this->uninstallPlugin('ZenMode'); + } + + private function uninstallPlugin($plugin) + { + $pluginManager = Manager::getInstance(); + + if ($pluginManager->isPluginInstalled($plugin)) { + if ($pluginManager->isPluginActivated($plugin)) { + $pluginManager->deactivatePlugin($plugin); + } + + $pluginManager->unloadPlugin($plugin); + $pluginManager->uninstallPlugin($plugin); + } else { + $this->makeSurePluginIsRemovedFromFilesystem($plugin); + } + } + + private function makeSurePluginIsRemovedFromFilesystem($plugin) + { + Manager::deletePluginFromFilesystem($plugin); + } +} diff --git a/core/Updates/2.15.0-b17.php b/core/Updates/2.15.0-b17.php new file mode 100644 index 0000000000000000000000000000000000000000..86e3decf20105fd67f76c166d9bfe1bab651979f --- /dev/null +++ b/core/Updates/2.15.0-b17.php @@ -0,0 +1,44 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ + +namespace Piwik\Updates; + +use Piwik\Config; +use Piwik\Updater; +use Piwik\Updates; + +/** + * Update for version 2.15.0-b17. + */ +class Updates_2_15_0_b17 extends Updates +{ + /** + * Perform the incremental version update. + * + * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()` + * method, you must call {@link Updater::executeMigrationQueries()} here. + * + * See {@link Updates} for an example. + * + * @param Updater $updater + */ + public function doUpdate(Updater $updater) + { + $this->removeDeprecatedDebugConfig('enable_measure_piwik_usage_in_idsite'); + } + + private function removeDeprecatedDebugConfig($name) + { + $config = Config::getInstance(); + $debug = $config->Debug; + unset($debug[$name]); + $config->Debug = $debug; + $config->forceSave(); + } +} diff --git a/core/Updates/2.15.0-b20.php b/core/Updates/2.15.0-b20.php new file mode 100644 index 0000000000000000000000000000000000000000..79b4703f1b201751d47f791305b7e4e620ca11e5 --- /dev/null +++ b/core/Updates/2.15.0-b20.php @@ -0,0 +1,42 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ + +namespace Piwik\Updates; + +use Piwik\Plugin; +use Piwik\Updater; +use Piwik\Updates; + +/** + * Update for version 2.15.0-b20. + */ +class Updates_2_15_0_b20 extends Updates +{ + + /** + * Perform the incremental version update. + * + * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()` + * method, you must call {@link Updater::executeMigrationQueries()} here. + * + * See {@link Updates} for an example. + * + * @param Updater $updater + */ + public function doUpdate(Updater $updater) + { + $this->makeSurePluginIsRemovedFromFilesystem('ZenMode'); + $this->makeSurePluginIsRemovedFromFilesystem('LeftMenu'); + } + + private function makeSurePluginIsRemovedFromFilesystem($plugin) + { + Plugin\Manager::deletePluginFromFilesystem($plugin); + } +} diff --git a/core/View/UIControl.php b/core/View/UIControl.php index 845d0f9d6ae72fb08c0fe82d9ce1d76d8511cc58..dc5bca1279857c897deb18c981dd1c18a9419e06 100644 --- a/core/View/UIControl.php +++ b/core/View/UIControl.php @@ -59,6 +59,13 @@ class UIControl extends \Piwik\View */ public $cssClass = ""; + /** + * HTML Attributes for the root element + * + * @var string + */ + public $htmlAttributes = array(); + /** * The inner view that renders the actual control content. * @@ -125,6 +132,7 @@ class UIControl extends \Piwik\View $this->templateVars['cssIdentifier'] = $this->cssIdentifier; $this->templateVars['cssClass'] = $this->cssClass; $this->templateVars['jsClass'] = $this->jsClass; + $this->templateVars['htmlAttributes'] = $this->htmlAttributes; $this->templateVars['jsNamespace'] = $this->jsNamespace; $this->templateVars['implOverride'] = $override; diff --git a/lang/ar.json b/lang/ar.json index f377dc92b49539163a95f3260e7d338a538d26ef..ad887566338065ba4786427fb099a81bb5f446d4 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "لوØØ© التØكم لكاÙØ© المواقع", "And": "Ùˆ", "API": "واجهة تØكم التطبيقات", - "ApplyDateRange": "تطبيق مدى التاريخ", "ArchivingInlineHelp": "للمواقع المتوسطة وعالية الزيارات، من المÙضل تعطيل إطلاق الأرشÙØ© من المتصÙØ. بدلاً من ذلك، ÙÙ†ØÙ† Ù†Ùضل ضبط Cron job لمعالجة Piwik كل ساعة.", "ArchivingTriggerDescription": "Ù…Ùضل ÙÙŠ Øالة مواقع Piwik الكبيرة أن تقوم %sبضبط وظيÙØ© %s لمعالجة التقارير آلياً.", "AuthenticationMethodSmtp": "أسلوب المصادقة لمزود SMTP", @@ -241,7 +240,6 @@ "Widgets": "الإضاÙات", "YearsDays": "%1$s سنة %2$s أيام", "Yes": "نعم", - "YouAreViewingDemoShortMessage": "أنت تشاهد Øالياً نسخة عرض من Piwik", "YouMustBeLoggedIn": "يجب عليك تسجيل الدخول للوصول إلى هذه الخاصية.", "YourChangesHaveBeenSaved": "تم ØÙظ التغييرات." }, diff --git a/lang/be.json b/lang/be.json index a23a909c7b8185a5d2219d7d1c92bc34e1fd633f..3db0b9931d2ae70b1ea11bfe1d5cd3c7e6ae22fa 100644 --- a/lang/be.json +++ b/lang/be.json @@ -7,7 +7,6 @@ "AfterEntry": "паÑÐ»Ñ ÑžÐ²Ð°Ñ…Ð¾Ð´Ð½Ñ‹ тут", "AllWebsitesDashboard": "Ð“Ð°Ð»Ð¾ÑžÐ½Ð°Ñ Ð¿Ð°Ð½Ñль ÑžÑÑ–Ñ… вÑб-Ñайтаў", "API": "API-функцыі", - "ApplyDateRange": "ПрымÑніце дыÑпазон дат", "ArchivingInlineHelp": "Ð”Ð»Ñ Ñайтаў з ÑÑÑ€Ñднім Ñ– выÑокім трафікам, Ñ€Ñкамендуецца адключыць функцыю Ð°Ñ€Ñ…Ñ–Ð²Ð°Ð²Ð°Ð½Ð½Ñ Piwik Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку з браўзÑра.", "ArchivingTriggerDescription": "Ð Ñкамендуецца Ð´Ð»Ñ Piwik на Ñайтах з выÑокім трафікам, патрÑбна %sÑžÑталÑваць заданне Ð´Ð»Ñ ÐºÑ€Ð¾Ð½Ñƒ%s Ð´Ð»Ñ Ð°ÑžÑ‚Ð°Ð¼Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ð¹ апрацоўкі Ñправаздач.", "AuthenticationMethodSmtp": "Метад праверкі ÑапраўднаÑці Ð´Ð»Ñ SMTP", @@ -261,7 +260,6 @@ "Widgets": "ВіджÑÑ‚Ñ‹", "YearsDays": "%1$s гадоў %2$s дзён", "Yes": "Так", - "YouAreViewingDemoShortMessage": "Ð’Ñ‹ праглÑдаеце дÑма верÑÑ–ÑŽ Piwik", "YouMustBeLoggedIn": "Каб атрымаць доÑтуп да гÑтай функцыÑнальнаÑці, Ð’Ñ‹ павінны аўтарызавацца.", "YourChangesHaveBeenSaved": "Вашы змены былі захаваныÑ." } diff --git a/lang/bg.json b/lang/bg.json index 854afef7f40bb09e702e643f5dcd08463a4b1353..30ad48d1cc53db9f00a2dff0ab1ef9c04965f769 100644 --- a/lang/bg.json +++ b/lang/bg.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Табло за вÑички Ñайтове", "And": "и", "API": "API", - "ApplyDateRange": "Прилагане на периода от време", "ArchivingInlineHelp": "За Ñайтовете ÑÑŠÑ Ñреден или виÑок трафик, препоръчваме да изключите Piwik архивиране Ñлед гледане от браузър. Съветваме ви в този Ñлучай да използвате cron job за Вашите доклади на вÑеки чаÑ.", "ArchivingTriggerDescription": "За по-големи Piwik инÑталации, Ñе препоръчва %scron job%s за автоматични доклади.", "AuthenticationMethodSmtp": "УдоÑтоверен метод за SMTP", @@ -388,7 +387,6 @@ "YearsDays": "%1$s години %2$s дни", "Yes": "Да", "YouAreCurrentlyUsing": "Вие използвате Piwik %s.", - "YouAreViewingDemoShortMessage": "Ð’ момента Вие разглеждате демо верÑÐ¸Ñ Ð½Ð° Piwik", "YouMustBeLoggedIn": "ТрÑбва да Ñте влÑзъл, за да имате доÑтъп до тази функционалноÑÑ‚.", "YourChangesHaveBeenSaved": "Промените бÑха запазени." }, diff --git a/lang/bs.json b/lang/bs.json index e4c3bed4a1832e52b59e01824002dad4859e6843..a37d3a5716dd05a8865d3bdd13b2da488c5284a7 100644 --- a/lang/bs.json +++ b/lang/bs.json @@ -9,7 +9,6 @@ "AllWebsitesDashboard": "Kontrolne ploÄe svih web stranica", "And": "i", "API": "API", - "ApplyDateRange": "Prihvati raspon datuma", "ArchivingInlineHelp": "Za web stranice koje imaju veću posjećenost preporuÄeno je iskljuÄiti Piwik arhiviranje pokretaÄa iz browsera. Umjesto toga, preporuÄujemo cron job koji se procesira svaki sat.", "ArchivingTriggerDescription": "PreporuÄeno za veće Piwik instalacije, moraÅ¡ %s postaviti cron job%s da procesiras reporte automatski.", "AuthenticationMethodSmtp": "Metoda provjere za SMTP", @@ -308,7 +307,6 @@ "YearsDays": "%1$s godine %2$s dani", "Yes": "Da", "YouAreCurrentlyUsing": "Trenutno koristite piwik %s.", - "YouAreViewingDemoShortMessage": "Trenutno pregledate demo veziju Piwik-a", "YouMustBeLoggedIn": "Moras biti ulogovan za ovu funkciju.", "YourChangesHaveBeenSaved": "VaÅ¡e promjene su saÄuvane." } diff --git a/lang/ca.json b/lang/ca.json index 27d2d5b9424b7655e4c17d533737a41042ae384d..12dd727763d22c7f5ef507c216e423fa9d59fe25 100644 --- a/lang/ca.json +++ b/lang/ca.json @@ -9,7 +9,6 @@ "All": "Tots", "AllWebsitesDashboard": "Tauler de tots els llocs web", "API": "API", - "ApplyDateRange": "Aplicar un rang de dates", "ArchivingInlineHelp": "Per llocs amb transit entre mig i alt, es recomana desactivar l'arxivat del Piwik des del navegador. En canvi, recomanem que configureu una tasca de cron per processar els informes de Piwik cada hora.", "ArchivingTriggerDescription": "Recomanat per instal·lacions grans de Piwik, es pot %sconfigurar una %stasca programada per processar les entrades automà ticament.", "AuthenticationMethodSmtp": "Mètode d'autenticació SMTP", @@ -347,7 +346,6 @@ "YearsDays": "%1$s anys %2$s dies", "Yes": "SÃ", "YouAreCurrentlyUsing": "Ara mateix està s fent servir el Piwik %s.", - "YouAreViewingDemoShortMessage": "Ara mateix està s veient la demo del Piwik", "YouMustBeLoggedIn": "Has d'entrar per accedir a aquesta funcionalitat.", "YourChangesHaveBeenSaved": "Els vostres canvis s'han guardat" }, diff --git a/lang/cs.json b/lang/cs.json index 1f9650744389a386bbce029a6fe41ad1e561e3c3..9d274d13b0a4bf47e7477bd010ea71a27ce37f88 100644 --- a/lang/cs.json +++ b/lang/cs.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "NástÄ›nka pro vÅ¡echny weby", "And": "a", "API": "API", - "ApplyDateRange": "PoužÃt vybraný rozsah", "ArchivingInlineHelp": "Pro web stránky se stÅ™ednà nebo vysokou návÅ¡tÄ›vnostà je doporuÄeno zakázat archivovánà Piwiku z webového prohlÞeÄe. MÃsto toho doporuÄujeme vytvoÅ™enà úlohy pro cron", "ArchivingTriggerDescription": "DoporuÄeno pro vÄ›tÅ¡Ã instalace Piwiku, potÅ™ebujete %snastavit cron úlohu%s na automatické spracovánà hlášenÃ.", "AuthenticationMethodSmtp": "AutentizaÄnà metoda SMTP", @@ -402,7 +401,6 @@ "YearsDays": "%1$s roků %2$s dnÃ", "Yes": "Ano", "YouAreCurrentlyUsing": "PoužÃváte Piwik verze %s.", - "YouAreViewingDemoShortMessage": "PrávÄ› si prohlÞÃte demoverzi Piwiku", "YouMustBeLoggedIn": "Abyste mohli využÃvat tyto funkce musÃte být pÅ™ihlášeni", "YourChangesHaveBeenSaved": "VaÅ¡e zmÄ›ny byly uloženy" }, diff --git a/lang/da.json b/lang/da.json index d7c3f1029e8614d6d1ad260afcee2460a5e1fffc..49c70c5019bffe72b3a1e0dd16b72321013471b1 100644 --- a/lang/da.json +++ b/lang/da.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Kontrolpanel for alle hjemmesider", "And": "og", "API": "API", - "ApplyDateRange": "Anvend datointerval", "ArchivingInlineHelp": "For hjemmesider med medium til høj trafik anbefales det at deaktivere Piwik-arkivering udløst fra browseren. I stedet anbefales det at køre et cron job hver time til at behandle Piwik rapporter.", "ArchivingTriggerDescription": "Til større Piwik installationer anbefales det, at %soprette et cron job%s til at behandle rapporterne automatisk.", "AuthenticationMethodSmtp": "Godkenselsesmetode til SMTP", @@ -389,7 +388,6 @@ "YearsDays": "%1$s Ã¥r %2$s dage", "Yes": "Ja", "YouAreCurrentlyUsing": "Du bruger i øjeblikket Piwik %s.", - "YouAreViewingDemoShortMessage": "Du bruger en demo version af Piwik", "YouMustBeLoggedIn": "Du skal være logget pÃ¥ for at fÃ¥ adgang til denne funktion.", "YourChangesHaveBeenSaved": "Ændringer er gemt." }, diff --git a/lang/de.json b/lang/de.json index a4be0d4224ef87e94de246f69c9360a743c71cf8..25650ebf009fb9735de6d98c45ee3d3aa4e2e302 100644 --- a/lang/de.json +++ b/lang/de.json @@ -11,7 +11,7 @@ "AllWebsitesDashboard": "Dashboard aller Websites", "And": "und", "API": "API", - "ApplyDateRange": "Zeitraum anwenden", + "Apply": "Anwenden", "ArchivingInlineHelp": "Für Websites mit mittlerem bis hohem Verkehrsaufkommen wird empfohlen, die durch den Browser ausgelöste Archivierung zu deaktivieren. Stattdessen wird empfohlen, dass Sie einen Cronjob aufsetzen, der die Berichte einmal pro Stunde abarbeitet.", "ArchivingTriggerDescription": "Für größere Piwik-Installationen sollten Sie %seinen Cronjob erstellen%s, der die Berichte automatisch abarbeitet.", "AuthenticationMethodSmtp": "Authentifizierungsmethode für SMTP", diff --git a/lang/el.json b/lang/el.json index 23819d344f27a97da2dacb896fc9607d91073831..2fac12eb087a90bb2e829b1f47f873508b16eea7 100644 --- a/lang/el.json +++ b/lang/el.json @@ -11,7 +11,7 @@ "AllWebsitesDashboard": "ΚεντÏικός πίνακας όλων των ιστοσελίδων", "And": "και", "API": "API", - "ApplyDateRange": "ΕφαÏμογή ΧÏÎ¿Î½Î¹ÎºÎ¿Ï Î•ÏÏους", + "Apply": "ΕφαÏμογή", "ArchivingInlineHelp": "Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, Ï€Ïοτείνεται να απενεÏγοποιήσετε την αÏχειοθÎτηση από τον φυλλομετÏητή. Αντί για αυτό, σας Ï€Ïοτείνουμε να εγκαταστήσετε μια εÏγασία cron για να δημιουÏγείτε αναφοÏÎÏ‚ Piwik κάθε ÏŽÏα.", "ArchivingTriggerDescription": "Συνιστάται για μεγάλες εγκαταστάσεις του Piwik. ΧÏειάζεται να %sεγκαταστήσετε μια εÏγασία cron%s για να δημιουÏγείτε τις αναφοÏÎÏ‚ αυτόματα.", "AuthenticationMethodSmtp": "ÎœÎθοδος πιστοποίησης SMTP", @@ -402,7 +402,7 @@ "YearsDays": "%1$s Îτη %2$s ημÎÏες", "Yes": "Îαι", "YouAreCurrentlyUsing": "ΧÏησιμοποιείτε την Îκδοση %s του Piwik.", - "YouAreViewingDemoShortMessage": "ΤώÏα βλÎπετε τη δοκιμή του Piwik", + "YouAreViewingDemoShortMessage": "ΒλÎπετε μια Îκδοση του Piwik σε κατάστασης παÏουσίασης", "YouMustBeLoggedIn": "Î ÏÎπει να συνδεθείτε για να Îχετε Ï€Ïόσβαση στη λειτουÏγία", "YourChangesHaveBeenSaved": "Οι αλλαγÎÏ‚ σας αποθηκεÏτηκαν." }, diff --git a/lang/en.json b/lang/en.json index 5cdeef30a828c5b1441bf49197060475c386bd20..a3da13491cc75d491ea25ceb3bb228d9530a2cef 100644 --- a/lang/en.json +++ b/lang/en.json @@ -11,7 +11,7 @@ "AllWebsitesDashboard": "All Websites dashboard", "And": "and", "API": "API", - "ApplyDateRange": "Apply Date Range", + "Apply": "Apply", "ArchivingInlineHelp": "For medium to high traffic websites, it is recommended to disable Piwik archiving to trigger from the browser. Instead, we recommend that you setup a cron job to process Piwik reports every hour.", "ArchivingTriggerDescription": "Recommended for larger Piwik installs, you need to %ssetup a cron job%s to process the reports automatically.", "AuthenticationMethodSmtp": "Authentication method for SMTP", @@ -99,7 +99,7 @@ "DateRange": "Date range:", "DateRangeFrom": "From", "DateRangeFromTo": "From %s to %s", - "DateRangeInPeriodList": "Date range", + "DateRangeInPeriodList": "date range", "DateRangeTo": "To", "DaysHours": "%1$s days %2$s hours", "DaysSinceFirstVisit": "Days since first visit", @@ -403,7 +403,7 @@ "YearsDays": "%1$s years %2$s days", "Yes": "Yes", "YouAreCurrentlyUsing": "You are currently using Piwik %s.", - "YouAreViewingDemoShortMessage": "You are currently viewing the demo of Piwik", + "YouAreViewingDemoShortMessage": "You are viewing the demo of Piwik", "YouMustBeLoggedIn": "You must be logged in to access this functionality.", "YourChangesHaveBeenSaved": "Your changes have been saved." }, diff --git a/lang/es.json b/lang/es.json index bf2dcb8fac59bdc35ae4f8e49c6afe5f358d2571..273fae6abec641381411d568f4fe9e01df15b80b 100644 --- a/lang/es.json +++ b/lang/es.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Panel de todos los sitios de internet", "And": "y", "API": "API", - "ApplyDateRange": "Aplicar el rango de fecha", "ArchivingInlineHelp": "Para sitios de internet de medio o alto tráfico, se recomienda deshabilitar el archivado de Piwik al ingresar con el navegador. En su lugar, le recomendamos que configure una tarea cron para procesar los informes de Piwik cada hora.", "ArchivingTriggerDescription": "Recomendado para grandes instalaciones de Piwik, necesita %sconfigurar una tarea de cron %s para procesar los reportes automáticamente.", "AuthenticationMethodSmtp": "Método de autenticación SMTP", @@ -399,7 +398,6 @@ "YearsDays": "%1$s años %2$s dÃas", "Yes": "SÃ", "YouAreCurrentlyUsing": "Actualmente está utilizando Piwik %s.", - "YouAreViewingDemoShortMessage": "Actualmente está viendo la demo de Piwik", "YouMustBeLoggedIn": "Debe ingresar para acceder a esta funcionalidad.", "YourChangesHaveBeenSaved": "Se han guardado los cambios." }, diff --git a/lang/et.json b/lang/et.json index ba75a0591078461bb22089845b869431e149ac40..85ee35982564a52ca94199ab7f37da2b877e9ab2 100644 --- a/lang/et.json +++ b/lang/et.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Kõigi veebilehtede töölaud", "And": "ja", "API": "API", - "ApplyDateRange": "Rakenda kuupäeva vahemik", "AuthenticationMethodSmtp": "SMTP serveri autentimismeetod", "AverageOrderValue": "Keskmine tellimuse väärtus", "AveragePrice": "Keskmine hind", @@ -299,7 +298,6 @@ "YearsDays": "%1$s aastat %2$s päeva", "Yes": "Jah", "YouAreCurrentlyUsing": "Kasutad hetkel Piwik versiooni %s.", - "YouAreViewingDemoShortMessage": "Hetkel asud Piwiku demo keskkonnas", "YouMustBeLoggedIn": "Antud funktsionaalsusele ligipääsuks pead olema sisselogitud.", "YourChangesHaveBeenSaved": "Sinu muudatused on salvestatud." }, diff --git a/lang/eu.json b/lang/eu.json index 462bc4c60c01a954c6ffc05c0d46e487ab59860c..9991094d534b39d70959afbbeda69e3e318ca354 100644 --- a/lang/eu.json +++ b/lang/eu.json @@ -143,7 +143,6 @@ "Widgets": "Widget-ak", "YearsDays": "%1$s urte %2$s egun", "Yes": "Bai", - "YouAreViewingDemoShortMessage": "Piwiken demoa ikusten ari zara", "YouMustBeLoggedIn": "Saioa hasi behar duzu funtzionaltasun hau erabiltzeko.", "YourChangesHaveBeenSaved": "Zure aldaketak gorde egin dira." } diff --git a/lang/fa.json b/lang/fa.json index 886614852c3811a083b961217ef0cbcf39ce520d..9fafc732358209732257e497d6bbfeab0feac04e 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "داشبورد همه وبسايت‌ها", "And": "Ùˆ", "API": "API", - "ApplyDateRange": "استÙاده از بازه زمانی", "ArchivingInlineHelp": "توصیه می‌شود برای وبسایت‌های با تراÙیک متوسط یا بالا گزینه آرشیو پیویک از مرورگر غیر Ùعال شود. بجای آن توصیه می‌کنیم تا یک cron job برای پردازش گزارش‌ها هر یک ساعت راه‌اندازی شود.", "ArchivingTriggerDescription": "شما به %sراه‌اندازی یک cron job%s برای پردازش خودکار گزارش‌ها نیاز دارید.", "AuthenticationMethodSmtp": "روش تایید هویت برای SMTP", @@ -355,7 +354,6 @@ "YearsDays": "%1$s سال ها %2$s روز ها", "Yes": "بلی", "YouAreCurrentlyUsing": "شما هم اکنون از پیوک %s استÙاده Ù…ÛŒ کنید.", - "YouAreViewingDemoShortMessage": "شما هم اکنون در Øال مشاهده نسخه نمایشی پیویک هستید", "YouMustBeLoggedIn": "برای دسترسی به این قابلیت شما باید وارد سیستم شوید.", "YourChangesHaveBeenSaved": "تغییرات شما دخیره شد." }, diff --git a/lang/fi.json b/lang/fi.json index cffa849a8aca899b32d3fdf11ee84bfac20bb810..4406cd2eff2c0685cca447393f513aa44c954105 100644 --- a/lang/fi.json +++ b/lang/fi.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Kaikkien verkkosivujen työpöytä", "And": "ja", "API": "API", - "ApplyDateRange": "Ota käyttöön", "ArchivingInlineHelp": "Keskikokoisilla ja vilkkailla sivulla on suositeltavaa kieltää arkistointi selaimesta. Parempi vaihtoehto on käyttää cron-työtä arkistointiin joka tunti.", "ArchivingTriggerDescription": "Suositeltavaa suuremmissa Piwik-asennuksissa. Sinun täytyy %sasentaa cron-työ%s, jotta raportit käsitellään oikein.", "AuthenticationMethodSmtp": "SMTP:n autentikointimenetelmä", @@ -390,7 +389,6 @@ "YearsDays": "%1$s vuotta %2$s päivää", "Yes": "Kyllä", "YouAreCurrentlyUsing": "Käytät Piwik %s:ää", - "YouAreViewingDemoShortMessage": "Katselet demoversiota Piwikistä", "YouMustBeLoggedIn": "Sinun täytyy kirjautua sisään ennen tämän toiminnallisuuden käyttämistä.", "YourChangesHaveBeenSaved": "Muutokset on tallennettu" }, diff --git a/lang/fr.json b/lang/fr.json index 625b1a4fb6ca4faff8776332cec67c08fae7bff1..c034a062c0c942f4d9f7736f02c8794b9387a4f8 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Tableau de bord de tous les sites", "And": "et", "API": "API", - "ApplyDateRange": "Appliquer la plage de dates", "ArchivingInlineHelp": "Pour les sites à trafic moyen et fort, il est recommandé de désactiver l'archivage de Piwik depuis le navigateur. Nous vous recommandons de mettre en place une tâche planifiée (cron job) qui génère les rapports toutes les heures.", "ArchivingTriggerDescription": "Recommandé pour les installations importantes de Piwik, vous devriez %s mettre en place une tâche planifiée (cron) %s pour générer les rapports automatiquement.", "AuthenticationMethodSmtp": "Méthode d'authentification pour le serveur SMTP", @@ -402,7 +401,6 @@ "YearsDays": "%1$s années %2$s jours", "Yes": "Oui", "YouAreCurrentlyUsing": "Vous utilisez actuellement Piwik %s", - "YouAreViewingDemoShortMessage": "Vous êtes en train de visionner la démonstration de Piwik", "YouMustBeLoggedIn": "Vous devez être connecté(e) pour accéder à cette fonctionnalité.", "YourChangesHaveBeenSaved": "Vos modifications ont été enregistrées." }, diff --git a/lang/gl.json b/lang/gl.json index 9769cdde26faa4d98f405bdbd0376a6ba21710e4..770ebfaf5d8e99756f8e016a29cc60e8db29bd2e 100644 --- a/lang/gl.json +++ b/lang/gl.json @@ -131,7 +131,6 @@ "Widgets": "Engadidos", "YearsDays": "%1$s anos %2$s dÃas", "Yes": "Si", - "YouAreViewingDemoShortMessage": "Vostede esta vendo a demo de Piwik", "YouMustBeLoggedIn": "Debes de rexistrate para acceder a esta función.", "YourChangesHaveBeenSaved": "Os cambios foron grabados" }, diff --git a/lang/he.json b/lang/he.json index 5373a84706de2a0bc849b38e940704f323ad56f2..2d39983728c22226e760ad59b1e2787986307b30 100644 --- a/lang/he.json +++ b/lang/he.json @@ -9,7 +9,6 @@ "AllWebsitesDashboard": "פ×× ×œ סקירה לכל ×”×תרי×", "And": "ו", "API": "API", - "ApplyDateRange": "×™×™×©×•× ×˜×•×•×— ת×ריכי×", "ArchivingInlineHelp": "עבור ××ª×¨×™× ×‘×¢×œ×™ תעבורה ×‘×™× ×•× ×™×ª×¢×“ גבוהה, מומלץ לבטל ×ת ×רכיון Piwik בעת צפייה דרך הדפדפן בדוחות. ×‘×ž×§×•× ×–×ת, מומלץ להגדיר עבודה ×›×¨×•× ×™×ª (cron job) שתעבד דוחות Piwik בכל שעה.", "ArchivingTriggerDescription": "מומלץ ×œ×”×ª×§× ×•×ª גדולות יותר של Piwik, צריך %sלהגדיר עבודה ×›×¨×•× ×™×ª%s שתעבד ×ת הדוחות ×וטומטית.", "AuthenticationMethodSmtp": "שיטת ×ימות עבור SMTP", @@ -216,7 +215,6 @@ "YearlyReports": "דוחות ×©× ×ª×™×™×", "YearsDays": "%1$s ×©× ×™× ×•-%2$s ימי×", "Yes": "כן", - "YouAreViewingDemoShortMessage": "×”× ×š צופה בגרסת ההדגמה של Piwik", "YouMustBeLoggedIn": "חובה להתחבר למערכת בכדי לבצע פעולה זו.", "YourChangesHaveBeenSaved": "×”×©×™× ×•×™×™× × ×©×ž×¨×•." }, diff --git a/lang/hi.json b/lang/hi.json index d7a468d5559260b22cc51839dfdf84eb6cbc6683..370c5a19778ceba8133a3bd9f3ddd516f6921572 100644 --- a/lang/hi.json +++ b/lang/hi.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "सà¤à¥€ वेबसाइटों के डैशबोरà¥à¤¡", "And": "और", "API": "à¤à¤ªà¥€à¤†à¤ˆ", - "ApplyDateRange": "तिथि सीमा लागू करें", "ArchivingInlineHelp": "मधà¥à¤¯à¤® से उचà¥à¤š यातायात वेबसाइटों के लिà¤,यह Piwik बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° से सकà¥à¤°à¤¿à¤¯ करने के लिठपà¥à¤°à¤¾à¤²à¥‡à¤–ण को निषà¥à¤•à¥à¤°à¤¿à¤¯ करने की सिफारिश की है.इसके बजाय, हम आपको Piwik रिपोरà¥à¤Ÿà¥‹à¤‚ के हर घंटे की पà¥à¤°à¤•à¥à¤°à¤¿à¤¯à¤¾ के लिठà¤à¤• कà¥à¤°à¥‰à¤¨ जॉब सेटअप करने की सलाह देते हैं.", "ArchivingTriggerDescription": "बड़ा Piwik सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ के लिठसिफारिश है, आपको सà¥à¤µà¤¤à¤ƒ रिपोरà¥à¤Ÿà¥‹à¤‚ को संसाधित करने के लिठ%s à¤à¤• कà¥à¤°à¥‰à¤¨ जॉब सेटअप %s की जरूरत है.", "AuthenticationMethodSmtp": "à¤à¤¸à¤à¤®à¤Ÿà¥€à¤ªà¥€ के लिठपà¥à¤°à¤®à¤¾à¤£à¥€à¤•à¤°à¤£ विधि", @@ -383,7 +382,6 @@ "YearsDays": "%1$s साल %2$s दिन", "Yes": "हां", "YouAreCurrentlyUsing": "आप वरà¥à¤¤à¤®à¤¾à¤¨ में Piwik %s का उपयोग कर रहे हैं.", - "YouAreViewingDemoShortMessage": "आप वरà¥à¤¤à¤®à¤¾à¤¨ में Piwik का डेमो देख रहे हैं", "YouMustBeLoggedIn": "आप इस कारà¥à¤¯à¤•à¥à¤·à¤®à¤¤à¤¾ का उपयोग करने में लॉग इन होना चाहिà¤.", "YourChangesHaveBeenSaved": "आपके परिवरà¥à¤¤à¤¨ को सहेजा गया है." }, diff --git a/lang/hr.json b/lang/hr.json index b4592701002cfaf6a23f6ff3ee72172c4b67361c..5f2a1441c53231ce46ec9e8de5b7ee97df2bdc67 100644 --- a/lang/hr.json +++ b/lang/hr.json @@ -9,7 +9,6 @@ "AllWebsitesDashboard": "UpravljaÄka ploÄa za sve stranice", "And": "i", "API": "API", - "ApplyDateRange": "Odredi vremenski raspon", "ArchivingInlineHelp": "PreporuÄljivo je iskljuÄiti pokretanje arhiviranja pri posjeti za stranice sa srednjom i visokom posjećenošću.Umjesto toga savjetujemo da postavite cron job koji će obraditi Piwik izvjeÅ¡taje svakih sat vremena.", "ArchivingTriggerDescription": "Za veće Piwik instalacije preporuÄamo %spostavljanje cron joba %s za automatsku obradu izvjeÅ¡taja.", "AuthenticationMethodSmtp": "NaÄin SMTP autorizacije", @@ -289,7 +288,6 @@ "Widgets": "Widgeti", "YearsDays": "%1$s godina\/e %2$s dan(a)", "Yes": "Da", - "YouAreViewingDemoShortMessage": "Trenutno gledate demonstraciju Piwika", "YouMustBeLoggedIn": "MoraÅ¡ biti prijavljen za pristup ovoj funkciji.", "YourChangesHaveBeenSaved": "Tvoje su izmjene spremljene" }, diff --git a/lang/hu.json b/lang/hu.json index d6ae8fec019a67bef85d89b961442f1e1c4d8f2a..3c4bb0f14840919da2fd7443f510d70b34fc63dd 100644 --- a/lang/hu.json +++ b/lang/hu.json @@ -6,7 +6,6 @@ "Actions": "Akciók", "AllWebsitesDashboard": "Weboldal-összesÃtÅ‘ vezérlÅ‘pult", "API": "API", - "ApplyDateRange": "IdÅ‘intervallum alkalmazása", "ArchivingInlineHelp": "Közepes és nagy forgalmú weboldalak esetén ajánlott letiltani a böngészÅ‘vel való megnyitás által elÅ‘idézett archiválást. Ehelyett ajánlott egy cron job beállÃtása, mely óránként feldolgozza a Piwik jelentéseket.", "ArchivingTriggerDescription": "Nagyobb, Piwik-et használó weboldalak esetén ajánlott. A jelentések automatikus feldolgozásához %segy cron job belállÃtása%s is szükséges.", "AuthenticationMethodSmtp": "SMTP autentikációs módszer", @@ -249,7 +248,6 @@ "Widgets": "Modulok", "YearsDays": "%1$s év %2$s nap", "Yes": "Igen", - "YouAreViewingDemoShortMessage": "Jelenleg a Piwik demóváltozatát láthatod.", "YouMustBeLoggedIn": "A funkció eléréséhez be kell lépnie.", "YourChangesHaveBeenSaved": "Változtatások elmentve." } diff --git a/lang/id.json b/lang/id.json index 3ed870575e48b8895668637b450ffaf8065b40cb..919fe0886c521eec4b327faeabfcfa18ee0ddea2 100644 --- a/lang/id.json +++ b/lang/id.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Panel Kendali semua Situs", "And": "dan", "API": "API", - "ApplyDateRange": "Terapkan Rentang Tanggal", "ArchivingInlineHelp": "Untuk kunjungan situs menengah hingga tinggi, disarankan untuk mematikan pengarsipan Piwik ketika laporan ditampilkan. Kami lebih menyarankan untuk mengatur tugas Cron untuk mengolah laporan pada tiap jam.", "ArchivingTriggerDescription": "Disarankan untuk instalasi Piwik besar untuk %smengatur tugas Cron%s untuk mengolah laporan otomatis.", "AuthenticationMethodSmtp": "Metode otentikasi untuk SMTP", @@ -350,7 +349,6 @@ "YearsDays": "%1$s tahun %2$s hari", "Yes": "Ya", "YouAreCurrentlyUsing": "Anda saat ini menggunakan Piwik %s.", - "YouAreViewingDemoShortMessage": "Anda sedanng melihat demostrasi Piwik", "YouMustBeLoggedIn": "Anda harus masuk untuk mengakses fungsi ini.", "YourChangesHaveBeenSaved": "Perubahan Anda telah tersimpan." }, diff --git a/lang/it.json b/lang/it.json index 8b856596d824f5b0d1154dfdf4e1ce321838452a..6ce8e2c37b45734185fa5d95f35f2fda11dc7adf 100644 --- a/lang/it.json +++ b/lang/it.json @@ -11,7 +11,7 @@ "AllWebsitesDashboard": "Le dashboard di tutti i siti", "And": "e", "API": "API", - "ApplyDateRange": "Applica intervallo di date", + "Apply": "Applica", "ArchivingInlineHelp": "Per i siti da medi a grandi, è raccomandabile disabilitare l'attivazione di Piwik dal browser. Raccomandiamo piuttosto di configurare un cron job per elaborare i report di Piwik ogni ora.", "ArchivingTriggerDescription": "Raccomandato per installazioni di Piwik grandi, devi %sconfigurare un cron job%s per elaborare i report automaticamente.", "AuthenticationMethodSmtp": "Metodo di autenticazione per SMTP", @@ -402,7 +402,7 @@ "YearsDays": "%1$s anni %2$s giorni", "Yes": "Sì", "YouAreCurrentlyUsing": "Stai utilizzando Piwik %s.", - "YouAreViewingDemoShortMessage": "Stai attualmente guardando la demo di Piwik", + "YouAreViewingDemoShortMessage": "Stai vedendo una demo di Piwik", "YouMustBeLoggedIn": "Devi essere loggato per accedere a questa funzionalità .", "YourChangesHaveBeenSaved": "Le impostazioni sono state salvate." }, diff --git a/lang/ja.json b/lang/ja.json index bc20fae91a129f3f1e3357607fac2b05f2228517..b56b20c2dbe6cc6e0412c093c99826d35bfca52f 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "全ウェブサイトã®ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰", "And": "ãã—ã¦", "API": "API", - "ApplyDateRange": "期間をé©ç”¨ã™ã‚‹", "ArchivingInlineHelp": "比較的トラフィックã®é«˜ã„ウェブサイトã§ã¯ã€ãƒ–ラウザã§ã®è¡¨ç¤ºã‚’トリガーã¨ã™ã‚‹ Piwik アーカイブ処ç†ã‚’無効ã«ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚ 代ã‚ã‚Šã«ã€1時間ã”ã¨ã« Piwik リãƒãƒ¼ãƒˆã‚’処ç†ã™ã‚‹ cron ジョブをセットアップã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚", "ArchivingTriggerDescription": "比較的トラフィックã®é«˜ã„ウェブサイトã«æŽ¨å¥¨ã—ã¾ã™ã€‚ 自動リãƒãƒ¼ãƒˆå‡¦ç†ã«ã¯ %scron ジョブã®ã‚»ãƒƒãƒˆã‚¢ãƒƒãƒ—%sãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚", "AuthenticationMethodSmtp": "SMTP ã®èªè¨¼æ–¹æ³•", @@ -391,7 +390,6 @@ "YearsDays": "%1$s å¹´ %2$s æ—¥", "Yes": "ã¯ã„", "YouAreCurrentlyUsing": "ç¾åœ¨Piwik %s を利用ã—ã¦ã„ã¾ã™", - "YouAreViewingDemoShortMessage": "ç¾åœ¨ã€Piwik ã®ãƒ‡ãƒ¢ã‚’表示ã—ã¦ã„ã¾ã™", "YouMustBeLoggedIn": "ã“ã®æ©Ÿèƒ½ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ãƒã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚", "YourChangesHaveBeenSaved": "変更ã¯ä¿å˜ã•ã‚Œã¾ã—ãŸã€‚" }, diff --git a/lang/ko.json b/lang/ko.json index bb855e29147872bc8ac873fb572e7aaaa44b22fa..0a945953060f6fca9460524374f632c3ec8cbeab 100644 --- a/lang/ko.json +++ b/lang/ko.json @@ -6,9 +6,11 @@ "Actions": "활ë™", "Add": "추가", "AfterEntry": "ì—¬ê¸°ì— ë“¤ì–´ê°„ 후", + "All": "모ë‘", + "AllowPiwikArchivingToTriggerBrowser": "ë³´ê³ ì„œê°€ 웹 브ë¼ìš°ì €ì— 표시ë ë•Œ ì•„ì¹´ì´ë¸Œ", "AllWebsitesDashboard": "ì „ì²´ 웹사ì´íŠ¸ì˜ 대시보드", + "And": "ê·¸ë¦¬ê³ ", "API": "API", - "ApplyDateRange": "기간 ì ìš©", "ArchivingInlineHelp": "비êµì íŠ¸ëž˜í”½ì´ ë†’ì€ ì›¹ì‚¬ì´íŠ¸ëŠ” 브ë¼ìš°ì € 트리거를 Piwikì— ë³´ê´€í•˜ëŠ” ê²ƒì„ ë¹„í™œì„±í™”í•˜ëŠ” ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤. ëŒ€ì‹ , 1 시간마다 Piwik ë³´ê³ ì„œë¥¼ 처리하는 cron ìž‘ì—…ì„ ì„¤ì •í•˜ëŠ” ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.", "ArchivingTriggerDescription": "비êµì íŠ¸ëž˜í”½ì´ ë†’ì€ ì›¹ì‚¬ì´íŠ¸ì— 권장합니다. ìžë™ ë³´ê³ ì„œ 처리는 %scron ìž‘ì—… ì„¤ì •%sì´ í•„ìš”í•©ë‹ˆë‹¤.", "AuthenticationMethodSmtp": "SMTP ì¸ì¦ 방법", @@ -97,6 +99,7 @@ "DaysSinceLastEcommerceOrder": "마지막 ì „ìžìƒê±°ëž˜ 주문ì¼", "DaysSinceLastVisit": "마지막 방문ì¼", "Default": "기본", + "DefaultAppended": "(기본)", "Delete": "ì‚ì œ", "Description": "설명", "Desktop": "ë°ìŠ¤í¬í†±", @@ -105,6 +108,7 @@ "DisplaySimpleTable": "간단한 í…Œì´ë¸” 표시", "DisplayTableWithGoalMetrics": "목표 지표를 í¬í•¨í•˜ëŠ” í…Œì´ë¸” 표시", "DisplayTableWithMoreMetrics": "ëª¨ë“ í†µê³„ë¥¼ í¬í•¨í•˜ëŠ” í…Œì´ë¸” 표시", + "Documentation": "문서", "Donate": "기부", "Done": "완료", "Download": "다운로드", @@ -146,6 +150,8 @@ "ExceptionUnableToStartSession": "ì„¸ì…˜ì„ ì‹œìž‘í• ìˆ˜ 없습니다.", "ExceptionUndeletableFile": "%s를 ì œê±°í• ìˆ˜ 없습니다", "ExceptionUnreadableFileDisabledMethod": "ì„¤ì • íŒŒì¼ {%s}를 ë¡œë“œí• ìˆ˜ 없습니다. 서버 %sê°€ 비활성화ë˜ì—ˆì„ 수 있습니다.", + "ExceptionReportNotFound": "ìš”ì²ëœ ë³´ê³ ì„œê°€ 존재하지 않습니다.", + "ExceptionWidgetNotFound": "ìš”ì²ëœ ìœ„ì ¯ì´ ì¡´ìž¬í•˜ì§€ 않습니다.", "Export": "내보내기", "ExportAsImage": "ì´ë¯¸ì§€ë¡œ 내보내기", "ExportThisReport": "다른 형ì‹ìœ¼ë¡œ ë°ì´í„°ì…‹ 내보내기", @@ -153,6 +159,7 @@ "FileIntegrityWarningExplanation": "파ì¼ì˜ 무결성 검사가 ì‹¤íŒ¨í•˜ê³ ëª‡ 가지 오류가 ë³´ê³ ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ê²ƒì€ ëŒ€ë¶€ë¶„ì˜ ê²½ìš°, 파ì¼ì´ ë¶ˆì™„ì „í•˜ê±°ë‚˜ ì¼ë¶€ Piwik 파ì¼ì„ ì—…ë¡œë“œì— ì‹¤íŒ¨í–ˆì„ ë•Œ 입니다. ëª¨ë“ Piwik 파ì¼ì„ ë°”ì´ë„ˆë¦¬ 모드로 다시 업로드하여 오류가 나타나지 ì•Šì„ ë•Œê¹Œì§€ 페ì´ì§€ë¥¼ 새로 ê³ ì¹¨í• í•„ìš”ê°€ 있습니다.", "First": "처ìŒ", "ForExampleShort": "예:", + "Forums": "í¬ëŸ¼", "FromReferrer": "소스", "GeneralInformation": "ì¼ë°˜ ì •ë³´", "GetStarted": "시작하기", @@ -170,6 +177,7 @@ "Installed": "설치ë¨", "InvalidDateRange": "기간 ì§€ì •ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤. 다시 ì„¤ì •í•˜ì„¸ìš”.", "InvalidResponse": "ìˆ˜ì‹ í•œ ë°ì´í„°ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤.", + "IP": "IP", "JsTrackingTag": "ìžë°”스í¬ë¦½íŠ¸ 트래킹 태그", "Language": "언어", "LastDays": "마지막 %sì¼ê°„ (오늘 í¬í•¨)", @@ -208,11 +216,12 @@ "NotDefined": "%s ì—†ìŒ", "Note": "주ì˜", "NotInstalled": "설치ë˜ì§€ ì•ŠìŒ", + "NotRecommended": "비추천", "NotValid": "%s ì‚¬ìš©í• ìˆ˜ ì—†ìŒ", "NumberOfVisits": "방문수", "NVisits": "%s회 방문", "Ok": "확ì¸", - "OneVisit": "1회 방분", + "OneVisit": "1회 방문", "OnlyEnterIfRequired": "SMTP 서버가 ì‚¬ìš©ìž ì´ë¦„ì„ í•„ìš”ë¡œí•˜ëŠ” 경우ì—만 ìž…ë ¥í•©ë‹ˆë‹¤.", "OnlyEnterIfRequiredPassword": "SMTP 서버가 암호를 필요로하는 경우ì—만 ìž…ë ¥í•©ë‹ˆë‹¤.", "OnlyUsedIfUserPwdIsSet": "ì‚¬ìš©ìž ì´ë¦„\/암호가 ì„¤ì •ë˜ì–´ìžˆëŠ” 경우ì—만 사용ë©ë‹ˆë‹¤. ì–´ë–¤ ë°©ë²•ì„ ì‚¬ìš©í•´ì•¼í•˜ëŠ”ì§€ 잘 모르는 경우, 공급ìžì—게 문ì˜í•˜ì„¸ìš”.", @@ -246,6 +255,7 @@ "PurchasedProducts": "구입한 ì œí’ˆ", "Quantity": "수량", "RangeReports": "기간 ì§€ì •", + "Recommended": "권장", "RecordsToPlot": "êµ¬ë¶„ëœ ë ˆì½”ë“œ", "Refresh": "ìƒˆë¡œê³ ì¹¨", "RefreshPage": "페ì´ì§€ ìƒˆë¡œê³ ì¹¨", @@ -255,6 +265,7 @@ "Report": "ë³´ê³ ì„œ", "ReportGeneratedFrom": "ì´ ë³´ê³ ì„œëŠ” %sì˜ ë°ì´í„°ë¥¼ 사용하여 ìƒì„±ë˜ì—ˆìŠµë‹ˆë‹¤.", "Reports": "ë³´ê³ ì„œ", + "ReportsContainingTodayWillBeProcessedAtMostEvery": "ë³´ê³ ì„œ ì•„ì¹´ì´ë¸Œë¥¼ 몇 ì´ˆì— í•œ 번씩 수행", "ReportsWillBeProcessedAtMostEveryHour": "ë”°ë¼ì„œ, ë³´ê³ ì„œëŠ” 1시간마다 처리ë©ë‹ˆë‹¤.", "RequestTimedOut": "%sì— ë°ì´í„° ìš”ì²ì´ 초과ë˜ì—ˆìŠµë‹ˆë‹¤. 다시 ì‹œë„하세요.", "Required": "%s 필요함", @@ -324,12 +335,13 @@ "YearsDays": "%1$së…„ %2$sì¼", "Yes": "예", "YouAreCurrentlyUsing": "현재 Piwik %s를 ì´ìš©í•˜ê³ 있습니다.", - "YouAreViewingDemoShortMessage": "현재 Piwik ë°ëª¨ë¥¼ 표시", "YouMustBeLoggedIn": "ì´ ê¸°ëŠ¥ì— ì ‘ê·¼í•˜ë ¤ë©´ 로그ì¸í•´ì•¼í•©ë‹ˆë‹¤.", "YourChangesHaveBeenSaved": "변경 사í•ì´ ì €ìž¥ë˜ì—ˆìŠµë‹ˆë‹¤." }, "Mobile": { + "AboutPiwikMobile": "About Piwik 모바ì¼", "AccessUrlLabel": "Piwik ì ‘ê·¼ URL", + "Account": "ê³„ì •", "Accounts": "ê³„ì •", "AddAccount": "ê³„ì • 추가", "AddPiwikDemo": "Piwik ë°ëª¨ 추가", @@ -340,6 +352,7 @@ "ChooseHttpTimeout": "HTTP 시간 초과 ê°’ ì„ íƒ", "ChooseMetric": "ì¸¡ì • í•ëª© ì„ íƒ", "ChooseReport": "ë³´ê³ ì„œ ì„ íƒ", + "ConfirmRemoveAccount": "현재 ê³„ì •ì„ ì‚ì œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "DefaultReportDate": "ë³´ê³ ì„œ ë‚ ì§œ", "EnableGraphsLabel": "그래프 표시", "EvolutionGraph": "ì´ë ¥ 그래프", @@ -352,12 +365,19 @@ "LoginUseHttps": "HTTPS 사용", "MultiChartLabel": "스파í¬ë¼ì¸ 표시", "NavigationBack": "뒤로", + "NetworkError": "ë„¤íŠ¸ì›Œí¬ ì—러", "NetworkErrorWithStatusCode": "\"%s\" 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 요ì²ì—ì„œ \"%s\" ìƒíƒœê°€ 반환ë˜ì—ˆìŠµë‹ˆë‹¤. URLì€ \"%s\" 입니다. ìž…ë ¥í•œ URLì„ í™•ì¸í•´ ë³´ê³ ì„œë²„ì˜ ì˜¤ë¥˜ 로그ì—ì„œ ë” ìžì„¸í•œ ë‚´ìš©ì„ ë¶„ì„하여 ì´ ë¬¸ì œë¥¼ 해결하세요.", "NetworkNotReachable": "네트워í¬ì— ì—°ê²°í• ìˆ˜ ì—†ìŒ", + "NoDataShort": "ë°ì´í„° ì—†ìŒ", "NoPiwikAccount": "Piwik ê³„ì •ì´ ì—†ë‚˜ìš”?", + "NoReportsShort": "ë³´ê³ ì„œ ì—†ìŒ", "NoVisitorFound": "방문ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ", + "NoVisitorsShort": "ë°©ë¬¸ìž ì—†ìŒ", "NoWebsiteFound": "웹사ì´íŠ¸ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ", + "NoWebsitesShort": "웹사ì´íŠ¸ ì—†ìŒ", "PullDownToRefresh": "아래로 ëŒì–´ 새로 ê³ ì¹¨...", + "PossibleSslError": "SSL ì¸ì¦ ì—ëŸ¬ì¼ í™•ë¥ ì´ ë†’ìŠµë‹ˆë‹¤.", + "IgnoreSslError": "SSL ì—러 무시", "RatingDontRemindMe": "ë”ì´ìƒ ë³´ì´ì§€ ì•ŠìŒ", "RatingNotNow": "지금 안함", "RatingNow": "좋아요, 지금 í‰ê°€í•˜ê² 습니다", @@ -369,6 +389,7 @@ "ShowAll": "ëª¨ë‘ ë³´ê¸°", "ShowLess": "작게 보기", "StaticGraph": "그래프 개요", + "TryIt": "ì‹œë„í•´ 보세요!", "UseSearchBarHint": "첫 번째 %sì˜ ì›¹ì‚¬ì´íŠ¸ê°€ ì—¬ê¸°ì— í‘œì‹œë©ë‹ˆë‹¤. 다른 웹사ì´íŠ¸ì— 액세스 í• ìˆ˜ìžˆëŠ” 검색막대를 사용하세요.", "VerifyAccount": "ê³„ì • 확ì¸", "VerifyLoginData": "ì‚¬ìš©ìž ì´ë¦„ê³¼ 비밀번호 ì¡°í•©ì´ ì˜¬ë°”ë¥¸ì§€ 확ì¸í•˜ì„¸ìš”.", diff --git a/lang/lt.json b/lang/lt.json index 53eca652a9a08a28240cccdb94618cee149de4af..e25dd58181fb2ecc15d727e77091fa3d7b52e77f 100644 --- a/lang/lt.json +++ b/lang/lt.json @@ -8,7 +8,6 @@ "AllWebsitesDashboard": "Visų svetainių skydelis", "And": "ir", "API": "API sÄ…saja", - "ApplyDateRange": "Patvirtinti datos intervalÄ…", "ArchivingInlineHelp": "Vidutinio ir didelio srauto svetainÄ—ms rekomenduojama iÅ¡jungti Piwik archyvavimo trigerį. Vietoj to, rekomenduojame nustatyti cron job Piwik ataskaitų generavimui kas valandÄ….", "ArchivingTriggerDescription": "Rekomenduojama didesniems Piwik diegimams. Jums reikia %snustatyti cron job%s automatiniam ataskaitų generavimui.", "AuthenticationMethodSmtp": "SMTP autentifikacijos metodas", @@ -244,7 +243,6 @@ "YearsDays": "%1$s metai %2$s dienos", "Yes": "Taip", "YouAreCurrentlyUsing": "Å iuo metu jÅ«s naudojate Piwik %s.", - "YouAreViewingDemoShortMessage": "Å iuo metu JÅ«s stebite Piwik demonstracijÄ…", "YouMustBeLoggedIn": "Pirmiausia turite prisijungti.", "YourChangesHaveBeenSaved": "JÅ«sų atlikti pakeitimai iÅ¡saugoti." }, diff --git a/lang/lv.json b/lang/lv.json index b011a0d47aee086016b3096d56af39f3f789f058..543966acb8d18f4bcd7badab836824166963d2fa 100644 --- a/lang/lv.json +++ b/lang/lv.json @@ -7,7 +7,6 @@ "AfterEntry": "pÄ“c nonÄkÅ¡anas Å¡eit", "AllWebsitesDashboard": "Visu vietņu panelis", "API": "API", - "ApplyDateRange": "ApstiprinÄt datumu diapozonu", "ArchivingInlineHelp": "VidÄ“ja un augsta apmeklÄ“juma vietnÄ“m rekomendÄ“jam atslÄ“gt pÄrlÅ«ka izsauktu Piwik arhivÄ“Å¡anu. TÄ vietÄ iesakam lietot cron darbu, kas arhivÄ“ Piwik katru stundu.", "ArchivingTriggerDescription": "ApjomÄ«gÄm Piwik instalÄcijÄm iesakam %siestatÄ«t cron darbu%s, kas apstrÄdÄs atskaites automÄtiski.", "AuthenticationMethodSmtp": "SMTP autentifikÄcijas metode", @@ -245,7 +244,6 @@ "Widgets": "Logdaļas", "YearsDays": "%1$s gadi, %2$s dienas", "Yes": "JÄ", - "YouAreViewingDemoShortMessage": "JÅ«s paÅ¡laik skatÄties Piwik demonstrÄciju", "YouMustBeLoggedIn": "Lai tiktu pie Å¡Ä«s funkcionalitÄtes, Jums jÄpiesakÄs.", "YourChangesHaveBeenSaved": "Izmaiņas saglabÄtas." }, diff --git a/lang/nb.json b/lang/nb.json index 7654c8fa2bb384f7bcc7b3f611fcb7da3e83efd4..b0af25380c60265df574ee006718027031555b3c 100644 --- a/lang/nb.json +++ b/lang/nb.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Oversiktspanel for alle nettsteder", "And": "og", "API": "API", - "ApplyDateRange": "Bruk datointervall", "ArchivingInlineHelp": "For nettsteder med medium til høy trafikk, er det anbefalt Ã¥ slÃ¥ av at nettleseren kan utløse Piwik-arkivering. I stedet anbefaler vi at du setter opp en cron-jobb som prosesserer Piwik-rapporter hver time.", "ArchivingTriggerDescription": "For større Piwik-installasjoner anbefales det at du setter opp en %scron-jobb%s for Ã¥ behandle rapporter automatisk.", "AuthenticationMethodSmtp": "Autentiseringsmetode for SMTP", @@ -369,7 +368,6 @@ "YearsDays": "%1$s Ã¥r %2$s dager", "Yes": "Ja", "YouAreCurrentlyUsing": "Du bruker for øyeblikket Piwik %s.", - "YouAreViewingDemoShortMessage": "Du ser for øyeblikket pÃ¥ Piwik-demoen", "YouMustBeLoggedIn": "Du mÃ¥ være innlogget for Ã¥ bruke denne funksjonaliteten.", "YourChangesHaveBeenSaved": "Din endringer er lagret." }, diff --git a/lang/nl.json b/lang/nl.json index fa1a05e93e638897e5212c5b4d3a7dd91c9fd691..774914af72512428b4360fee029162aff7fed5ee 100644 --- a/lang/nl.json +++ b/lang/nl.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Dashboard van alle websites", "And": "en", "API": "API", - "ApplyDateRange": "Voer datumbereik in", "ArchivingInlineHelp": "Voor middelgrote tot grote websites, is het aan te raden Piwik archivering voor de browser uit te schakelen. Als alternatief raden we aan om een cronjob te maken om piwik om het uur rapporten te laten genereren.", "ArchivingTriggerDescription": "Aangeraden voor grote Piwik installaties, gebruik een %scronjob%s om automatisch rapporten te genereren.", "AuthenticationMethodSmtp": "Authenticatie methode voor SMTP", @@ -401,7 +400,6 @@ "YearsDays": "%1$s jaren %2$s dagen", "Yes": "Ja", "YouAreCurrentlyUsing": "U gebruikt momenteel Piwik %s.", - "YouAreViewingDemoShortMessage": "U bekijkt momenteel de demo versie van Piwik.", "YouMustBeLoggedIn": "U moet ingelogd zijn om deze functionaliteit te gebruiken.", "YourChangesHaveBeenSaved": "De wijzigingen zijn opgeslagen." }, diff --git a/lang/nn.json b/lang/nn.json index e0ae721027d97f6a302a0b6d0ec9120304f7773c..79133a7493e404f745122e66d1db6b9acf67c580 100644 --- a/lang/nn.json +++ b/lang/nn.json @@ -7,7 +7,6 @@ "AfterEntry": "etter inngang her", "AllWebsitesDashboard": "Styringspanel for alle nettstadene", "API": "API", - "ApplyDateRange": "Set periode", "ArchivingInlineHelp": "For nettstader med middels til høg trafikk, er det tilrÃ¥dd Ã¥ slÃ¥ av arkivering via nettlesaren. Me oppmodar deg heller til Ã¥ setja opp ein cron-jobb for Ã¥ handsama rapportane til Piwik kvar time.", "ArchivingTriggerDescription": "For større installasjonar av Piwik er det tilrÃ¥dd at du %ssett opp ein cron-jobb%s for Ã¥ handsama rapportane automatisk.", "AuthenticationMethodSmtp": "Godkjenningsmetode for SMTP", @@ -270,7 +269,6 @@ "YearsDays": "%1$s Ã¥r %2$s dagar", "Yes": "Ja", "YouAreCurrentlyUsing": "Du bruker no Piwik %s.", - "YouAreViewingDemoShortMessage": "Dette er ein demo av Piwik", "YouMustBeLoggedIn": "Du mÃ¥ vera innlogga for Ã¥ bruka denne funksjonen.", "YourChangesHaveBeenSaved": "Endringane dine er lagra." } diff --git a/lang/pl.json b/lang/pl.json index 3ee937eb5cc86b6efac84b26167ee31be794fa3f..816397d73ebf69e483d4baa1b920a193b51ceba1 100644 --- a/lang/pl.json +++ b/lang/pl.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Tablica analiz wszystkich stron", "And": "i", "API": "API", - "ApplyDateRange": "Zastosuj dla tego zakresu dat", "ArchivingInlineHelp": "Dla serwisów o Å›rednim i wysokim natężeniu ruchu, zalecane jest wyÅ‚Ä…czenie archiwizacji danych Piwik podczas przeglÄ…dania raportów w przeglÄ…darce. Zamiast tego zaleca siÄ™ skonfigurowanie żądania cron, by przetwarzanie raportów Piwik nastÄ™powaÅ‚o co godzinÄ™.", "ArchivingTriggerDescription": "Zalecany dla wiÄ™kszych instalacji Piwik, musisz %sskonfigurować crona%s do przetwarzania raportów automatycznie.", "AuthenticationMethodSmtp": "Metoda uwierzytelnienie dla SMTP", @@ -364,7 +363,6 @@ "YearsDays": "%1$s lat %2$s dni", "Yes": "Tak", "YouAreCurrentlyUsing": "Aktualnie używasz Piwik %s.", - "YouAreViewingDemoShortMessage": "Aktualnie oglÄ…dasz wersjÄ™ demonstracyjnÄ… statystyk Piwik", "YouMustBeLoggedIn": "Musisz siÄ™ zalogować, by uzyskać dostÄ™p do funkcji zasobów.", "YourChangesHaveBeenSaved": "Twoje modyfikacje zostaÅ‚y zapisane pomyÅ›lnie." }, diff --git a/lang/pt-br.json b/lang/pt-br.json index ad5005b6da58105cf92cfca732cd4db1bb85f2ea..fd85406905d2d52dc2ec938b338bc1694979b421 100644 --- a/lang/pt-br.json +++ b/lang/pt-br.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Painel de Todos os sites", "And": "e", "API": "API", - "ApplyDateRange": "Aplicar para este perÃodo", "ArchivingInlineHelp": "Para sites com tráfego de médio a alto, é recomendado desabilitar a trigger que salva do navegador. Em vez disso, nós recomendamos que instale um cron job para processar os relatorios Piwik a cada hora.", "ArchivingTriggerDescription": "Recomendado para instalações maiores do Piwik, precisa de %s configurar um cron job%s para processar os relatórios automaticamente.", "AuthenticationMethodSmtp": "Método de autenticação para SMTP", @@ -402,7 +401,6 @@ "YearsDays": "%1$s anos %2$s dias", "Yes": "Sim", "YouAreCurrentlyUsing": "Você está usando atualmente Piwik %s.", - "YouAreViewingDemoShortMessage": "Você está vendo a demonstração do Piwik", "YouMustBeLoggedIn": "Tem de estar ligado para aceder a essa funcionalidade.", "YourChangesHaveBeenSaved": "Suas alterações foram salvas" }, diff --git a/lang/pt.json b/lang/pt.json index ba2a0b422cbce0c1016cc8905bbffa0556777406..3d3b07c7d92b406d0fb78ac1efb4d05ba30012cc 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Painel de Controlo de Todos os Websites", "And": "e", "API": "API", - "ApplyDateRange": "Aplicar Intervalo de Datas", "ArchivingInlineHelp": "Para websites de tráfego médio ou elevado, é recomendado desactivar o arquivar de Piwik de ser accionado quando os relatórios são vistos no navegador. Em vez disso, recomendamos que configure uma tarefa cron para processar os relatórios de Piwik cada hora.", "ArchivingTriggerDescription": "Recomendado para instalações Piwik maiores, tem que %sconfigurar uma tarefa cron%s para processar os relatórios automaticamente.", "AuthenticationMethodSmtp": "Método de autenticação SMTP", @@ -293,7 +292,6 @@ "YearlyReports": "Relatórios Anuais", "YearsDays": "%1$s anos %2$s dias", "Yes": "Sim", - "YouAreViewingDemoShortMessage": "Está actualmente a visualizar a demo de Piwik.", "YouMustBeLoggedIn": "Tem que estar ligado para aceder a esta funcionalidade.", "YourChangesHaveBeenSaved": "As suas alterações foram guardadas." }, diff --git a/lang/ro.json b/lang/ro.json index 45e76ee2ded71bf74799d76fc8dfc9c53a8de6a5..7d9ef6a296620ea331c6fb63e22516960211091d 100644 --- a/lang/ro.json +++ b/lang/ro.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Panoul de control pentru toate site-urile", "And": "ÅŸi", "API": "API", - "ApplyDateRange": "Aplica interval", "ArchivingInlineHelp": "Pentru site-uri cu trafic mediu sau mare, este recomandata dezactivarea arhivari Piwik din browser. Recomandat sa faceti setup la un cron job pentru a procesa rapoarte Piwik in fiecare ora", "ArchivingTriggerDescription": "Recomandat pentru instalari mari, trebuie sa %ssetup un cron job%s pentru procesarea automata a rapoartelor", "AuthenticationMethodSmtp": "Metoda autentificare pentru SMTP", @@ -372,7 +371,6 @@ "YearsDays": "%1$s ani %2$s zile", "Yes": "Da", "YouAreCurrentlyUsing": "FoloseÅŸti Piwik %s.", - "YouAreViewingDemoShortMessage": "Vizualizati o versiune demo a Piwik", "YouMustBeLoggedIn": "Trebuie sa fiti logat pentru a accesa aceasta functionalitate.", "YourChangesHaveBeenSaved": "Schimbarile au fost salvate" }, diff --git a/lang/ru.json b/lang/ru.json index f163eb12b9974a1130f78471c2870b8a23f2809d..bbdd7f1e0ffb77c762a9e99ceb4db2e98b5eeea0 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "СтатиÑтика вÑех Ñайтов", "And": "и", "API": "API-функции", - "ApplyDateRange": "Применить период", "ArchivingInlineHelp": "Ð”Ð»Ñ Ñайтов Ñо Ñредней или выÑокой нагрузкой рекомендуетÑÑ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ архивирование данных при входе в веб-аналитику через браузер. ВмеÑто Ñтого лучше назначить cron-задачу, чтобы Piwik автоматичеÑки формировал отчеты каждый чаÑ.", "ArchivingTriggerDescription": "Ð”Ð»Ñ Ñайтов Ñ Ð²Ñ‹Ñокой нагрузкой наÑтоÑтельно рекомендуетÑÑ %sназначить cron-задачу%s, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ формировать отчеты автоматичеÑки.", "AuthenticationMethodSmtp": "Метод аутентификации SMTP", @@ -391,7 +390,6 @@ "YearsDays": "%1$s г. %2$s дн.", "Yes": "Да", "YouAreCurrentlyUsing": "Ð’Ñ‹ иÑпользуете верÑию Piwik %s.", - "YouAreViewingDemoShortMessage": "Ð’Ñ‹ ÑÐµÐ¹Ñ‡Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚Ðµ Ñ Ð´ÐµÐ¼Ð¾ ÑиÑтемы Piwik", "YouMustBeLoggedIn": "Ð’Ñ‹ должны зайти на Ñайт, чтобы получить доÑтуп к Ñтому функционалу.", "YourChangesHaveBeenSaved": "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñохранены." }, diff --git a/lang/sk.json b/lang/sk.json index 5c19064dd2e57a109bc4a08e09c5919ce4ab8550..5bac8b9edfc94a3da8b2c26630a0761826d14f2a 100644 --- a/lang/sk.json +++ b/lang/sk.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Nástenka pre vÅ¡etky weby", "And": "a", "API": "API", - "ApplyDateRange": "PoužiÅ¥ Äasový rozsah", "ArchivingInlineHelp": "Pre stredné až vysoké návÅ¡tevnosti webových stránok, sa odporúÄa vypnúť v Piwiku archiváciu spúšťanú prezeranÃm z prehliadaÄa. Namiesto toho odporúÄame nastaviÅ¥ cron úlohu na spracovanie Piwik reportov každú hodinu.", "ArchivingTriggerDescription": "OdporúÄa sa pre väÄÅ¡ie inÅ¡talácie Piwiku, musÃte %s nastaviÅ¥ cron %s aby spracovával reporty automaticky.", "AuthenticationMethodSmtp": "Metóda overovania pre SMTP", @@ -396,7 +395,6 @@ "YearsDays": "%1$s rokov %2$s dnÃ", "Yes": "Ãno", "YouAreCurrentlyUsing": "Aktuálne použÃvate Piwik %s.", - "YouAreViewingDemoShortMessage": "Momentálne vidÃte demo Piwiku", "YouMustBeLoggedIn": "MusÃte byÅ¥ prihlásený pre prÃstup k tejto functionnality.", "YourChangesHaveBeenSaved": "VaÅ¡e zmeny boli uložené." }, diff --git a/lang/sl.json b/lang/sl.json index a5fdea267d55dc8f55989f0ff712b50d3b11f818..1e61e1b738862055c66270e8a667dfe9c4c8a715 100644 --- a/lang/sl.json +++ b/lang/sl.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Vse nadzorne ploÅ¡Äe spletnih strani", "And": "in", "API": "API", - "ApplyDateRange": "Uveljavi Datumski Razpon", "ArchivingInlineHelp": "Za srednje velike in velike spletne strani izklopite arhiviranje preko spletnega brskalnika. Namesto tega vam priporoÄamo, da nastavite \"cron job\" tako, da bodo poroÄila ustvarjena vsako uro.", "ArchivingTriggerDescription": "PriporoÄamo za veÄje namestitve. %sNastavite \"cron job\"%s za avtomatsko procesiranje.", "AuthenticationMethodSmtp": "Metoda potrditve verodostojnosti za SMTP", @@ -389,7 +388,6 @@ "YearsDays": "%1$s let %2$s dni", "Yes": "Da", "YouAreCurrentlyUsing": "Trenutno uporabljate Piwik %s.", - "YouAreViewingDemoShortMessage": "Trenutno si ogledujete Piwik v demo naÄinu", "YouMustBeLoggedIn": "Za uporabo te funkcije morate biti vpisani.", "YourChangesHaveBeenSaved": "VaÅ¡e spremembe so bile shranjene." }, diff --git a/lang/sq.json b/lang/sq.json index 59f9828e40415c5e0fc9a94fc77cf413ebd3c2df..1d2d71825e6f75e0e838a001a89fe40596d1bd5c 100644 --- a/lang/sq.json +++ b/lang/sq.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Pult për krejt sajtet", "And": "dhe", "API": "API", - "ApplyDateRange": "Zbato Intervalin e Datave", "ArchivingInlineHelp": "Për sajte me trafik mesatar ose të shumtë këshillohet të çaktivizohet vënia në punë e arkivimit nga Piwik-u prej shfletuesit. Në vend të kësaj këshillojmë të rregulloni një akt cron që të përpunoni raporte Piwik-u çdo orë.", "ArchivingTriggerDescription": "E këshilluar për instalime më të ngarkuara të Piwik-ut, lypset të %s rregulloni një akt cron-i%s që të përpunohen raportet automatikisht.", "AuthenticationMethodSmtp": "Metodë mirëfilltësimi për SMTP", @@ -395,7 +394,6 @@ "YearsDays": "%1$s vite %2$s ditë", "Yes": "Po", "YouAreCurrentlyUsing": "Jeni duke përdorur Piwik %s.", - "YouAreViewingDemoShortMessage": "Hëpërhë jeni duke parë një demonstrim të Piwik-ut", "YouMustBeLoggedIn": "Që të përdorni këtë funksion, duhet të keni bërë hyrjen.", "YourChangesHaveBeenSaved": "Ndryshimet tuaja u ruajtën." }, diff --git a/lang/sr.json b/lang/sr.json index 15322e61223d1cf00d1dff7e7ac9ef6bf392ddd0..534b8e3a51aaf2e1a1835f2d790d1eba6146aeeb 100644 --- a/lang/sr.json +++ b/lang/sr.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Svi sajtovi", "And": "i", "API": "API", - "ApplyDateRange": "Primeni opseg datuma", "ArchivingInlineHelp": "Za srednje i velike sajtove preporuka je da iskljuÄite ovu opciju i da podesite cron koji će procesirati Piwik izveÅ¡taje svaki sat", "ArchivingTriggerDescription": "PreporuÄljivo za velike Piwik instalacije; potrebno je da %spodesite cron%s da procesira izveÅ¡taje automatski", "AuthenticationMethodSmtp": "NaÄin autentikacije za SMTP", @@ -401,7 +400,6 @@ "YearsDays": "%1$s godine %2$s dani", "Yes": "Da", "YouAreCurrentlyUsing": "Trenutno koristite Piwik %s.", - "YouAreViewingDemoShortMessage": "Trenutno koristite demo verziju programa Piwik", "YouMustBeLoggedIn": "Morate se prijaviti da biste pristupili ovim funkcijama", "YourChangesHaveBeenSaved": "VaÅ¡e izmene su saÄuvane" }, diff --git a/lang/sv.json b/lang/sv.json index 5137f3ec926f5e8ddcef76dc88350240f2281515..ad1909fb09b0c98abdf2d754430f06b1e412ba74 100644 --- a/lang/sv.json +++ b/lang/sv.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Alla webbplatsers instrumentpanel", "And": "och", "API": "API", - "ApplyDateRange": "Verkställ datumintervall", "ArchivingInlineHelp": "För webbplatser med medelhög till hög trafik rekommenderas det att du stänger av Piwik's funktion för arkivering att aktiveras frÃ¥n denna webbläsare.", "ArchivingTriggerDescription": "För större Piwik-installationer rekommenderas det att du %ssätta upp ett cron job%s för att behandla rapporterna automatiskt.", "AuthenticationMethodSmtp": "Autentiseringsmetod för SMTP", @@ -401,7 +400,6 @@ "YearsDays": "%1$s Ã¥r %2$s dagar", "Yes": "Ja", "YouAreCurrentlyUsing": "Du använder för närvarande Piwik %s.", - "YouAreViewingDemoShortMessage": "Du ser just nu en demo av Piwik", "YouMustBeLoggedIn": "Du mÃ¥ste vara inloggad för att komma Ã¥t denna funktion.", "YourChangesHaveBeenSaved": "Dina ändringar har sparats." }, diff --git a/lang/ta.json b/lang/ta.json index b2313f28bd6c7b86b626ebc1c53d665bcbc0aca4..6a81e67828c1cf6a7a8d4528be079ad7a1613aa1 100644 --- a/lang/ta.json +++ b/lang/ta.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "அனைதà¯à®¤à¯ இணையதள கடà¯à®Ÿà¯à®ªà¯à®ªà®¾à®Ÿà¯à®Ÿà¯ அறை", "And": "மறà¯à®±à¯à®®à¯", "API": "à®à®ªà®¿à®", - "ApplyDateRange": "தேதி வரையை விணà¯à®£à®ªà¯à®ªà®¿à®•à¯à®•", "AuthenticationMethodSmtp": "SMTP கà¯à®•à®¾à®© உறà¯à®¤à®¿à®ªà¯à®ªà®Ÿà¯à®¤à¯à®¤à¯à®®à¯ à®®à¯à®±à¯ˆ", "AverageOrderValue": "சராசரி à®’à®´à¯à®™à¯à®•à¯ மதிபà¯à®ªà¯", "AveragePrice": "சராசரி விலை", diff --git a/lang/th.json b/lang/th.json index d4c5d243f63c5e97e06a45b772862109aa0cf114..8ec90a69a9a93fd6d106ddcabb1b9c56256dca98 100644 --- a/lang/th.json +++ b/lang/th.json @@ -8,7 +8,6 @@ "AfterEntry": "หลังจาà¸à¸—ี่à¸à¸£à¸à¸à¸¥à¸‡à¸—ี่นี่", "AllWebsitesDashboard": "à¹à¸œà¸‡à¸„วบคุมเว็บไซต์ทั้งหมด", "API": "API", - "ApplyDateRange": "ช่วงวันที่สมัคร", "ArchivingInlineHelp": "เหมาะสำหรับเว็บไซต์ที่มีà¸à¸²à¸£à¸ˆà¸£à¸²à¸ˆà¸£à¸ªà¸¹à¸‡ เราà¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸›à¸´à¸”à¸à¸²à¸£à¹ƒà¸Šà¹‰à¸‡à¸²à¸™ Piwik ในà¸à¸²à¸£à¹€à¸£à¸µà¸¢à¸à¹€à¸à¹‡à¸šà¸ˆà¸²à¸à¹€à¸šà¸£à¸²à¸§à¹Œà¹€à¸‹à¸à¸£à¹Œ à¹à¸•à¹ˆà¹€à¸£à¸²à¸‚à¸à¹à¸™à¸°à¸™à¸³à¹ƒà¸«à¹‰à¸„ุณติดตั้ง Cron job ในà¸à¸²à¸£à¸›à¸£à¸°à¸¡à¸§à¸¥à¸œà¸¥à¹€à¸žà¸·à¹ˆà¸à¸£à¸²à¸¢à¸‡à¸²à¸™ Piwik ทุà¸à¸Šà¸±à¹ˆà¸§à¹‚มง", "ArchivingTriggerDescription": "à¹à¸™à¸°à¸™à¸³à¸ªà¸³à¸«à¸£à¸±à¸šà¸à¸²à¸£à¸•à¸´à¸”ตั้ง Piwik ขนาดใหà¸à¹ˆà¸—ี่คุณจะต้à¸à¸‡ %s ติดตั้ง Cron job%s เพื่à¸à¸”ำเนินà¸à¸²à¸£à¸£à¸²à¸¢à¸‡à¸²à¸™à¹‚ดยà¸à¸±à¸•à¹‚นมัติ", "AuthenticationMethodSmtp": "วิธีà¸à¸²à¸£à¸•à¸£à¸§à¸ˆà¸ªà¸à¸šà¸‚้à¸à¸¡à¸¹à¸¥à¸‚à¸à¸‡ SMTP", @@ -292,7 +291,6 @@ "YearsDays": "%1$s ปี %2$s วัน", "Yes": "ใช่", "YouAreCurrentlyUsing": "คุณà¸à¸³à¸¥à¸±à¸‡à¹ƒà¸Šà¹‰ Piwik %s", - "YouAreViewingDemoShortMessage": "คุณà¸à¸³à¸¥à¸±à¸‡à¸”ูà¸à¸²à¸£à¸ªà¸²à¸˜à¸´à¸•à¸‚à¸à¸‡ Piwik", "YouMustBeLoggedIn": "คุณจะต้à¸à¸‡à¹€à¸‚้าสู่ระบบเพื่à¸à¹€à¸ˆà¹‰à¸²à¸ˆà¸±à¸”à¸à¸²à¸£à¸Ÿà¸±à¸‡à¸à¹Œà¸Šà¸±à¹ˆà¸™à¸™à¸µà¹‰", "YourChangesHaveBeenSaved": "บันทึà¸à¸à¸²à¸£à¹€à¸›à¸¥à¸µà¹ˆà¸¢à¸™à¹à¸›à¸¥à¸‡à¸‚à¸à¸‡à¸„ุณà¹à¸¥à¹‰à¸§" }, diff --git a/lang/tl.json b/lang/tl.json index 93bea0fb85b4d19e16f459b76a2022c38a188230..8f9ec11b2234e9442708367a82791a440443352e 100644 --- a/lang/tl.json +++ b/lang/tl.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Lahat ng dashboard Websites", "And": "at", "API": "API", - "ApplyDateRange": "I-apply ang petsa", "ArchivingInlineHelp": "Para sa katam-tamang dami ng traffic websites inirerekomenda na huwag paganahin ang Piwik-archive upang ma-trigger mula sa browser. Sa halip aming nirerekomenda na mag setup ng cron job upang i-proseso ang mga ulat kada oras.", "ArchivingTriggerDescription": "Inirerekomenda para sa mas malakihang pag-install ng Piwik kailangan mong %ssetup ang cron job%s upang awtomatikong iproseso ang mga ulat.", "AuthenticationMethodSmtp": "Authentication method para sa SMTP", diff --git a/lang/tr.json b/lang/tr.json index 0800c83d578e4c0efc15a5df489f15105c1ff37c..9d980c802e6462f1e125abae836e9f8158319bbc 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -10,7 +10,6 @@ "AllWebsitesDashboard": "Tüm Websitelerin Panosu", "And": "ve", "API": "API", - "ApplyDateRange": "Tarih Aralığını Uygula", "AuthenticationMethodSmtp": "SMTP için kimlik doÄŸrulama yöntemi", "AverageOrderValue": "Ortalama SipariÅŸ DeÄŸeri", "AveragePrice": "Ortalama Fiyat", diff --git a/lang/uk.json b/lang/uk.json index e0c33ff1f3e340a3111f27d3153564389fd4b4e7..519aad1ad4dc598d679c9c9d3855331f1374c7fc 100644 --- a/lang/uk.json +++ b/lang/uk.json @@ -175,7 +175,6 @@ "Widgets": "Віджет", "YearsDays": "%1$s років %2$s днів", "Yes": "Так", - "YouAreViewingDemoShortMessage": "Зараз переглÑдаєтьÑÑ Ð´ÐµÐ¼Ð¾Ð½Ñтраційний варіант Piwik", "YouMustBeLoggedIn": "Треба увійти в ÑиÑтему щоб отримати доÑтуп до цих функцій.", "YourChangesHaveBeenSaved": "Зміни збережено." } diff --git a/lang/vi.json b/lang/vi.json index 404960e60c1bf43bb98e2b69e21b6464e894e988..7cfb9a0c74231e02e9154dc316d75317461a4848 100644 --- a/lang/vi.json +++ b/lang/vi.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "Bảng Ä‘iá»u khiển tất cả các Website", "And": "và ", "API": "API", - "ApplyDateRange": "Giá»›i hạn thá»i gian", "ArchivingInlineHelp": "Äối vá»›i những trang web có mức Ä‘á»™ truy cáºp trung bình và cao, chúng tôi khuyến cáo bạn bá» chế Ä‘á»™ cáºp nháºt lên Piwik dá»±a và o trigger phÃa trình duyệt. Thay và o đó, bạn nên thiết láºp lịch cho Piwik tá»± xá» lý báo cáo sau má»—i giỠđồng hồ (để tránh quá tải server).", "ArchivingTriggerDescription": "Äá» nghị cho cà i đặt Piwik lá»›n hÆ¡n, bạn cần phải %s thiết láºp má»™t cron %s để xá» lý các báo cáo tá»± Ä‘á»™ng.", "AuthenticationMethodSmtp": "PhÆ°Æ¡ng thức xác thá»±c SMTP", @@ -368,7 +367,6 @@ "YearsDays": "%1$s năm %2$s ngà y", "Yes": "Có", "YouAreCurrentlyUsing": "Bạn Ä‘ang sá» dụng Piwik %s.", - "YouAreViewingDemoShortMessage": "Bạn Ä‘ang xem phần giá»›i thiệu Piwik", "YouMustBeLoggedIn": "Bạn phải đăng nháºp để truy cáºp chức năng nà y.", "YourChangesHaveBeenSaved": "Các thay đổi của bạn đã được lÆ°u." }, diff --git a/lang/zh-cn.json b/lang/zh-cn.json index 6f53ff107ae977a388cf6a71ce0710966a606689..e9f526a20d1e0392a722fed89e60e0198ec8aa57 100644 --- a/lang/zh-cn.json +++ b/lang/zh-cn.json @@ -11,7 +11,6 @@ "AllWebsitesDashboard": "所有网站报表", "And": "å’Œ", "API": "API", - "ApplyDateRange": "应用时间段", "ArchivingInlineHelp": "对于ä¸é«˜æµé‡çš„网站,建议ç¦ç”¨Piwikæµè§ˆå™¨è§¦å‘处ç†ã€‚最好是设置定时任务(Cron job),æ¯å°æ—¶å¤„ç†ä¸€æ¬¡Piwik报表。", "ArchivingTriggerDescription": "适åˆå¤§åž‹çš„Piwik安装,需è¦%s设置定时任务(Cron job) %sæ¥è‡ªåŠ¨å¤„ç†æŠ¥è¡¨ã€‚", "AuthenticationMethodSmtp": "SMTP 验è¯æ–¹æ³•", @@ -365,7 +364,6 @@ "YearsDays": "%1$s å¹´ %2$s 天", "Yes": "是", "YouAreCurrentlyUsing": "您æ£åœ¨ä½¿ç”¨ Piwik %s.", - "YouAreViewingDemoShortMessage": "您æ£åœ¨æµè§ˆ Piwik 演示", "YouMustBeLoggedIn": "您必须登录æ‰èƒ½å˜å–这个功能。", "YourChangesHaveBeenSaved": "修改已ä¿å˜ã€‚" }, diff --git a/lang/zh-tw.json b/lang/zh-tw.json index 5bf8aab1bc51a4c91eaec8f1f7c6e68fd6bc0c4b..431b52109a2e4ff318cdf516afd3780652647857 100644 --- a/lang/zh-tw.json +++ b/lang/zh-tw.json @@ -6,7 +6,8 @@ "Add": "新增", "AfterEntry": "在這裡之後輸入", "All": "全部", - "AllWebsitesDashboard": "所有網站展示æ¿", + "AllWebsitesDashboard": "所有網站的控制å°", + "And": "å’Œ", "API": "API", "ArchivingInlineHelp": "å°æ–¼ä¸æˆ–高æµé‡çš„網站,建è°åœç”¨ Piwik 彙整觸發ç€è¦½å™¨ã€‚å之,我們建è°ä½ è¨å®šä¸€å€‹å·¥ä½œæŽ’程(Cron job),æ¯å°æ™‚è™•ç† Piwik å ±å‘Šã€‚", "ArchivingTriggerDescription": "推薦大型的 Piwik 安è£ï¼Œä½ 需è¦%sè¨å®šä¸€å€‹å·¥ä½œæŽ’程(Cron job)%s來自動處ç†å ±å‘Šã€‚", @@ -197,7 +198,6 @@ "Widgets": "組件", "YearsDays": "%1$s å¹´ %2$s 天", "Yes": "是", - "YouAreViewingDemoShortMessage": "ä½ æ£åœ¨ç€è¦½ Piwik 範例", "YouMustBeLoggedIn": "æ‚¨å¿…é ˆç™»å…¥æ‰èƒ½å˜å–這個功能ï¼", "YourChangesHaveBeenSaved": "您的變更已儲å˜ï¼" }, @@ -208,15 +208,26 @@ "Accounts": "帳號", "AddAccount": "新增帳號", "AddPiwikDemo": "å¢žåŠ Piwik 示範", + "Advanced": "進階", "AnonymousAccess": "匿åå˜å–", + "AnonymousTracking": "匿å追蹤", + "ChooseHttpTimeout": "é¸æ“‡HTTP多久之後超時", + "ChooseReport": "é¸æ“‡ä¸€å€‹å ±è¡¨", "EnableGraphsLabel": "顯示圖表", "MultiChartLabel": "顯示 sparklines", "NetworkNotReachable": "網路無法訪å•", + "NoVisitorsShort": "沒有任何訪å•è€…", + "NoWebsiteFound": "沒有網站", + "NoWebsitesShort": "沒有任何網站", "SaveSuccessError": "請確èªè¨å®š", "YouAreOffline": "抱æ‰ï¼Œæ‚¨ç›®å‰ç‚ºé›¢ç·šç‹€æ…‹" }, "RowEvolution": { "AvailableMetrics": "å¯ç”¨æŒ‡æ¨™", - "CompareRows": "比較紀錄" + "CompareRows": "比較紀錄", + "ComparingRecords": "æ£åœ¨æ¯”較 %s è¡Œ", + "MetricBetweenText": "從 %s 到 %s", + "MetricChangeText": "在這段時間改變了 %s", + "PickAnotherRow": "é¸æ“‡å…¶ä»–行來進行比較" } } \ No newline at end of file diff --git a/plugins/API/API.php b/plugins/API/API.php index 8245d0712eb345408f61a42e778081344c04f3bc..ae5e1b407ff75caa53fbaa7628b554ecd30a4af6 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -25,8 +25,6 @@ use Piwik\Metrics; use Piwik\Period; use Piwik\Period\Range; use Piwik\Piwik; -use Piwik\Plugin\Dimension\VisitDimension; -use Piwik\Plugin\Report; use Piwik\Plugins\API\DataTable\MergeDataTables; use Piwik\Plugins\CoreAdminHome\CustomLogo; use Piwik\Translation\Translator; diff --git a/plugins/API/WidgetMetadata.php b/plugins/API/WidgetMetadata.php index ef12800a39f982f5a12caee92a48b4d61d91ef6d..8f0fb0330f6fc4e514779fd34f95a0ebfa71b15d 100644 --- a/plugins/API/WidgetMetadata.php +++ b/plugins/API/WidgetMetadata.php @@ -154,6 +154,7 @@ class WidgetMetadata 'id' => (string) $category->getId(), 'name' => Piwik::translate($category->getId()), 'order' => $category->getOrder(), + 'icon' => $category->getIcon(), ); } diff --git a/plugins/API/lang/cs.json b/plugins/API/lang/cs.json index 2d03c857bde959fb1834d12d143a5eeeaa0d42fc..68c93a8e58da43985b4227393fb2e93c89dd33f5 100644 --- a/plugins/API/lang/cs.json +++ b/plugins/API/lang/cs.json @@ -8,6 +8,8 @@ "ReportingApiReference": "Reference API hlášenÃ", "TopLinkTooltip": "ZpÅ™ÃstupnÄ›te VaÅ¡e Webové analýzy programovÄ› skrze jednoduché API pomocà json, xml a dalÅ¡Ãch.", "UserAuthentication": "Autentifikace uživatele", - "UsingTokenAuth": "Pokud chcete %s naÄÃst data ze skriptu, cronu, atd. %s PotÅ™ebujete pÅ™idat parametr %s k volánÃm API, které vyžadujà pÅ™ihlášenÃ" + "UsingTokenAuth": "Pokud chcete %s naÄÃst data ze skriptu, cronu, atd. %s PotÅ™ebujete pÅ™idat parametr %s k volánÃm API, které vyžadujà pÅ™ihlášenÃ", + "Glossary": "Glosář", + "LearnAboutCommonlyUsedTerms": "ZjistÄ›te vÃc o nejÄastÄ›jÅ¡Ãch termÃnech, abyste mohli využÃt Piwik naplno %s a %s." } } \ No newline at end of file diff --git a/plugins/API/templates/listAllAPI.twig b/plugins/API/templates/listAllAPI.twig index 47a1327c36a0b85a9a985a28a6fcdc5063759f41..d3c551c997e36a058e69c35006c7bfd245a4725f 100644 --- a/plugins/API/templates/listAllAPI.twig +++ b/plugins/API/templates/listAllAPI.twig @@ -2,18 +2,17 @@ {% set title %}{{ 'API_ReportingApiReference'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div class="api-list"> <h2>{{ title }}</h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <p>{{ 'API_PluginDescription'|translate }}</p> <p> diff --git a/plugins/AnonymousPiwikUsageMeasurement b/plugins/AnonymousPiwikUsageMeasurement new file mode 160000 index 0000000000000000000000000000000000000000..b3db172b25b06a92658b9848184f1bd4fa97e9b9 --- /dev/null +++ b/plugins/AnonymousPiwikUsageMeasurement @@ -0,0 +1 @@ +Subproject commit b3db172b25b06a92658b9848184f1bd4fa97e9b9 diff --git a/plugins/Contents/Columns/Metrics/InteractionRate.php b/plugins/Contents/Columns/Metrics/InteractionRate.php index 64485fe0e67e0b254a0924cc808e3f9a70a1875c..513f0efe355a9ed59fd295088087357cdf2c2312 100644 --- a/plugins/Contents/Columns/Metrics/InteractionRate.php +++ b/plugins/Contents/Columns/Metrics/InteractionRate.php @@ -32,6 +32,11 @@ class InteractionRate extends ProcessedMetric return Piwik::translate('Contents_InteractionRate'); } + public function getDocumentation() + { + return Piwik::translate('Contents_InteractionRateMetricDocumentation'); + } + public function compute(Row $row) { $interactions = $this->getMetric($row, 'nb_interactions'); diff --git a/plugins/Contents/Contents.php b/plugins/Contents/Contents.php index 49df9a730bc5b1d30406051da6a758c933bcc9b5..df42522cb31e679a614282342cec3da16b00860d 100644 --- a/plugins/Contents/Contents.php +++ b/plugins/Contents/Contents.php @@ -8,6 +8,8 @@ */ namespace Piwik\Plugins\Contents; +use Piwik\Piwik; + class Contents extends \Piwik\Plugin { /** @@ -17,6 +19,7 @@ class Contents extends \Piwik\Plugin { return array( 'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations', + 'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations', 'AssetManager.getJavaScriptFiles' => 'getJsFiles', 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles' ); @@ -39,4 +42,9 @@ class Contents extends \Piwik\Plugin $stylesheets[] = "plugins/Contents/stylesheets/datatable.less"; } + public function addMetricDocumentationTranslations(&$translations) + { + $translations['nb_impressions'] = Piwik::translate('Contents_ImpressionsMetricDocumentation'); + $translations['nb_interactions'] = Piwik::translate('Contents_InteractionsMetricDocumentation'); + } } diff --git a/plugins/Contents/lang/en.json b/plugins/Contents/lang/en.json index e6a89ad64098d5233162ea4bf72fb6f29bd2bfa0..3873a7b2ac50dad05ee18beee9e88991e7de5b16 100644 --- a/plugins/Contents/lang/en.json +++ b/plugins/Contents/lang/en.json @@ -8,6 +8,9 @@ "ContentName":"Content Name", "ContentPiece":"Content Piece", "ContentTarget":"Content Target", - "Contents":"Contents" + "Contents":"Contents", + "InteractionsMetricDocumentation": "The number of times a content block was interacted with (eg, a 'click' on a banner or ad).", + "ImpressionsMetricDocumentation": "The number of times a content block, such as a banner or an ad, was displayed on a page.", + "InteractionRateMetricDocumentation": "The ratio of content impressions to interactions." } } \ No newline at end of file diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml index 8eed477e8b01b16705bfbfa28dbe133218b128c9..35ee103b17b11c9d3a4f569f1278a9fe82072bb4 100644 --- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml +++ b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml @@ -13,6 +13,11 @@ <nb_impressions>Impressions</nb_impressions> <nb_interactions>Interactions</nb_interactions> </metrics> + <metricsDocumentation> + <nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions> + <nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions> + <interaction_rate>The ratio of content impressions to interactions.</interaction_rate> + </metricsDocumentation> <processedMetrics> <interaction_rate>Interaction Rate</interaction_rate> </processedMetrics> diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml index f0115ea581060912112c3e4045a8758cdb63b288..d7e5a543f89df4a082d7e4f0a4571d352d038264 100644 --- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml +++ b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml @@ -13,6 +13,11 @@ <nb_impressions>Impressions</nb_impressions> <nb_interactions>Interactions</nb_interactions> </metrics> + <metricsDocumentation> + <nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions> + <nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions> + <interaction_rate>The ratio of content impressions to interactions.</interaction_rate> + </metricsDocumentation> <processedMetrics> <interaction_rate>Interaction Rate</interaction_rate> </processedMetrics> diff --git a/plugins/CoreAdminHome/API.php b/plugins/CoreAdminHome/API.php index 119d56d74f92b2a22da0349d7e68ad2b4e1c0039..18f5764a5a2c1441fa84fc1bc8ebf50aca53dfbb 100644 --- a/plugins/CoreAdminHome/API.php +++ b/plugins/CoreAdminHome/API.php @@ -17,9 +17,9 @@ use Piwik\CronArchive; use Piwik\Date; use Piwik\Db; use Piwik\Piwik; +use Piwik\Segment; use Piwik\Scheduler\Scheduler; use Piwik\Site; -use Psr\Log\LoggerInterface; /** * @method static \Piwik\Plugins\CoreAdminHome\API getInstance() @@ -31,9 +31,15 @@ class API extends \Piwik\Plugin\API */ private $scheduler; - public function __construct(Scheduler $scheduler) + /** + * @var ArchiveInvalidator + */ + private $invalidator; + + public function __construct(Scheduler $scheduler, ArchiveInvalidator $invalidator) { $this->scheduler = $scheduler; + $this->invalidator = $invalidator; } /** @@ -50,28 +56,25 @@ class API extends \Piwik\Plugin\API } /** - * When tracking data in the past (using Tracking API), this function - * can be used to invalidate reports for the idSites and dates where new data - * was added. - * DEV: If you call this API, the UI should display the data correctly, but will process - * in real time, which could be very slow after large data imports. - * After calling this function via REST, you can manually force all data - * to be reprocessed by visiting the script as the Super User: - * http://example.net/piwik/misc/cron/archive.php?token_auth=$SUPER_USER_TOKEN_AUTH_HERE - * REQUIREMENTS: On large piwik setups, you will need in PHP configuration: max_execution_time = 0 - * We recommend to use an hourly schedule of the script. - * More information: http://piwik.org/setup-auto-archiving/ + * Invalidates report data, forcing it to be recomputed during the next archiving run. * - * @param string $idSites Comma separated list of idSite that have had data imported for the specified dates - * @param string $dates Comma separated list of dates to invalidate for all these websites - * @param string $period If specified (one of day, week, month, year, range) it will only invalidates archives for this period. - * Note: because week, month, year, range reports aggregate day reports then you need to specifically invalidate day reports to see - * other periods reports processed.. + * Note: This is done automatically when tracking or importing visits in the past. + * + * @param string $idSites Comma separated list of site IDs to invalidate reports for. + * @param string $dates Comma separated list of dates of periods to invalidate reports for. + * @param string|bool $period The type of period to invalidate: either 'day', 'week', 'month', 'year', 'range'. + * The command will automatically cascade up, invalidating reports for parent periods as + * well. So invalidating a day will invalidate the week it's in, the month it's in and the + * year it's in, since those periods will need to be recomputed too. + * @param string|bool $segment Optional. The segment to invalidate reports for. + * @param bool $cascadeDown If true, child periods will be invalidated as well. So if it is requested to invalidate + * a month, then all the weeks and days within that month will also be invalidated. But only + * if this parameter is set. * @throws Exception * @return array * @hideExceptForSuperUser */ - public function invalidateArchivedReports($idSites, $dates, $period = false) + public function invalidateArchivedReports($idSites, $dates, $period = false, $segment = false, $cascadeDown = false) { $idSites = Site::getIdSitesFromIdSitesString($idSites); if (empty($idSites)) { @@ -80,19 +83,25 @@ class API extends \Piwik\Plugin\API Piwik::checkUserHasAdminAccess($idSites); + if (!empty($segment)) { + $segment = new Segment($segment, $idSites); + } else { + $segment = null; + } + list($dateObjects, $invalidDates) = $this->getDatesToInvalidateFromString($dates); - $invalidator = new ArchiveInvalidator(); - $output = $invalidator->markArchivesAsInvalidated($idSites, $dateObjects, $period); + $invalidationResult = $this->invalidator->markArchivesAsInvalidated($idSites, $dateObjects, $period, $segment, (bool)$cascadeDown); + $output = $invalidationResult->makeOutputLogs(); if ($invalidDates) { $output[] = 'Warning: some of the Dates to invalidate were invalid: ' . implode(", ", $invalidDates) . ". Piwik simply ignored those and proceeded with the others."; } - Site::clearCache(); + Site::clearCache(); // TODO: is this needed? it shouldn't be needed... - return $output; + return $invalidationResult->makeOutputLogs(); } /** diff --git a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php b/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php index fbfbcf1df05fc979da95578114d756636366ae85..cfbfdf82b148674432e55a6fa90d93a7ae1bc4ec 100644 --- a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php +++ b/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php @@ -76,7 +76,7 @@ class FixDuplicateLogActions extends ConsoleCommand { parent::__construct(); - $this->archiveInvalidator = $invalidator ?: new ArchiveInvalidator(); + $this->archiveInvalidator = $invalidator ?: StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); $this->duplicateActionRemover = $duplicateActionRemover ?: new DuplicateActionRemover(); $this->actionsAccess = $actionsAccess ?: new Actions(); $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface'); diff --git a/plugins/CoreAdminHome/Commands/InvalidateReportData.php b/plugins/CoreAdminHome/Commands/InvalidateReportData.php new file mode 100644 index 0000000000000000000000000000000000000000..f424afc8e8fd7c8ed4d1eeb9ec3f4e7f9afadb89 --- /dev/null +++ b/plugins/CoreAdminHome/Commands/InvalidateReportData.php @@ -0,0 +1,200 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\CoreAdminHome\Commands; + +use Piwik\Container\StaticContainer; +use Piwik\Date; +use Piwik\Period; +use Piwik\Period\Range; +use Piwik\Piwik; +use Piwik\Segment; +use Piwik\Plugin\ConsoleCommand; +use Piwik\Plugins\SitesManager\API as SitesManagerAPI; +use Piwik\Site; +use Piwik\Period\Factory as PeriodFactory; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Provides a simple interface for invalidating report data by date ranges, site IDs and periods. + */ +class InvalidateReportData extends ConsoleCommand +{ + const ALL_OPTION_VALUE = 'all'; + + protected function configure() + { + $this->setName('core:invalidate-report-data'); + $this->setDescription('Invalidate archived report data by date range, site and period.'); + $this->addOption('dates', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, + 'List of dates or date ranges to invalidate report data for, eg, 2015-01-03 or 2015-01-05,2015-02-12.'); + $this->addOption('sites', null, InputOption::VALUE_REQUIRED, + 'List of site IDs to invalidate report data for, eg, "1,2,3,4" or "all" for all sites.', + self::ALL_OPTION_VALUE); + $this->addOption('periods', null, InputOption::VALUE_REQUIRED, + 'List of period types to invalidate report data for. Can be one or more of the following values: day, ' + . 'week, month, year or "all" for all of them.', + self::ALL_OPTION_VALUE); + $this->addOption('segment', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, + 'List of segments to invalidate report data for.'); + $this->addOption('cascade', null, InputOption::VALUE_NONE, + 'If supplied, invalidation will cascade, invalidating child period types even if they aren\'t specified in' + . ' --periods. For example, if --periods=week, --cascade will cause the days within those weeks to be ' + . 'invalidated as well. If --periods=month, then weeks and days will be invalidated. Note: if a period ' + . 'falls partly outside of a date range, then --cascade will also invalidate data for child periods ' + . 'outside the date range. For example, if --dates=2015-09-14,2015-09-15 & --periods=week, --cascade will' + . ' also invalidate all days within 2015-09-13,2015-09-19, even those outside the date range.'); + $this->addOption('dry-run', null, InputOption::VALUE_NONE, 'For tests. Runs the command w/o actually ' + . 'invalidating anything.'); + $this->setHelp('Invalidate archived report data by date range, site and period. Invalidated archive data will ' + . 'be re-archived during the next core:archive run. If your log data has changed for some reason, this ' + . 'command can be used to make sure reports are generated using the new, changed log data.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); + + $cascade = $input->getOption('cascade'); + $dryRun = $input->getOption('dry-run'); + + $sites = $this->getSitesToInvalidateFor($input); + $periodTypes = $this->getPeriodTypesToInvalidateFor($input); + $dateRanges = $this->getDateRangesToInvalidateFor($input); + $segments = $this->getSegmentsToInvalidateFor($input, $sites); + + foreach ($periodTypes as $periodType) { + foreach ($dateRanges as $dateRange) { + foreach ($segments as $segment) { + $segmentStr = $segment ? $segment->getString() : ''; + + $output->writeln("Invalidating $periodType periods in $dateRange [segment = $segmentStr]..."); + + $dates = $this->getPeriodDates($periodType, $dateRange); + + if ($dryRun) { + $output->writeln("[Dry-run] invalidating archives for site = [ " . implode(', ', $sites) + . " ], dates = [ " . implode(', ', $dates) . " ], period = [ $periodType ], segment = [ " + . "$segmentStr ], cascade = [ " . (int)$cascade . " ]"); + } else { + $invalidationResult = $invalidator->markArchivesAsInvalidated($sites, $dates, $periodType, $segment, $cascade); + + if ($output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL) { + $output->writeln($invalidationResult->makeOutputLogs()); + } + } + } + } + } + } + + private function getSitesToInvalidateFor(InputInterface $input) + { + $sites = $input->getOption('sites'); + + $siteIds = Site::getIdSitesFromIdSitesString($sites); + if (empty($siteIds)) { + throw new \InvalidArgumentException("Invalid --sites value: '$sites'."); + } + + $allSiteIds = SitesManagerAPI::getInstance()->getAllSitesId(); + foreach ($siteIds as $idSite) { + if (!in_array($idSite, $allSiteIds)) { + throw new \InvalidArgumentException("Invalid --sites value: '$sites', there are no sites with IDs = $idSite"); + } + } + + return $siteIds; + } + + private function getPeriodTypesToInvalidateFor(InputInterface $input) + { + $periods = $input->getOption('periods'); + if (empty($periods)) { + throw new \InvalidArgumentException("The --periods argument is required."); + } + + if ($periods == self::ALL_OPTION_VALUE) { + $result = array_keys(Piwik::$idPeriods); + unset($result[4]); // remove 'range' period + return $result; + } + + $periods = explode(',', $periods); + $periods = array_map('trim', $periods); + + foreach ($periods as $periodIdentifier) { + if ($periodIdentifier == 'range') { + throw new \InvalidArgumentException( + "Invalid period type: invalidating range periods is not currently supported."); + } + + if (!isset(Piwik::$idPeriods[$periodIdentifier])) { + throw new \InvalidArgumentException("Invalid period type '$periodIdentifier' supplied in --periods."); + } + } + + return $periods; + } + + /** + * @param InputInterface $input + * @return Date[][] + */ + private function getDateRangesToInvalidateFor(InputInterface $input) + { + $dateRanges = $input->getOption('dates'); + if (empty($dateRanges)) { + throw new \InvalidArgumentException("The --dates option is required."); + } + + return $dateRanges; + } + + private function getPeriodDates($periodType, $dateRange) + { + if (!isset(Piwik::$idPeriods[$periodType])) { + throw new \InvalidArgumentException("Invalid period type '$periodType'."); + } + + try { + $period = PeriodFactory::build($periodType, $dateRange); + } catch (\Exception $ex) { + throw new \InvalidArgumentException("Invalid date or date range specifier '$dateRange'", $code = 0, $ex); + } + + $result = array(); + if ($period instanceof Range) { + foreach ($period->getSubperiods() as $subperiod) { + $result[] = $subperiod->getDateStart(); + } + } else { + $result[] = $period->getDateStart(); + } + return $result; + } + + private function getSegmentsToInvalidateFor(InputInterface $input, $idSites) + { + $segments = $input->getOption('segment'); + $segments = array_map('trim', $segments); + $segments = array_unique($segments); + + if (empty($segments)) { + return array(null); + } + + $result = array(); + foreach ($segments as $segmentString) { + $result[] = new Segment($segmentString, $idSites); + } + return $result; + } +} diff --git a/plugins/CoreAdminHome/CoreAdminHome.php b/plugins/CoreAdminHome/CoreAdminHome.php index 75f1230cd68942a0e3635a2d758c77daa947b734..305506038a53234ebe979512c75e695f26bcdf94 100644 --- a/plugins/CoreAdminHome/CoreAdminHome.php +++ b/plugins/CoreAdminHome/CoreAdminHome.php @@ -38,7 +38,6 @@ class CoreAdminHome extends \Piwik\Plugin public function getStylesheetFiles(&$stylesheets) { $stylesheets[] = "libs/jquery/themes/base/jquery-ui.min.css"; - $stylesheets[] = "plugins/CoreAdminHome/stylesheets/menu.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/base.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/main.less"; $stylesheets[] = "plugins/CoreAdminHome/stylesheets/generalSettings.less"; diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php index 7994979450ade784fd8851bc0750acc506c8c1de..b4621e2f5e356e4fedc86531c03ade9666e7bd0a 100644 --- a/plugins/CoreAdminHome/Menu.php +++ b/plugins/CoreAdminHome/Menu.php @@ -23,10 +23,10 @@ class Menu extends \Piwik\Plugin\Menu $hasAdminAccess = Piwik::isUserHasSomeAdminAccess(); if ($hasAdminAccess) { - $menu->addManageItem(null, "", $order = 1); - $menu->addSettingsItem(null, "", $order = 5); - $menu->addDiagnosticItem(null, "", $order = 10); - $menu->addDevelopmentItem(null, "", $order = 15); + $menu->addManageItem(null, array(), $order = 1); + $menu->addSettingsItem(null, array(), $order = 5); + $menu->addDiagnosticItem(null, array(), $order = 10); + $menu->addDevelopmentItem(null, array(), $order = 15); if (Piwik::hasUserSuperUserAccess()) { $menu->addSettingsItem('General_General', @@ -51,7 +51,8 @@ class Menu extends \Piwik\Plugin\Menu $url = $this->urlForAction('generalSettings'); } - $menu->addItem('CoreAdminHome_Administration', null, $url, 10); + $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-configure'); + $menu->addItem('CoreAdminHome_Administration', null, $url, 980, Piwik::translate('CoreAdminHome_Administration')); } } diff --git a/plugins/CoreAdminHome/lang/ko.json b/plugins/CoreAdminHome/lang/ko.json index 9158cdfb30b629287aaa2409a0d52a4f1a4d810f..d44b2797a7795529e538fc6b46080f11d87e7fcc 100644 --- a/plugins/CoreAdminHome/lang/ko.json +++ b/plugins/CoreAdminHome/lang/ko.json @@ -1,7 +1,9 @@ { "CoreAdminHome": { "Administration": "관리", + "ArchivingSettings": "ì•„ì¹´ì´ë¸Œ ì„¤ì •", "BrandingSettings": "브랜딩 ì„¤ì •", + "ReleaseChannel": "릴리즈 채ë„", "ClickHereToOptIn": "í´ë¦í•˜ì—¬ 허용합니다.", "ClickHereToOptOut": "í´ë¦í•˜ì—¬ 차단합니다.", "CustomLogoFeedbackInfo": "Piwik ë¡œê³ ë¥¼ 변경하거나 ìƒë‹¨ ë©”ë‰´ì˜ %s ë§í¬ë„ 숨길 수 있습니다. %s í”ŒëŸ¬ê·¸ì¸ ê´€ë¦¬ %s 페ì´ì§€ì—ì„œ 피드백 플러그ì¸ì„ 비활성화세요.", @@ -21,10 +23,13 @@ "OptOutExplanationBis": "HTML 코드는 방문ìžì˜ 브ë¼ìš°ì €ì— 차단 Cookie를 ì„¤ì •í•˜ëŠ” Piwik 차단 ë§í¬ë¥¼ ​​í¬í•¨ iFrameì„ í‘œì‹œí•©ë‹ˆë‹¤. iFrameì—ì„œ 표시ë˜ëŠ” ë‚´ìš©ì„ í‘œì‹œí•˜ë ¤ë©´ %s여기를 í´ë¦%s합니다.", "OptOutForYourVisitors": "방문ìžì˜ Piwik 차단", "PiwikIsInstalledAt": "Piwikê°€ 설치ë˜ì–´ 있습니다", + "PluginSettings": "í”ŒëŸ¬ê·¸ì¸ ì„¤ì •", + "SystemPluginSettings": "시스템 í”ŒëŸ¬ê·¸ì¸ ì„¤ì •", "TrackAGoal": "목표 추ì ", "TrackingCode": "추ì 코드", "TrustedHostConfirm": "ì‹ ë¢°í• ìˆ˜ 있는 Piwik 호스트네임으로 ë³€ê²½í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "TrustedHostSettings": "ì‹ ë¢°í• ìˆ˜ 있는 Piwik 호스트네임", + "UpdateSettings": "ì—…ë°ì´íŠ¸ ì„¤ì •", "UseCustomLogo": "ë¡œê³ ë³€ê²½í•˜ê¸°", "ValidPiwikHostname": "ìœ íš¨í•œ Piwik 호스트네임", "YouAreOptedIn": "í—ˆìš©ëœ ìƒíƒœìž…니다.", diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less index eac16b6c4c01bd7a1a8ddec95b4a7003167661e3..9d232f789b65bf2229115a06f3a0478328674229 100644 --- a/plugins/CoreAdminHome/stylesheets/generalSettings.less +++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less @@ -13,9 +13,6 @@ } #content.admin { - margin: 0 0 0 260px; - padding: 0 0 40px; - display: table; font-size: 13px; // Fix the <pre> blocks because of the display: table @@ -25,8 +22,8 @@ } .admin #header_message { - margin-top: 10px; - margin-right: 10px; + margin-top: 8px; + margin-right: 8px; } table.admin { @@ -92,9 +89,9 @@ table.admin tbody td:hover, table.admin tbody th:hover { width: 100%; &:first-of-type:not(.secondary) { - margin-top: 17px; + margin-top: 7px; margin-bottom: 16px; - border-bottom: 1px solid #DADADA; + border-bottom: 1px solid @theme-color-background-tinyContrast; } } @@ -162,11 +159,6 @@ table.admin tbody td:hover, table.admin tbody th:hover { margin-left: 0px; } -/* to override .admin a */ -.admin .sites_autocomplete a { - color: #255792; -} - /* trusted host styles */ #trustedHostSettings input { width: 238px; diff --git a/plugins/CoreAdminHome/stylesheets/menu.less b/plugins/CoreAdminHome/stylesheets/menu.less deleted file mode 100644 index af76bc82816fc42f784978fcd9f59b87521edd73..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/stylesheets/menu.less +++ /dev/null @@ -1,71 +0,0 @@ -#container { - clear: left; -} - -.Menu--admin { - padding: 0; - float: left; - width: 240px; -} - -.Menu--admin > .Menu-tabList { - -moz-background-size: 5px 100%; - background-size: 5px 100%; - background-position: 0 0, 100% 0; - background-repeat: no-repeat; -} - -.Menu--admin > .Menu-tabList { - padding-left: 5px; - margin-bottom: 0; - margin-top: 0.1em; - border: 1px solid @theme-color-background-lowContrast; - border-radius: 5px; - border-left: 0px; -} - -.Menu--admin > .Menu-tabList li { - list-style: none; - margin: 0; -} - -.Menu--admin > .Menu-tabList > li { - padding-bottom: 5px; -} - -.Menu--admin > .Menu-tabList > li > a, -.Menu--admin > .Menu-tabList > li > span { - text-decoration: none; - border-bottom: 1px dotted #778; - display: block; - padding: 5px 10px; - font-size: 18px; - color: #7E7363; -} - -.Menu--admin > .Menu-tabList li li a { - text-decoration: none; - padding: 0.6em 0.9em; - font-size: 14px; - display: block; -} - -.Menu--admin > .Menu-tabList li li a:link, -.Menu--admin > .Menu-tabList li li a:visited { - color: #000; -} - -.Menu--admin > .Menu-tabList li li a:hover, -.Menu--admin > .Menu-tabList li li a.active { - color: @theme-color-menu-contrast-textActive !important; - background: @theme-color-menu-contrast-background; - border-color: #000; -} - -.Menu--admin > .Menu-tabList li li a:hover { - text-decoration: underline; -} - -.Menu--admin > .Menu-tabList li li a.current { - background: #defdbb; -} diff --git a/plugins/CoreAdminHome/templates/_menu.twig b/plugins/CoreAdminHome/templates/_menu.twig deleted file mode 100644 index 080f36e93c1ee47da52ccaba31992889b78adecf..0000000000000000000000000000000000000000 --- a/plugins/CoreAdminHome/templates/_menu.twig +++ /dev/null @@ -1,3 +0,0 @@ -{% import '@CoreHome/macros.twig' as corehome %} - -{{ corehome.sidebarMenu(adminMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreAdminHome/tests/Framework/Mock/API.php b/plugins/CoreAdminHome/tests/Framework/Mock/API.php index 70070c50e9b27855c6deacd23007b5b80a7f740f..0fc3f106b070c8258b9eaa75e7a794df245efb73 100644 --- a/plugins/CoreAdminHome/tests/Framework/Mock/API.php +++ b/plugins/CoreAdminHome/tests/Framework/Mock/API.php @@ -14,7 +14,7 @@ class API extends \Piwik\Plugins\CoreAdminHome\API { private $invalidatedReports = array(); - public function invalidateArchivedReports($idSites, $dates, $period = false) + public function invalidateArchivedReports($idSites, $dates, $period = false, $segment = false, $cascadeDown = false) { $this->invalidatedReports[] = func_get_args(); } diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php new file mode 100644 index 0000000000000000000000000000000000000000..f565b7105b5abf08b743531a5e8826db1110385a --- /dev/null +++ b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php @@ -0,0 +1,239 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\CoreAdminHome\tests\Integration\Commands; + +use Piwik\Tests\Framework\Fixture; +use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase; + +/** + * @group CoreAdminHome + * @group CoreAdminHome_Integration + */ +class InvalidateReportDataTest extends ConsoleCommandTestCase +{ + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + + Fixture::createWebsite('2012-01-01 00:00:00'); + Fixture::createWebsite('2012-01-01 00:00:00'); + Fixture::createWebsite('2012-01-01 00:00:00'); + } + + /** + * @dataProvider getInvalidDateRanges + */ + public function test_Command_FailsWhenAnInvalidDateRangeIsUsed($invalidDateRange) + { + $code = $this->applicationTester->run(array( + 'command' => 'core:invalidate-report-data', + '--dates' => array($invalidDateRange), + '--periods' => 'day', + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + )); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + $this->assertContains("Invalid date or date range specifier", $this->applicationTester->getDisplay()); + } + + public function getInvalidDateRanges() + { + return array( + array('garbage'), + array('2012-01-03 2013-02-01'), + ); + } + + /** + * @dataProvider getInvalidPeriodTypes + */ + public function test_Command_FailsWhenAnInvalidPeriodTypeIsUsed($invalidPeriodType) + { + $code = $this->applicationTester->run(array( + 'command' => 'core:invalidate-report-data', + '--dates' => '2012-01-01', + '--periods' => $invalidPeriodType, + '--sites' => '1', + '--dry-run' => true, + '-vvv' => true, + )); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + $this->assertContains("Invalid period type", $this->applicationTester->getDisplay()); + } + + public function getInvalidPeriodTypes() + { + return array( + array('cranberries'), + array('range'), + ); + } + + /** + * @dataProvider getInvalidSiteLists + */ + public function test_Command_FailsWhenAnInvalidSiteListIsUsed($invalidSites) + { + $code = $this->applicationTester->run(array( + 'command' => 'core:invalidate-report-data', + '--dates' => '2012-01-01', + '--periods' => 'day', + '--sites' => $invalidSites, + '--dry-run' => true, + '-vvv' => true, + )); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + $this->assertContains("Invalid --sites value", $this->applicationTester->getDisplay()); + } + + public function getInvalidSiteLists() + { + return array( + array('wolfalice'), + array(','), + array('1,500'), + ); + } + + public function test_Command_FailsWhenAnInvalidSegmentIsUsed() + { + $code = $this->applicationTester->run(array( + 'command' => 'core:invalidate-report-data', + '--dates' => '2012-01-01', + '--periods' => 'day', + '--sites' => '1', + '--segment' => array('ablksdjfdslkjf'), + '--dry-run' => true, + '-vvv' => true, + )); + + $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + $this->assertContains("The segment 'ablksdjfdslkjf' is not valid", $this->applicationTester->getDisplay()); + } + + /** + * @dataProvider getTestDataForSuccessTests + */ + public function test_Command_InvalidatesCorrectSitesAndDates($dates, $periods, $sites, $cascade, $segments, $expectedOutputs) + { + $code = $this->applicationTester->run(array( + 'command' => 'core:invalidate-report-data', + '--dates' => $dates, + '--periods' => $periods, + '--sites' => $sites, + '--cascade' => $cascade, + '--segment' => $segments ?: array(), + '--dry-run' => true, + '-vvv' => true, + )); + + $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage()); + + foreach ($expectedOutputs as $output) { + $this->assertContains($output, $this->applicationTester->getDisplay()); + } + } + + public function getTestDataForSuccessTests() + { + return array( + + array( // no cascade, single site + single day + array('2012-01-01'), + 'day', + '1', + false, + null, + array( + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', + ), + ), + + array( // no cascade, single site + single day + array('2012-01-01'), + 'day', + '1', + true, + null, + array( + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [ ]', + ), + ), + + array( // no cascade, single site, date, period + array('2012-01-01'), + 'week', + '1', + false, + null, + array( + '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [ ]', + ), + ), + + array( // no cascade, multiple site, date & period + array('2012-01-01,2012-02-05', '2012-01-26,2012-01-27', '2013-03-19'), + 'month,week', + '1,3', + false, + null, + array( + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [ ], cascade = [ 0 ]', + ), + ), + + array( // cascade, single site, date, period + array('2012-01-30,2012-02-10'), + 'week', + '2', + true, + null, + array( + '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + ), + ), + + array( // cascade, multiple site, date & period + array('2012-02-03,2012-02-04', '2012-03-15'), + 'month,week,day', + 'all', + true, + null, + array( + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [ ], cascade = [ 1 ]', + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [ ], cascade = [ 1 ]', + ), + ), + + array( // cascade, one week, date & period + segment + array('2012-01-01,2012-01-14'), + 'week', + 'all', + true, + array('browserCode==FF'), + array( + '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09 ], period = [ week ], segment = [ browserCode==FF ], cascade = [ 1 ]', + ), + ), + ); + } +} diff --git a/plugins/CoreHome/Categories/ActionsCategory.php b/plugins/CoreHome/Categories/ActionsCategory.php index e995df110d89255d7ca72ecb1c8a86f05b4c2af4..a7f1c57276c9a793960b9c6dca8aee4169653ffe 100644 --- a/plugins/CoreHome/Categories/ActionsCategory.php +++ b/plugins/CoreHome/Categories/ActionsCategory.php @@ -14,4 +14,5 @@ class ActionsCategory extends Category { protected $id = 'General_Actions'; protected $order = 10; + protected $icon = 'icon-reporting-actions'; } diff --git a/plugins/CoreHome/Categories/VisitorsCategory.php b/plugins/CoreHome/Categories/VisitorsCategory.php index c4604c40354af34d2cb0abafefedcbf5c2fddffd..1327c7b95564c157c173efb8ea3d528d3a3d8beb 100644 --- a/plugins/CoreHome/Categories/VisitorsCategory.php +++ b/plugins/CoreHome/Categories/VisitorsCategory.php @@ -14,4 +14,5 @@ class VisitorsCategory extends Category { protected $id = 'General_Visitors'; protected $order = 5; + protected $icon = 'icon-reporting-visitors'; } diff --git a/plugins/CoreHome/Controller.php b/plugins/CoreHome/Controller.php index a0866c0ff20e394ac7a0297638e60cead593c33a..cf4be9b446895e7a59ad7634805cbc79f68ef1d8 100644 --- a/plugins/CoreHome/Controller.php +++ b/plugins/CoreHome/Controller.php @@ -131,6 +131,7 @@ class Controller extends \Piwik\Plugin\Controller { $view = new View('@CoreHome/getDefaultIndexView'); $this->setGeneralVariablesView($view); + $view->showMenu = true; $view->dashboardSettingsControl = new DashboardManagerControl(); $view->content = ''; return $view; diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php index c8b2b428d0d8648ea01855ad1ba2edab81070ef8..519891acb043ff2da7d3c8242dbb0739e04b3832 100644 --- a/plugins/CoreHome/CoreHome.php +++ b/plugins/CoreHome/CoreHome.php @@ -68,7 +68,6 @@ class CoreHome extends \Piwik\Plugin $stylesheets[] = "plugins/Morpheus/stylesheets/base.less"; $stylesheets[] = "plugins/Morpheus/stylesheets/main.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/coreHome.less"; - $stylesheets[] = "plugins/CoreHome/stylesheets/menu.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/dataTable.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/cloud.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css"; @@ -79,9 +78,12 @@ class CoreHome extends \Piwik\Plugin $stylesheets[] = "plugins/CoreHome/stylesheets/sparklineColors.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/notification.less"; $stylesheets[] = "plugins/CoreHome/stylesheets/zen-mode.less"; + $stylesheets[] = "plugins/CoreHome/stylesheets/layout.less"; $stylesheets[] = "plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less"; $stylesheets[] = "plugins/CoreHome/angularjs/dialogtoggler/ngdialog.less"; $stylesheets[] = "plugins/CoreHome/angularjs/notification/notification.directive.less"; + $stylesheets[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.less"; + $stylesheets[] = "plugins/CoreHome/angularjs/selector/selector.directive.less"; } public function getJsFiles(&$jsFiles) @@ -121,6 +123,7 @@ class CoreHome extends \Piwik\Plugin $jsFiles[] = "plugins/CoreHome/javascripts/color_manager.js"; $jsFiles[] = "plugins/CoreHome/javascripts/notification.js"; $jsFiles[] = "plugins/CoreHome/javascripts/notification_parser.js"; + $jsFiles[] = "plugins/CoreHome/javascripts/numberFormatter.js"; $jsFiles[] = "plugins/CoreHome/angularjs/piwikApp.config.js"; @@ -190,6 +193,11 @@ class CoreHome extends \Piwik\Plugin $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js"; $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js"; $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js"; + + $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.controller.js"; + $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.js"; + + $jsFiles[] = "plugins/CoreHome/angularjs/selector/selector.directive.js"; } public function getClientSideTranslationKeys(&$translationKeys) @@ -198,8 +206,11 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_Loading'; $translationKeys[] = 'General_Show'; $translationKeys[] = 'General_Hide'; + $translationKeys[] = 'General_Website'; + $translationKeys[] = 'General_ChooseWebsite'; $translationKeys[] = 'Intl_Year_Short'; $translationKeys[] = 'General_MultiSitesSummary'; + $translationKeys[] = 'General_SearchNoResults'; $translationKeys[] = 'CoreHome_YouAreUsingTheLatestVersion'; $translationKeys[] = 'CoreHome_IncludeRowsWithLowPopulation'; $translationKeys[] = 'CoreHome_ExcludeRowsWithLowPopulation'; @@ -211,6 +222,7 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'CoreHome_UnFlattenDataTable'; $translationKeys[] = 'CoreHome_ExternalHelp'; $translationKeys[] = 'CoreHome_ClickToEditX'; + $translationKeys[] = 'CoreHome_Menu'; $translationKeys[] = 'SitesManager_NotFound'; $translationKeys[] = 'Annotations_ViewAndAddAnnotations'; $translationKeys[] = 'General_RowEvolutionRowActionTooltipTitle'; @@ -265,6 +277,7 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'Intl_Day_Min_StandAlone_5'; $translationKeys[] = 'Intl_Day_Min_StandAlone_6'; $translationKeys[] = 'Intl_Day_Min_StandAlone_7'; + $translationKeys[] = 'General_And'; $translationKeys[] = 'General_Search'; $translationKeys[] = 'General_Clear'; $translationKeys[] = 'General_MoreDetails'; @@ -282,9 +295,14 @@ class CoreHome extends \Piwik\Plugin $translationKeys[] = 'General_LoadingData'; $translationKeys[] = 'General_ErrorRequest'; $translationKeys[] = 'General_YourChangesHaveBeenSaved'; + $translationKeys[] = 'General_LearnMore'; $translationKeys[] = 'CoreHome_UndoPivotBySubtable'; $translationKeys[] = 'CoreHome_PivotBySubtable'; $translationKeys[] = 'General_LearnMore'; $translationKeys[] = 'CoreHome_NoSuchPage'; + $translationKeys[] = 'CoreHome_QuickAccessTitle'; + $translationKeys[] = 'CoreHome_Segments'; + $translationKeys[] = 'CoreHome_MenuEntries'; + $translationKeys[] = 'SitesManager_Sites'; } } diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php index 9b80f92c87917e614cf8207615ce7015fa441cd8..d73c5c21580c7620240d70bac2ff108409d5f682 100644 --- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php +++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php @@ -15,6 +15,7 @@ use Piwik\Common; use Piwik\DataTable; use Piwik\Date; use Piwik\Metrics; +use Piwik\NumberFormatter; use Piwik\Period\Factory as PeriodFactory; use Piwik\Piwik; use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution as EvolutionViz; @@ -231,7 +232,10 @@ class RowEvolution $change = isset($metricData['change']) ? $metricData['change'] : false; list($first, $last) = $this->getFirstAndLastDataPointsForMetric($metric); - $details = Piwik::translate('RowEvolution_MetricBetweenText', array($first, $last)); + $details = Piwik::translate('RowEvolution_MetricBetweenText', array( + NumberFormatter::getInstance()->format($first), + NumberFormatter::getInstance()->format($last) + )); if ($change !== false) { $lowerIsBetter = Metrics::isLowerValueBetter($metric); @@ -258,7 +262,11 @@ class RowEvolution $min = isset($metricData['min']) ? $metricData['min'] : 0; $min .= $unit; $max .= $unit; - $minmax = Piwik::translate('RowEvolution_MetricMinMax', array($metricData['name'], $min, $max)); + $minmax = Piwik::translate('RowEvolution_MetricMinMax', array( + $metricData['name'], + NumberFormatter::getInstance()->formatNumber($min), + NumberFormatter::getInstance()->formatNumber($max) + )); $newMetric = array( 'label' => $metricData['name'], diff --git a/plugins/CoreHome/Menu.php b/plugins/CoreHome/Menu.php index 83e5d053d66c38f87da1522f01fd18ba3d0580e3..20d9ac8eb8ba9d10801eb54db2f44ea38593b851 100644 --- a/plugins/CoreHome/Menu.php +++ b/plugins/CoreHome/Menu.php @@ -27,24 +27,29 @@ class Menu extends \Piwik\Plugin\Menu } if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) { - $menu->addItem('General_Help', null, array('module' => 'Feedback', 'action' => 'index')); + $menu->registerMenuIcon('General_Help', 'icon-help'); + $menu->addItem('General_Help', null, array('module' => 'Feedback', 'action' => 'index'), $order = 990, Piwik::translate('General_Help')); } + $menu->registerMenuIcon($login, 'icon-user'); + if (Piwik::isUserIsAnonymous()) { - if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) { - $menu->addItem($login, null, array('module' => 'Feedback', 'action' => 'index'), 998); + if (Plugin\Manager::getInstance()->isPluginActivated('ScheduledReports')) { + $menu->addItem($login, null, array('module' => 'ScheduledReports', 'action' => 'index'), 970, $login); } else { - $menu->addItem($login, null, array('module' => 'API', 'action' => 'listAllAPI'), 998); + $menu->addItem($login, null, array('module' => 'API', 'action' => 'listAllAPI'), 970, $login); } } else { - $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 998); + $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 970, $login); } $module = $this->getLoginModule(); if (Piwik::isUserIsAnonymous()) { - $menu->addItem('Login_LogIn', null, array('module' => $module, 'action' => false), 999); + $menu->registerMenuIcon('Login_LogIn', 'icon-sign-in'); + $menu->addItem('Login_LogIn', null, array('module' => $module, 'action' => false), 1000, Piwik::translate('Login_LogIn')); } else { - $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 999); + $menu->registerMenuIcon('General_Logout', 'icon-sign-out'); + $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 1000, Piwik::translate('General_Logout')); } } diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api.js b/plugins/CoreHome/angularjs/common/services/piwik-api.js index 9d4b3f8fc4803ebaca749f5f24f8b73e53607f0a..8bb14808c5d1ffc1c79efe2fd0b599544faa4474 100644 --- a/plugins/CoreHome/angularjs/common/services/piwik-api.js +++ b/plugins/CoreHome/angularjs/common/services/piwik-api.js @@ -4,6 +4,10 @@ * @link http://piwik.org * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ + +// see https://github.com/piwik/piwik/issues/5094 used to detect an ad blocker +var hasBlockedContent = false; + (function () { angular.module('piwikApp.service').factory('piwikApi', piwikApiService); diff --git a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less index 054c0bdba0024f8e90dd9888d8addbf886876639..4ffb8326f0ea06517a65731e6649307bdeb98684 100644 --- a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less +++ b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less @@ -2,6 +2,16 @@ display: none; } +[piwik-enriched-headline] { + visibility: hidden; + height: 47px; +} + +[piwik-enriched-headline].ng-isolate-scope { + visibility: visible; + height: auto; +} + .enrichedHeadline { min-height: 22px; diff --git a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html index 14191ac20ed48d900bd1fc74abfae73e78c1a137..b9084dbe1033a6c896e45b4cf07aa10873a9061f 100644 --- a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html +++ b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html @@ -5,7 +5,7 @@ title="{{ tooltip }}" ng-bind-html="menuTitle"/> - <div class="items" ng-show="view.showItems"> + <div class="items borderedControl" ng-show="view.showItems"> <div class="search" ng-if="showSearch && view.showItems"> <input type="text" piwik-focus-if="view.showItems" diff --git a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less index da8b79a1fc00a46f28767a33e39d5259bfbc864c..a36d00c0f5b5772291f4053d48cd6b8e6198da39 100644 --- a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less +++ b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less @@ -25,9 +25,9 @@ } .items { - z-index: 21; + z-index: 200; position: absolute; - border: 1px solid @color-silver-l80 !important; + border: 1px solid @color-silver-l80; background: @theme-color-background-base; max-height: 400px; overflow-y: auto; @@ -41,7 +41,7 @@ .search_ico { position: absolute; right: 25px; - top: 22px; + top: 27px; margin: 0px; left: initial; } @@ -74,11 +74,11 @@ text-align: left; &:hover { - background: @color-silver-l80; + background: @theme-color-background-tinyContrast; } &.active { - background-color: @color-silver-l80; + background-color: @theme-color-background-tinyContrast; } &.category { diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js new file mode 100644 index 0000000000000000000000000000000000000000..9e1fefba82c4960b7c532597922e67efb78446ab --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js @@ -0,0 +1,78 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +(function () { + angular.module('piwikApp').controller('QuickAccessController', QuickAccessController); + + QuickAccessController.$inject = ['$scope', '$filter', 'siteSelectorModel']; + + function QuickAccessController($scope, $filter, siteSelectorModel){ + + this.menuItems = []; + this.numMenuItems = 0; + this.sitesModel = siteSelectorModel; + + this.onKeypress = function (event) { + if (38 == event.which) { + $scope.highlightPreviousItem(); + event.preventDefault(); + } else if (40 == event.which) { + $scope.highlightNextItem(); + event.preventDefault(); + } else if (13 == event.which) { + $scope.clickQuickAccessMenuItem(); + } + }; + + this.searchMenu = function (searchTerm) { + searchTerm = searchTerm.toLowerCase(); + + var index = -1; + var menuItemsIndex = {}; + var menuItems = []; + + var moveToCategory = function (i, submenuItem) { + submenuItem = angular.copy(submenuItem); // force rerender of element to prevent weird side effects + submenuItem.menuIndex = ++index; // needed for proper highlighting with arrow keys + + var category = submenuItem.category; + if (!(category in menuItemsIndex)) { + menuItems.push({title: category, items: []}); + menuItemsIndex[category] = menuItems.length - 1; + } + + var indexOfCategory = menuItemsIndex[category]; + menuItems[indexOfCategory].items.push(submenuItem); + }; + + $scope.resetSearchIndex(); + + if ($scope.hasSitesSelector) { + this.sitesModel.searchSite(searchTerm); + } + + var topMenuItems = $filter('filter')($scope.getTopMenuItems(), searchTerm); + var leftMenuItems = $filter('filter')($scope.getLeftMenuItems(), searchTerm); + var segmentItems = $filter('filter')($scope.getSegmentItems(), searchTerm); + + $.each(topMenuItems, moveToCategory); + $.each(leftMenuItems, moveToCategory); + $.each(segmentItems, moveToCategory); + + this.numMenuItems = topMenuItems.length + leftMenuItems.length + segmentItems.length; + this.menuItems = menuItems; + }; + + this.selectSite = function (idsite) { + this.sitesModel.loadSite(idsite); + }; + + this.selectMenuItem = function (index) { + $scope.selectMenuItem(index); + }; + + } +})(); diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html new file mode 100644 index 0000000000000000000000000000000000000000..1e76f4fe7d16ff058d0f72f603939555db3d076d --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html @@ -0,0 +1,36 @@ +<div class="quick-access" title="{{ quickAccessTitle }}" + ng-class="{active: view.searchActive, expanded: view.searchActive}" + piwik-focus-anywhere-but-here="view.searchActive = false;"> + <span class="icon-search" ng-hide="search.term || view.searchActive" + ng-mouseenter="view.searchActive=true"></span> + <input ng-keydown="quickAccess.onKeypress($event)" + ng-change="view.searchActive=true;quickAccess.searchMenu(search.term)" + ng-focus="view.searchActive=true" + ng-model="search.term" piwik-focus-if="view.searchActive" + type="text"/> + <ul ng-hide="!search.term || !view.searchActive || (quickAccess.numMenuItems > 0) || (quickAccess.sitesModel.sites | length)"> + <li class="no-result">{{ 'General_SearchNoResults' | translate }}</li> + </ul> + <ul ng-show="search.term && view.searchActive" ng-repeat="subcategory in quickAccess.menuItems"> + <li class="quick-access-category" + ng-click="search.term = subcategory.title;quickAccess.searchMenu(search.term)">{{ subcategory.title }}</li> + <li class="result" + ng-class="{selected: submenuEntry.menuIndex == search.index}" + ng-mouseenter="search.index=submenuEntry.menuIndex" + ng-click="quickAccess.selectMenuItem(submenuEntry.index)" + ng-repeat="submenuEntry in subcategory.items"><a>{{ submenuEntry.name | trim }}</a></li> + </ul> + <ul ng-show="search.term && view.searchActive"> + <li class="quick-access-category websiteCategory" + ng-show="hasSitesSelector && ((quickAccess.sitesModel.sites | length) || quickAccess.sitesModel.isLoading)" + >{{ 'SitesManager_Sites' | translate }}</li> + <li class="no-result" + ng-show="hasSitesSelector && quickAccess.sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li> + <li class="result" + ng-show="hasSitesSelector && !quickAccess.sitesModel.isLoading" + ng-mouseenter="search.index=(quickAccess.numMenuItems + $index)" + ng-class="{selected: (quickAccess.numMenuItems + $index) == search.index}" + ng-click="quickAccess.selectSite(site.idsite)" + ng-repeat="site in quickAccess.sitesModel.sites"><a ng-bind-html="site.name"></a></li> + </ul> +</div> \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js new file mode 100644 index 0000000000000000000000000000000000000000..35df1d2ef0e03c43577ba31342cd07a4ec07975c --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js @@ -0,0 +1,282 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +/** + * Usage: + * <div piwik-dialog="showDialog">...</div> + * Will show dialog once showDialog evaluates to true. + * + * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed. + */ +(function () { + angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective); + + QuickAccessDirective.$inject = ['$rootElement', '$timeout', 'piwik', '$filter']; + + function QuickAccessDirective ($rootElement, $timeout, piwik, $filter) { + + return { + restrict: 'A', + replace: true, + scope: {}, + templateUrl: 'plugins/CoreHome/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster, + controller: 'QuickAccessController', + controllerAs: 'quickAccess', + link: function (scope, element, attrs) { + + var menuIndex = -1; // the menu index is used to identify which element to click + var topMenuItems = []; // cache for top menu items + var leftMenuItems = []; // cache for left menu items + var segmentItems = []; // cache for segment items + var hasSegmentSelector = angular.element('.segmentEditorPanel').length; + scope.hasSitesSelector = angular.element('.top_controls [piwik-siteselector]').length; + + + var translate = $filter('translate'); + var searchAreasTitle = ''; + var searchAreas = [translate('CoreHome_MenuEntries')] + + if (hasSegmentSelector) { + searchAreas.push(translate('CoreHome_Segments')) + } + + if (scope.hasSitesSelector) { + searchAreas.push(translate('SitesManager_Sites')) + } + + while (searchAreas.length) { + searchAreasTitle += searchAreas.shift(); + if (searchAreas.length >= 2) { + searchAreasTitle += ', '; + } else if (searchAreas.length === 1) { + searchAreasTitle += ' ' + translate('General_And') + ' '; + } + } + + scope.quickAccessTitle = translate('CoreHome_QuickAccessTitle', searchAreasTitle); + + function trim(str) { + return str.replace(/^\s+|\s+$/g,''); + } + + scope.getTopMenuItems = function() + { + if (topMenuItems && topMenuItems.length) { + return topMenuItems; + } + + var category = _pk_translate('CoreHome_Menu'); + + $rootElement.find('#topRightBar .navbar-right li > a').each(function (index, element) { + var $element = $(element); + + if ($element.is('#topmenu-usersmanager')) { + // ignore languages manager + return; + } + + var text = trim($element.text()); + + if (!text) { + text = trim($element.attr('title')); // possibly a icon, use title instead + } + + if (text) { + topMenuItems.push({name: text, index: ++menuIndex, category: category}); + $element.attr('quick_access', menuIndex); + } + }); + + return topMenuItems; + }; + + scope.getLeftMenuItems = function () + { + if (leftMenuItems && leftMenuItems.length) { + return leftMenuItems; + } + + $rootElement.find('#secondNavBar .menuTab').each(function (index, element) { + var $element = angular.element(element); + var category = trim($element.find('> .item').text()); + + if (category && -1 !== category.lastIndexOf("\n")) { + // remove "\n\nMenu" + category = trim(category.substr(0, category.lastIndexOf("\n"))); + } + + $element.find('li .item').each(function (i, element) { + var $element = angular.element(element); + var text = trim($element.text()); + + if (text) { + leftMenuItems.push({name: text, category: category, index: ++menuIndex}); + $element.attr('quick_access', menuIndex); + } + }) + + }); + + return leftMenuItems; + }; + + scope.getSegmentItems = function() + { + if (!hasSegmentSelector) { + return []; + } + + if (segmentItems && segmentItems.length) { + return segmentItems; + } + + var category = _pk_translate('CoreHome_Segments'); + + $rootElement.find('.segmentList [data-idsegment]').each(function (index, element) { + var $element = angular.element(element); + var text = trim($element.find('.segname').text()); + + if (text) { + segmentItems.push({name: text, category: category, index: ++menuIndex}); + $element.attr('quick_access', menuIndex); + } + }); + + return segmentItems; + }; + + scope.activateSearch = function() + { + scope.$eval('view.searchActive = true'); + $timeout(function () { + scope.$apply(); + }, 0); + }; + + scope.deactivateSearch = function() + { + scope.$eval('search.term = ""'); + scope.$eval('view.searchActive = false'); + element.find('input').blur(); + $timeout(function () { + scope.$apply(); + }, 0); + }; + + function isElementInViewport(element) { + + var rect = element.getBoundingClientRect(); + + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= $(window).height() && + rect.right <= $(window).width() + ); + } + + function getCurrentlySelectedElement(index) + { + var results = element.find('li.result'); + if (results && results.length && results[scope.search.index]) { + return $(results[scope.search.index]); + } + } + + function makeSureSelectedItemIsInViewport() { + var element = getCurrentlySelectedElement(); + + if (element && element[0] && !isElementInViewport(element[0])) { + scrollFirstElementIntoView(element); + } + } + + function scrollFirstElementIntoView(element) + { + if (element && element[0] && element[0].scrollIntoView) { + // make sure search is visible + element[0].scrollIntoView(); + } + } + + scope.highlightPreviousItem = function() + { + if (0 >= (scope.search.index - 1)) { + scope.search.index = 0; + } else { + scope.search.index--; + } + makeSureSelectedItemIsInViewport(); + }; + + scope.resetSearchIndex = function () { + scope.search.index = 0; + makeSureSelectedItemIsInViewport(); + }; + + scope.highlightNextItem = function() + { + var numTotal = element.find('li.result').length; + + if (numTotal <= (scope.search.index + 1)) { + scope.search.index = numTotal - 1; + } else { + scope.search.index++; + } + + makeSureSelectedItemIsInViewport(); + }; + + scope.clickQuickAccessMenuItem = function() + { + var selectedMenuElement = getCurrentlySelectedElement(); + if (selectedMenuElement) { + $timeout(function () { + selectedMenuElement.click(); + }, 20); + } + }; + + scope.selectMenuItem = function(index) + { + var target = $rootElement.find('[quick_access=' + index + ']'); + + if (target && target.length && target[0]) { + scope.deactivateSearch(); + + var actualTarget = target[0]; + + var href = $(actualTarget).attr('href'); + + if (href && href.length > 10 && actualTarget && actualTarget.click) { + try { + actualTarget.click(); + } catch (e) { + $(actualTarget).click(); + } + } else { + $(actualTarget).click(); + } + } + }; + + Mousetrap.bind('f', function(event) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; // IE + } + + scrollFirstElementIntoView(element); + + scope.activateSearch(); + }); + + } + }; + } +})(); \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less new file mode 100644 index 0000000000000000000000000000000000000000..1c46c7533d19fa43332b1a3f0d7c383df29d0f4f --- /dev/null +++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less @@ -0,0 +1,55 @@ +.quick-access { + position: relative; + + li { + font-size: 11px; + } + + li a { + padding: 10px 19px; + display: inline-block; + text-decoration: none; + word-break: break-all; + } + + .icon-search { + position: absolute; + font-size: 14px; + top: 10px; + left: 10px; + + } + input { + width:100%; + height: 100%; + border: 0 !important; + box-shadow: 0 0 !important; + border-radius: 0 !important; + font-size: 11px; + &:focus { + outline: none; + } + } + .selected { + background-color: @theme-color-background-tinyContrast !important; + } + .quick-access-category { + text-align: left !important; + font-size: 11px; + padding: 5px 5px 5px 10px; + cursor: pointer; + } + .result { + cursor: pointer; + } + .quick-access-category:hover { + background: none !important; + } + .no-result { + padding: 10px 19px; + cursor: default; + } + .websiteCategory { + cursor: default; + } +} \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js index adc1b9793613b56295387a97d7b17955c9095784..1ac9e223f34815f378ece2bbbfdd970b9ae7c0c7 100644 --- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js +++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js @@ -67,7 +67,6 @@ if (activeCategory && category.id === activeCategory) { // this doesn't really belong here but placed it here for convenience category.active = true; - category.hover = true; } category.subcategories = []; @@ -94,6 +93,7 @@ if (subcategory.active) { goalsGroup.name = subcategory.name; + goalsGroup.active = true; } var goalId = page.subcategory.id; diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js index 6e3a21e8516afa6d2502d3f02d18a45069b0f755..57d202b250eab222b5768c66fb58efee4f23f6da 100644 --- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js +++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js @@ -15,9 +15,15 @@ { angular.forEach(menuModel.menu, function (cat) { cat.active = false; - cat.hover = false; angular.forEach(cat.subcategories, function (subcat) { subcat.active = false; + + if (subcat.isGroup && subcat.subcategories) { + angular.forEach(subcat.subcategories, function (sub) { + sub.active = false; + }); + + } }); }); } @@ -33,42 +39,8 @@ $scope.menuModel = menuModel; - var timeoutPromise = null; - - // show subcategories of the currently hovered category - $scope.enterCategory = function (category) { - - if (timeoutPromise) { - $timeout.cancel(timeoutPromise); - } - - angular.forEach(menuModel.menu, function (cat) { - cat.hover = false; - }); - - category.hover = true; - }; - - // show subcategories of the current active category again (after 2 sec max) - $scope.leaveCategory = function (category) { - - if (timeoutPromise) { - $timeout.cancel(timeoutPromise); - } - - timeoutPromise = $timeout(function () { - angular.forEach(menuModel.menu, function (cat) { - if (cat.active) { - cat.hover = true; - } else { - cat.hover = false; - } - }); - }, 2000); - }; - // highlight the currently hovered subcategory (and category) - $scope.enterSubcategory = function (category, subcategory) { + function enterSubcategory(category, subcategory) { if (!category || !subcategory) { return; } @@ -76,7 +48,6 @@ markAllCategoriesAsInactive(); category.active = true; - category.hover = true; subcategory.active = true; }; @@ -110,7 +81,7 @@ menuModel.fetchMenuItems().then(function (menu) { if (!$location.search().subcategory) { // load first, initial page if no subcategory is present - $scope.enterSubcategory(menu[0], menu[0].subcategories[0]); + enterSubcategory(menu[0], menu[0].subcategories[0]); $location.search($scope.makeUrl(menu[0], menu[0].subcategories[0])); } }); @@ -124,7 +95,7 @@ } var found = menuModel.findSubcategory(category, subcategory); - $scope.enterSubcategory(found.category, found.subcategory); + enterSubcategory(found.category, found.subcategory); }); } diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html index bbfd687517f222e5ba4dd59c28a9be37c57a2ca5..c31a66a602d17272f3dd3f7f1c716f874e0ead21 100644 --- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html +++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html @@ -1,40 +1,36 @@ -<div class="Menu--dashboard"> - <ul class="Menu-tabList"> - <li ng-repeat="category in menuModel.menu" - ng-class="{'sfActive': category.active, 'sfHover': category.hover}" - ng-mouseenter="enterCategory(category)" - ng-mouseleave="leaveCategory(category)"> - <a class="menuItem" - ng-href="#?{{ makeUrl(category,category.subcategories[0]) }}" - ng-click="loadSubcategory(category, category.subcategories[0])"> - {{ category.name }} - </a> - <ul ng-show="(category.subcategories|length) > 1"> - <li ng-repeat="subcategory in category.subcategories" - ng-class="{'sfHover': subcategory.active}"> - <div ng-if="subcategory.isGroup" piwik-menudropdown show-search="true" menu-title="{{ subcategory.name|escape }}"> - <a class="item" - ng-repeat="subcat in subcategory.subcategories" - title="{{ subcat.tooltip }}" - ng-class="{'active': subcat.active}" - ng-href="#?{{ makeUrl(category,subcat) }}" - ng-click='loadSubcategory(category, subcat)'> - {{ subcat.name }} - </a> - </div> - - <a ng-if="!subcategory.isGroup" - ng-href="#?{{ makeUrl(category,subcategory) }}" - class="menuItem" - ng-click='loadSubcategory(category, subcategory)'> - {{ subcategory.name }} +<ul class="navbar"> + <li ng-repeat="category in menuModel.menu" + class="menuTab" + ng-class="{'active': category.active}"> + <a class="item" + ng-href="#?{{ makeUrl(category,category.subcategories[0]) }}" + ng-click="loadSubcategory(category, category.subcategories[0])"> + <span class="menu-icon {{ category.icon ? category.icon : 'icon-arrow-right' }}"></span>{{ category.name }} + <span class="hidden"> + {{ 'CoreHome_Menu'|translate }} + </span> + </a> + <ul> + <li ng-repeat="subcategory in category.subcategories" + ng-class="{'active': subcategory.active}"> + <div ng-if="subcategory.isGroup" piwik-menudropdown show-search="true" menu-title="{{ subcategory.name|escape }}"> + <a class="item" + ng-repeat="subcat in subcategory.subcategories" + title="{{ subcat.tooltip }}" + ng-class="{'active': subcat.active}" + ng-href="#?{{ makeUrl(category,subcat) }}" + ng-click='loadSubcategory(category, subcat)'> + {{ subcat.name }} </a> - </li> - </ul> - </li> - <li id="Searchmenu"> - <span piwik-quick-access></span> - </li> - </ul> + </div> -</div> \ No newline at end of file + <a ng-if="!subcategory.isGroup" + ng-href="#?{{ makeUrl(category,subcategory) }}" + class="item" + ng-click='loadSubcategory(category, subcategory)'> + {{ subcategory.name }} + </a> + </li> + </ul> + </li> +</ul> \ No newline at end of file diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js index 7cdd9e951b45a95717b6e5bdedea15e3254cf86a..1b524d3e9b0fe343bc98b0aa0064153b0d06a7bf 100644 --- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js +++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js @@ -23,6 +23,7 @@ return { restrict: 'A', + replace: true, scope: {}, templateUrl: 'plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html?cb=' + piwik.cacheBuster, controller: 'ReportingMenuController' diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.js b/plugins/CoreHome/angularjs/selector/selector.directive.js new file mode 100644 index 0000000000000000000000000000000000000000..37db1d5743e88c982e1634d3519a65493578fe4a --- /dev/null +++ b/plugins/CoreHome/angularjs/selector/selector.directive.js @@ -0,0 +1,87 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +/** + * + */ +(function () { + angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick); + + piwikExpandOnClick.$inject = ['$document']; + + function piwikExpandOnClick($document){ + + return { + restrict: 'A', + link: function(scope, element, attr) { + + element.find('.title').on('click', function () { + element.toggleClass('expanded'); + }); + + function onClickOutsideElement (event) { + if (element.has(event.target).length === 0) { + element.removeClass('expanded'); + } + } + + function onEscapeHandler (event) { + if (event.which === 27) { + element.removeClass('expanded'); + } + } + + $document.on('keyup', onEscapeHandler); + $document.on('mouseup', onClickOutsideElement); + scope.$on('$destroy', function() { + $document.off('mouseup', onClickOutsideElement); + $document.off('keyup', onEscapeHandler); + }); + } + }; + } + + angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover); + + piwikExpandOnHover.$inject = ['$document']; + + function piwikExpandOnHover($document){ + + return { + restrict: 'A', + link: function(scope, element, attr) { + + element.on('mouseenter', '.title', function () { + element.addClass('expanded'); + }); + + element.on('mouseleave', function () { + element.removeClass('expanded'); + }); + + function onClickOutsideElement (event) { + if (element.has(event.target).length === 0) { + element.removeClass('expanded'); + } + } + + function onEscapeHandler (event) { + if (event.which === 27) { + element.removeClass('expanded'); + } + } + + $document.on('keyup', onEscapeHandler); + $document.on('mouseup', onClickOutsideElement); + scope.$on('$destroy', function() { + $document.off('mouseup', onClickOutsideElement); + $document.off('keyup', onEscapeHandler); + }); + } + }; + } +})(); diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.less b/plugins/CoreHome/angularjs/selector/selector.directive.less new file mode 100644 index 0000000000000000000000000000000000000000..9c0e207d4d0dec2d22d1b77a84ed636a41f296eb --- /dev/null +++ b/plugins/CoreHome/angularjs/selector/selector.directive.less @@ -0,0 +1,59 @@ +.piwikSelector { + display: inline-block; + line-height: 0; + + span.title, + a.title { + .font-default(11px, 12px); + display: inline-block; + width: 100%; + padding: 11px 19px 10px; + white-space: nowrap; + cursor: pointer; + text-transform: uppercase; + text-decoration: none; + color: @theme-color-text; + + &.activityIndicator { + background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + + .icon { + visibility: hidden; + } + } + + .icon { + padding-left: 6px; + display: inline-block; + vertical-align: top; + + &.iconHidden { + visibility: hidden; + } + } + + .icon:not(.icon-fixed) { + float: right; + &:after { + clear:right; + content: ' '; + } + } + + &:hover, &:focus { + text-decoration: none; + } + } + + .dropdown { + .font-default(11px, 15px); + display: none; + padding: 5px 19px 11px 19px; + } + + &.expanded { + .dropdown { + display: block; + } + } +} diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html index 5f6a3cac8ad029ca3c96fbed82095c33e6e2cc74..3a4cbec8f29f9849858964e8ba0866d08d8cdd83 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html @@ -1,5 +1,6 @@ -<div piwik-focus-anywhere-but-here="view.showSitesList=false" class="custom_select" - ng-class="{'sites_autocomplete--dropdown': (model.hasMultipleWebsites || showAllSitesItem || !model.sites.length)}"> +<div piwik-focus-anywhere-but-here="view.showSitesList=false" + class="siteSelector piwikSelector borderedControl" + ng-class="{'expanded': view.showSitesList}"> <script type="text/ng-template" id="siteselector_allsiteslink.html"> <div ng-click="switchSite({idsite: 'all', name: allSitesText});view.showSitesList=false;" @@ -13,13 +14,19 @@ <input ng-if="inputName" type="hidden" name="{{ inputName }}" ng-value="selectedSite.id"/> <a ng-click="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();" + piwik-onenter="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();" href="javascript:void(0)" - class="custom_select_main_link" - ng-class="{'loading': model.isLoading}"> - <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span> + title="{{ 'General_ChooseWebsite'|translate }}" + ng-class="{'loading': model.isLoading}" + class="title"> + <span class="icon icon-arrow-bottom" + ng-class="{'iconHidden': model.isLoading, 'collapsed': !view.showSitesList}"></span> + <span>{{ 'General_Website'| translate }}: + <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span> + </span> </a> - <div ng-show="view.showSitesList" class="custom_select_block"> + <div ng-show="view.showSitesList" class="dropdown"> <div ng-if="allSitesLocation=='top' && showAllSitesItem" ng-include="'siteselector_allsiteslink.html'"></div> @@ -49,10 +56,8 @@ ng-click="view.searchTerm=''" ng-model="view.searchTerm" ng-change="model.searchSite(view.searchTerm)" + placeholder="{{ 'General_Search' | translate }}" class="websiteSearch inp"/> - <input type="submit" - ng-click="model.searchSite(view.searchTerm)" - value="{{ 'General_Search' | translate }}" class="but"/> <img title="Clear" ng-show="view.searchTerm" ng-click="view.searchTerm=''; model.loadInitialSites()" diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js index 450813f2e14a631705144688f91162769a172af6..ba5c492cb84f57d045807b317e69044a7b817ece 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js @@ -26,9 +26,9 @@ (function () { angular.module('piwikApp').directive('piwikSiteselector', piwikSiteselector); - piwikSiteselector.$inject = ['$document', 'piwik', '$filter']; + piwikSiteselector.$inject = ['$document', 'piwik', '$filter', '$timeout']; - function piwikSiteselector($document, piwik, $filter){ + function piwikSiteselector($document, piwik, $filter, $timeout){ var defaults = { name: '', siteid: piwik.idSite, @@ -85,6 +85,10 @@ scope.$watch('view.showSitesList', function (newValue) { element.toggleClass('expanded', !! newValue); }); + + $timeout(function () { + initTopControls(); + }); }; } }; diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less index 8b38e556df88e8d52a3009be7edfac1a0369b11c..4afc63a8f9bbdb945d767396d814df04abcc7ac0 100644 --- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less +++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less @@ -1,155 +1,137 @@ - -/*sites_autocomplete*/ -.sites_autocomplete { - position: absolute; - font-size: 12px; - display: inline-block; - height: 30px; /* Hack to not push the dashboard widget below */ -} - -table.dataTable tr td .sites_autocomplete a { - width: auto; -} - -.sites_selector_in_dashboard { - margin-top:10px; -} -.top_bar_sites_selector { - float: right -} - -.top_bar_sites_selector > label { - display: inline-block; - padding: 7px 0 6px 0; - float: left; - font-size: 12px; -} - -.top_bar_sites_selector > .sites_autocomplete { - position: static; - margin-left: 12px; -} - .autocompleteMatched { color: #5256BE; font-weight: bold; } - -.sites_autocomplete .custom_select { - float: left; - position: relative; - z-index: 19; - background: @theme-color-background-base url(plugins/Morpheus/images/sites_selection.png) repeat-x 0 0; - border: 1px solid @color-silver-l85; - color: #255792; - border-radius: 4px; - cursor: pointer; - width: 205px; -} - -.sites_autocomplete .custom_select_main_link { - display: block; - text-decoration: none; - background: none; - cursor: default; - padding: 9px 5px 7px 5px; -} - -#content.admin .adminTable .sites_autocomplete a { - text-decoration: none; -} - -.sites_autocomplete .custom_select_ul_list li a, -.sites_autocomplete .custom_select_all a, -.sites_autocomplete .custom_select_main_link > span { +.siteSelector { + a.title { + .icon.collapsed.iconHidden { + visibility: visible; + } + } + .dropdown { + max-width: 210px; + } +} + +#content { + .sites_autocomplete { + position: static !important; + height: 36px; + z-index: 99; + vertical-align: middle; + + > .siteSelector { + position: absolute; + z-index: 9999; + } + + a.title { + text-decoration: none; + } + } +} + +.siteSelector.expanded { + .loading { + background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + } +} + +.siteSelector a.title, +.siteSelector .custom_select_ul_list li a, +.siteSelector .custom_select_all a, +.siteSelector .custom_select_main_link > span { display: inline-block; - max-width: 170px; + max-width: 210px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - padding: 0 10px 0 4px; -} - -.sites_autocomplete--dropdown .custom_select_main_link:not(.loading):before { - content: " \25BC"; - position: absolute; - right: 0; - font-size: 0.8em; - margin-top: 0.2em; - color: @theme-color-text-light; - margin-top: 9px; + padding: 0; + color: @theme-color-text; + text-transform: uppercase; + width: 100%; } -.sites_autocomplete--dropdown .custom_select_main_link { - cursor: pointer; - position: relative; -} +.siteSelector a.title { + > span { + max-width: 161px; + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + } -.sites_autocomplete .custom_select_main_link.loading { - background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px; + span { + vertical-align: top; + } } -.sites_autocomplete .custom_select_ul_list, -.sites_autocomplete ul.ui-autocomplete { +.siteSelector .custom_select_ul_list, +.siteSelector ul.ui-autocomplete { position: relative; list-style: none; line-height: 18px; padding: 0 0 15px 0; + box-shadow: none !important; } -.sites_autocomplete .custom_select_ul_list li a, -.sites_autocomplete .custom_select_all a { +.siteSelector .custom_select_ul_list { + padding: 0 0 5px 0; +} + +.siteSelector .dropdown { + padding-top: 0; +} + +.siteSelector .custom_select_ul_list li a, +.siteSelector .custom_select_all a { line-height: 18px; height: auto; display: block; text-decoration: none; + padding-left: 5px; + margin-left: -5px; } -.sites_autocomplete .custom_select_ul_list li a:hover, -.sites_autocomplete .custom_select_all a:hover { +.siteSelector .custom_select_ul_list li a:hover, +.siteSelector .custom_select_all a:hover { background: #ebeae6; } -.sites_autocomplete .custom_select_all a { +.siteSelector .custom_select_all a { text-decoration: none; - margin: 0 0 5px 0; + margin: 0 0 5px -5px; } -.sites_autocomplete .custom_select_search { - margin: 0 0 0 4px; - height: 26px; +.siteSelector .custom_select_search { + margin: 0; + height: 33px; display: block; white-space: nowrap; - background: url(plugins/Morpheus/images/search_bg.png) no-repeat 0 0; -} - -.sites_autocomplete .custom_select_search .inp { - vertical-align: top; - width: 165px; - padding: 2px 6px !important; - border: 0 !important; - background: transparent !important; - font-size: 10px !important; - color: #454545 !important; - -} -.sites_autocomplete { - width: 205px; -} - -.sites_autocomplete .custom_select_search .but { - vertical-align: top; - font-size: 10px; - border: 0; - background: transparent; - width: 21px; - height: 17px; - overflow: hidden; - opacity: 0; - cursor: pointer; + position: relative; + padding-top: 4px; + + .inp { + vertical-align: top; + width: 100%; + padding: 4px 6px !important; + border: 1px solid #d0d0d0 !important; + background: transparent !important; + font-size: 11px !important; + color: #454545 !important; + } + .reset { + position: absolute; + top: 10px; + right: 4px; + cursor: pointer; + } +} + +.siteSelector { + width: auto; } -.sites_selector_container>.sites_autocomplete { +.sites_selector_container>.siteSelector { padding-left: 12px; } @@ -158,17 +140,6 @@ table.dataTable tr td .sites_autocomplete a { float:none;position:static } -.custom_select_search .reset { - position: relative; top: 3px; left: -50px; cursor: pointer; -} - -.custom_select_block { - overflow: hidden; - max-width: inherit; - visibility: visible; - padding: 0 5px 7px 5px; -} - .custom_select_block_show { height: auto; overflow: visible; diff --git a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html index db98dee89552650992ed17f043b88a8a0d1c668f..32bb13331e999333700df64ad6f1b73ed221885e 100644 --- a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html +++ b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html @@ -14,7 +14,7 @@ </div> </div> - <div style="float:left;max-width:900px;"> + <div style="float:left;max-width:730px;"> <h2 ng-if="selectedWidget.name" class="noTopMargin">{{ selectedWidget.name }}</h2> <div ng-if="selectedWidget.parameters" class="dimensionReport" diff --git a/plugins/CoreHome/javascripts/calendar.js b/plugins/CoreHome/javascripts/calendar.js index 1c308fb74c3492ff9eba7f059df3994ac8a5c68b..004c15e0aad498092a6c6447614e13755012de36 100644 --- a/plugins/CoreHome/javascripts/calendar.js +++ b/plugins/CoreHome/javascripts/calendar.js @@ -294,7 +294,6 @@ var togglePeriodPickers = function (showSingle) { $('#periodString').find('.period-date').toggle(showSingle); $('#periodString').find('.period-range').toggle(!showSingle); - $('#calendarRangeApply').toggle(!showSingle); }; // @@ -355,7 +354,24 @@ }); var reloading = false; - var changePeriodOnClick = function (periodInput) { + + var changePeriodWithPageReload = function (periodInput) { + var url = periodInput.val(), + period = broadcast.getValueFromUrl('period', url); + + // if clicking on the selected period, change the period but not the date + if (period != 'range' && !reloading) { + // only reload if current period is different from selected + reloading = true; + selectedPeriod = period; + updateDate(piwik.currentDateString); + return true; + } + + return false; + }; + + var changePeriodOnClickIfPeriodChanged = function (periodInput) { if (reloading) // if a click event resulted in reloading, don't reload again { return; @@ -367,11 +383,10 @@ // if clicking on the selected period, change the period but not the date if (selectedPeriod == period && selectedPeriod != 'range') { // only reload if current period is different from selected - if (piwik.period != selectedPeriod && !reloading) { - reloading = true; - selectedPeriod = period; - updateDate(piwik.currentDateString); + if (piwik.period != selectedPeriod) { + return changePeriodWithPageReload(periodInput); } + return true; } @@ -380,16 +395,50 @@ $("#otherPeriods").find("label,input").on('dblclick', function (e) { var id = $(e.target).attr('for'); - changePeriodOnClick($('#' + id)); + changePeriodOnClickIfPeriodChanged($('#' + id)); + }); + + $("#otherPeriods").find("label,input").on('dblclick', function (e) { + var id = $(e.target).attr('for'); + changePeriodOnClickIfPeriodChanged($('#' + id)); }); + // Apply date range button will reload the page with the selected range + $('#calendarApply') + .on('click', function () { + var $selectedPeriod = $('#periodMore [name=period]:checked'); + + if (!$selectedPeriod.is('#period_id_range')) { + changePeriodWithPageReload($selectedPeriod); + return true; + } + + var dateFrom = $('#inputCalendarFrom').val(), + dateTo = $('#inputCalendarTo').val(), + oDateFrom = $.datepicker.parseDate('yy-mm-dd', dateFrom), + oDateTo = $.datepicker.parseDate('yy-mm-dd', dateTo); + + if (!isValidDate(oDateFrom) + || !isValidDate(oDateTo) + || oDateFrom > oDateTo) { + $('#alert').find('h2').text(_pk_translate('General_InvalidDateRange')); + piwikHelper.modalConfirm('#alert', {}); + return false; + } + piwikHelper.showAjaxLoading('ajaxLoadingCalendar'); + broadcast.propagateNewPage('period=range&date=' + dateFrom + ',' + dateTo); + }) + .show(); + + + // when non-range period is clicked, change the period & refresh the date picker $("#otherPeriods").find("input").on('click', function (e) { var request_URL = $(e.target).val(), period = broadcast.getValueFromUrl('period', request_URL), lastPeriod = selectedPeriod; - if (changePeriodOnClick($(e.target))) { + if (changePeriodOnClickIfPeriodChanged($(e.target))) { return true; } @@ -440,21 +489,6 @@ toggleMonthDropdown(selectedPeriod == 'year'); }); - // reset date/period when opening calendar - $("#periodString").on('click', "#date,.calendar-icon", function () { - var periodMore = $("#periodMore").toggle(); - if (periodMore.is(":visible")) { - periodMore.find(".ui-state-highlight").removeClass('ui-state-highlight'); - } - }); - - $('body').on('click', function(e) { - var target = $(e.target); - if (target.closest('html').length && !target.closest('#periodString').length && !target.is('option') && $("#periodMore").is(":visible")) { - $("#periodMore").hide(); - } - }); - function onDateRangeSelect(dateText, inst) { var toOrFrom = inst.id == 'calendarFrom' ? 'From' : 'To'; $('#inputCalendar' + toOrFrom).val(dateText); @@ -487,27 +521,6 @@ // If not called, the first date appears light brown instead of dark brown $('.ui-state-hover').removeClass('ui-state-hover'); - // Apply date range button will reload the page with the selected range - $('#calendarRangeApply') - .on('click', function () { - var request_URL = $(e.target).val(); - var dateFrom = $('#inputCalendarFrom').val(), - dateTo = $('#inputCalendarTo').val(), - oDateFrom = $.datepicker.parseDate('yy-mm-dd', dateFrom), - oDateTo = $.datepicker.parseDate('yy-mm-dd', dateTo); - - if (!isValidDate(oDateFrom) - || !isValidDate(oDateTo) - || oDateFrom > oDateTo) { - $('#alert').find('h2').text(_pk_translate('General_InvalidDateRange')); - piwikHelper.modalConfirm('#alert', {}); - return false; - } - piwikHelper.showAjaxLoading('ajaxLoadingCalendar'); - broadcast.propagateNewPage('period=range&date=' + dateFrom + ',' + dateTo); - }) - .show(); - // Bind the input fields to update the calendar's date when date is manually changed $('#inputCalendarFrom, #inputCalendarTo') .keyup(function (e) { @@ -520,7 +533,7 @@ } $("#calendar" + fromOrTo).datepicker("setDate", newDate); if (e.keyCode == 13) { - $('#calendarRangeApply').click(); + $('#calendarApply').click(); } }); return true; @@ -534,6 +547,8 @@ if (piwik.period == 'range') { $("#period_id_range").click(); } + + initTopControls(); }); }(jQuery)); diff --git a/plugins/CoreHome/javascripts/corehome.js b/plugins/CoreHome/javascripts/corehome.js index 16a5abecbdac1256aaa4451655b4a0a4b71af672..f2a7468d6a82c5e2e69fadfd6b08de797d0243c3 100755 --- a/plugins/CoreHome/javascripts/corehome.js +++ b/plugins/CoreHome/javascripts/corehome.js @@ -27,17 +27,26 @@ module: 'CoreHome', action: 'checkForUpdates' }, 'get'); + ajaxRequest.withTokenInUrl(); + + var $titleElement = $(this); + $titleElement.addClass('activityIndicator'); + ajaxRequest.setCallback(function (response) { headerMessage.fadeOut('slow', function () { response = $(response); + $titleElement.removeClass('activityIndicator'); + var newVersionAvailable = response.hasClass('header_alert'); if (newVersionAvailable) { headerMessage.replaceWith(response); + headerMessage.show(); } else { - headerMessage.html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion')).show(); + headerMessage.find('.title').html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion')); + headerMessage.show(); setTimeout(function () { headerMessage.fadeOut('slow', function () { headerMessage.replaceWith(response); @@ -55,7 +64,7 @@ // when clicking the header message, show the long message w/o needing to hover headerMessageParent.on('click', '#header_message', function (e) { if (e.target.tagName.toLowerCase() != 'a') { - $(this).toggleClass('active'); + $(this).toggleClass('expanded'); } }); diff --git a/plugins/CoreHome/javascripts/numberFormatter.js b/plugins/CoreHome/javascripts/numberFormatter.js new file mode 100644 index 0000000000000000000000000000000000000000..2d3bcc172b3f2bac4f1921a3175f9f50d02301eb --- /dev/null +++ b/plugins/CoreHome/javascripts/numberFormatter.js @@ -0,0 +1,143 @@ +/*! + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +/** + * Number Formatter for formatting numbers, percent and currencies values + * + * @type {object} + */ +var NumberFormatter = (function () { + + var minimumFractionDigits = 0; + var maximumFractionDigits = 2; + + /** + * Formats the given numeric value with the given pattern + * + * @param value + * @param pattern + * @returns {string} + */ + function format(value, pattern) { + + if (!$.isNumeric(value)) { + return value; + } + pattern = pattern || piwik.numbers.patternNumber; + + var patterns = pattern.split(';'); + if (patterns.length == 1) { + // No explicit negative pattern was provided, construct it. + patterns.push('-' + patterns[0]) + } + + // Ensure that the value is positive and has the right number of digits. + var negative = value < 0; + pattern = negative ? patterns[1] : patterns[0]; + + var usesGrouping = (pattern.indexOf(',') != -1); + // if pattern has number groups, parse them. + if (usesGrouping) { + var primaryGroupMatches = pattern.match(/#+0/); + var primaryGroupSize = primaryGroupMatches[0].length; + var secondaryGroupSize = primaryGroupMatches[0].length; + var numberGroups = pattern.split(','); + // check for distinct secondary group size. + if (numberGroups.length > 2) { + secondaryGroupSize = numberGroups[1].length; + } + } + + var signMultiplier = negative ? '-1' : '1'; + value = value * signMultiplier; + // Split the number into major and minor digits. + var valueParts = value.toString().split('.'); + var majorDigits = valueParts[0]; + // Account for maximumFractionDigits = 0, where the number won't + // have a decimal point, and $valueParts[1] won't be set. + minorDigits = valueParts[1] || ''; + if (usesGrouping) { + // Reverse the major digits, since they are grouped from the right. + majorDigits = majorDigits.split('').reverse(); + // Group the major digits. + var groups = []; + groups.push(majorDigits.splice(0, primaryGroupSize).reverse().join('')); + while (majorDigits.length) { + groups.push(majorDigits.splice(0, secondaryGroupSize).reverse().join('')); + } + // Reverse the groups and the digits inside of them. + groups = groups.reverse(); + // Reconstruct the major digits. + majorDigits = groups.join(','); + } + if (minimumFractionDigits < maximumFractionDigits) { + // Strip any trailing zeroes. + var minorDigits = minorDigits.replace(/0+$/,''); + if (minorDigits.length < minimumFractionDigits) { + // Now there are too few digits, re-add trailing zeroes + // until the desired length is reached. + var neededZeroes = minimumFractionDigits - minorDigits.length; + minorDigits += (new Array(neededZeroes+1)).join('0'); + } + } + // Assemble the final number and insert it into the pattern. + value = minorDigits ? majorDigits + '.' + minorDigits : majorDigits; + value = pattern.replace(/#(?:[\.,]#+)*0(?:[,\.][0#]+)*/, value); + // Localize the number. + return replaceSymbols(value); + } + + /** + * Replaces the placeholders with real symbols + * + * @param value + * @returns {string} + */ + function replaceSymbols(value) { + var replacements = { + '.': piwik.numbers.symbolDecimal, + ',': piwik.numbers.symbolGroup, + '+': piwik.numbers.symbolPlus, + '-': piwik.numbers.symbolMinus, + '%': piwik.numbers.symbolPercent + }; + + var newValue = ''; + var valueParts = value.split(''); + + $.each(valueParts, function(index, value) { + $.each(replacements, function(char, replacement) { + if (value.indexOf(char) != -1) { + value = value.replace(char, replacement); + return false; + } + }); + newValue += value; + }); + + return newValue; + } + + /** + * Public available methods + */ + return { + + formatNumber: function (value) { + return format(value, piwik.numbers.patternNumber); + }, + + formatPercent: function (value) { + return format(value, piwik.numbers.patternPercent); + }, + + formatCurrency: function (value, currency) { + var formatted = format(value, piwik.numbers.patternCurrency); + return formatted.replace('¤', currency); + } + } +})(); diff --git a/plugins/CoreHome/javascripts/top_controls.js b/plugins/CoreHome/javascripts/top_controls.js index 62ce3ceccadf998982ef29a175b59952ac4b1a79..38b069d6c59e26b1de1552ce9eb4320c3ec508c7 100644 --- a/plugins/CoreHome/javascripts/top_controls.js +++ b/plugins/CoreHome/javascripts/top_controls.js @@ -5,9 +5,29 @@ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later */ function initTopControls() { + function getOverlap(element1, element2) + { + if (!element1 || !element1.getBoundingClientRect || !element2 || !element2.getBoundingClientRect) { + return 0; + } + + var rect1 = element1.getBoundingClientRect(); + var rect2 = element2.getBoundingClientRect(); + + var doOverlap = !(rect1.right < rect2.left || rect1.left > rect2.right); + + if (doOverlap) { + return rect1.left - rect2.right; + } + + return 0; + } + var $topControlsContainer = $('.top_controls'), left = 0; + var allRendered = true; + if ($topControlsContainer.length) { $('.piwikTopControl').each(function () { var $control = $(this); @@ -16,12 +36,32 @@ function initTopControls() { } $control.css('left', left); + var width = $control.outerWidth(true); - if (!$.contains($topControlsContainer[0], this)) { - $control.detach().appendTo($topControlsContainer); + var isControlFullyRendered = width >= 30; + if (!isControlFullyRendered) { + allRendered = false; } - left += $control.outerWidth(true); + left += width; }); + + if (allRendered) { + // we make top controls visible only after all selectors are rendered + $('.top_controls').css('visibility', 'visible'); + $('.top_controls').css('opacity', '1'); + } + + var header = $('#header_message.isPiwikDemo'); + if (header.length) { + // make sure isPiwikDemo message is always fully visible, move it to the right if needed + var lastSelector = $('.top_controls .piwikTopControl:last'); + + var overlap = getOverlap(header[0], lastSelector[0]); + if (header[0] !== lastSelector[0] && overlap !== 0) { + header.css('right', (Math.abs(overlap) + 18) * -1); + } + } + } } \ No newline at end of file diff --git a/plugins/CoreHome/lang/de.json b/plugins/CoreHome/lang/de.json index 7d9e83a1db4650be03f4e4c4baa5df07ffe20f61..e0f2df25056106e4d9da85964e22cb3ba59f8fdc 100644 --- a/plugins/CoreHome/lang/de.json +++ b/plugins/CoreHome/lang/de.json @@ -48,6 +48,9 @@ "YouAreUsingTheLatestVersion": "Sie verwenden die aktuelle Version von Piwik!", "ClickRowToExpandOrContract": "Klicken Sie auf diese Zeile um die Untertabelle anzuzeigen oder zu verbergen.", "UndoPivotBySubtable": "Pivot erstellt für diesen Bericht %s Pivot rückgängig machen", - "PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %s Pivot erstellen mit %s" + "PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %s Pivot erstellen mit %s", + "QuickAccessTitle": "Suche nach Menüeinträgen, Segmenten und Websites. Tastenkürzel: Drücken Sie 'f' um zu suchen.", + "Segments": "Segmente", + "AdblockIsMaybeUsed": "Für den Fall, dass Sie einen Ad-Blocker verwenden, deaktivieren Sie diesen bitte für diese Seite um sicherzustellen, dass Piwik problemlos läuft." } } \ No newline at end of file diff --git a/plugins/CoreHome/lang/el.json b/plugins/CoreHome/lang/el.json index 9fea9102c19f6495c176fb217ace5dadad9331c4..5f09a036d77b233af5168c23d4909059a7ba10fa 100644 --- a/plugins/CoreHome/lang/el.json +++ b/plugins/CoreHome/lang/el.json @@ -48,6 +48,9 @@ "YouAreUsingTheLatestVersion": "ΧÏησιμοποιείτε την τελευταία Îκδοση του Piwik!", "ClickRowToExpandOrContract": "Πατήστε στη γÏαμμή για να επεκταθεί ή να κÏυφτεί ο υποπίνακας.", "UndoPivotBySubtable": "Η αναφοÏά θεμελιώθηκε %s ΑναίÏεση της θεμελίωσης", - "PivotBySubtable": "Η αναφοÏά αυτή δεν είναι θεμελιωμÎνη %s Îα θεμελιωθεί από %s" + "PivotBySubtable": "Η αναφοÏά αυτή δεν είναι θεμελιωμÎνη %s Îα θεμελιωθεί από %s", + "QuickAccessTitle": "Αναζήτηση για καταχωÏήσεις μενοÏ, τμήματα και ιστοτόπους. ΠλήκτÏο συντόμευσης: Πατήστε 'f' για αναζήτηση.", + "Segments": "Τμήματα", + "AdblockIsMaybeUsed": "Σε πεÏίπτωση που χÏησιμοποιείτε κάποια Ï€ÏόγÏαμμα που μπλοκάÏει τις διαφημίσεις, παÏακαλοÏμε απενεÏγοποιήστε το για αυτόν τον ιστοτόπο για να είστε σίγουÏοι ότι το Piwik δουλεÏει σωστά." } } \ No newline at end of file diff --git a/plugins/CoreHome/lang/en.json b/plugins/CoreHome/lang/en.json index 7b3d4bbcf396a165c73b42969e899bb8ad3fe2df..6e38e1d0f28b64ab132e42723d35ad18aedefe4f 100644 --- a/plugins/CoreHome/lang/en.json +++ b/plugins/CoreHome/lang/en.json @@ -49,6 +49,10 @@ "ClickRowToExpandOrContract": "Click this row to expand or contract the subtable.", "UndoPivotBySubtable": "This report has been pivoted %s Undo pivot", "PivotBySubtable": "This report is not pivoted %s Pivot by %s", - "NoSuchPage": "This page does not exist" + "NoSuchPage": "This page does not exist", + "QuickAccessTitle": "Search for %s. Shortcut: Press 'f' to search.", + "MenuEntries": "Menu entries", + "Segments": "Segments", + "AdblockIsMaybeUsed": "In case you are using an ad blocker, please disable it for this site to make sure Piwik works without any issues." } } diff --git a/plugins/CoreHome/lang/it.json b/plugins/CoreHome/lang/it.json index e2ad63bd98bf097ef072c613b22e4948fff57d16..d002b7d0574c6b25d355fd0fb4812e4609e9fa77 100644 --- a/plugins/CoreHome/lang/it.json +++ b/plugins/CoreHome/lang/it.json @@ -48,6 +48,8 @@ "YouAreUsingTheLatestVersion": "Stai utilizzando l'ultima versione di Piwik!", "ClickRowToExpandOrContract": "Clicca su questa riga per espandere o restringere la sotto-tabella.", "UndoPivotBySubtable": "Questo report è stato imperniato al Pivot %s Undo", - "PivotBySubtable": "Questo report non è imperniato al Pivot %s da %s" + "PivotBySubtable": "Questo report non è imperniato al Pivot %s da %s", + "QuickAccessTitle": "Ricerca selezioni da menù, segmenti e siti web. Scorciatoia: Premi 'f' per la ricerca.", + "Segments": "Segmenti" } } \ No newline at end of file diff --git a/plugins/CoreHome/lang/pt-br.json b/plugins/CoreHome/lang/pt-br.json index 24470d4b52955baa7920b1b2cb7eabc66bb59a60..61c4fe38192767e340d2e021c98982ce5c9bbd92 100644 --- a/plugins/CoreHome/lang/pt-br.json +++ b/plugins/CoreHome/lang/pt-br.json @@ -48,6 +48,8 @@ "YouAreUsingTheLatestVersion": "Você está usando a última versão do Piwik!", "ClickRowToExpandOrContract": "Clique nesta linha para expandir ou contrair a subtabela.", "UndoPivotBySubtable": "Este relatório foi articulado %s desfazer articulação", - "PivotBySubtable": "Este relatório não foi articulado %s Articular por %s" + "PivotBySubtable": "Este relatório não foi articulado %s Articular por %s", + "QuickAccessTitle": "Procurar por entradas do menu, segmentos e websites. Atalho: Pressione 'f' para pesquisar.", + "Segments": "Segmentos" } } \ No newline at end of file diff --git a/plugins/CoreHome/stylesheets/coreHome.less b/plugins/CoreHome/stylesheets/coreHome.less index 63607d749f5c4cdf779109c10c0f562d0e18c5d1..9be7d148797ceb272db1949ece74388731923402 100644 --- a/plugins/CoreHome/stylesheets/coreHome.less +++ b/plugins/CoreHome/stylesheets/coreHome.less @@ -1,8 +1,7 @@ .home { h2 { font-size: 18px; - padding: 12px 0 7px 0; - clear: both; + padding: 16px 0 16px 0; border: none; margin: 0; } @@ -18,21 +17,19 @@ } } -.nav_sep { - height: 39px; - border-radius: 0 4px 0 0; - border: 1px solid #DDD; -} - -.pageWrap { - margin-top: 15px; - font-size: 13px; -} - /* Content */ #content.home { - padding-top: 5px; font-size: 14px; + display: inline-block; + width: 100%; + + > h2:first-child { + padding-top: 7px; + } +} + +#content.admin { + display: inline-block; } /* 2 columns reports */ @@ -110,10 +107,8 @@ div.ui-datepicker { line-height: 12px; } -#calendarRangeApply { - display: none; +#calendarApply { margin-top: 10px; - margin-left: 10px; } #invalidDateRange { @@ -211,10 +206,6 @@ a.Piwik_Popover_Error_Back { margin: 10px auto 5px !important; } -.header_short #updateCheckLinkContainer .icon { - display: none; -} - .header_full #updateCheckLinkContainer { margin-top: -2px; } @@ -230,39 +221,6 @@ a.Piwik_Popover_Error_Back { width: 160px; } -#updateCheckLinkContainer { - opacity: 0.7; -} - -#updateCheckLinkContainer:hover { - opacity: 1; -} - -#updateCheckLinkContainer { - float: right; - cursor: pointer; -} - -#updateCheckLinkContainer>* { - vertical-align: middle; -} - -#header_message #checkForUpdates { - font-size: 10px; - line-height: 16px; - display: inline-block; - vertical-align: middle; - text-transform: uppercase; -} - -#header_message #checkForUpdates { - text-decoration: none; -} - -#header_message #checkForUpdates:hover { - text-decoration: underline; -} - /* Used to link within content text, without adding visual clutter */ .linkContent { color:#333; text-decoration:none} .linkContent:hover { text-decoration:underline;} @@ -271,4 +229,10 @@ a.Piwik_Popover_Error_Back { border-bottom: 0 none; margin:0; font-size:18px; -} \ No newline at end of file +} + +#pluginSettings { + .settingIntroduction { + font-weight: bold; + } +} diff --git a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less index 5932fd0978286af7f04cba25c4d0205148580ccb..4b5f8321b2e6e73feedb93b7cb7e57f00e68a00a 100644 --- a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less +++ b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less @@ -42,6 +42,10 @@ table.dataTable img { margin-left: 0.5em; } +table.subDataTable img.link { + transform: translateY(-50%); +} + table.dataTable tr.subDataTable { cursor: pointer; @@ -164,7 +168,7 @@ div.dataTable, div.dataTable > .dataTableWrapper { color: #888; text-align: left; margin: 10px; - margin-left: 12px; + margin-left: 1px; } .dataTablePages { @@ -589,7 +593,7 @@ tr td.label img.plusMinus { .pk-emptyDataTable { padding-top: 20px; padding-bottom: 10px; - padding-left: 11px; + padding-left: 1px; } .widget .pk-emptyDataTable { diff --git a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css index c3077b7b5fff731a34915d3c5b83e9a94e04d30a..8bac824f1c3f03b610b6749499d186d6d71c1de6 100644 --- a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css +++ b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css @@ -59,7 +59,7 @@ } .ui-corner-all { - border-radius: 4px; + border-radius: 0; } .ui-menu .ui-menu-item a.ui-state-focus { diff --git a/plugins/CoreHome/stylesheets/layout.less b/plugins/CoreHome/stylesheets/layout.less new file mode 100644 index 0000000000000000000000000000000000000000..ac6d3ed8a6f38b138c13d8705dd87fd6f650f089 --- /dev/null +++ b/plugins/CoreHome/stylesheets/layout.less @@ -0,0 +1,397 @@ + #header { + padding: 0 15px; + background-color: @theme-color-background-base; + height: 50px; + + /* Clear fix */ + &:after { + display: table; + clear: both; + content: ""; + } + + .icon-menu-hamburger { + display: none; + } + + #logo { + } + + #topRightBar { + li { + display: inline-block; + } + + .topBarElem { + color: @theme-color-text; + text-decoration: none; + padding: 14px 12px; + display: inline-block; + height: 100%; + transition: background-color 150ms linear; + + &:hover { + background-color: @theme-color-menu-contrast-background; + } + + &.active { + color: @theme-color-brand; + } + + .menuDropdown { + color: @theme-color-text; + .title:after { + color: @theme-color-text; + border-top-color: @theme-color-text; + } + } + } + + .navbar-right { + height: 48px; + position: absolute; + right: 10px; + font-size: 13px; + } + } +} + + .navbar { + a { + text-decoration: none; + &:hover, &:focus, &:active { + text-decoration: none; + } + } + } + + // start #secondNavBar fadeInLeft animation + @-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } + } + @keyframes fadeInLeft { + 0% { + opacity: 0; + transform: translateX(-20px); + } + 100% { + opacity: 1; + transform: translateX(0); + } + } + // end #secondNavBar fadeInLeft animation + +#root { + + .pageWrap { + padding-left: 18px; + padding-right: 15px; + } + + #secondNavBar + .pageWrap { + margin-left: 224px; + } + + #root>.top_controls { + margin-left:15px; + margin-right:15px; + } + + @media all and (max-width: 749px) { + .pageWrap { + margin-left: 0 !important; + } + + #header { + min-height: 50px; + height: auto; + } + + #topRightBar { + .navbar-right { + text-align: left; + margin-left: 2px; + display: inline-block; + position: relative; + height: auto; + min-height: 48px; + } + } + + #navbar-collapse1 { + margin-left: 45px; + } + + #secondNavBar { + z-index: 9999; + position: absolute; + border-right: 1px solid @theme-color-background-tinyContrast; + border-top: 1px solid @theme-color-background-tinyContrast; + -webkit-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + -moz-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75); + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; + + display: none; + &.open { + display: block; + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; + } + + #search { + display: none; + } + } + + + .top_controls { + height: auto; + + .isPiwikDemo, + .piwikTopControl { + position: static !important; + margin: 0 0 10px; + float: none; + display: inline-block; + } + + .isPiwikDemo { + margin-top: 8px; + } + } + + .icon-menu-hamburger { + padding: 10px 10px 10px; + display: inline-block; + float: left; + cursor: pointer; + font-size: 23px; + } + + #logo { + display: none; + } + + } + + #ajaxLoadingDiv { + margin-top: 10px; + } + + #secondNavBar { + width: 224px; + float:left; + + #search { + padding: 8px 0 13px 8px; + height: 61px; + + .quick-access { + z-index: 1000; + position: absolute; + width: 216px; + input { + height: 33px; + font-size: 11px; + padding: 10px 12px 10px 10px; + } + } + } + + .navbar { + background-color: @theme-color-menu-contrast-background; + border-bottom: 1px solid @theme-color-menu-contrast-background; + + .menu-icon { + padding-right: 13px; + } + + > li { + display: inline-block; + width: 100%; + .border-radius(0px); + border: 0; + background: none; + + .item { + display: inline-block; + width: 100%; + font-family: Verdana, sans-serif; + .font-default(13px, 21px); + padding: 12px 21px 12px 19px; + color: @theme-color-menu-contrast-text; + decoration: none !important; + word-break: break-word; + + &:hover, &:focus { + decoration: none !important; + } + } + + > .item { + cursor: default; + font-weight: bold; + &:hover { + text-decoration: none; + } + } + + > ul { + + li { + .item { + .font-default(13px, 16px); + padding: 11px 22px 11px 45px; + decoration: none; + transition: background-color 200ms linear; + &:hover { + text-decoration: none; + color: @theme-color-menu-contrast-textActive; + } + } + + &.active { + > .menuDropdown, + > .item { + background-color: @theme-color-background-base; + decoration: none; + } + } + } + } + } + + + .menuDropdown { + width: 100%; + + .items { + width: 224px; + box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); + + .search { + margin: 15px 16px 10px 17px; + } + + .item { + padding: 10px 16px 10px !important; + min-height: 25px; + height: auto; + } + } + + .title { + color: @theme-color-menu-contrast-text; + display: block; + padding: 15px 22px 11px 45px; + font-size: 13px; + font-weight: normal; + + &:hover { + color: @theme-color-menu-contrast-textActive; + } + + &:after { + color: @theme-color-menu-contrast-text; + border-top: 5px solid @theme-color-menu-contrast-text; + top: 20px; + right: 3px; + } + } + } + } + + &.Menu--dashboard .navbar > li { + > ul { + display: none; + + @media all and (max-width: 749px) { + display: block; + } + } + + > .item { + cursor: pointer; + &:hover { + color: @theme-color-menu-contrast-textActive; + } + } + + &.active { + ul { + display: block; + } + + .icon-arrow-right:before { + content: "\e63b"; + } + } + } + + &.Menu--admin .navbar > li { + > .item { + padding: 14px 21px 6px 19px; + } + .item .icon-arrow-right:before { + content: "\e63b"; + } + } + } +} + +#root { + .top_controls { + visibility: hidden; + opacity: 0; + .piwikTopControl { + margin-top: 8px; + margin-bottom: 8px; + } + } +} + +#root, #standalone { + .top_controls { + min-height: 51px; + position: relative; + background-color: @theme-color-background-base; + height: auto; + margin-bottom: 10px; + + .piwikTopControl { + display: inline-block; + float: none; + position: absolute; + margin-right: 18px; + vertical-align: top; + font-size: 11px; + } + } + + .borderedControl { + background-color: @theme-color-background-base; + border: 1px solid @theme-color-background-tinyContrast; + transition: box-shadow 150ms linear; + &.expanded, + &:hover { + box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12); + } + } +} + +.widgetize { + width: auto; +} diff --git a/plugins/CoreHome/stylesheets/menu.less b/plugins/CoreHome/stylesheets/menu.less deleted file mode 100644 index 76c8b9023808fa5a7673f78f672d547e4b918121..0000000000000000000000000000000000000000 --- a/plugins/CoreHome/stylesheets/menu.less +++ /dev/null @@ -1,177 +0,0 @@ -.Menu--dashboard { - position: relative; - - .menuDropdown { - - .items { - width: 250px; - - .search { - margin: 15px 16px 10px 17px; - } - - .item { - padding: 10px 16px 4px !important; - min-height: 25px; - height: auto; - } - } - - .title { - color: @theme-color-menu-contrast-text; - display: block; - padding: 15px 22px 11px; - font-size: 15px; - font-weight: normal; - - &:hover { - color: @theme-color-menu-contrast-textActive; - } - - &:after { - color: @theme-color-menu-contrast-text; - border-top: 5px solid @theme-color-menu-contrast-text; - top: 20px; - right: 3px; - } - } - } -} - -.Menu--dashboard > .Menu-tabList { - line-height: 1; - display: table; // The nav has the height og his children - margin-bottom: -1px; // Allow tabs to merge with the submenu -} - -.Menu--dashboard > .Menu-tabList ul { - background: @theme-color-background-base; /*IE6 needs this*/ - float: left; - position: relative; -} - -/* LEVEL1 NORMAL */ -.Menu--dashboard > .Menu-tabList > li { - background: #f1f1f1; - float: left; - list-style: none; - z-index: 49; - margin-right: -1px; - border: 1px solid #ddd; - border-bottom: 0; - border-radius: 4px 4px 0 0; -} - -.Menu--dashboard > .Menu-tabList a { - color: @theme-color-text-light; - font-size: 18px; - display: block; - float: left; - padding: 8px 27px 0; - height: 50px; - text-decoration: none; - font-weight: normal; -} - -/* LEVEL1 HOVER */ -.Menu--dashboard > .Menu-tabList > li:hover, -.Menu--dashboard > .Menu-tabList > li.sfHover { - background: @theme-color-background-base; -} - -.Menu--dashboard > .Menu-tabList > li:hover > a, -.Menu--dashboard > .Menu-tabList > li.sfHover > a, -.Menu--dashboard > .Menu-tabList > li.sfActive > a, -.Menu--dashboard > .Menu-tabList a:hover { - color: @theme-color-link; -} - -.Menu--dashboard > .Menu-tabList > li:hover > a { - text-decoration: underline; -} - -.Menu--dashboard > .Menu-tabList > li.sfHover > a { - border-bottom: 1px solid #fff; -} - -/* LEVEL2 NORMAL */ -.Menu--dashboard > .Menu-tabList > li ul { - padding: 9px 0 5px 0; - left: 0; - top: -999em; - position: absolute; - min-height: 25px; - width: 100%; - background: none; -} - -.Menu--dashboard > .Menu-tabList > li li { - float: left; - background: none; - border: 0; - text-align: center; -} - -.Menu--dashboard > .Menu-tabList > li li > a { - padding: 5px 15px; - font-size: 14px; - border: 0; - float: none; - display: inline-block; - height: auto; - background: none; - color: @theme-color-text-light; - text-decoration: none; -} - -/* LEVEL2 HOVER */ -.Menu--dashboard > .Menu-tabList > li.sfHover ul, -.Menu--dashboard > .Menu-tabList > li:hover ul { - z-index: 130; - top: 100%; - opacity: 1; - -webkit-transition: opacity 300ms ease-out 10ms; /* property duration timing-function delay */ - -moz-transition: opacity 300ms ease-out 10ms; - -o-transition: opacity 300ms ease-out 10ms; - transition: opacity 300ms ease-out 10ms; -} - -/* for screen readers */ -.Menu--dashboard a span.hidden { - height: 1px; - width: 1px; - position: absolute; - overflow: hidden; - top: 0; -} - - -.Menu--dashboard > .Menu-tabList > li li:hover > a, -.Menu--dashboard > .Menu-tabList > li li.sfHover > a { - color: @theme-color-link; -} - -.Menu--dashboard > .Menu-tabList > li li.sfHover > a { - font-weight: bold; - text-decoration: none !important; -} - -@media all and (max-width: 949px) { - .nav { - clear: right; - } -} - -@media all and (max-width: 749px) { - .Menu--dashboard > .Menu-tabList a { - padding-left: 8px; - padding-right: 8px; - } -} - -@media all and (max-width: 549px) { - .Menu--dashboard > ul.Menu-tabList > li.sfHover > a, - .Menu--dashboard > ul.Menu-tabList > li.sfActive.sfHover > a { - border-bottom: 0; - } -} \ No newline at end of file diff --git a/plugins/CoreHome/stylesheets/notification.less b/plugins/CoreHome/stylesheets/notification.less index 36f7085f6f8263d1d8c8950a547446d05ebdd4ec..cab47a40a5f3f8bbb05ae292e5189eef86040d48 100644 --- a/plugins/CoreHome/stylesheets/notification.less +++ b/plugins/CoreHome/stylesheets/notification.less @@ -1,8 +1,5 @@ #content.admin #notificationContainer { - width: 750px; - display: table-header-group; /* no overlap with About Piwik box */ - .notification { - margin: 10px; + margin: 0 0 10px 0; } } \ No newline at end of file diff --git a/plugins/CoreHome/stylesheets/zen-mode.less b/plugins/CoreHome/stylesheets/zen-mode.less index 112c6b2da6cafc0d43f1555f38650972021a480c..520d501d32ca68af2cbb9dfaabb520206643c846 100644 --- a/plugins/CoreHome/stylesheets/zen-mode.less +++ b/plugins/CoreHome/stylesheets/zen-mode.less @@ -85,11 +85,12 @@ h2 { margin-top: 40px; - padding-left: 10px; - font-size: 24px; + padding: 16px 0 12px 0; + font-size: 21px; &.noTopMargin { - margin-top: 0px; + margin-top: 0; + padding-top: 7px; } } @@ -99,8 +100,13 @@ } } -.widget { +#root #dashboard .widget { + h2 { + padding-left: 10px; + } +} +.widget { h2:nth-of-type(n+2) { padding-top: 40px!important; margin-top: 0!important; diff --git a/plugins/CoreHome/templates/_adblockDetect.twig b/plugins/CoreHome/templates/_adblockDetect.twig new file mode 100644 index 0000000000000000000000000000000000000000..ec69ffecf8e2f3e7e410b66dae6487396f14eac9 --- /dev/null +++ b/plugins/CoreHome/templates/_adblockDetect.twig @@ -0,0 +1,36 @@ +<div id="bottomAd" style="font-size: 2px;"> </div> +<script type="text/javascript"> + if ('undefined' === (typeof hasBlockedContent) || hasBlockedContent !== false) { + {# if hasBlockedContent was "false" most likely nothing was blocked #} + (function () { + {# most likely jQuery is not available, have to use vanilla JS here #} + var body = document.getElementsByTagName('body'); + + if (!body || !body[0]) { + return; + } + + var bottomAd = document.getElementById('bottomAd'); + var wasMostLikelyCausedByAdblock = false; + + if (!bottomAd) { + wasMostLikelyCausedByAdblock = true; + } else if (bottomAd.style && bottomAd.style.display === 'none') { + wasMostLikelyCausedByAdblock = true; + } else if ('undefined' !== (typeof bottomAd.clientHeight) && bottomAd.clientHeight === 0) { + wasMostLikelyCausedByAdblock = true; + } + + if (wasMostLikelyCausedByAdblock) { + var warning = document.createElement('h3'); + warning.innerHTML = '{{ 'CoreHome_AdblockIsMaybeUsed'|translate|e('js') }}'; + + body[0].appendChild(warning); + warning.style.color = 'red'; + warning.style.fontWeight = 'bold'; + warning.style.marginLeft = '16px'; + warning.style.marginBottom = '16px'; + } + })(); + } +</script> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_dataTableCell.twig b/plugins/CoreHome/templates/_dataTableCell.twig index 40e61541f344333d1f9e7b19313256b35889bc3f..1bcd1bb0f2bdc4edb4675458ef4b114e57ea1011 100644 --- a/plugins/CoreHome/templates/_dataTableCell.twig +++ b/plugins/CoreHome/templates/_dataTableCell.twig @@ -25,7 +25,7 @@ {% if siteTotal and siteTotal > reportTotal %} {% set totalPercentage = row.getColumn(column)|percentage(siteTotal, 1) %} - {% set totalRatioTooltip = 'General_TotalRatioTooltip'|translate(totalPercentage, siteTotal, metricTitle) %} + {% set totalRatioTooltip = 'General_TotalRatioTooltip'|translate(totalPercentage, siteTotal|number(2,0), metricTitle) %} {% else %} {% set totalRatioTooltip = '' %} {% endif %} @@ -41,7 +41,10 @@ {{ piwik.logoHtml(row.getMetadata(), row.getColumn('label')) }} {% if row.getMetadata('html_label_prefix') %}<span class='label-prefix'>{{ row.getMetadata('html_label_prefix') | raw }} </span>{% endif -%} {%- if row.getMetadata('html_label_suffix') %}<span class='label-suffix'>{{ row.getMetadata('html_label_suffix') | raw }}</span>{% endif -%} -{% endif %}<span class="value">{% if row.getColumn(column) %}{{- row.getColumn(column)|raw -}}{% else %}-{% endif %}</span> +{% endif %}<span class="value"> + {%- if row.getColumn(column) %}{% if column=='label' %}{{- row.getColumn(column)|raw -}}{% else %}{{- row.getColumn(column)|number(2,0)|raw -}}{% endif %} + {%- else -%}- + {%- endif -%}</span> {% if column=='label' %}</span>{% endif %} {% if not row.getIdSubDataTable() and column=='label' and row.getMetadata('url') %} </a> diff --git a/plugins/CoreHome/templates/_headerMessage.twig b/plugins/CoreHome/templates/_headerMessage.twig index c1d81b5cb0f0dc9e2a4234719728462b9ab4240f..bb4f8e760768b3a7700f87b98b4b796e823e6152 100644 --- a/plugins/CoreHome/templates/_headerMessage.twig +++ b/plugins/CoreHome/templates/_headerMessage.twig @@ -1,47 +1,59 @@ {# testing, remove test_ from var names #} {% set test_latest_version_available="4.0.0" %} {% set test_piwikUrl='http://demo.piwik.org/' %} -{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/'}}{% endset %} +{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/' }}{% endset %} {% set updateCheck %} -<div id="updateCheckLinkContainer"> - <span class='loadingPiwik' style="display:none;"><img src='plugins/Morpheus/images/loading-blue.gif'/></span> - <span class="icon icon-reload"></span> - <a href="#" id="checkForUpdates"><em>{{ 'CoreHome_CheckForUpdates'|translate }}</em></a> -</div> + <span id="updateCheckLinkContainer"> + {{ 'CoreHome_CheckForUpdates'|translate }} + <span class="icon icon-fixed icon-reload"></span> + </span> {% endset %} {% if isPiwikDemo or (latest_version_available and hasSomeViewAccess and not isUserIsAnonymous) or (isSuperUser and adminMenu is defined and adminMenu) %} -<span id="header_message" class="{% if isPiwikDemo or not latest_version_available %}header_info{% else %}header_alert{% endif %}"> - <span class="header_short"> +<div piwik-expand-on-hover + id="header_message" + class="piwikSelector borderedControl {% if isPiwikDemo or not latest_version_available %}header_info{% else %}{% endif %} {% if isPiwikDemo %}isPiwikDemo{% else %}piwikTopControl{% endif %} {% if latest_version_available %}update_available{% endif %}" + > + + <a class="title" href="#"> {% if isPiwikDemo %} {{ 'General_YouAreViewingDemoShortMessage'|translate }} {% elseif latest_version_available %} {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }} + <span class="icon-warning"></span> {% elseif isSuperUser and adminMenu is defined and adminMenu %} {{ updateCheck|raw }} {% endif %} - </span> + </a> - <span class="header_full"> + <div class="dropdown"> {% if isPiwikDemo %} - {{ 'General_YouAreViewingDemoShortMessage'|translate }} - <br /> {{ 'General_DownloadFullVersion'|translate("<a href='http://piwik.org/'>","</a>","<a href='http://piwik.org'>piwik.org</a>")|raw }} <br/> + {% if isSuperUser and adminMenu is defined and adminMenu %} + <br/> + {% endif %} {% endif %} {% if latest_version_available and isSuperUser %} {{ 'General_PiwikXIsAvailablePleaseUpdateNow'|translate(latest_version_available,"<br /><a href='index.php?module=CoreUpdater&action=newVersionAvailable'>","</a>","<a href='?module=Proxy&action=redirect&url=http://piwik.org/changelog/' target='_blank'>","</a>")|raw }} + <br /> {% elseif latest_version_available and not isPiwikDemo and hasSomeViewAccess and not isUserIsAnonymous %} {% set updateSubject = 'General_NewUpdatePiwikX'|translate(latest_version_available)|e('url') %} {{ 'General_PiwikXIsAvailablePleaseNotifyPiwikAdmin'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/' target='_blank'>Piwik</a> <a href='?module=Proxy&action=redirect&url=http://piwik.org/changelog/' target='_blank'>" ~ latest_version_available ~ "</a>", "<a href='mailto:" ~ superUserEmails ~ "?subject=" ~ updateSubject ~ "'>", "</a>")|raw }} - {% endif %} - {% if isSuperUser and adminMenu is defined and adminMenu %} <br /> + {% endif %} + + {% if isPiwikDemo and isSuperUser and adminMenu is defined and adminMenu %} + <br/> {{ updateCheck|raw }} + <br/> + <br/> {% endif %} - <br /> + {{ 'General_YouAreCurrentlyUsing'|translate(piwik_version) }} - </span> -</span> + </div> +</div> + +<div style="clear:right"></div> {% endif %} diff --git a/plugins/CoreHome/templates/_menu.twig b/plugins/CoreHome/templates/_menu.twig index f4bfd7d902f2c14d8d79454a0550a589dfa997d4..b04b809405f487530ebc7767a7abddcaab6fc892 100644 --- a/plugins/CoreHome/templates/_menu.twig +++ b/plugins/CoreHome/templates/_menu.twig @@ -1,66 +1,43 @@ -{% macro submenuItem(name, url) %} - {% if name|slice(0,1) != '_' %} - <li> - <a class="menuItem" href='#{{ url|urlRewriteWithParameters|slice(1) }}'> - {{ name|translate }} - </a> - </li> - {% endif %} -{% endmacro %} - -{% macro groupedItem(name, group) %} - <li> - <div piwik-menudropdown show-search="true" menu-title="{{ name|translate|e('html_attr') }}"> - {% for item in group.getItems %} - <a class="item menuItem" - href='#?{{ item.url|urlRewriteWithParameters|slice(1) }}' - {% if item.tooltip %}title="{{ item.tooltip|e('html_attr') }}"{% endif %}> - {{ item.name|translate }} - </a> - {% endfor %} +{% macro menu(menu, anchorlink, cssClass, currentModule, currentAction) %} + <div id="secondNavBar" class="{{ cssClass }}"> + <div id="search"> + <div piwik-quick-access class="borderedControl"></div> </div> - </li> -{% endmacro %} - -{% macro getId(urlParameters) -%} - {% if urlParameters is iterable -%} - {{ urlParameters|urlRewriteWithParameters }} - {%- endif %} -{%- endmacro %} + <ul class="navbar"> + {% for level1,level2 in menu %} -{% macro getFirstUrl(urlParameters) -%} - {% if urlParameters is iterable -%} - {{ urlParameters|urlRewriteWithParameters|slice(1) }} - {%- endif %} -{%- endmacro %} - -<div class="Menu--dashboard"> - - <ul class="Menu-tabList"> - {% for level1,level2 in menu %} - <li id="{% if level2._url is defined %}{{ _self.getId(level2._url) }}{% endif %}" class="menuTab"> - <a class="menuItem" {% if level2._url is defined %}href="#{{ _self.getFirstUrl(level2._url) }}"{% endif %}> - {{ level1|translate }} - <span class="hidden"> - {{ 'CoreHome_Menu'|translate }} - </span> - </a> - <ul> + {% set hasSubmenuItem = false %} {% for name,urlParameters in level2 %} - {% if urlParameters._url is defined and urlParameters._url is not iterable %} - {{ _self.groupedItem(name,urlParameters._url) }} - {% elseif name|slice(0,1) != '_' %} - {{ _self.submenuItem(name,urlParameters._url) }} + {% if name|slice(0,1) != '_' %} + {% set hasSubmenuItem = true %} {% endif %} {% endfor %} - </ul> - </li> - {% endfor %} - <li id="Searchmenu"> - <span piwik-quick-access></span> - </li> - </ul> + {% if hasSubmenuItem %} + <li class="menuTab"> -</div> -<div class="nav_sep"></div> + <a class="item"> + <span class="menu-icon {{ level2._icon|default('icon-arrow-right') }}"></span>{{ level1|translate }} + <span class="hidden"> + {{ 'CoreHome_Menu'|translate }} + </span> + </a> + <ul> + {% for name,urlParameters in level2 %} + {% if name|slice(0,1) != '_' %} + <li {% if urlParameters._url.module is defined and urlParameters._url.module == currentModule and urlParameters._url.action is defined and urlParameters._url.action == currentAction %}class="active"{% endif %} + > + <a class="item" + href="index.php?{{ urlParameters._url|urlRewriteWithParameters|slice(1) }}"> + {{ name|translate }} + </a> + </li> + {% endif %} + {% endfor %} + </ul> + </li> + {% endif %} + {% endfor %} + </ul> + </div> +{% endmacro %} diff --git a/plugins/CoreHome/templates/_periodSelect.twig b/plugins/CoreHome/templates/_periodSelect.twig index 14ca6d707f30b424d24be9a3b470f1fc30a872c3..67b30183d3484b431661403a005554dd269f9ba9 100644 --- a/plugins/CoreHome/templates/_periodSelect.twig +++ b/plugins/CoreHome/templates/_periodSelect.twig @@ -1,7 +1,9 @@ -<div id="periodString" class="piwikTopControl periodSelector"> - <div id="date">{{ 'General_DateRange'|translate }} <strong>{{ prettyDate }}</strong></div> - <div class="calendar-icon"></div> - <div id="periodMore"> +<div id="periodString" piwik-expand-on-click class="piwikTopControl piwikSelector borderedControl periodSelector"> + <a id="date" class="title" title="{{ 'General_ChooseDate'|translate|e('html_attr') }}"> + <span class="icon icon-calendar"></span> + {{ prettyDate }} + </a> + <div id="periodMore" class="dropdown"> <div class="period-date"> <div id="datepicker"></div> </div> @@ -26,7 +28,7 @@ <br/> {% endfor %} </span> - <input tabindex="3" type="submit" value="{{ 'General_ApplyDateRange'|translate }}" id="calendarRangeApply" class="btn"/> + <input tabindex="3" type="submit" value="{{ 'General_Apply'|translate }}" id="calendarApply" class="btn"/> {% import 'ajaxMacros.twig' as ajax %} {{ ajax.loadingDiv('ajaxLoadingCalendar') }} </div> diff --git a/plugins/CoreHome/templates/_siteSelectHeader.twig b/plugins/CoreHome/templates/_siteSelectHeader.twig index 547f2e41297b5afc74e9e680866e586d6aa16afe..7353e2e07a794f2c2138a403d56fcd4c11265865 100644 --- a/plugins/CoreHome/templates/_siteSelectHeader.twig +++ b/plugins/CoreHome/templates/_siteSelectHeader.twig @@ -1,5 +1,3 @@ -<div class="top_bar_sites_selector {% if currentModule == 'CoreHome' %}sites_selector_in_dashboard{% endif %}"> - <label>{{ 'General_Website'|translate }}</label> +<div class="top_bar_sites_selector piwikTopControl"> <div piwik-siteselector class="sites_autocomplete"></div> - </div> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_topBar.twig b/plugins/CoreHome/templates/_topBar.twig index 41bd5da7a11af039e3b4ad268810419b614cebdb..e69e9c1978b840c8b8fb669d1a3ba601693f1350 100644 --- a/plugins/CoreHome/templates/_topBar.twig +++ b/plugins/CoreHome/templates/_topBar.twig @@ -1,4 +1,34 @@ {{ postEvent("Template.beforeTopBar", userAlias, userLogin, topMenu, userMenu) }} -<div id="topBars"> - {% include "@CoreHome/_topBarTopMenu.twig" %} -</div> +<ul class="navbar-right"> + + {% macro menuItemLabel(label, icon) %} + {% if icon is defined and icon and icon starts with 'icon-' %} + <span class="{{ icon|striptags }}"></span> + {% else %} + {{ label|translate }} + {% endif %} + {% endmacro %} + + {% macro topMenuItem(label, menu, currentModule, currentAction) %} + {% if menu._html is defined %} + {{ menu._html|raw }} + {% else %} + <a {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %} + class="topBarElem {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}" + id="topmenu-{{ menu._url.module|lower }}" + href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ _self.menuItemLabel(label, menu._icon) }}</a> + {% endif %} + {% endmacro %} + + {% if topMenuModule is not defined %} + {% set topMenuModule = currentModule %} + {% set topMenuAction = currentAction %} + {% endif %} + + {% spaceless %} + {% for label,menu in topMenu %} + <li>{{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }}</li> + {% endfor %} + {% endspaceless %} + +</ul> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_topBarTopMenu.twig b/plugins/CoreHome/templates/_topBarTopMenu.twig deleted file mode 100644 index 459ccb611e268f2c116adb1f6f8bf0faa42ca774..0000000000000000000000000000000000000000 --- a/plugins/CoreHome/templates/_topBarTopMenu.twig +++ /dev/null @@ -1,37 +0,0 @@ -<div id="topRightBar"> - - {% macro topMenuItem(label, menu, currentModule, currentAction) %} - {% if menu._html is defined %} - {{ menu._html|raw }} - {% elseif (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %} - <span class="topBarElem topBarElemActive"><strong>{{ label|translate }}</strong></span> - {% else %} - <span class="topBarElem" {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %}> - <a id="topmenu-{{ menu._url.module|lower }}" href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ label|translate }}</a> - </span> - {% endif %} - {% endmacro %} - - {% macro userMenuItem(label, menu, currentModule, currentAction) %} - - <a class="item {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}" - href="index.php{{ menu._url|urlRewriteWithParameters }}" - id="usermenu-{{ menu._url.module|lower }}-{{ menu._url.action|default('index')|lower }}" - {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %} - >{{ label|translate }}</a> - - {% endmacro %} - - {% if topMenuModule is not defined %} - {% set topMenuModule = currentModule %} - {% set topMenuAction = currentAction %} - {% endif %} - - {% for label,menu in topMenu %} - {% if not loop.first %} - | - {% endif %} - {{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }} - {% endfor %} - -</div> diff --git a/plugins/CoreHome/templates/_topScreen.twig b/plugins/CoreHome/templates/_topScreen.twig index 2aebf1254e1fbe9733a0fdcfa7bfbe1ab0813989..805619814c4fce55ee26a0650399410c2f4e9d4d 100644 --- a/plugins/CoreHome/templates/_topScreen.twig +++ b/plugins/CoreHome/templates/_topScreen.twig @@ -1,5 +1,15 @@ -<div id="header"> - <a href='#main' tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a> - {% include "@CoreHome/_logo.twig" %} - {% include "@CoreHome/_topBar.twig" %} -</div> +<div id="header" class="container-fluid"> + <a href="#main" tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a> + <div id="topRightBar" class="navbar row"> + <div class="navbar-header col-md-3"> + <span class="toggle-second-menu icon-menu-hamburger"></span> + {% include "@CoreHome/_logo.twig" %} + + <!-- we need to put button to toggle nav for responsiveness here --> + + </div> + <div class="collapse navbar-collapse col-md-9" id="navbar-collapse1"> + {% include "@CoreHome/_topBar.twig" %} + </div> + </div> +</div> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_uiControl.twig b/plugins/CoreHome/templates/_uiControl.twig index 856f1afac0441632a87ffa25d1f8b625d863a682..1f188cb691c744ba6ce6f6b5e70adf9b977bca7c 100644 --- a/plugins/CoreHome/templates/_uiControl.twig +++ b/plugins/CoreHome/templates/_uiControl.twig @@ -1,6 +1,9 @@ <div class="{{ cssIdentifier }} {{ cssClass }}" - data-props="{{ clientSideProperties|json_encode }}" - data-params="{{ clientSideParameters|json_encode }}"> - {% render implView with implOverride %} + {% for name,value in htmlAttributes %} + {{ name }}="{{ value|e('html_attr') }}" + {% endfor %} + data-props="{{ clientSideProperties|json_encode }}" + data-params="{{ clientSideParameters|json_encode }}"> +{% render implView with implOverride %} </div> <script>$(document).ready(function () { require('{{ jsNamespace }}').{{ jsClass }}.initElements(); });</script> \ No newline at end of file diff --git a/plugins/CoreHome/templates/_userMenu.twig b/plugins/CoreHome/templates/_userMenu.twig deleted file mode 100644 index 67076af75599094b5cda985a3397371cf0a54db4..0000000000000000000000000000000000000000 --- a/plugins/CoreHome/templates/_userMenu.twig +++ /dev/null @@ -1,3 +0,0 @@ -{% import '@CoreHome/macros.twig' as corehome %} - -{{ corehome.sidebarMenu(userMenu, currentModule, currentAction) }} \ No newline at end of file diff --git a/plugins/CoreHome/templates/getDefaultIndexView.twig b/plugins/CoreHome/templates/getDefaultIndexView.twig index 4efd45315906b07d467f783f23c20d2712749abe..d685977971c6ccedbdba30b91f755c1bec54bc69 100644 --- a/plugins/CoreHome/templates/getDefaultIndexView.twig +++ b/plugins/CoreHome/templates/getDefaultIndexView.twig @@ -1,13 +1,23 @@ {% extends "dashboard.twig" %} -{% block notification %}{% endblock %} -{% block content %} +{% import 'ajaxMacros.twig' as ajax %} -{% include "@CoreHome/_siteSelectHeader.twig" %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} + {{ postEvent("Template.nextToCalendar") }} + {% render dashboardSettingsControl %} + {% include "@CoreHome/_headerMessage.twig" %} +{% endblock %} -<div piwik-reporting-menu></div> -<div class="nav_sep"></div> +{% block content %} + {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} + {{ ajax.loadingDiv() }} -{% include "@CoreHome/_indexContent.twig" %} + <div id="content" class="home"> + {% if content %}{{ content }}{% endif %} + <div piwik-reporting-page ng-cloak></div> + </div> + <div class="clear"></div> {% endblock %} diff --git a/plugins/CoreHome/templates/macros.twig b/plugins/CoreHome/templates/macros.twig deleted file mode 100644 index 05638568568572281498bf47be68120f9d1dbe19..0000000000000000000000000000000000000000 --- a/plugins/CoreHome/templates/macros.twig +++ /dev/null @@ -1,26 +0,0 @@ -{% macro sidebarMenu(sidebarMenu, currentModule, currentAction) %} - {% if sidebarMenu|length > 1 %} - <div class="Menu Menu--admin"> - <ul class="Menu-tabList"> - {% for name,submenu in sidebarMenu %} - {% if submenu._hasSubmenu %} - <li> - <span>{{ name|translate }}</span> - <ul> - {% for sname,url in submenu %} - {% if sname|slice(0,1) != '_' %} - <li> - <a href='index.php{{ url._url|urlRewriteWithParameters }}' - target="_self" - {% if url._url.module == currentModule and (url._url.action is empty or url._url.action == currentAction) %}class='active'{% endif %}>{{ sname|translate }}</a> - </li> - {% endif %} - {% endfor %} - </ul> - </li> - {% endif %} - {% endfor %} - </ul> - </div> - {% endif %} -{% endmacro %} diff --git a/plugins/CorePluginsAdmin/Menu.php b/plugins/CorePluginsAdmin/Menu.php index 97ec818a59b6703eaa3eb1f4588615b14569ced3..415ace73a6ceee39dafbef5ef30dc538c5e46c0c 100644 --- a/plugins/CorePluginsAdmin/Menu.php +++ b/plugins/CorePluginsAdmin/Menu.php @@ -49,7 +49,7 @@ class Menu extends \Piwik\Plugin\Menu if (Piwik::hasUserSuperUserAccess() && CorePluginsAdmin::isMarketplaceEnabled()) { $menu->addManageItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('browsePlugins', array('activated' => '')), + $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'admin')), $order = 12); } } @@ -66,7 +66,7 @@ class Menu extends \Piwik\Plugin\Menu { if ($this->isAllowedToSeeMarketPlace()) { $menu->addPlatformItem('CorePluginsAdmin_Marketplace', - $this->urlForAction('userBrowsePlugins', array('activated' => '')), + $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'user')), $order = 5); } } diff --git a/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less b/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less index d506e60f04e0d64339e6f59e36a6709846807200..4d43e0e600b0b68293700218bc5443cefa0df413 100644 --- a/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less +++ b/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less @@ -93,6 +93,14 @@ table.entityTable tr td a.uninstall { #plugins { + .inactive-plugin, + .active-plugin { + .name { + max-width: 200px; + word-wrap: break-word; + } + } + .plugin-desc-missingrequirements { font-weight:bold; font-style: italic; diff --git a/plugins/CorePluginsAdmin/templates/macros.twig b/plugins/CorePluginsAdmin/templates/macros.twig index 0c0ea9e27910cca9da5ac0519498f702c2ac5997..d7e7c459b0ddda44c6bacaccfa201b35982ea5c7 100644 --- a/plugins/CorePluginsAdmin/templates/macros.twig +++ b/plugins/CorePluginsAdmin/templates/macros.twig @@ -153,7 +153,7 @@ {% set isDefaultTheme = isTheme and name == 'Morpheus' %} {% if (plugin.alwaysActivated is defined and not plugin.alwaysActivated) or isTheme %} <tr {% if plugin.activated %}class="active-plugin"{% else %}class="inactive-plugin"{% endif %} data-filter-status="{% if plugin.activated %}active{% else %}inactive{% endif %}" data-filter-origin="{% if plugin.isCorePlugin %}core{% else %}noncore{% endif %}"> - <td class="name" style="white-space:nowrap;"> + <td class="name"> <a name="{{ name|e('html_attr') }}"></a> {% if not plugin.isCorePlugin and name in marketplacePluginNames -%} <a href="javascript:void(0);" class="plugin-details" diff --git a/plugins/CoreVisualizations/javascripts/jqplot.js b/plugins/CoreVisualizations/javascripts/jqplot.js index 5392dc986cbb6895bb4adab424302b5020e366b1..6e5d2135d1e731f467d6a1ddfc448d800a78aecd 100644 --- a/plugins/CoreVisualizations/javascripts/jqplot.js +++ b/plugins/CoreVisualizations/javascripts/jqplot.js @@ -114,7 +114,8 @@ axes: { yaxis: { tickOptions: { - formatString: '%d' + formatString: '%s', + formatter: $.jqplot.NumberFormatter } } } @@ -384,7 +385,7 @@ // TODO: this code destroys plots when a page is switched. there must be a better way of managing memory. if (typeof $.jqplot.visiblePlots == 'undefined') { $.jqplot.visiblePlots = []; - $('.nav').on('piwikSwitchPage', function () { + $('#secondNavBar').on('piwikSwitchPage', function () { for (var i = 0; i < $.jqplot.visiblePlots.length; i++) { if ($.jqplot.visiblePlots[i] == null) { continue; @@ -528,7 +529,7 @@ var axisId = this.jqplotParams.series[seriesIndex].yaxis; var formatString = this.jqplotParams.axes[axisId].tickOptions.formatString; - return formatString.replace('%s', value); + return $.jqplot.NumberFormatter(formatString, value); }, /** @@ -746,6 +747,22 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () { } }; +// ------------------------------------------------------------ +// PIWIK NUMBERFORMATTER PLUGIN FOR JQPLOT +// ------------------------------------------------------------ +(function($){ + + $.jqplot.NumberFormatter = function (format, value) { + + if (!$.isNumeric(value)) { + return format.replace(/%s/, value); + } + return format.replace(/%s/, NumberFormatter.formatNumber(value)); + } + +})(jQuery); + + // ------------------------------------------------------------ // PIWIK TICKS PLUGIN FOR JQPLOT // Handle ticks the piwik way... diff --git a/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js b/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js index 69996cd4b7204d624a43c514ca3034bdc1128e99..cd21308f739b35e7c983db7e404cd4d7bbd2c681 100644 --- a/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js +++ b/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js @@ -62,7 +62,7 @@ var percentage = ''; if (typeof this.tooltip.percentages != 'undefined') { percentage = this.tooltip.percentages[seriesIndex][valueIndex]; - percentage = ' (' + percentage + '%)'; + percentage = ' (' + NumberFormatter.formatPercent(percentage) + ')'; } var label = this.jqplotParams.axes.xaxis.labels[valueIndex]; diff --git a/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js b/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js index df0a7f9b2f7e0b2175418b115b563591649f61b8..7169e32af4ff1b75ce486fcb8fff709a964e5db8 100644 --- a/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js +++ b/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js @@ -67,7 +67,7 @@ var label = this.data[0][valueIndex][0]; - var text = '<strong>' + percentage + '%</strong> (' + value + ' ' + series + ')'; + var text = '<strong>' + NumberFormatter.formatPercent(percentage) + '</strong> (' + value + ' ' + series + ')'; $(element).tooltip({ track: true, items: '*', diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts index eeaa41b2ac0aa559caf2ef7c1be3b893de69c795..6c05ca43d7c83dd795eb713b9feb624d8d6d2eb1 160000 --- a/plugins/CustomAlerts +++ b/plugins/CustomAlerts @@ -1 +1 @@ -Subproject commit eeaa41b2ac0aa559caf2ef7c1be3b893de69c795 +Subproject commit 6c05ca43d7c83dd795eb713b9feb624d8d6d2eb1 diff --git a/plugins/Dashboard/Categories/DashboardCategory.php b/plugins/Dashboard/Categories/DashboardCategory.php index 99a3785c840edbe5f9606bc1e564b8aedb19e604..4fb99523858e94d5f96619afc6af903b5e8b877d 100644 --- a/plugins/Dashboard/Categories/DashboardCategory.php +++ b/plugins/Dashboard/Categories/DashboardCategory.php @@ -14,4 +14,5 @@ class DashboardCategory extends Category { protected $id = 'Dashboard_Dashboard'; protected $order = 0; + protected $icon = 'icon-reporting-dashboard'; } diff --git a/plugins/Dashboard/Dashboard.php b/plugins/Dashboard/Dashboard.php index 5a0a7cc0ec6af802e73f23440aa7fec746bb6ce4..f46bf1526f100972424af009a86ea2efb086d097 100644 --- a/plugins/Dashboard/Dashboard.php +++ b/plugins/Dashboard/Dashboard.php @@ -35,35 +35,73 @@ class Dashboard extends \Piwik\Plugin public function addWidgetConfigs(&$widgets) { - $dashboards = API::getInstance()->getDashboards(); - - foreach ($dashboards as $dashboard) { - $config = new WidgetConfig(); - $config->setIsNotWidgetizable(); - $config->setModule('Dashboard'); - $config->setAction('embeddedIndex'); - $config->setCategoryId('Dashboard_Dashboard'); - $config->setSubcategoryId($dashboard['id']); - $config->setParameters(array('idDashboard' => $dashboard['id'])); - $widgets[] = $config; + if (Piwik::isUserIsAnonymous()) { + $this->addDefaultDashboard($widgets); + } else { + $dashboards = API::getInstance()->getDashboards(); + + if (empty($dashboards)) { + $this->addDefaultDashboard($widgets); + } else { + foreach ($dashboards as $dashboard) { + $config = new WidgetConfig(); + $config->setIsNotWidgetizable(); + $config->setModule('Dashboard'); + $config->setAction('embeddedIndex'); + $config->setCategoryId('Dashboard_Dashboard'); + $config->setSubcategoryId($dashboard['id']); + $config->setParameters(array('idDashboard' => $dashboard['id'])); + $widgets[] = $config; + } + } } } + private function addDefaultDashboard(&$widgets) + { + $config = new WidgetConfig(); + $config->setIsNotWidgetizable(); + $config->setModule('Dashboard'); + $config->setAction('embeddedIndex'); + $config->setCategoryId('Dashboard_Dashboard'); + $config->setSubcategoryId('1'); + $config->setParameters(array('idDashboard' => 1)); + $widgets[] = $config; + } + public function addSubcategories(&$subcategories) { - $dashboards = API::getInstance()->getDashboards(); - - $order = 0; - foreach ($dashboards as $dashboard) { - $subcategory = new Subcategory(); - $subcategory->setName($dashboard['name']); - $subcategory->setCategoryId('Dashboard_Dashboard'); - $subcategory->setId($dashboard['id']); - $subcategory->setOrder($order++); - $subcategories[] = $subcategory; + if (Piwik::isUserIsAnonymous()) { + $this->addDefaultSubcategory($subcategories); + } else { + $dashboards = API::getInstance()->getDashboards(); + + if (empty($dashboards)) { + $this->addDefaultSubcategory($subcategories); + } else { + $order = 0; + foreach ($dashboards as $dashboard) { + $subcategory = new Subcategory(); + $subcategory->setName($dashboard['name']); + $subcategory->setCategoryId('Dashboard_Dashboard'); + $subcategory->setId($dashboard['id']); + $subcategory->setOrder($order++); + $subcategories[] = $subcategory; + } + } } } + private function addDefaultSubcategory(&$subcategories) + { + $subcategory = new Subcategory(); + $subcategory->setName('Dashboard_Dashboard'); + $subcategory->setCategoryId('Dashboard_Dashboard'); + $subcategory->setId('1'); + $subcategory->setOrder(1); + $subcategories[] = $subcategory; + } + /** * Returns the layout in the DB for the given user, or false if the layout has not been set yet. * Parameters must be checked BEFORE this function call @@ -258,6 +296,7 @@ class Dashboard extends \Piwik\Plugin $translationKeys[] = 'Dashboard_LoadingWidget'; $translationKeys[] = 'Dashboard_WidgetNotFound'; $translationKeys[] = 'Dashboard_DashboardCopied'; + $translationKeys[] = 'Dashboard_Dashboard'; $translationKeys[] = 'General_Close'; $translationKeys[] = 'General_Refresh'; } diff --git a/plugins/Dashboard/DashboardManagerControl.php b/plugins/Dashboard/DashboardManagerControl.php index fb119e008367e75359d0ae2ca0deab30a2e59770..df573903b34014b891d4c6523406c01f40b1d830 100644 --- a/plugins/Dashboard/DashboardManagerControl.php +++ b/plugins/Dashboard/DashboardManagerControl.php @@ -20,7 +20,7 @@ class DashboardManagerControl extends DashboardSettingsControlBase parent::__construct(); $this->jsClass = "DashboardManagerControl"; - $this->cssIdentifier = "dashboard-manager"; + $this->cssIdentifier = "dashboard-manager piwikSelector"; $this->addDashboardActions(); $this->addGeneralActions(); diff --git a/plugins/Dashboard/DashboardSettingsControlBase.php b/plugins/Dashboard/DashboardSettingsControlBase.php index 72752240829b6c83eaf31efe221662420dca0882..c47ece211af382efe7ea8a2dce69b24d70f1a5ee 100644 --- a/plugins/Dashboard/DashboardSettingsControlBase.php +++ b/plugins/Dashboard/DashboardSettingsControlBase.php @@ -23,7 +23,8 @@ abstract class DashboardSettingsControlBase extends UIControl { parent::__construct(); - $this->cssClass = "piwikTopControl dashboardSettings"; + $this->cssClass = "borderedControl piwikTopControl dashboardSettings"; + $this->htmlAttributes = array('piwik-expand-on-click' => ''); $this->dashboardActions = array(); $this->generalActions = array(); } diff --git a/plugins/Dashboard/javascripts/dashboard.js b/plugins/Dashboard/javascripts/dashboard.js index 039f243c428f6a7b2f7edb78f8281454055ec17e..5a0396e6b3e535a2e2fe71c20a3251078f2cc792 100644 --- a/plugins/Dashboard/javascripts/dashboard.js +++ b/plugins/Dashboard/javascripts/dashboard.js @@ -161,7 +161,7 @@ function copyDashboardToUser() { // on menu item click, trigger action event on this var self = this; this.$element.on('click', 'ul.submenu li[data-action]', function (e) { - self.$element.toggleClass('visible'); + self.$element.toggleClass('expanded'); $(self).trigger($(this).attr('data-action')); }); @@ -169,7 +169,7 @@ function copyDashboardToUser() { // open manager on open this.$element.on('click', function (e) { if ($(e.target).is('.dashboardSettings,.dashboardSettings>span')) { - self.$element.toggleClass('visible'); + self.$element.toggleClass('expanded'); // fix position self.$element @@ -186,7 +186,7 @@ function copyDashboardToUser() { && !$(e.target).is('.dashboardSettings') ) { self.$element.widgetPreview('reset'); - self.$element.removeClass('visible'); + self.$element.removeClass('expanded'); } }; @@ -199,7 +199,7 @@ function copyDashboardToUser() { }, onSelect: function (widgetUniqueId) { var widget = widgetsHelper.getWidgetObjectFromUniqueId(widgetUniqueId); - self.$element.removeClass('visible'); + self.$element.removeClass('expanded'); self.widgetSelected(widget); }, @@ -280,7 +280,7 @@ function copyDashboardToUser() { }, hide: function () { - this.$element.removeClass('visible'); + this.$element.removeClass('expanded'); }, isWidgetAvailable: function (widgetUniqueId) { diff --git a/plugins/Dashboard/javascripts/dashboardObject.js b/plugins/Dashboard/javascripts/dashboardObject.js index 32c6c01a94ae944da45bd79f847f3edacfd0e92b..beb590c4f666d335cc18733fad6c4e01ee239c8d 100644 --- a/plugins/Dashboard/javascripts/dashboardObject.js +++ b/plugins/Dashboard/javascripts/dashboardObject.js @@ -509,24 +509,26 @@ return $(this).attr('id').indexOf('Dashboard_embeddedIndex') == 0; }).remove(); + if (dashboards.length === 0) { + dashboards = [{iddashboard: 1, name: _pk_translate('Dashboard_Dashboard')}]; + } + if (dashboards.length > 1 || dashboardMenuListItems.length >= 1 ) { var items = []; for (var i = 0; i < dashboards.length; i++) { - var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name); + var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name).addClass('item title'); var $li = $('<li/>').attr('id', 'Dashboard_embeddedIndex_' + dashboards[i].iddashboard) .addClass('dashboardMenuItem').append($link); items.push($li); if (dashboards[i].iddashboard == dashboardId) { dashboardName = dashboards[i].name; - $li.addClass('sfHover'); + $li.addClass('active'); } } dashboardMenuList.prepend(items); - } else { - dashboardMenuList.hide(); } dashboardMenuList.find('a[data-idDashboard]').click(function (e) { diff --git a/plugins/Dashboard/javascripts/widgetMenu.js b/plugins/Dashboard/javascripts/widgetMenu.js index 169768eb0353935cc1da888255283cdc1f12c966..7190f342a5b66d02f533b027066c796c11d1531b 100644 --- a/plugins/Dashboard/javascripts/widgetMenu.js +++ b/plugins/Dashboard/javascripts/widgetMenu.js @@ -288,7 +288,12 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid if ($('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).length) { var position = $('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).position().top - - $('.' + settings.categorylistClass, widgetPreview).position().top; + $('.' + settings.categorylistClass, widgetPreview).position().top + + $('.dashboard-manager .addWidget').outerHeight(); + + if (!$('#content.admin').length) { + position += 10; // + padding defined in dashboard view + } $('.' + settings.widgetlistClass, widgetPreview).css('top', position); $('.' + settings.widgetlistClass, widgetPreview).css('marginBottom', position); @@ -344,6 +349,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid $('li', widgetList).on('click', function () { if (!$('.widgetLoading', widgetPreview).length) { settings.onSelect($(this).attr('uniqueid')); + $(widgetPreview).closest('.dashboard-manager').removeClass('expanded'); if (settings.resetOnSelect) { resetWidgetPreview(widgetPreview); } @@ -405,6 +411,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid settings.onPreviewLoaded(widgetUniqueId, widgetElement); $('.' + settings.widgetpreviewClass + ' .widgetTop', widgetPreview).on('click', function () { settings.onSelect(widgetUniqueId); + $(widgetPreview).closest('.dashboard-manager').removeClass('expanded'); if (settings.resetOnSelect) { resetWidgetPreview(widgetPreview); } diff --git a/plugins/Dashboard/lang/ko.json b/plugins/Dashboard/lang/ko.json index 995d08d2f33c0a7d05bc83a8e91d13891a9be56d..535fe103191ffb332b16a95ac013864cd8341777 100644 --- a/plugins/Dashboard/lang/ko.json +++ b/plugins/Dashboard/lang/ko.json @@ -10,7 +10,7 @@ "DashboardEmptyNotification": "ëŒ€ì‹œë³´ë“œì— ìœ„ì ¯ì´ í•˜ë‚˜ë„ ì—†ìŠµë‹ˆë‹¤. 대시 ë³´ë“œ ìœ„ì ¯ì„ ì¶”ê°€í•˜ê±°ë‚˜ 대시 보드를 기본 ìœ„ì ¯ìœ¼ë¡œ ìž¬ì„¤ì •í•˜ì„¸ìš”.", "DashboardName": "대시보드 ì´ë¦„:", "DashboardOf": "%sì˜ ëŒ€ì‹œë³´ë“œ", - "DefaultDashboard": "기본 대시보드 - 기본 ìœ„ì ¯ê³¼ ì—´ë¡œ êµ¬ì„±ëœ ë ˆì´ì•„ì›ƒì„ ì‚¬ìš©í•©ë‹ˆë‹¤", + "DefaultDashboard": "기본 대시보드 - 기본 ìœ„ì ¯ìœ¼ë¡œ êµ¬ì„±ëœ ë ˆì´ì•„ì›ƒì„ ì‚¬ìš©í•©ë‹ˆë‹¤", "DeleteWidgetConfirm": "대시보드ì—ì„œ ì´ ìœ„ì ¯ì„ ì‚ì œí•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "EmptyDashboard": "빈 대시보드 - ì›í•˜ëŠ” ìœ„ì ¯ì„ ì„ íƒí•˜ì„¸ìš”", "LoadingWidget": "ìœ„ì ¯ 로딩중, ìž ì‹œë§Œ 기다리세요...", @@ -18,6 +18,7 @@ "Maximise": "최대화", "Minimise": "최소화", "NotUndo": "ì´ ìž‘ì—…ì€ ì·¨ì†Œí• ìˆ˜ 없습니다.", + "PluginDescription": "ë‹¹ì‹ ì˜ ì‚¬ì´íŠ¸ë¥¼ 분ì„í•œ 대시보드입니다. 드래그 앤 ë“œë¡ìœ¼ë¡œ 새로운 ìœ„ì ¯ì„ ì¶”ê°€í•˜ê±°ë‚˜ 대시보드 ë ˆì´ì•„ì›ƒì„ ë°”ê¾¸ëŠ” ê¸°ëŠ¥ì„ í†µí•´ ë‹¹ì‹ ë§Œì˜ ëŒ€ì‹œë³´ë“œë¥¼ 꾸며보세요. ëª¨ë“ ì‚¬ìš©ìžë“¤ì€ ìžì‹ ë§Œì˜ ëŒ€ì‹œë³´ë“œë¥¼ 가질 수 있습니다.", "RemoveDashboard": "대시보드 ì‚ì œ", "RemoveDashboardConfirm": "ì •ë§ ëŒ€ì‹œë³´ë“œ \"%s\"를 ì‚ì œ í•˜ì‹œê² ìŠµë‹ˆê¹Œ?", "RenameDashboard": "대시보드 ì´ë¦„ 변경", diff --git a/plugins/Dashboard/stylesheets/dashboard.less b/plugins/Dashboard/stylesheets/dashboard.less index fad10183e7d19adaa407caee790d583792a152e8..39ad2e3ed77c4afcc935e46ecfa252c3ceb62390 100644 --- a/plugins/Dashboard/stylesheets/dashboard.less +++ b/plugins/Dashboard/stylesheets/dashboard.less @@ -1,40 +1,21 @@ #dashboard { - margin: 0 -7px; + margin: 0 -6px; } -#root>.top_controls { - margin-left:15px; - margin-right:15px; +#standalone #dashboard { + margin: -10px -6px 0; } -.top_controls { - position: relative; - height: 32px; - clear: left; -} - -@media all and (max-width: 749px) { - .top_controls { - height: auto; - } - .top_controls #periodString, - .top_controls .dashboardSettings, - .top_controls .segmentEditorPanel { - position: static !important; - margin: 0 0 10px; - float: none; - } -} #dashboard { .col { min-height: 100px; // Customize Bootstrap gutter between columns - padding-right: 7px; - padding-left: 7px; + padding-right: 6px; + padding-left: 6px; >.sortable { - padding: 5px 0 10px 0; + padding: 5px 0 8px 0; } } } @@ -152,10 +133,8 @@ z-index: 120; background: #f7f7f7; border: 1px solid #e4e5e4; - padding: 5px 10px 6px 10px; border-radius: 4px; color: @theme-color-text-light; - font-size: 14px; cursor: pointer; overflow: hidden; } @@ -165,9 +144,9 @@ border-color: #a9a399; } -.dashboardSettings.visible { +.dashboardSettings.expanded { z-index: 1020; /* More than .jqplot-seriespicker-popover (1010) */ - min-width: 700px; + min-width: 800px; } .dashboardSettings > span { @@ -182,10 +161,9 @@ float: left; } -.dashboardSettings.visible ul.submenu { +.dashboardSettings.expanded ul.submenu { display: block; list-style: square outside none; - margin-left: 15px; } .dashboardSettings > ul.submenu > li { @@ -328,7 +306,6 @@ div.widgetpreview-preview { min-height: 0; height: auto; margin-right: 10px; - min-width: 180px; } .dashboardSettings .submenu { @@ -372,8 +349,8 @@ div.widgetpreview-preview { display: none; } -.dashboardSettings.visible .widgetpreview-widgetlist, -.dashboardSettings.visible .widgetpreview-preview { +.dashboardSettings.expanded .widgetpreview-widgetlist, +.dashboardSettings.expanded .widgetpreview-preview { display: block; } @@ -416,7 +393,7 @@ div.widgetpreview-preview { } #dashboardWidgetsArea { - margin-top: 5px; + margin-top: -5px; } @media all and (max-width: 749px) { diff --git a/plugins/Dashboard/stylesheets/standalone.css b/plugins/Dashboard/stylesheets/standalone.css index 5a2b0d90d9f436516d31da145ed5d15c9002b7b2..292d3e63c0d2cca73b7320acabaceb52544c7688 100644 --- a/plugins/Dashboard/stylesheets/standalone.css +++ b/plugins/Dashboard/stylesheets/standalone.css @@ -45,17 +45,10 @@ body { } #Dashboard > ul > li:hover, -#Dashboard > ul > li:hover a, -#Dashboard > ul > li.sfHover, -#Dashboard > ul > li.sfHover a { +#Dashboard > ul > li:hover a { color: #e87500; } -#Dashboard > ul > li.sfHover, -#Dashboard > ul > li.sfHover a { - font-weight: bold; -} - .top_controls > #Dashboard, .top_controls > #periodString, .top_controls > .dashboardSettings { diff --git a/plugins/Dashboard/stylesheets/widget.less b/plugins/Dashboard/stylesheets/widget.less index a06564f033aedd13b9e4e8021ad4542162e77ee9..558da41ab9d32b8e48c3edd2a509ec06b91ffa95 100644 --- a/plugins/Dashboard/stylesheets/widget.less +++ b/plugins/Dashboard/stylesheets/widget.less @@ -16,7 +16,7 @@ font-weight: normal; font-size: 15px; margin: 0; - color: #0D0D0D; + color: @theme-color-text; text-shadow: none; padding: 15px 15px 10px 12px; } diff --git a/plugins/Dashboard/templates/_dashboardSettings.twig b/plugins/Dashboard/templates/_dashboardSettings.twig index dc05a6dae1ca366fa3a104b1c6bd17bebd4f3ea6..b82e9137430d09556673948d19f012f314ef5df6 100644 --- a/plugins/Dashboard/templates/_dashboardSettings.twig +++ b/plugins/Dashboard/templates/_dashboardSettings.twig @@ -1,12 +1,12 @@ -<span>{{ 'Dashboard_Dashboard'|translate }}</span> -<ul class="submenu"> +<a class="title" title="{{ 'Dashboard_ManageDashboard'|translate|e('html_attr') }}"><span class="icon icon-arrow-bottom"></span>{{ 'Dashboard_Dashboard'|translate }} </a> +<ul class="dropdown submenu"> <li> - <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }} ↓</div> + <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }}</div> <ul class="widgetpreview-categorylist"></ul> </li> {% if dashboardActions|length > 0 %} <li> - <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }} ↓</div> + <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }}</div> <ul> {% for action, title in dashboardActions %} <li data-action="{{ action }}">{{ title|translate }}</li> diff --git a/plugins/Dashboard/templates/index.twig b/plugins/Dashboard/templates/index.twig index 0a8831fe3fcfdbbe5c567e580c238eaba1a8fe31..ddaac2428cb2c5f3a13056665025cb06433043b6 100644 --- a/plugins/Dashboard/templates/index.twig +++ b/plugins/Dashboard/templates/index.twig @@ -3,11 +3,12 @@ {% include "@CoreHome/_periodSelect.twig" %} {{ postEvent("Template.nextToCalendar") }} {% render dashboardSettingsControl %} - <div id="Dashboard" class="piwikTopControl"> + <div id="Dashboard" class="piwikTopControl borderedControl piwikSelector"> <ul> {% for dashboard in dashboards %} <li class="dashboardMenuItem" id="Dashboard_embeddedIndex_{{ dashboard.iddashboard }}"> - <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});">{{ dashboard.name|escape }}</a> + <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});" + class="title">{{ dashboard.name|escape }}</a> </li> {% endfor %} </ul> diff --git a/plugins/DevicePlugins/DevicePlugins.php b/plugins/DevicePlugins/DevicePlugins.php index 3ac882e8ceec9bb53bf389520d437c3d0da39860..5ddc6d15d32340a7bed04e1707924b13717ab242 100644 --- a/plugins/DevicePlugins/DevicePlugins.php +++ b/plugins/DevicePlugins/DevicePlugins.php @@ -25,6 +25,7 @@ class DevicePlugins extends \Piwik\Plugin return array( 'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations', 'Live.getAllVisitorDetails' => 'extendVisitorDetails', + 'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction', ); } @@ -45,4 +46,10 @@ class DevicePlugins extends \Piwik\Plugin $translations = array_merge($translations, $metrics); } + public function renameUserSettingsModuleAndAction(&$module, &$action) + { + if ($module == 'UserSettings' && $action == 'getPlugin') { + $module = 'DevicePlugins'; + } + } } diff --git a/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php b/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php new file mode 100644 index 0000000000000000000000000000000000000000..1901960abbd85bd7c3d44f0efefc61e93750e7ca --- /dev/null +++ b/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php @@ -0,0 +1,78 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\DevicePlugins\tests\System; + +use Piwik\Tests\Fixtures\OneVisitorTwoVisits; +use Piwik\Tests\Framework\TestCase\SystemTestCase; + +/** + * @group DevicePlugins + * @group DevicePlugins_System + */ +class UserSettingsBCTest extends SystemTestCase +{ + /** + * @var OneVisitorTwoVisits + */ + public static $fixture; + + /** + * @dataProvider getApiForTesting + */ + public function test_Api($api, $params) + { + $this->runApiTests($api, $params); + } + + public function getApiForTesting() + { + $idSite = self::$fixture->idSite; + $dateTime = self::$fixture->dateTime; + + $api = array( + 'UserSettings.getPlugin', + ); + + $result = array(); + + + foreach ($api as $method) { + list($module, $action) = explode('.', $method); + + // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing + // against DevicePlugins & overwrite the module & action w/ otherRequestParameters) + $result[] = array('DevicePlugins.getPlugin', array('idSite' => $idSite, + 'date' => $dateTime, + 'periods' => array('day'), + 'testSuffix' => $module . '_' . $method . '_', + 'otherRequestParameters' => array( + 'method' => $method, + ), + )); + + // api metadata tests + $result[] = array('API.getMetadata', array( + 'idSite' => $idSite, + 'date' => $dateTime, + 'apiModule' => $module, + 'apiAction' => $action, + 'testSuffix' => $module . '_' . $method . '_', + )); + } + + return $result; + } + + public static function getPathToTestDirectory() + { + return dirname(__FILE__); + } +} + +UserSettingsBCTest::$fixture = new OneVisitorTwoVisits(); \ No newline at end of file diff --git a/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..9a4f40396328a93cdc60e99fb98e4c3a5a898827 --- /dev/null +++ b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Settings</category> + <name>Browser Plugins</name> + <module>DevicePlugins</module> + <action>getPlugin</action> + <dimension>Plugin</dimension> + <documentation>This report shows which browser plugins your visitors had enabled. This information might be important for choosing the right way to deliver your content.</documentation> + <metrics> + <nb_visits>Visits</nb_visits> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + </metricsDocumentation> + <processedMetrics> + <nb_visits_percentage>% Visits</nb_visits_percentage> + </processedMetrics> + <constantRowsCount>1</constantRowsCount> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicePlugins&apiAction=getPlugin&period=day&date=2010-03-06</imageGraphUrl> + <uniqueId>DevicePlugins_getPlugin</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..72728977e1a14514399c39119d67ece38f14a71c --- /dev/null +++ b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Cookie</label> + <nb_visits>2</nb_visits> + <nb_visits_percentage>100%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/cookie.gif</logo> + </row> + <row> + <label>Flash</label> + <nb_visits>2</nb_visits> + <nb_visits_percentage>100%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/flash.gif</logo> + </row> + <row> + <label>Java</label> + <nb_visits>2</nb_visits> + <nb_visits_percentage>100%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/java.gif</logo> + </row> + <row> + <label>Director</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/director.gif</logo> + </row> + <row> + <label>Gears</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/gears.gif</logo> + </row> + <row> + <label>Pdf</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/pdf.gif</logo> + </row> + <row> + <label>Quicktime</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/quicktime.gif</logo> + </row> + <row> + <label>Realplayer</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/realplayer.gif</logo> + </row> + <row> + <label>Silverlight</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/silverlight.gif</logo> + </row> + <row> + <label>Windowsmedia</label> + <nb_visits>0</nb_visits> + <nb_visits_percentage>0%</nb_visits_percentage> + <logo>plugins/DevicePlugins/images/plugins/windowsmedia.gif</logo> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/DevicesDetection.php b/plugins/DevicesDetection/DevicesDetection.php index 5385b29354ca899085a56ef900ae5487959d2cbc..2fd7b59fd2e6826fb2cc39d66e53f459fe355ea0 100644 --- a/plugins/DevicesDetection/DevicesDetection.php +++ b/plugins/DevicesDetection/DevicesDetection.php @@ -23,7 +23,8 @@ class DevicesDetection extends \Piwik\Plugin public function registerEvents() { return array( - 'Live.getAllVisitorDetails' => 'extendVisitorDetails' + 'Live.getAllVisitorDetails' => 'extendVisitorDetails', + 'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction', ); } @@ -49,4 +50,21 @@ class DevicesDetection extends \Piwik\Plugin $visitor['browserVersion'] = $instance->getBrowserVersion(); } + public function renameUserSettingsModuleAndAction(&$module, &$action) + { + $movedMethods = array( + 'index' => 'software', + 'getBrowser' => 'getBrowsers', + 'getBrowserVersion' => 'getBrowserVersions', + 'getMobileVsDesktop' => 'getType', + 'getOS' => 'getOsVersions', + 'getOSFamily' => 'getOsFamilies', + 'getBrowserType' => 'getBrowserEngines', + ); + + if ($module == 'UserSettings' && array_key_exists($action, $movedMethods)) { + $module = 'DevicesDetection'; + $action = $movedMethods[$action]; + } + } } diff --git a/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php b/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e86887780d63cefac9d26c0d49f0ad831a9a0300 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php @@ -0,0 +1,83 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\DevicesDetection\tests\System; + +use Piwik\Tests\Fixtures\OneVisitorTwoVisits; +use Piwik\Tests\Framework\TestCase\SystemTestCase; + +/** + * @group DevicesDetection + * @group DevicesDetection_System + */ +class UserSettingsBCTest extends SystemTestCase +{ + /** + * @var OneVisitorTwoVisits + */ + public static $fixture; + + /** + * @dataProvider getApiForTesting + */ + public function test_Api($api, $params) + { + $this->runApiTests($api, $params); + } + + public function getApiForTesting() + { + $idSite = self::$fixture->idSite; + $dateTime = self::$fixture->dateTime; + + $api = array( + 'UserSettings.getBrowser', + 'UserSettings.getBrowserVersion', + 'UserSettings.getMobileVsDesktop', + 'UserSettings.getOS', + 'UserSettings.getOSFamily', + 'UserSettings.getBrowserType', + ); + + $result = array(); + + + foreach ($api as $method) { + list($module, $action) = explode('.', $method); + + // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing + // against DevicesDetection & overwrite the module & action w/ otherRequestParameters) + $result[] = array('DevicesDetection.getBrowsers', array('idSite' => $idSite, + 'date' => $dateTime, + 'periods' => array('day'), + 'testSuffix' => $module . '_' . $method . '_', + 'otherRequestParameters' => array( + 'method' => $method, + ), + )); + + // api metadata tests + $result[] = array('API.getMetadata', array( + 'idSite' => $idSite, + 'date' => $dateTime, + 'apiModule' => $module, + 'apiAction' => $action, + 'testSuffix' => $module . '_' . $method . '_', + )); + } + + return $result; + } + + public static function getPathToTestDirectory() + { + return dirname(__FILE__); + } +} + +UserSettingsBCTest::$fixture = new OneVisitorTwoVisits(); \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..59301a5809fca76c93aa32941ce06bec7d3a49d4 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Browser engines</name> + <module>DevicesDetection</module> + <action>getBrowserEngines</action> + <dimension>Browser engine</dimension> + <documentation>This report shows your visitors' browsers broken down into browser engines. <br /> The most important information for web developers is what kind of rendering engine their visitors are using. The labels contain the names of the engines followed by the most common browser using that engine in brackets.</documentation> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowserEngines&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowserEngines&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getBrowserEngines</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e5e262294b635bb177510b24ec335698c9d7336 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Gecko (Firefox)</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>browserEngine==Gecko</segment> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..ae5eedde5290ebf4871826f5e0500be05f56c9e3 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Browser version</name> + <module>DevicesDetection</module> + <action>getBrowserVersions</action> + <dimension>Browser version</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowserVersions&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowserVersions&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getBrowserVersions</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..3c2fe50a07e7aecd2dc8a8f511ad9244e19a8218 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Firefox 3.6</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>browserCode==FF;browserVersion==3.6</segment> + <logo>plugins/DevicesDetection/images/browsers/FF.gif</logo> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c5b2df10ae4b58d6b1a00dae3c71c7145e740c9 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Visitor Browser</name> + <module>DevicesDetection</module> + <action>getBrowsers</action> + <dimension>Browser</dimension> + <documentation>This report contains information about what kind of browser your visitors were using. Each browser version is listed separately.</documentation> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowsers&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getBrowsers&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getBrowsers</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..68128919afa8a1571728e089d355d13f1c34d8e7 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Firefox</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <logo>plugins/DevicesDetection/images/browsers/FF.gif</logo> + <segment>browserCode==FF</segment> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..377949b52e6a27f7bb709d3f9053c2e3595c75c2 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Device type</name> + <module>DevicesDetection</module> + <action>getType</action> + <dimension>Device type</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getType&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getType&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getType</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..e2c2f35414cbe899635c6fa0f7d4de8d9114c688 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Desktop</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>deviceType==desktop</segment> + <logo>plugins/DevicesDetection/images/screens/normal.gif</logo> + </row> + <row> + <label>Camera</label> + <nb_visits>0</nb_visits> + <segment>deviceType==camera</segment> + <logo>plugins/DevicesDetection/images/screens/camera.png</logo> + </row> + <row> + <label>Car browser</label> + <nb_visits>0</nb_visits> + <segment>deviceType==car+browser</segment> + <logo>plugins/DevicesDetection/images/screens/carbrowser.png</logo> + </row> + <row> + <label>Console</label> + <nb_visits>0</nb_visits> + <segment>deviceType==console</segment> + <logo>plugins/DevicesDetection/images/screens/console.gif</logo> + </row> + <row> + <label>Feature phone</label> + <nb_visits>0</nb_visits> + <segment>deviceType==feature+phone</segment> + <logo>plugins/DevicesDetection/images/screens/mobile.gif</logo> + </row> + <row> + <label>Phablet</label> + <nb_visits>0</nb_visits> + <segment>deviceType==phablet</segment> + <logo>plugins/DevicesDetection/images/screens/unknown.gif</logo> + </row> + <row> + <label>Portable media player</label> + <nb_visits>0</nb_visits> + <segment>deviceType==portable+media+player</segment> + <logo>plugins/DevicesDetection/images/screens/unknown.gif</logo> + </row> + <row> + <label>Smart display</label> + <nb_visits>0</nb_visits> + <segment>deviceType==smart+display</segment> + <logo>plugins/DevicesDetection/images/screens/unknown.gif</logo> + </row> + <row> + <label>Smartphone</label> + <nb_visits>0</nb_visits> + <segment>deviceType==smartphone</segment> + <logo>plugins/DevicesDetection/images/screens/smartphone.png</logo> + </row> + <row> + <label>Tablet</label> + <nb_visits>0</nb_visits> + <segment>deviceType==tablet</segment> + <logo>plugins/DevicesDetection/images/screens/tablet.png</logo> + </row> + <row> + <label>Tv</label> + <nb_visits>0</nb_visits> + <segment>deviceType==tv</segment> + <logo>plugins/DevicesDetection/images/screens/tv.png</logo> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..23934c7263cd0bfdda53d39791c92f64175e7cba --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Operating System families</name> + <module>DevicesDetection</module> + <action>getOsFamilies</action> + <dimension>Operating system family</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getOsFamilies&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getOsFamilies&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getOsFamilies</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..1883e1f03ee4f834b04431841fa1bcaa22ca9089 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Windows</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <logo>plugins/DevicesDetection/images/os/WIN.gif</logo> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d6d669f04d772b9d4f14b16bbe7dba63ebbdcf0 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Devices</category> + <name>Operating System versions</name> + <module>DevicesDetection</module> + <action>getOsVersions</action> + <dimension>Operating System versions</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getOsVersions&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=DevicesDetection&apiAction=getOsVersions&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>DevicesDetection_getOsVersions</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..ee964d53f1eaffd0660eaf46ba2e42f25325a240 --- /dev/null +++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Windows XP</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>operatingSystemCode==WIN;operatingSystemVersion==XP</segment> + <logo>plugins/DevicesDetection/images/os/WIN.gif</logo> + </row> +</result> \ No newline at end of file diff --git a/plugins/Ecommerce/Categories/EcommerceCategory.php b/plugins/Ecommerce/Categories/EcommerceCategory.php index 39cd5bb3eaff78aa9917ea958ef5e2b7b7a89e4f..0e14470cfb01a3a231c774f6cc036e02c51c553e 100644 --- a/plugins/Ecommerce/Categories/EcommerceCategory.php +++ b/plugins/Ecommerce/Categories/EcommerceCategory.php @@ -14,4 +14,5 @@ class EcommerceCategory extends Category { protected $id = 'Goals_Ecommerce'; protected $order = 20; + protected $icon = 'icon-reporting-ecommerce'; } diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png index abda1cb32078cbac45acd55b29b52bfa65ccef68..f4f72b1c11c4b2f34eef6c88146512fbb3696bc2 100644 Binary files a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png and b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png differ diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png index 3543e6596a5fe86860832f070e81d5922ad7e2ca..fff1b50d89ec73c1ef2025d13e2da4554009c3f2 100644 Binary files a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png and b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png differ diff --git a/plugins/Goals/Categories/GoalsCategory.php b/plugins/Goals/Categories/GoalsCategory.php index 7ba4b4df58823584ca111ff7c481d614483f7212..043a51fd0b4bb2d2eae8a2ae1cd1d05270a6b5c7 100644 --- a/plugins/Goals/Categories/GoalsCategory.php +++ b/plugins/Goals/Categories/GoalsCategory.php @@ -14,4 +14,5 @@ class GoalsCategory extends Category { protected $id = 'Goals_Goals'; protected $order = 25; + protected $icon = 'icon-reporting-goal'; } diff --git a/plugins/Goals/templates/_listTopDimension.twig b/plugins/Goals/templates/_listTopDimension.twig index 8de4594f58aa9a104144e4f2a6001c634c5f3704..2d63e077b59ee6f83182a950c8b5ef82eaf1f0eb 100644 --- a/plugins/Goals/templates/_listTopDimension.twig +++ b/plugins/Goals/templates/_listTopDimension.twig @@ -1,8 +1,8 @@ {% for element in topDimension %} {% set goal_nb_conversion=element.nb_conversions %} {% set goal_conversion_rate=element.conversion_rate %} - <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion~"</b>")|raw }}, - {{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate~"</b>")|raw }}'> + <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion|number~"</b>")|raw }}, + {{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate|number~"</b>")|raw }}'> {{ element.name }} </span> diff --git a/plugins/Goals/templates/manageGoals.twig b/plugins/Goals/templates/manageGoals.twig index 4e3a4ce855ee0ea031b00dcecf29def5beecec28..72124faf72d3c1e6ab4407dd6e25da7aed1e7e32 100644 --- a/plugins/Goals/templates/manageGoals.twig +++ b/plugins/Goals/templates/manageGoals.twig @@ -2,6 +2,10 @@ {% set title %}{{ 'Goals_ManageGoals'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} +{% endblock %} + {% block content %} <h2 piwik-enriched-headline> @@ -20,8 +24,6 @@ {{ title }} </h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - {% include "@Goals/_addEditGoal.twig" %} <style type="text/css"> diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php index eb4d0a1289e1324221c9607470d77b06d949f53e..e70e4f8fbe264e050773074daadb2e0b090d92ac 100644 --- a/plugins/ImageGraph/StaticGraph.php +++ b/plugins/ImageGraph/StaticGraph.php @@ -13,6 +13,7 @@ use Exception; use pData; use pImage; use Piwik\Container\StaticContainer; +use Piwik\NumberFormatter; use Piwik\Piwik; use Piwik\BaseFactory; @@ -249,6 +250,8 @@ abstract class StaticGraph extends BaseFactory } } + $this->pData->setAxisDisplay(0, AXIS_FORMAT_CUSTOM, '\\Piwik\\Plugins\\ImageGraph\\formatYAxis'); + $this->pData->addPoints($this->abscissaSeries, self::ABSCISSA_SERIE_NAME); $this->pData->setAbscissa(self::ABSCISSA_SERIE_NAME); } @@ -341,3 +344,15 @@ abstract class StaticGraph extends BaseFactory } } } + +/** + * Global format method + * + * required to format y axis values using pcharts internal format callbacks + * @param $value + * @return mixed + */ +function formatYAxis($value) +{ + return NumberFormatter::getInstance()->format($value); +} diff --git a/plugins/ImageGraph/templates/testAllSizes.twig b/plugins/ImageGraph/templates/testAllSizes.twig index c00c023d09db0290e697ee0890482c21d67f7bd1..c4df9672ecb29c119605befb30c17ba9849c908d 100644 --- a/plugins/ImageGraph/templates/testAllSizes.twig +++ b/plugins/ImageGraph/templates/testAllSizes.twig @@ -1,15 +1,15 @@ {% extends 'dashboard.twig' %} +{% block topcontrols %} + {% include '@CoreHome/_periodSelect.twig' %} +{% endblock %} + {% block content %} {% set showSitesSelection=true %} <div> <h2>{{ 'ImageGraph_ImageGraph'|translate }} ::: {{ siteName }}</h2> - <div class="top_controls"> - {% include '@CoreHome/_periodSelect.twig' %} - </div> - <div class="entityContainer" style="width:100%;"> <div class="entityAddContainer"> <table class="dataTable entityTable"> diff --git a/plugins/Installation/stylesheets/installation.css b/plugins/Installation/stylesheets/installation.css index 5621ae98df5bd4ea980cb0579e7252709642b282..feb21be950e1ba46a48b7fbd5f9b8402914e6ed3 100644 --- a/plugins/Installation/stylesheets/installation.css +++ b/plugins/Installation/stylesheets/installation.css @@ -4,7 +4,7 @@ body { /* Header */ .header { - padding: 50px 0 12px; + padding: 50px 0 22px; margin-bottom: 40px; border-bottom: solid 1px #ccc; } @@ -20,7 +20,7 @@ body { } .language-selector { float: left; - margin-left: 15px; + margin-left: 20px; margin-top: 10px; } .installation-progress { diff --git a/plugins/Intl/Commands/GenerateIntl.php b/plugins/Intl/Commands/GenerateIntl.php index b6a57b957a5c7437ee5deeee2112c9079130e213..45637452a8d33096a4fcf66d219d6f8cf4489006 100644 --- a/plugins/Intl/Commands/GenerateIntl.php +++ b/plugins/Intl/Commands/GenerateIntl.php @@ -98,6 +98,7 @@ class GenerateIntl extends ConsoleCommand $this->fetchCalendarData($output, $transformedLangCode, $requestLangCode, $translations); $this->fetchLayoutDirection($output, $transformedLangCode, $requestLangCode, $translations); $this->fetchUnitData($output, $transformedLangCode, $requestLangCode, $translations); + $this->fetchNumberFormattingData($output, $transformedLangCode, $requestLangCode, $translations); ksort($translations['Intl']); @@ -324,6 +325,32 @@ class GenerateIntl extends ConsoleCommand return $dateFormat; } + protected function fetchNumberFormattingData(OutputInterface $output, $langCode, $requestLangCode, &$translations) + { + $unitsUrl = 'https://raw.githubusercontent.com/unicode-cldr/cldr-numbers-full/master/main/%s/numbers.json'; + + try { + $unitsData = Http::fetchRemoteFile(sprintf($unitsUrl, $requestLangCode)); + $unitsData = json_decode($unitsData, true); + $unitsData = $unitsData['main'][$requestLangCode]['numbers']; + + $numberingSystem = $unitsData['defaultNumberingSystem']; + + $translations['Intl']['NumberSymbolDecimal'] = $unitsData['symbols-numberSystem-' . $numberingSystem]['decimal']; + $translations['Intl']['NumberSymbolGroup'] = $unitsData['symbols-numberSystem-' . $numberingSystem]['group']; + $translations['Intl']['NumberSymbolPercent'] = $unitsData['symbols-numberSystem-' . $numberingSystem]['percentSign']; + $translations['Intl']['NumberSymbolPlus'] = $unitsData['symbols-numberSystem-' . $numberingSystem]['plusSign']; + $translations['Intl']['NumberSymbolMinus'] = $unitsData['symbols-numberSystem-' . $numberingSystem]['minusSign']; + $translations['Intl']['NumberFormatNumber'] = $unitsData['decimalFormats-numberSystem-' . $numberingSystem]['standard']; + $translations['Intl']['NumberFormatCurrency'] = $unitsData['currencyFormats-numberSystem-' . $numberingSystem]['standard']; + $translations['Intl']['NumberFormatPercent'] = $unitsData['percentFormats-numberSystem-' . $numberingSystem]['standard']; + + $output->writeln('Saved number formatting data for ' . $langCode); + } catch (\Exception $e) { + $output->writeln('Unable to import number formatting data for ' . $langCode); + } + } + protected function fetchUnitData(OutputInterface $output, $langCode, $requestLangCode, &$translations) { $unitsUrl = 'https://raw.githubusercontent.com/unicode-cldr/cldr-units-full/master/main/%s/units.json'; diff --git a/plugins/Intl/lang/am.json b/plugins/Intl/lang/am.json index 551304d5d6621327a8a153d4b12891d8ffd606bc..49992598502e773df97aa110aeb9bb6d4c0410cd 100644 --- a/plugins/Intl/lang/am.json +++ b/plugins/Intl/lang/am.json @@ -174,7 +174,7 @@ "Country_NG": "ናá‹áŒ„ሪያ", "Country_NI": "ኒካራጓ", "Country_NL": "ኔዘáˆáˆ‹áŠ•á‹µ", - "Country_NO": "ኖáˆá‹Œ", + "Country_NO": "ኖáˆá‹Œá‹", "Country_NP": "ኔá“áˆ", "Country_NR": "ናኡሩ", "Country_NU": "ኒኡá‹", @@ -198,7 +198,7 @@ "Country_RE": "ሪዩኒየን", "Country_RO": "ሮሜኒያ", "Country_RS": "ሰáˆá‰¥á‹«", - "Country_RU": "ራሺያ", + "Country_RU": "ራሽያ", "Country_RW": "ሩዋንዳ", "Country_SA": "ሳá‹á‹µáŠ ረቢያ", "Country_SB": "ሰሎሞን ደሴት", @@ -300,10 +300,10 @@ "Day_Short_StandAlone_6": "ቅዳሜ", "Day_Short_StandAlone_7": "እሑድ", "EnglishLanguageName": "Amharic", - "Format_DateTime_Long": "EEEE, d MMMM y h:mm:ss a", + "Format_DateTime_Long": "EEEE á£d MMMM y h:mm:ss a", "Format_DateTime_Short": "d MMM y h:mm:ss a", - "Format_Date_Day_Month": "E, MMM d", - "Format_Date_Long": "EEEE, d MMMM y", + "Format_Date_Day_Month": "EᣠMMM d", + "Format_Date_Long": "EEEE á£d MMMM y", "Format_Date_Short": "d MMM y", "Format_Interval_Long_D": "MMMM d–dᣠy", "Format_Interval_Long_M": "MMMM d – MMMM dᣠy", @@ -318,11 +318,14 @@ "Hours": "ሰዓቶች", "Language_aa": "አá‹áˆáŠ›", "Language_ab": "አብáˆá‹šáŠ›", + "Language_ae": "አቬስታን", "Language_af": "አáሪካንኛ", "Language_ak": "አካንኛ", "Language_am": "አማáˆáŠ›", + "Language_an": "አራጎንስ", "Language_ar": "ዓረብኛ", "Language_as": "አሳሜዛዊ", + "Language_av": "አቫሪáŠ", "Language_ay": "አያማáˆáŠ›", "Language_az": "አዘáˆá‰£áŒƒáŠ•áŠ›", "Language_ba": "ባስኪáˆáŠ›", @@ -335,8 +338,13 @@ "Language_br": "ብሬቶንኛ", "Language_bs": "ቦስኒያንኛ", "Language_ca": "ካታላንኛ", + "Language_ce": "ችችን", + "Language_ch": "ቻሞሮ", "Language_co": "ኮáˆáˆ²áŠ«áŠ›", + "Language_cr": "áŠáˆª", "Language_cs": "ቼáŠáŠ›", + "Language_cu": "ቸáˆá‰½ ስላቪáŠ", + "Language_cv": "ቹቫሽ", "Language_cy": "ወáˆáˆ½", "Language_da": "ዴኒሽ", "Language_de": "ጀáˆáˆ˜áŠ•", @@ -346,7 +354,7 @@ "Language_el": "áŒáˆªáŠáŠ›", "Language_en": "እንáŒáˆŠá‹áŠ›", "Language_eo": "ኤስáራንቶ", - "Language_es": "ስá“ኒሽ", + "Language_es": "ስá“ንሽኛ", "Language_et": "ኢስቶኒያንኛ", "Language_eu": "ባስáŠáŠ›", "Language_fa": "ááˆáˆºá‹«áŠ›", @@ -428,7 +436,7 @@ "Language_rm": "ሮማንሽ", "Language_rn": "ሩንዲኛ", "Language_ro": "ሮማኒያን", - "Language_ru": "ራሽኛ", + "Language_ru": "ራሽያኛ", "Language_rw": "ኪንያáˆá‹‹áŠ•á‹µáŠ›", "Language_sa": "ሳንስáŠáˆªá‰µáŠ›", "Language_sd": "ሲንድሂኛ", @@ -531,6 +539,14 @@ "NMinutesShort": "%s ደቂቃ", "NSeconds": "%s ሰከንዶች", "NSecondsShort": "%s ሰ", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ቀናት", "OneMinute": "1 ደቂቃ", "OneMinuteShort": "1 ደቂ", diff --git a/plugins/Intl/lang/ar.json b/plugins/Intl/lang/ar.json index 4adbcfa7a4926a63543a096aa4f876531c8b692f..481c4e62ce3364a608f3958ccb9806b4d3ac1304 100644 --- a/plugins/Intl/lang/ar.json +++ b/plugins/Intl/lang/ar.json @@ -21,7 +21,7 @@ "Country_AS": "ساموا الأمريكية", "Country_AT": "النمسا", "Country_AU": "أستراليا", - "Country_AW": "آروبا", + "Country_AW": "أروبا", "Country_AX": "جزر آلاند", "Country_AZ": "أذربيجان", "Country_BA": "البوسنة والهرسك", @@ -39,21 +39,21 @@ "Country_BO": "بوليÙيا", "Country_BQ": "هولندا الكاريبية", "Country_BR": "البرازيل", - "Country_BS": "الباهاما", + "Country_BS": "البهاما", "Country_BT": "بوتان", "Country_BV": "جزيرة بوÙيه", "Country_BW": "بتسوانا", - "Country_BY": "روسيا البيضاء", + "Country_BY": "بيلاروس", "Country_BZ": "بليز", "Country_CA": "كندا", - "Country_CC": "جزر كوكوس", + "Country_CC": "جزر كوكوس (كيلينغ)", "Country_CD": "الكونغو - كينشاسا", "Country_CF": "جمهورية Ø£Ùريقيا الوسطى", "Country_CG": "الكونغو - برازاÙيل", "Country_CH": "سويسرا", "Country_CI": "ساØÙ„ العاج", "Country_CK": "جزر كوك", - "Country_CL": "شيلي", + "Country_CL": "تشيلي", "Country_CM": "الكاميرون", "Country_CN": "الصين", "Country_CO": "كولومبيا", @@ -71,10 +71,10 @@ "Country_DO": "جمهورية الدومينيك", "Country_DZ": "الجزائر", "Country_EC": "الإكوادور", - "Country_EE": "أستونيا", + "Country_EE": "إستونيا", "Country_EG": "مصر", "Country_EH": "الصØراء الغربية", - "Country_ER": "أريتريا", + "Country_ER": "إريتريا", "Country_ES": "إسبانيا", "Country_ET": "إثيوبيا", "Country_FI": "Ùنلندا", @@ -94,7 +94,7 @@ "Country_GL": "غرينلاند", "Country_GM": "غامبيا", "Country_GN": "غينيا", - "Country_GP": "جوادلوب", + "Country_GP": "غوادلوب", "Country_GQ": "غينيا الإستوائية", "Country_GR": "اليونان", "Country_GS": "جورجيا الجنوبية وجزر ساندويتش الجنوبية", @@ -108,7 +108,7 @@ "Country_HR": "كرواتيا", "Country_HT": "هايتي", "Country_HU": "هنغاريا", - "Country_ID": "أندونيسيا", + "Country_ID": "إندونيسيا", "Country_IE": "أيرلندا", "Country_IL": "إسرائيل", "Country_IM": "جزيرة مان", @@ -178,7 +178,7 @@ "Country_NP": "نيبال", "Country_NR": "ناورو", "Country_NU": "نيوي", - "Country_NZ": "نيوزيلاندا", + "Country_NZ": "نيوزيلندا", "Country_OM": "عÙمان", "Country_PA": "بنما", "Country_PE": "بيرو", @@ -221,12 +221,12 @@ "Country_SX": "سينت مارتن", "Country_SY": "سوريا", "Country_SZ": "سوازيلاند", - "Country_TC": "جزر الترك وجايكوس", + "Country_TC": "جزر توركس وكايكوس", "Country_TD": "تشاد", - "Country_TF": "المقاطعات الجنوبية الÙرنسية", - "Country_TG": "توجو", + "Country_TF": "الأقاليم الجنوبية الÙرنسية", + "Country_TG": "توغو", "Country_TH": "تايلاند", - "Country_TJ": "طاجكستان", + "Country_TJ": "طاجيكستان", "Country_TK": "توكيلو", "Country_TL": "تيمور الشرقية", "Country_TM": "تركمانستان", @@ -236,7 +236,7 @@ "Country_TT": "ترينيداد وتوباغو", "Country_TV": "توÙالو", "Country_TW": "تايوان", - "Country_TZ": "تانزانيا", + "Country_TZ": "تنزانيا", "Country_UA": "أوكرانيا", "Country_UG": "أوغندا", "Country_UM": "جزر الولايات المتØدة النائية", @@ -315,7 +315,7 @@ "Format_Month_Short": "MMM y", "Format_Time": "h:mm:ss a", "Format_Year": "y", - "Hours": "ساعة", + "Hours": "ساعات", "Language_aa": "الأÙارية", "Language_ab": "الأبخازية", "Language_ae": "الأÙستية", @@ -555,18 +555,26 @@ "NMinutesShort": "%s د", "NSeconds": "%s ثانية", "NSecondsShort": "%s Ø«", + "NumberFormatCurrency": "¤ #,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": "Ù«", + "NumberSymbolGroup": "Ù¬", + "NumberSymbolMinus": "â€-", + "NumberSymbolPercent": "Ùª", + "NumberSymbolPlus": "â€+", "OneDay": "يوم", - "OneMinute": "1 دقيقة", + "OneMinute": "دقيقة", "OneMinuteShort": "1 د", "OriginalLanguageName": "العربية", "PeriodDay": "يوم", - "PeriodDays": "يوم", + "PeriodDays": "أيام", "PeriodMonth": "الشهر", - "PeriodMonths": "شهر", + "PeriodMonths": "شهور", "PeriodWeek": "الأسبوع", - "PeriodWeeks": "أسبوع", + "PeriodWeeks": "أسابيع", "PeriodYear": "السنة", - "PeriodYears": "سنة", + "PeriodYears": "سنوات", "Seconds": "ثانية", "Time_AM": "ص", "Time_PM": "Ù…", diff --git a/plugins/Intl/lang/be.json b/plugins/Intl/lang/be.json index 85752d297078b0014949e183603dce492f6d2ea1..88bb7c14cbe074fb86e6f48e4c2b14b00483f957 100644 --- a/plugins/Intl/lang/be.json +++ b/plugins/Intl/lang/be.json @@ -1,9 +1,9 @@ { "Intl": { "Continent_afr": "Ðфрыка", - "Continent_amc": "ЦÑÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ ÐмÑрыка", - "Continent_amn": "ÐŸÐ°ÑžÐ½Ð¾Ñ‡Ð½Ð°Ñ ÐмÑрыка", - "Continent_ams": "ÐŸÐ°ÑžÐ´Ð½Ñ‘Ð²Ð°Ñ ÐмÑрыка", + "Continent_amc": "ЦÑÐ½Ñ‚Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ðмерыка", + "Continent_amn": "ÐŸÐ°ÑžÐ½Ð¾Ñ‡Ð½Ð°Ñ Ðмерыка", + "Continent_ams": "ÐŸÐ°ÑžÐ´Ð½Ñ‘Ð²Ð°Ñ Ðмерыка", "Continent_ant": "Ðнтарктыка", "Continent_asi": "ÐзіÑ", "Continent_eur": "Еўропа", @@ -37,18 +37,19 @@ "Country_BM": "БермудÑÐºÑ–Ñ Ð°Ñтравы", "Country_BN": "Бруней", "Country_BO": "БалівіÑ", + "Country_BQ": "КарыбÑÐºÑ–Ñ ÐідÑрланды", "Country_BR": "БразіліÑ", "Country_BS": "Багамы", "Country_BT": "Бутан", - "Country_BV": "Ð‘ÑƒÐ²Ñ Ð²Ð¾Ñтраў", + "Country_BV": "ВоÑтраў БувÑ", "Country_BW": "БатÑвана", "Country_BY": "БеларуÑÑŒ", "Country_BZ": "Беліз", "Country_CA": "Канада", "Country_CC": "КакоÑÐ°Ð²Ñ‹Ñ Ð°Ñтравы", - "Country_CD": "Конга, ДÑÐ¼Ð°ÐºÑ€Ð°Ñ‚Ñ‹Ñ‡Ð½Ð°Ñ Ð ÑÑпубліка", + "Country_CD": "Конга (КіншаÑа)", "Country_CF": "ЦÑнтральна-ÐфрыканÑÐºÐ°Ñ Ð ÑÑпубліка", - "Country_CG": "Конга", + "Country_CG": "Конга (Бразавіль)", "Country_CH": "ШвейцарыÑ", "Country_CI": "Кот-д’Івуар", "Country_CK": "ÐÑтравы Кука", @@ -60,7 +61,7 @@ "Country_CU": "Куба", "Country_CV": "Каба-ВердÑ", "Country_CW": "ВоÑтраў КюраÑаа", - "Country_CX": "ВоÑтраў РажÑтва", + "Country_CX": "ВоÑтраў РаÑтва", "Country_CY": "Кіпр", "Country_CZ": "ЧÑÑ…Ñ–Ñ", "Country_DE": "ГерманіÑ", @@ -78,7 +79,7 @@ "Country_ET": "ÐфіопіÑ", "Country_FI": "ФінлÑндыÑ", "Country_FJ": "Фіджы", - "Country_FK": "ФолклÑндÑÐºÑ–Ñ Ð°Ñтравы", + "Country_FK": "ФалклендÑÐºÑ–Ñ Ð°Ñтравы", "Country_FM": "МікранезіÑ", "Country_FO": "ФарÑÑ€ÑÐºÑ–Ñ Ð°Ñтравы", "Country_FR": "ФранцыÑ", @@ -101,8 +102,8 @@ "Country_GU": "Гуам", "Country_GW": "ГвінеÑ-БіÑау", "Country_GY": "ГаÑна", - "Country_HK": "Гон-Конг, Кітай (СÐÐ )", - "Country_HM": "ВоÑтраў Херд Ñ– ÐÑтравы Макдоналд", + "Country_HK": "Ганконг, СÐÐ (Кітай)", + "Country_HM": "ВоÑтраў Херд Ñ– аÑтравы Макдональд", "Country_HN": "ГандураÑ", "Country_HR": "ХарватыÑ", "Country_HT": "Гаіці", @@ -147,13 +148,14 @@ "Country_MC": "Манака", "Country_MD": "Малдова", "Country_ME": "ЧарнагорыÑ", + "Country_MF": "Сен-МартÑн", "Country_MG": "МадагаÑкар", "Country_MH": "Маршалавы ÐÑтравы", - "Country_MK": "МакедоніÑ, БЮР", + "Country_MK": "МакедоніÑ", "Country_ML": "Малі", - "Country_MM": "М’Ñнма", + "Country_MM": "М’Ñнма (Бірма)", "Country_MN": "МанголіÑ", - "Country_MO": "Макао, Кітай (СÐÐ )", + "Country_MO": "Макаа, СÐÐ (Кітай)", "Country_MP": "ÐŸÐ°ÑžÐ½Ð¾Ñ‡Ð½Ñ‹Ñ ÐœÐ°Ñ€Ñ‹ÑнÑÐºÑ–Ñ Ð°Ñтравы", "Country_MQ": "Марцініка", "Country_MR": "МаўрытаніÑ", @@ -204,7 +206,7 @@ "Country_SD": "Судан", "Country_SE": "ШвецыÑ", "Country_SG": "Сінгапур", - "Country_SH": "СвÑтой Ðлены, ВоÑтраў", + "Country_SH": "ВоÑтраў СвÑтой Ðлены", "Country_SI": "СлавеніÑ", "Country_SJ": "Свальбард (Паўночна-УÑходнÑÑ Ð—ÑмлÑ) Ñ– Ян-Маен", "Country_SK": "СлавакіÑ", @@ -213,8 +215,10 @@ "Country_SN": "Сенегал", "Country_SO": "Самалі", "Country_SR": "Сурынам", + "Country_SS": "Паўднёвы Судан", "Country_ST": "Сан-Ð¢Ð°Ð¼Ñ Ñ– ПрынÑіпі", "Country_SV": "Сальвадор", + "Country_SX": "Сінт-МартÑн", "Country_SY": "СірыÑ", "Country_SZ": "Свазіленд", "Country_TC": "Ð¦Ñ‘Ñ€ÐºÑ Ñ– КайкаÑ", @@ -235,6 +239,7 @@ "Country_TZ": "ТанзаніÑ", "Country_UA": "Украіна", "Country_UG": "Уганда", + "Country_UM": "Ð—Ð½ÐµÑˆÐ½Ñ–Ñ Ð¼Ð°Ð»Ñ‹Ñ Ð°Ñтравы ЗШÐ", "Country_US": "Ð—Ð»ÑƒÑ‡Ð°Ð½Ñ‹Ñ Ð¨Ñ‚Ð°Ñ‚Ñ‹ Ðмерыкі", "Country_UY": "Уругвай", "Country_UZ": "УзбекіÑтан", @@ -300,19 +305,20 @@ "Format_Date_Day_Month": "E, d MMM", "Format_Date_Long": "EEEE, d MMMM y", "Format_Date_Short": "d.M.y", - "Format_Interval_Long_D": "y MMMM d–d", - "Format_Interval_Long_M": "y MMMM d – MMMM d", - "Format_Interval_Long_Y": "y MMMM d – y MMMM d", - "Format_Interval_Short_D": "y MMM d–d", - "Format_Interval_Short_M": "y MMM d – MMM d", - "Format_Interval_Short_Y": "y MMM d – y MMM d", + "Format_Interval_Long_D": "d–d MMMM y", + "Format_Interval_Long_M": "d MMMM – d MMMM y", + "Format_Interval_Long_Y": "d MMMM y – d MMMM y", + "Format_Interval_Short_D": "d–d MMM y", + "Format_Interval_Short_M": "d MMM – d MMM y", + "Format_Interval_Short_Y": "d MMM y – d MMM y", "Format_Month_Long": "LLLL y", "Format_Month_Short": "LLL y", "Format_Time": "HH.mm.ss", "Format_Year": "y", - "Hours": "hr", + "Hours": "гадзіны", "Language_ab": "ÐбхазÑкаÑ", "Language_af": "ÐфрыкаанÑ", + "Language_ak": "Ðкан", "Language_am": "ÐмхарÑкаÑ", "Language_an": "ÐрагонÑкаÑ", "Language_ar": "ÐрабÑкаÑ", @@ -323,17 +329,22 @@ "Language_ba": "БашкірÑкаÑ", "Language_be": "БеларуÑкаÑ", "Language_bg": "БалгарÑкаÑ", + "Language_bm": "Бамбара", "Language_bn": "БенгальÑкаÑ", + "Language_bo": "ТыбецкаÑ", "Language_br": "БрÑтонÑкаÑ", "Language_bs": "БаÑнійÑкаÑ", - "Language_ca": "КаталонÑкаÑ", + "Language_ca": "КаталанÑкаÑ", "Language_ce": "ЧачÑнÑкаÑ", + "Language_co": "КарÑіканÑкаÑ", "Language_cs": "ЧÑшÑкаÑ", "Language_cv": "ЧувашÑкаÑ", "Language_cy": "ВалійÑкаÑ", "Language_da": "ДацкаÑ", "Language_de": "ÐÑмецкаÑ", - "Language_el": "ГрÑцкаÑ", + "Language_dz": "Дзонгкха", + "Language_ee": "Ðве", + "Language_el": "ГрÑчаÑкаÑ", "Language_en": "ÐнглійÑкаÑ", "Language_eo": "ÐÑперанта", "Language_es": "ІÑпанÑкаÑ", @@ -341,6 +352,7 @@ "Language_eu": "БаÑкÑкаÑ", "Language_fa": "ФарÑÑ–", "Language_fi": "ФінÑкаÑ", + "Language_fj": "ФіджыйÑкаÑ", "Language_fo": "ФарÑÑ€ÑкаÑ", "Language_fr": "ФранцузÑкаÑ", "Language_fy": "ФрызÑкаÑ", @@ -348,63 +360,93 @@ "Language_gd": "ШатландÑÐºÐ°Ñ Ð³ÑльÑкаÑ", "Language_gl": "ГаліÑійÑкаÑ", "Language_gn": "Гуарані", - "Language_gu": "ГуÑраці", + "Language_gu": "Гуджараці", + "Language_gv": "ÐœÑнÑкаÑ", + "Language_ha": "ХаўÑа", "Language_he": "Іўрыт", "Language_hi": "Хіндзі", "Language_hr": "ХарвацкаÑ", + "Language_ht": "ГаіцÑнÑкаÑ", "Language_hu": "ВенгерÑкаÑ", "Language_hy": "ÐрмÑнÑкаÑ", "Language_ia": "ІнтÑрлінгва", "Language_id": "ІнданезійÑкаÑ", "Language_ie": "ІнтÑрлінгве", + "Language_ig": "Ігба", + "Language_ii": "Сычуань І", "Language_is": "ІÑландÑкаÑ", "Language_it": "ІтальÑнÑкаÑ", + "Language_iu": "Інуктытут", "Language_ja": "ЯпонÑкаÑ", "Language_jv": "ЯванÑкаÑ", "Language_ka": "ГрузінÑкаÑ", + "Language_ki": "Кікую", "Language_kk": "КазахÑкаÑ", - "Language_kn": "Каннада", + "Language_kl": "ГрÑнландÑкаÑ", + "Language_km": "КхмерÑкаÑ", + "Language_kn": "Канада", "Language_ko": "КарÑйÑкаÑ", + "Language_ks": "КашмірÑкаÑ", "Language_ku": "КурдÑкаÑ", + "Language_kw": "КорнÑкаÑ", + "Language_ky": "КіргізÑкаÑ", "Language_la": "ЛацінÑкаÑ", + "Language_lb": "ЛюкÑембургÑкаÑ", + "Language_lg": "Ганда", "Language_ln": "Лінгала", "Language_lo": "ЛаоÑкаÑ", "Language_lt": "ЛітоўÑкаÑ", + "Language_lu": "Луба-катанга", "Language_lv": "ЛатышÑкаÑ", + "Language_mg": "МалагаÑійÑкаÑ", + "Language_mi": "Маары", "Language_mk": "МакедонÑкаÑ", - "Language_ml": "МалаÑламÑкаÑ", + "Language_ml": "МалаÑлам", "Language_mn": "МангольÑкаÑ", "Language_mr": "Маратхі", "Language_ms": "МалайÑкаÑ", "Language_mt": "МальтыйÑкаÑ", - "Language_nb": "ÐарвÑÑÐºÐ°Ñ Ð±ÑƒÐºÐ¼Ð°Ð»", + "Language_my": "БірманÑкаÑ", + "Language_nb": "ÐарвежÑÐºÐ°Ñ (букмал)", + "Language_nd": "ÐŸÐ°ÑžÐ½Ð¾Ñ‡Ð½Ð°Ñ Ð½Ð´Ñбеле", "Language_ne": "ÐепальÑкаÑ", "Language_nl": "ГаландÑкаÑ", "Language_nn": "ÐарвежÑÐºÐ°Ñ (нюнорÑк)", "Language_no": "ÐарвежÑкаÑ", "Language_oc": "ПраванÑальÑкаÑ", + "Language_om": "Ðрома", + "Language_or": "ОрыÑ", "Language_pa": "Панджабі", "Language_pl": "ПольÑкаÑ", "Language_ps": "Пушту", "Language_pt": "ПартугальÑкаÑ", + "Language_qu": "Кечуа", + "Language_rm": "Ð ÑтараманÑкаÑ", + "Language_rn": "Рундзі", "Language_ro": "РумынÑкаÑ", "Language_ru": "РуÑкаÑ", + "Language_rw": "КіньÑруанда", "Language_sa": "СанÑкрыт", "Language_sd": "Сіндхі", + "Language_se": "ПаўночнаÑаамÑкаÑ", + "Language_sg": "Санга", "Language_si": "СінгальÑкаÑ", "Language_sk": "СлавацкаÑ", "Language_sl": "СлавенÑкаÑ", + "Language_sn": "Шона", "Language_so": "СамалійÑкаÑ", "Language_sq": "ÐлбанÑкаÑ", "Language_sr": "СербÑкаÑ", - "Language_su": "СуданÑкаÑ", + "Language_su": "СундÑкаÑ", "Language_sv": "ШведÑкаÑ", "Language_sw": "Суахілі", "Language_ta": "ТамільÑкаÑ", "Language_te": "ТÑлугу", + "Language_tg": "ТаджыкÑкаÑ", "Language_th": "ТайÑкаÑ", "Language_ti": "ТыгрыньÑ", "Language_tk": "ТуркменÑкаÑ", + "Language_to": "ТанганÑкаÑ", "Language_tr": "ТурÑцкаÑ", "Language_tt": "ТатарÑкаÑ", "Language_ug": "УйгурÑкаÑ", @@ -412,12 +454,14 @@ "Language_ur": "Урду", "Language_uz": "УзбекÑкаÑ", "Language_vi": "В’етнамÑкаÑ", - "Language_xh": "ХоÑа", + "Language_wo": "Валоф", + "Language_xh": "КоÑа", "Language_yi": "Ідыш", + "Language_yo": "Ðруба", "Language_zh": "КітайÑкаÑ", "Language_zu": "Зулу", "LayoutDirection": "ltr", - "Minutes": "min", + "Minutes": "хвіліны", "Month_Long_1": "СтудзенÑ", "Month_Long_10": "КаÑтрычніка", "Month_Long_11": "ЛіÑтапада", @@ -466,29 +510,37 @@ "Month_Short_StandAlone_7": "Ліп", "Month_Short_StandAlone_8": "Жні", "Month_Short_StandAlone_9": "Вер", - "NDays": "%s днÑ", - "NHoursShort": "%s h", + "NDays": "%s Ñутак", + "NHoursShort": "%sгадз.", "NMinutes": "%s хвіліны", - "NMinutesShort": "%s min", - "NSeconds": "%s ÑÑкунды", - "NSecondsShort": "%s s", - "OneDay": "1 днÑ", + "NMinutesShort": "%s хв.", + "NSeconds": "%s Ñекунды", + "NSecondsShort": "%sÑ", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", + "OneDay": "1 Ñуткі", "OneMinute": "1 хвіліна", - "OneMinuteShort": "1 min", + "OneMinuteShort": "1 хв.", "OriginalLanguageName": "БеларуÑкаÑ", "PeriodDay": "дзень", - "PeriodDays": "day", + "PeriodDays": "Ñуткі", "PeriodMonth": "меÑÑц", - "PeriodMonths": "mon", + "PeriodMonths": "меÑÑцы", "PeriodWeek": "тыдзень", - "PeriodWeeks": "wk", + "PeriodWeeks": "тыдні", "PeriodYear": "год", - "PeriodYears": "yr", - "Seconds": "sec", - "Time_AM": "да палуднÑ", - "Time_PM": "паÑÐ»Ñ Ð¿Ð°Ð»ÑƒÐ´Ð½Ñ", + "PeriodYears": "гады", + "Seconds": "Ñекунды", + "Time_AM": "да паўднÑ", + "Time_PM": "паÑÐ»Ñ Ð¿Ð°ÑžÐ´Ð½Ñ", "Today": "СённÑ", - "Year_Short": "год", + "Year_Short": "г.", "Yesterday": "Учора" } } \ No newline at end of file diff --git a/plugins/Intl/lang/bg.json b/plugins/Intl/lang/bg.json index b257f6e2b928b5194a1ff78a4cb76aa5c1d9e930..02880b589d95bd8ebea83270c825d1b4da377418 100644 --- a/plugins/Intl/lang/bg.json +++ b/plugins/Intl/lang/bg.json @@ -35,7 +35,7 @@ "Country_BJ": "Бенин", "Country_BL": "Сен Бартелеми", "Country_BM": "Бермуда", - "Country_BN": "Бруней ДаруÑалам", + "Country_BN": "Бруней ДаруÑÑалам", "Country_BO": "БоливиÑ", "Country_BQ": "КарибÑка ÐидерландиÑ", "Country_BR": "БразилиÑ", @@ -47,9 +47,9 @@ "Country_BZ": "Белиз", "Country_CA": "Канада", "Country_CC": "КокоÑови оÑтрови (оÑтрови Кийлинг)", - "Country_CD": "Демократична република Конго", + "Country_CD": "Конго (КиншаÑа)", "Country_CF": "ЦентралноафриканÑка република", - "Country_CG": "Конго", + "Country_CG": "Конго (Бразавил)", "Country_CH": "ШвейцариÑ", "Country_CI": "Кот д’Ивоар", "Country_CK": "ОÑтрови Кук", @@ -63,7 +63,7 @@ "Country_CW": "КюраÑао", "Country_CX": "ОÑтров РождеÑтво", "Country_CY": "Кипър", - "Country_CZ": "ЧехиÑ", + "Country_CZ": "Чешка република", "Country_DE": "ГерманиÑ", "Country_DJ": "Джибути", "Country_DK": "ДаниÑ", @@ -84,11 +84,11 @@ "Country_FO": "ФарьорÑки оÑтрови", "Country_FR": "ФранциÑ", "Country_GA": "Габон", - "Country_GB": "ВеликобританиÑ", + "Country_GB": "Обединеното кралÑтво", "Country_GD": "Гренада", "Country_GE": "ГрузиÑ", "Country_GF": "ФренÑка Гвиана", - "Country_GG": "ГърнÑи", + "Country_GG": "Гърнзи", "Country_GH": "Гана", "Country_GI": "Гибралтар", "Country_GL": "ГренландиÑ", @@ -183,7 +183,7 @@ "Country_PA": "Панама", "Country_PE": "Перу", "Country_PF": "ФренÑка ПолинезиÑ", - "Country_PG": "Папуа Ðова ГвинеÑ", + "Country_PG": "Папуа-Ðова ГвинеÑ", "Country_PH": "Филипини", "Country_PK": "ПакиÑтан", "Country_PL": "Полша", @@ -319,7 +319,7 @@ "Language_aa": "Ðфар", "Language_ab": "Ðбхазки", "Language_ae": "ÐвеÑÑ‚Ñки", - "Language_af": "ÐфриканÑ", + "Language_af": "ÐфрикаанÑ", "Language_ak": "Ðкан", "Language_am": "ÐмхарÑки", "Language_an": "ÐрагонÑки", @@ -426,12 +426,12 @@ "Language_mt": "МалтийÑки", "Language_my": "БирманÑки", "Language_na": "Ðауру", - "Language_nb": "Ðорвежки букмол", + "Language_nb": "Ðорвежки (букмол)", "Language_nd": "Северен ндебеле", "Language_ne": "ÐепалÑки", "Language_ng": "Ðдонга", "Language_nl": "ÐидерландÑки", - "Language_nn": "Ðорвежки нюношк", + "Language_nn": "Ðорвежки (нюношк)", "Language_no": "Ðорвежки", "Language_nr": "Южен ндебеле", "Language_nv": "Ðавахо", @@ -525,36 +525,44 @@ "Month_Long_StandAlone_7": "Юли", "Month_Long_StandAlone_8": "ÐвгуÑÑ‚", "Month_Long_StandAlone_9": "Септември", - "Month_Short_1": "Ян.", - "Month_Short_10": "Окт.", - "Month_Short_11": "Ðоем.", - "Month_Short_12": "Дек.", - "Month_Short_2": "Февр.", + "Month_Short_1": "Яну", + "Month_Short_10": "Окт", + "Month_Short_11": "Ðое", + "Month_Short_12": "Дек", + "Month_Short_2": "Фев", "Month_Short_3": "Март", - "Month_Short_4": "Ðпр.", + "Month_Short_4": "Ðпр", "Month_Short_5": "Май", "Month_Short_6": "Юни", "Month_Short_7": "Юли", - "Month_Short_8": "Ðвг.", - "Month_Short_9": "Септ.", - "Month_Short_StandAlone_1": "Ян.", - "Month_Short_StandAlone_10": "Окт.", - "Month_Short_StandAlone_11": "Ðоем.", - "Month_Short_StandAlone_12": "Дек.", - "Month_Short_StandAlone_2": "Февр.", + "Month_Short_8": "Ðвг", + "Month_Short_9": "Сеп", + "Month_Short_StandAlone_1": "Яну", + "Month_Short_StandAlone_10": "Окт", + "Month_Short_StandAlone_11": "Ðое", + "Month_Short_StandAlone_12": "Дек", + "Month_Short_StandAlone_2": "Фев", "Month_Short_StandAlone_3": "Март", - "Month_Short_StandAlone_4": "Ðпр.", + "Month_Short_StandAlone_4": "Ðпр", "Month_Short_StandAlone_5": "Май", "Month_Short_StandAlone_6": "Юни", "Month_Short_StandAlone_7": "Юли", - "Month_Short_StandAlone_8": "Ðвг.", - "Month_Short_StandAlone_9": "Септ.", + "Month_Short_StandAlone_8": "Ðвг", + "Month_Short_StandAlone_9": "Сеп", "NDays": "%s дни", "NHoursShort": "%s h", "NMinutes": "%s минути", "NMinutesShort": "%s min", "NSeconds": "%s Ñекунди", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ден", "OneMinute": "1 минута", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/bn.json b/plugins/Intl/lang/bn.json index 1699da595d96231095da89f13908dc4c29dbfd15..2bac13f1beec03b28276d92e56b5a65e6cbbde2c 100644 --- a/plugins/Intl/lang/bn.json +++ b/plugins/Intl/lang/bn.json @@ -110,7 +110,7 @@ "Country_HU": "হাঙà§à¦—েরি", "Country_ID": "ইনà§à¦¦à§‹à¦¨à§‡à¦¶à¦¿à¦¯à¦¼à¦¾", "Country_IE": "আয়ারলà§à¦¯à¦¾à¦¨à§à¦¡", - "Country_IL": "ইসà§à¦°à¦¾à¦¯à¦¼à§‡à¦²", + "Country_IL": "ইজরায়েল", "Country_IM": "আইল অফ মà§à¦¯à¦¾à¦¨", "Country_IN": "à¦à¦¾à¦°à¦¤", "Country_IO": "বà§à¦°à¦¿à¦Ÿà¦¿à¦¶ à¦à¦¾à¦°à¦¤ মহাসাগরীয় অঞà§à¦šà¦²", @@ -132,7 +132,7 @@ "Country_KR": "দকà§à¦·à¦¿à¦£ কোরিয়া", "Country_KW": "কà§à¦¯à¦¼à§‡à¦¤", "Country_KY": "কেমà§à¦¯à¦¾à¦¨ দà§à¦¬à§€à¦ªà¦ªà§à¦žà§à¦œ", - "Country_KZ": "কাজাকসà§à¦¥à¦¾à¦¨", + "Country_KZ": "কাজাখসà§à¦¤à¦¾à¦¨", "Country_LA": "লাওস", "Country_LB": "লেবানন", "Country_LC": "সেনà§à¦Ÿ লà§à¦¸à¦¿à¦¯à¦¼à¦¾", @@ -350,7 +350,7 @@ "Language_de": "জারà§à¦®à¦¾à¦¨", "Language_dv": "দিবেহি", "Language_dz": "জোঙà§à¦—া", - "Language_ee": "à¦à¦¯à¦¼à§‡", + "Language_ee": "ইউয়ি", "Language_el": "গà§à¦°à¦¿à¦•", "Language_en": "ইংরেজি", "Language_eo": "à¦à¦¸à§à¦ªà§‡à¦°à¦¾à¦¨à§à¦¤à§‹", @@ -360,10 +360,10 @@ "Language_fa": "ফারà§à¦¸à¦¿", "Language_ff": "ফà§à¦²à¦¾à¦¹à§", "Language_fi": "ফিনিশ", - "Language_fj": "ফিজিও", - "Language_fo": "ফেরাউনি", + "Language_fj": "ফিজিআন", + "Language_fo": "ফারোস", "Language_fr": "ফরাসি", - "Language_fy": "পশà§à¦šà¦¿à¦® ফà§à¦°à¦¿à¦¸à¦¿à¦¯à¦¼", + "Language_fy": "পশà§à¦šà¦¿à¦® ফà§à¦°à¦¿à¦¸à¦¿à¦†à¦¨", "Language_ga": "আইরিশ", "Language_gd": "সà§à¦•à¦Ÿà¦¸-গà§à¦¯à§‡à¦²à¦¿à¦•", "Language_gl": "গà§à¦¯à¦¾à¦²à¦¿à¦¶à¦¿à¦¯à¦¼", @@ -390,10 +390,10 @@ "Language_it": "ইতালীয়", "Language_iu": "ইনà§à¦•à§à¦Ÿà¦¿à¦Ÿà§à¦Ÿ", "Language_ja": "জাপানি", - "Language_jv": "জাà¦à¦¾à¦¨à¦¿", + "Language_jv": "জাà¦à¦¾à¦¨à¦¿à¦œ", "Language_ka": "জরà§à¦œà¦¿à¦¯à¦¼à¦¾à¦¨", "Language_kg": "কঙà§à¦—ো", - "Language_ki": "কিকà§à§à¦‡à¦¯à¦¼à§", + "Language_ki": "কিকà§à¦¯à¦¼à§", "Language_kj": "কোয়ানিয়ামা", "Language_kk": "কাজাখ", "Language_kl": "কà§à¦¯à¦¾à¦²à¦¾à¦²à§à¦²à¦¿à¦¸à§à¦Ÿ", @@ -402,7 +402,7 @@ "Language_ko": "কোরিয়ান", "Language_kr": "কানà§à¦°à¦¿", "Language_ks": "কাশà§à¦®à§€à¦°à§€", - "Language_ku": "কà§à¦°à§à¦¦à¦¿", + "Language_ku": "কà§à¦°à§à¦¦à¦¿à¦¶", "Language_kv": "কোমি", "Language_kw": "করà§à¦£à¦¿à¦¶", "Language_ky": "কিরà§à¦—িজ", @@ -467,7 +467,7 @@ "Language_sr": "সারà§à¦¬à§€à¦¯à¦¼", "Language_ss": "সোয়াতি", "Language_st": "দকà§à¦·à¦¿à¦¨ সোথো", - "Language_su": "সà§à¦¦à¦¾à¦¨à§€", + "Language_su": "সà§à¦¨à§à¦¦à¦¾à¦¨à§€", "Language_sv": "সà§à¦‡à¦¡à¦¿à¦¶", "Language_sw": "সোয়াহিলি", "Language_ta": "তামিল", @@ -555,6 +555,14 @@ "NMinutesShort": "%s মিনিট", "NSeconds": "%s সেকেনà§à¦¡", "NSecondsShort": "%s সেকেনà§à¦¡", + "NumberFormatCurrency": "#,##,##0.00¤", + "NumberFormatNumber": "#,##,##0.###", + "NumberFormatPercent": "#,##,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 দিন", "OneMinute": "1 মিনিট", "OneMinuteShort": "1 মিনিট", @@ -568,7 +576,7 @@ "PeriodYear": "বছর", "PeriodYears": "বছর", "Seconds": "সেকেনà§à¦¡", - "Time_AM": "পূরà§à¦¬à¦¾à¦¹à§à¦£", + "Time_AM": "AM", "Time_PM": "অপরাহà§à¦£", "Today": "আজ", "Year_Short": "বছর", diff --git a/plugins/Intl/lang/bs.json b/plugins/Intl/lang/bs.json index 5cf7170ea0cc76fdc94cfd208f3cb3e2c15c07b7..89e795036398058eb942a719dfe1c5e1e28f9690 100644 --- a/plugins/Intl/lang/bs.json +++ b/plugins/Intl/lang/bs.json @@ -33,7 +33,7 @@ "Country_BH": "Bahrein", "Country_BI": "Burundi", "Country_BJ": "Benin", - "Country_BL": "Sv. Bartolomej", + "Country_BL": "Sveti Bartolomej", "Country_BM": "Bermuda", "Country_BN": "Brunej", "Country_BO": "Bolivija", @@ -46,7 +46,7 @@ "Country_BY": "Bjelorusija", "Country_BZ": "Belize", "Country_CA": "Kanada", - "Country_CC": "Kokos (Keling) Ostrva", + "Country_CC": "Kokosova (Kilingova) ostrva", "Country_CD": "Demokratska Republika Kongo", "Country_CF": "CentralnoafriÄka Republika", "Country_CG": "Kongo", @@ -103,7 +103,7 @@ "Country_GW": "Gvineja-Bisao", "Country_GY": "Gvajana", "Country_HK": "Hong Kong (S. A. R. Kina)", - "Country_HM": "Herd i Mekdonald Ostrva", + "Country_HM": "Heard i arhipelag McDonald", "Country_HN": "Honduras", "Country_HR": "Hrvatska", "Country_HT": "Haiti", @@ -135,7 +135,7 @@ "Country_KZ": "Kazahstan", "Country_LA": "Laos", "Country_LB": "Liban", - "Country_LC": "Sent Lucija", + "Country_LC": "Sveta Lucija", "Country_LI": "LihtenÅ¡tajn", "Country_LK": "Å ri Lanka", "Country_LR": "Liberija", @@ -187,7 +187,7 @@ "Country_PH": "Filipini", "Country_PK": "Pakistan", "Country_PL": "Poljska", - "Country_PM": "Sen Pjer i Mikelon", + "Country_PM": "Sveti Petar i Mikelon", "Country_PN": "Pitkern", "Country_PR": "Porto Riko", "Country_PS": "Palestinska Teritorija", @@ -208,7 +208,7 @@ "Country_SG": "Singapur", "Country_SH": "Sveta Helena", "Country_SI": "Slovenija", - "Country_SJ": "Svalbard i Janmajen Ostrva", + "Country_SJ": "Svalbard i Jan Majen", "Country_SK": "SlovaÄka", "Country_SL": "Sijera Leone", "Country_SM": "San Marino", @@ -221,7 +221,7 @@ "Country_SX": "Sint Marten", "Country_SY": "Sirija", "Country_SZ": "Svazilend", - "Country_TC": "Turks i Kajkos Ostrva", + "Country_TC": "Ostrva Turks i Caicos", "Country_TD": "ÄŒad", "Country_TF": "Francuske Južne Teritorije", "Country_TG": "Togo", @@ -239,18 +239,18 @@ "Country_TZ": "Tanzanija", "Country_UA": "Ukrajina", "Country_UG": "Uganda", - "Country_UM": "Manja Udaljena Ostrva SAD", + "Country_UM": "Udaljena ostrva SAD", "Country_US": "Sjedinjene AmeriÄke Države", "Country_UY": "Urugvaj", "Country_UZ": "Uzbekistan", "Country_VA": "Vatikan", - "Country_VC": "Sent Vinsent i Grenadini", + "Country_VC": "Sveti Vincent i Grenadini", "Country_VE": "Venecuela", "Country_VG": "Britanska DjeviÄanska Ostrva", "Country_VI": "DjeviÄanska Ostrva SAD", "Country_VN": "Vijetnam", "Country_VU": "Vanuatu", - "Country_WF": "Valis i Futuna Ostrva", + "Country_WF": "Wallis i Futuna", "Country_WS": "Samoa", "Country_YE": "Jemen", "Country_YT": "Majote", @@ -345,6 +345,7 @@ "Language_cs": "ÄŒeÅ¡ki", "Language_cu": "Staroslovenski", "Language_cv": "ÄŒuvaÅ¡ki", + "Language_cy": "VelÅ¡ki", "Language_da": "Danski", "Language_de": "NjemaÄki", "Language_dv": "Divehijski", @@ -466,7 +467,7 @@ "Language_sr": "Srpski", "Language_ss": "Svati", "Language_st": "Sesoto", - "Language_su": "Sudanski", + "Language_su": "Sundanski", "Language_sv": "Å vedski", "Language_sw": "Svahili", "Language_ta": "Tamilski", @@ -477,7 +478,7 @@ "Language_tk": "Turkmenski", "Language_tl": "Tagalski", "Language_tn": "Tsvana", - "Language_to": "Tonga", + "Language_to": "Tonganski", "Language_tr": "Turski", "Language_ts": "Tsonga", "Language_tt": "Tatarski", @@ -554,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekundi", "NSecondsShort": "%s sek", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dan", "OneMinute": "1 minut", "OneMinuteShort": "1 min", @@ -571,6 +580,6 @@ "Time_PM": "popodne", "Today": "Danas", "Year_Short": "g.", - "Yesterday": "JuÄe" + "Yesterday": "JuÄer" } } \ No newline at end of file diff --git a/plugins/Intl/lang/ca.json b/plugins/Intl/lang/ca.json index a32c0bcbc0e054036852b0519f5f25098e0df99f..d2b8a9a26e43b165825f9ae3c26ef7d4b693b056 100644 --- a/plugins/Intl/lang/ca.json +++ b/plugins/Intl/lang/ca.json @@ -43,7 +43,7 @@ "Country_BT": "Bhutan", "Country_BV": "Bouvet", "Country_BW": "Botswana", - "Country_BY": "Bielorússia", + "Country_BY": "Belarús", "Country_BZ": "Belize", "Country_CA": "Canadà ", "Country_CC": "Illes Cocos", @@ -312,7 +312,7 @@ "Format_Interval_Short_M": "d MMM – d MMM y", "Format_Interval_Short_Y": "d MMM y – d MMM y", "Format_Month_Long": "LLLL 'de' y", - "Format_Month_Short": "LLL y", + "Format_Month_Short": "LLL 'de' y", "Format_Time": "H:mm:ss", "Format_Year": "y", "Hours": "hores", @@ -363,7 +363,7 @@ "Language_fj": "Fijià ", "Language_fo": "Feroès", "Language_fr": "Francès", - "Language_fy": "Frisó oriental", + "Language_fy": "Frisó occidental", "Language_ga": "Irlandès", "Language_gd": "Gaèlic escocès", "Language_gl": "Gallec", @@ -440,7 +440,7 @@ "Language_oj": "Ojibwa", "Language_om": "Oromo", "Language_or": "Oriya", - "Language_os": "Osset", + "Language_os": "Osseta", "Language_pa": "Panjabi", "Language_pi": "Pali", "Language_pl": "Polonès", @@ -465,7 +465,7 @@ "Language_so": "Somali", "Language_sq": "Albanès", "Language_sr": "Serbi", - "Language_ss": "Siswati", + "Language_ss": "Swazi", "Language_st": "Sotho meridional", "Language_su": "Sundanès", "Language_sv": "Suec", @@ -476,8 +476,8 @@ "Language_th": "Tailandès", "Language_ti": "Tigrinya", "Language_tk": "Turcman", - "Language_tl": "Tagà log", - "Language_tn": "Tswana", + "Language_tl": "Tagal", + "Language_tn": "Setswana", "Language_to": "Tongalès", "Language_tr": "Turc", "Language_ts": "Tsonga", @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s segons", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dia", "OneMinute": "1 minut", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/cs.json b/plugins/Intl/lang/cs.json index ed94dbf86f0fa6c86e26e10f6b9406c902e89b87..813e0506eea7d0f8e4e09aad58666d318223729c 100644 --- a/plugins/Intl/lang/cs.json +++ b/plugins/Intl/lang/cs.json @@ -383,7 +383,7 @@ "Language_id": "Indonéština", "Language_ie": "Interlingue", "Language_ig": "IgboÅ¡tina", - "Language_ii": "S’-Ächuan i", + "Language_ii": "IÅ¡tina (seÄuánská)", "Language_ik": "InupiakÅ¡tina", "Language_io": "Ido", "Language_is": "IslandÅ¡tina", @@ -555,21 +555,29 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekund", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 den", "OneMinute": "1 minuta", "OneMinuteShort": "1 min", "OriginalLanguageName": "ÄŒeÅ¡tina", - "PeriodDay": "Den", + "PeriodDay": "den", "PeriodDays": "dny", - "PeriodMonth": "MÄ›sÃc", + "PeriodMonth": "mÄ›sÃc", "PeriodMonths": "mÄ›sÃce", - "PeriodWeek": "Týden", + "PeriodWeek": "týden", "PeriodWeeks": "týdny", - "PeriodYear": "Rok", + "PeriodYear": "rok", "PeriodYears": "roky", "Seconds": "sekundy", - "Time_AM": "dopoledne", - "Time_PM": "odpoledne", + "Time_AM": "dop.", + "Time_PM": "odp.", "Today": "Dnes", "Year_Short": "r.", "Yesterday": "VÄera" diff --git a/plugins/Intl/lang/cy.json b/plugins/Intl/lang/cy.json index 90e833d8e023038561e142e7c462b4ecfbebf793..69a71a6022a283c530b0522920489535a77e68f6 100644 --- a/plugins/Intl/lang/cy.json +++ b/plugins/Intl/lang/cy.json @@ -81,7 +81,7 @@ "Country_FJ": "Fiji", "Country_FK": "Ynysoedd y Falkland\/Malvinas", "Country_FM": "Micronesia", - "Country_FO": "Føroyar", + "Country_FO": "Ynysoedd Ffaro", "Country_FR": "Ffrainc", "Country_GA": "Gabon", "Country_GB": "Y Deyrnas Unedig", @@ -184,7 +184,7 @@ "Country_PE": "Periw", "Country_PF": "Polynesia Ffrengig", "Country_PG": "Papua Guinea Newydd", - "Country_PH": "Pilipinas", + "Country_PH": "Y Philipinau", "Country_PK": "Pakistan", "Country_PL": "Gwlad Pwyl", "Country_PM": "Saint-Pierre-et-Miquelon", @@ -212,7 +212,7 @@ "Country_SK": "Slofacia", "Country_SL": "Sierra Leone", "Country_SM": "San Marino", - "Country_SN": "Sénégal", + "Country_SN": "Senegal", "Country_SO": "Somalia", "Country_SR": "Suriname", "Country_SS": "De Swdan", @@ -315,7 +315,7 @@ "Format_Month_Short": "MMM y", "Format_Time": "HH:mm:ss", "Format_Year": "y", - "Hours": "hr", + "Hours": "oriau", "Language_aa": "Affareg", "Language_ab": "Abchaseg", "Language_ae": "Afestaneg", @@ -326,6 +326,7 @@ "Language_ar": "Arabeg", "Language_as": "Asameg", "Language_av": "Afareg", + "Language_ay": "Aymareg", "Language_az": "Aserbaijaneg", "Language_ba": "Bashcorteg", "Language_be": "Belarwseg", @@ -343,10 +344,12 @@ "Language_cr": "Cri", "Language_cs": "Tsieceg", "Language_cu": "Hen Slafoneg", + "Language_cv": "Tshwfasheg", "Language_cy": "Cymraeg", "Language_da": "Daneg", "Language_de": "Almaeneg", "Language_dv": "Difehi", + "Language_dz": "Dzongkha", "Language_ee": "Ewe", "Language_el": "Groeg", "Language_en": "Saesneg", @@ -388,7 +391,9 @@ "Language_jv": "Jafanaeg", "Language_ka": "Georgeg", "Language_kg": "Congo", + "Language_ki": "Kikuyu", "Language_kk": "Casacheg", + "Language_kl": "Kalaallisut", "Language_km": "Chmereg", "Language_kn": "Kannada", "Language_ko": "Coreeg", @@ -405,6 +410,7 @@ "Language_ln": "Lingala", "Language_lo": "Laoeg", "Language_lt": "Lithwaneg", + "Language_lu": "Luba-Katanga", "Language_lv": "Latfieg", "Language_mg": "Malagaseg", "Language_mh": "Marsialeg", @@ -438,7 +444,7 @@ "Language_ps": "Pashto", "Language_pt": "Portiwgeeg", "Language_qu": "Quechua", - "Language_rm": "Romaunsch", + "Language_rm": "Románsh", "Language_rn": "Rwndi", "Language_ro": "Rwmaneg", "Language_ru": "Rwseg", @@ -452,9 +458,11 @@ "Language_sk": "Slofaceg", "Language_sl": "Slofeneg", "Language_sm": "Samöeg", + "Language_sn": "Shona", "Language_so": "Somaleg", "Language_sq": "Albaneg", "Language_sr": "Serbeg", + "Language_ss": "Swati", "Language_st": "Sesotheg", "Language_su": "Swndaneg", "Language_sv": "Swedeg", @@ -471,6 +479,7 @@ "Language_tr": "Tyrceg", "Language_ts": "Tsongaeg", "Language_tt": "Tatareg", + "Language_tw": "Twi", "Language_ug": "Uighur", "Language_uk": "Wcreineg", "Language_ur": "Wrdw", @@ -485,7 +494,7 @@ "Language_zh": "Tsieineeg", "Language_zu": "Swlw", "LayoutDirection": "ltr", - "Minutes": "min", + "Minutes": "munudau", "Month_Long_1": "Ionawr", "Month_Long_10": "Hydref", "Month_Long_11": "Tachwedd", @@ -515,7 +524,7 @@ "Month_Short_11": "Tach", "Month_Short_12": "Rhag", "Month_Short_2": "Chwef", - "Month_Short_3": "Mawrth", + "Month_Short_3": "Maw", "Month_Short_4": "Ebrill", "Month_Short_5": "Mai", "Month_Short_6": "Meh", @@ -540,23 +549,31 @@ "NMinutesShort": "%s mun", "NSeconds": "%s eiliad", "NSecondsShort": "%s eil", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 diwrnod", "OneMinute": "1 munud", "OneMinuteShort": "1 mun", "OriginalLanguageName": "Cymraeg", - "PeriodDay": "Dydd", - "PeriodDays": "day", - "PeriodMonth": "Mis", - "PeriodMonths": "mon", - "PeriodWeek": "Wythnos", - "PeriodWeeks": "wk", - "PeriodYear": "Blwyddyn", - "PeriodYears": "yr", - "Seconds": "sec", + "PeriodDay": "dydd", + "PeriodDays": "diwrnodau", + "PeriodMonth": "mis", + "PeriodMonths": "misoedd", + "PeriodWeek": "wythnos", + "PeriodWeeks": "wythnosau", + "PeriodYear": "blwyddyn", + "PeriodYears": "blynyddoedd", + "Seconds": "eiliadau", "Time_AM": "AM", "Time_PM": "PM", "Today": "Heddiw", - "Year_Short": "Blwyddyn", + "Year_Short": "bl.", "Yesterday": "Ddoe" } } \ No newline at end of file diff --git a/plugins/Intl/lang/da.json b/plugins/Intl/lang/da.json index 8209c4685b7c76361c3d6a943b9fde6b9461fddf..3710ea0c0b04552c1b3243c5c64f22183a861b9b 100644 --- a/plugins/Intl/lang/da.json +++ b/plugins/Intl/lang/da.json @@ -9,7 +9,7 @@ "Continent_eur": "Europa", "Continent_oce": "Oceanien", "Country_AD": "Andorra", - "Country_AE": "Forenede Arabiske Emirater", + "Country_AE": "De Forenede Arabiske Emirater", "Country_AF": "Afghanistan", "Country_AG": "Antigua og Barbuda", "Country_AI": "Anguilla", @@ -37,7 +37,7 @@ "Country_BM": "Bermuda", "Country_BN": "Brunei", "Country_BO": "Bolivia", - "Country_BQ": "Nederlandske antiller", + "Country_BQ": "De Nederlandske Antiller", "Country_BR": "Brasilien", "Country_BS": "Bahamas", "Country_BT": "Bhutan", @@ -48,7 +48,7 @@ "Country_CA": "Canada", "Country_CC": "Cocosøerne", "Country_CD": "Congo-Kinshasa", - "Country_CF": "Centralafrikanske Republik", + "Country_CF": "Den Centralafrikanske Republik", "Country_CG": "Congo-Brazzaville", "Country_CH": "Schweiz", "Country_CI": "Elfenbenskysten", @@ -173,7 +173,7 @@ "Country_NF": "Norfolk Island", "Country_NG": "Nigeria", "Country_NI": "Nicaragua", - "Country_NL": "Holland", + "Country_NL": "Nederlandene", "Country_NO": "Norge", "Country_NP": "Nepal", "Country_NR": "Nauru", @@ -216,7 +216,7 @@ "Country_SO": "Somalia", "Country_SR": "Surinam", "Country_SS": "Sydsudan", - "Country_ST": "Sao Tome og Principe", + "Country_ST": "São Tomé og PrÃncipe", "Country_SV": "El Salvador", "Country_SX": "Sint Maarten", "Country_SY": "Syrien", @@ -473,7 +473,7 @@ "Language_ta": "Tamilsk", "Language_te": "Telugu", "Language_tg": "Tajik", - "Language_th": "Thailandsk", + "Language_th": "Thai", "Language_ti": "Tigrinya", "Language_tk": "Turkmensk", "Language_tl": "Tagalog", @@ -552,20 +552,28 @@ "NDays": "%s dage", "NHoursShort": "%s t", "NMinutes": "%s minutter", - "NMinutesShort": "%s min", + "NMinutesShort": "%s min.", "NSeconds": "%s sekunder", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dag", "OneMinute": "1 minut", - "OneMinuteShort": "1 min", + "OneMinuteShort": "1 min.", "OriginalLanguageName": "Dansk", - "PeriodDay": "Dag", + "PeriodDay": "dag", "PeriodDays": "dage", - "PeriodMonth": "MÃ¥ned", + "PeriodMonth": "mÃ¥ned", "PeriodMonths": "mÃ¥neder", - "PeriodWeek": "Uge", + "PeriodWeek": "uge", "PeriodWeeks": "uger", - "PeriodYear": "Ã…r", + "PeriodYear": "Ã¥r", "PeriodYears": "Ã¥r", "Seconds": "sekunder", "Time_AM": "AM", diff --git a/plugins/Intl/lang/de.json b/plugins/Intl/lang/de.json index e9e1b249f7d58945e1551107f908ba51ec450de6..813e67dde74a5c806848b3ceb318842593467456 100644 --- a/plugins/Intl/lang/de.json +++ b/plugins/Intl/lang/de.json @@ -103,7 +103,7 @@ "Country_GW": "Guinea-Bissau", "Country_GY": "Guyana", "Country_HK": "Sonderverwaltungszone Hongkong", - "Country_HM": "Heard- und McDonald-Inseln", + "Country_HM": "Heard und McDonaldinseln", "Country_HN": "Honduras", "Country_HR": "Kroatien", "Country_HT": "Haiti", @@ -239,7 +239,7 @@ "Country_TZ": "Tansania", "Country_UA": "Ukraine", "Country_UG": "Uganda", - "Country_UM": "Amerikanisch-Ozeanien", + "Country_UM": "Amerikanische Ãœberseeinseln", "Country_US": "Vereinigte Staaten", "Country_UY": "Uruguay", "Country_UZ": "Usbekistan", @@ -332,7 +332,7 @@ "Language_be": "Weißrussisch", "Language_bg": "Bulgarisch", "Language_bi": "Bislama", - "Language_bm": "Bambara-Sprache", + "Language_bm": "Bambara", "Language_bn": "Bengalisch", "Language_bo": "Tibetisch", "Language_br": "Bretonisch", @@ -349,7 +349,7 @@ "Language_da": "Dänisch", "Language_de": "Deutsch", "Language_dv": "Maledivisch", - "Language_dz": "Bhutanisch", + "Language_dz": "Dzongkha", "Language_ee": "Ewe", "Language_el": "Griechisch", "Language_en": "Englisch", @@ -370,12 +370,12 @@ "Language_gn": "Guarani", "Language_gu": "Gujarati", "Language_gv": "Manx", - "Language_ha": "Hausa", + "Language_ha": "Haussa", "Language_he": "Hebräisch", "Language_hi": "Hindi", "Language_ho": "Hiri-Motu", "Language_hr": "Kroatisch", - "Language_ht": "Haitianisch", + "Language_ht": "Haiti-Kreolisch", "Language_hu": "Ungarisch", "Language_hy": "Armenisch", "Language_hz": "Herero-Sprache", @@ -397,11 +397,11 @@ "Language_kj": "Kwanyama", "Language_kk": "Kasachisch", "Language_kl": "Grönländisch", - "Language_km": "Kambodschanisch", + "Language_km": "Khmer", "Language_kn": "Kannada", "Language_ko": "Koreanisch", "Language_kr": "Kanuri-Sprache", - "Language_ks": "Kaschmirisch", + "Language_ks": "Kaschmiri", "Language_ku": "Kurdisch", "Language_kv": "Komi-Sprache", "Language_kw": "Kornisch", @@ -427,7 +427,7 @@ "Language_my": "Birmanisch", "Language_na": "Nauruisch", "Language_nb": "Norwegisch BokmÃ¥l", - "Language_nd": "Nord-Ndebele-Sprache", + "Language_nd": "Nord-Ndebele", "Language_ne": "Nepalesisch", "Language_ng": "Ndonga", "Language_nl": "Niederländisch", @@ -441,21 +441,21 @@ "Language_om": "Oromo", "Language_or": "Oriya", "Language_os": "Ossetisch", - "Language_pa": "Panjabi", + "Language_pa": "Punjabi", "Language_pi": "Pali", "Language_pl": "Polnisch", "Language_ps": "Paschtu", "Language_pt": "Portugiesisch", "Language_qu": "Quechua", "Language_rm": "Rätoromanisch", - "Language_rn": "Rundi-Sprache", + "Language_rn": "Rundi", "Language_ro": "Rumänisch", "Language_ru": "Russisch", - "Language_rw": "Ruandisch", + "Language_rw": "Kinyarwanda", "Language_sa": "Sanskrit", "Language_sc": "Sardisch", "Language_sd": "Sindhi", - "Language_se": "Nord-Samisch", + "Language_se": "Nordsamisch", "Language_sg": "Sango", "Language_si": "Singhalesisch", "Language_sk": "Slowakisch", @@ -470,11 +470,11 @@ "Language_su": "Sundanesisch", "Language_sv": "Schwedisch", "Language_sw": "Suaheli", - "Language_ta": "Tamilisch", + "Language_ta": "Tamil", "Language_te": "Telugu", "Language_tg": "Tadschikisch", "Language_th": "Thailändisch", - "Language_ti": "Tigrinja", + "Language_ti": "Tigrinya", "Language_tk": "Turkmenisch", "Language_tl": "Tagalog", "Language_tn": "Tswana-Sprache", @@ -555,6 +555,14 @@ "NMinutesShort": "%s Min.", "NSeconds": "%s Sekunden", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 Tag", "OneMinute": "1 Minute", "OneMinuteShort": "1 Min.", diff --git a/plugins/Intl/lang/el.json b/plugins/Intl/lang/el.json index 360bbf34322d7413e5aa187ef9677ba8f8c494be..2af13ce2f3679a1c2e1b513da0b06edc5d590b5b 100644 --- a/plugins/Intl/lang/el.json +++ b/plugins/Intl/lang/el.json @@ -151,7 +151,7 @@ "Country_MF": "Άγιος ΜαÏτίνος (Γαλλικό τμήμα)", "Country_MG": "ΜαδαγασκάÏη", "Country_MH": "Îήσοι ΜάÏσαλ", - "Country_MK": "ΠΓΔΜ", + "Country_MK": "Î Ïώην Γιουγκοσλαβική ΔημοκÏατία της Μακεδονίας", "Country_ML": "Μάλι", "Country_MM": "ΜιανμάÏ\/ΒιÏμανία", "Country_MN": "Μογγολία", @@ -223,7 +223,7 @@ "Country_SZ": "Σουαζιλάνδη", "Country_TC": "Îήσοι ΤεÏκ και Κάικος", "Country_TD": "Τσαντ", - "Country_TF": "Γαλλικά Îότια Εδάφη", + "Country_TF": "ΓαλλικÎÏ‚ πεÏιοχÎÏ‚ του νοτίου ημισφαιÏίου", "Country_TG": "Τόγκο", "Country_TH": "Ταϊλάνδη", "Country_TJ": "Τατζικιστάν", @@ -239,7 +239,7 @@ "Country_TZ": "Τανζανία", "Country_UA": "ΟυκÏανία", "Country_UG": "Ουγκάντα", - "Country_UM": "ΑπομακÏυσμÎνες Îησίδες Η.Î .Α.", + "Country_UM": "ΑπομακÏυσμÎνες Îησίδες ΗΠΑ", "Country_US": "ΗνωμÎνες Πολιτείες", "Country_UY": "ΟυÏουγουάη", "Country_UZ": "Ουζμπεκιστάν", @@ -338,13 +338,13 @@ "Language_br": "Î’Ïετονικά", "Language_bs": "Βοσνιακά", "Language_ca": "Καταλανικά", - "Language_ce": "ΤσÎτσνιαν", + "Language_ce": "Τσετσενικά", "Language_ch": "ΚαμόÏÏο", "Language_co": "ΚοÏσικανικά", "Language_cr": "ΚÏι", "Language_cs": "Τσεχικά", "Language_cu": "Εκκλησιαστικά Σλαβικά", - "Language_cv": "Χουβάς", + "Language_cv": "Τσουβασικά", "Language_cy": "Ουαλικά", "Language_da": "Δανικά", "Language_de": "ΓεÏμανικά", @@ -467,7 +467,7 @@ "Language_sr": "ΣεÏβικά", "Language_ss": "Σουάτι", "Language_st": "Îότια Σόθο", - "Language_su": "Σουδανικά", + "Language_su": "Σουνδανικά", "Language_sv": "Σουηδικά", "Language_sw": "Σουαχίλι", "Language_ta": "Ταμίλ", @@ -555,17 +555,25 @@ "NMinutesShort": "%s λεπ.", "NSeconds": "%s δευτεÏόλεπτα", "NSecondsShort": "%s δ", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ημÎÏα", "OneMinute": "1 λεπτό", "OneMinuteShort": "1 λεπ.", "OriginalLanguageName": "Ελληνικά", - "PeriodDay": "ΗμÎÏα", + "PeriodDay": "ημÎÏα", "PeriodDays": "ημÎÏες", - "PeriodMonth": "Μήνας", + "PeriodMonth": "μήνας", "PeriodMonths": "μήνες", - "PeriodWeek": "Εβδομάδα", + "PeriodWeek": "εβδομάδα", "PeriodWeeks": "εβδομάδες", - "PeriodYear": "Έτος", + "PeriodYear": "Îτος", "PeriodYears": "Îτη", "Seconds": "δευτεÏόλεπτα", "Time_AM": "Ï€.μ.", diff --git a/plugins/Intl/lang/en.json b/plugins/Intl/lang/en.json index 7ee85c4a60e3070e307f7c3a047e97f95e465bab..a52b7b2cf6f3ad0e6a5b329982e1aeb3552e4278 100644 --- a/plugins/Intl/lang/en.json +++ b/plugins/Intl/lang/en.json @@ -375,7 +375,7 @@ "Language_hi": "Hindi", "Language_ho": "Hiri Motu", "Language_hr": "Croatian", - "Language_ht": "Haitian", + "Language_ht": "Haitian Creole", "Language_hu": "Hungarian", "Language_hy": "Armenian", "Language_hz": "Herero", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s seconds", "NSecondsShort": "%ss", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 day", "OneMinute": "1 minute", "OneMinuteShort": "1 min", "OriginalLanguageName": "English", - "PeriodDay": "Day", + "PeriodDay": "day", "PeriodDays": "days", - "PeriodMonth": "Month", + "PeriodMonth": "month", "PeriodMonths": "months", - "PeriodWeek": "Week", + "PeriodWeek": "week", "PeriodWeeks": "weeks", - "PeriodYear": "Year", + "PeriodYear": "year", "PeriodYears": "years", "Seconds": "seconds", "Time_AM": "AM", diff --git a/plugins/Intl/lang/es.json b/plugins/Intl/lang/es.json index dfac04d2496431afa83de6b479a84aea5f48f5c3..10590cb9265ee04211ce615317f9906c31e63cb5 100644 --- a/plugins/Intl/lang/es.json +++ b/plugins/Intl/lang/es.json @@ -3,7 +3,7 @@ "Continent_afr": "Ãfrica", "Continent_amc": "Centroamérica", "Continent_amn": "América del Norte", - "Continent_ams": "Suramérica", + "Continent_ams": "Sudamérica", "Continent_ant": "Antártida", "Continent_asi": "Asia", "Continent_eur": "Europa", @@ -61,7 +61,7 @@ "Country_CU": "Cuba", "Country_CV": "Cabo Verde", "Country_CW": "Curazao", - "Country_CX": "Isla de Navidad (Christmas)", + "Country_CX": "Isla de Navidad", "Country_CY": "Chipre", "Country_CZ": "República Checa", "Country_DE": "Alemania", @@ -192,7 +192,7 @@ "Country_PR": "Puerto Rico", "Country_PS": "Territorios Palestinos", "Country_PT": "Portugal", - "Country_PW": "Palau", + "Country_PW": "Palaos", "Country_PY": "Paraguay", "Country_QA": "Catar", "Country_RE": "Reunión", @@ -309,8 +309,8 @@ "Format_Interval_Long_M": "d 'de' MMMM–d 'de' MMMM 'de' y", "Format_Interval_Long_Y": "d 'de' MMMM 'de' y–d 'de' MMMM 'de' y", "Format_Interval_Short_D": "d–d MMM y", - "Format_Interval_Short_M": "d MMM–d MMM y", - "Format_Interval_Short_Y": "d MMM y–d MMM y", + "Format_Interval_Short_M": "d MMM – d MMM y", + "Format_Interval_Short_Y": "d MMM y – d MMM y", "Format_Month_Long": "MMMM 'de' y", "Format_Month_Short": "MMM y", "Format_Time": "H:mm:ss", @@ -344,7 +344,7 @@ "Language_cr": "Cree", "Language_cs": "Checo", "Language_cu": "Eslavo eclesiástico", - "Language_cv": "Chuvash", + "Language_cv": "Chuvasio", "Language_cy": "Galés", "Language_da": "Danés", "Language_de": "Alemán", @@ -426,12 +426,12 @@ "Language_mt": "Maltés", "Language_my": "Birmano", "Language_na": "Nauruano", - "Language_nb": "Bokmal noruego", + "Language_nb": "Noruego bokmal", "Language_nd": "Ndebele septentrional", "Language_ne": "NepalÃ", "Language_ng": "Ndonga", "Language_nl": "Neerlandés", - "Language_nn": "Nynorsk noruego", + "Language_nn": "Noruego nynorsk", "Language_no": "Noruego", "Language_nr": "Ndebele meridional", "Language_nv": "Navajo", @@ -469,7 +469,7 @@ "Language_st": "Sesotho meridional", "Language_su": "Sundanés", "Language_sv": "Sueco", - "Language_sw": "Swahili", + "Language_sw": "Suajili", "Language_ta": "Tamil", "Language_te": "Telugu", "Language_tg": "Tayiko", @@ -492,7 +492,7 @@ "Language_vi": "Vietnamita", "Language_vo": "Volapük", "Language_wa": "Valón", - "Language_wo": "Wólof", + "Language_wo": "Wolof", "Language_xh": "Xhosa", "Language_yi": "YÃdish", "Language_yo": "Yoruba", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s segundos", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dÃa", "OneMinute": "1 minuto", "OneMinuteShort": "1 min", "OriginalLanguageName": "Español", - "PeriodDay": "DÃa", + "PeriodDay": "dÃa", "PeriodDays": "dÃas", - "PeriodMonth": "Mes", + "PeriodMonth": "mes", "PeriodMonths": "meses", - "PeriodWeek": "Semana", + "PeriodWeek": "semana", "PeriodWeeks": "semanas", - "PeriodYear": "Año", + "PeriodYear": "año", "PeriodYears": "años", "Seconds": "segundos", "Time_AM": "a. m.", diff --git a/plugins/Intl/lang/et.json b/plugins/Intl/lang/et.json index 6db46c6cec098fc66bbf4d064dd4840a71767e88..db9277a739613cc470776cd97017c88f770e84b7 100644 --- a/plugins/Intl/lang/et.json +++ b/plugins/Intl/lang/et.json @@ -49,7 +49,7 @@ "Country_CC": "Kookossaared", "Country_CD": "Kongo DV", "Country_CF": "Kesk-Aafrika Vabariik", - "Country_CG": "Kongo-Brazzaville", + "Country_CG": "Kongo Vabariik", "Country_CH": "Å veits", "Country_CI": "Côte d’Ivoire", "Country_CK": "Cooki saared", @@ -80,7 +80,7 @@ "Country_FI": "Soome", "Country_FJ": "Fidži", "Country_FK": "Falklandi saared", - "Country_FM": "Mikroneesia Liiduriigid", + "Country_FM": "Mikroneesia", "Country_FO": "Fääri saared", "Country_FR": "Prantsusmaa", "Country_GA": "Gabon", @@ -102,7 +102,7 @@ "Country_GU": "Guam", "Country_GW": "Guinea-Bissau", "Country_GY": "Guyana", - "Country_HK": "Hongkong - Hiina erihalduspiirkond", + "Country_HK": "Hongkongi erihalduspiirkond", "Country_HM": "Heardi ja McDonaldi saared", "Country_HN": "Honduras", "Country_HR": "Horvaatia", @@ -122,7 +122,7 @@ "Country_JM": "Jamaica", "Country_JO": "Jordaania", "Country_JP": "Jaapan", - "Country_KE": "Kenya", + "Country_KE": "Keenia", "Country_KG": "Kõrgõzstan", "Country_KH": "Kambodža", "Country_KI": "Kiribati", @@ -148,14 +148,14 @@ "Country_MC": "Monaco", "Country_MD": "Moldova", "Country_ME": "Montenegro", - "Country_MF": "Saint Martin", + "Country_MF": "Saint-Martin", "Country_MG": "Madagaskar", - "Country_MH": "Marshalli saared", + "Country_MH": "Marshalli Saared", "Country_MK": "Makedoonia", "Country_ML": "Mali", "Country_MM": "Myanmar (Birma)", "Country_MN": "Mongoolia", - "Country_MO": "Macau - Hiina erihalduspiirkond", + "Country_MO": "Macau erihalduspiirkond", "Country_MP": "Põhja-Mariaanid", "Country_MQ": "Martinique", "Country_MR": "Mauritaania", @@ -306,16 +306,16 @@ "Format_Date_Long": "EEEE, d. MMMM y", "Format_Date_Short": "d. MMM y", "Format_Interval_Long_D": "d.–d. MMMM y", - "Format_Interval_Long_M": "d. MMMM–d. MMMM y", - "Format_Interval_Long_Y": "d. MMMM y–d. MMMM y", + "Format_Interval_Long_M": "d. MMMM – d. MMMM y", + "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y", "Format_Interval_Short_D": "d.–d. MMM y", - "Format_Interval_Short_M": "d. MMM–d. MMM y", - "Format_Interval_Short_Y": "d. MMM y–d. MMM y", + "Format_Interval_Short_M": "d. MMM – d. MMM y", + "Format_Interval_Short_Y": "d. MMM y – d. MMM y", "Format_Month_Long": "MMMM y", "Format_Month_Short": "MMM y", "Format_Time": "H:mm.ss", "Format_Year": "y", - "Hours": "tundi", + "Hours": "tunnid", "Language_aa": "Afari", "Language_ab": "Abhaasi", "Language_ae": "Avesta", @@ -358,7 +358,7 @@ "Language_et": "Eesti", "Language_eu": "Baski", "Language_fa": "Pärsia", - "Language_ff": "Fulbe", + "Language_ff": "Fula", "Language_fi": "Soome", "Language_fj": "Fidži", "Language_fo": "Fääri", @@ -373,7 +373,7 @@ "Language_ha": "Hausa", "Language_he": "Heebrea", "Language_hi": "Hindi", - "Language_ho": "Motu", + "Language_ho": "Hirimotu", "Language_hr": "Horvaadi", "Language_ht": "Haiti", "Language_hu": "Ungari", @@ -394,7 +394,7 @@ "Language_ka": "Gruusia", "Language_kg": "Kongo", "Language_ki": "Kikuju", - "Language_kj": "Ambo", + "Language_kj": "Kvanjama", "Language_kk": "Kasahhi", "Language_kl": "Grööni", "Language_km": "Khmeeri", @@ -431,7 +431,7 @@ "Language_ne": "Nepali", "Language_ng": "Ndonga", "Language_nl": "Hollandi", - "Language_nn": "Norra nynorsk", + "Language_nn": "Uusnorra", "Language_no": "Norra", "Language_nr": "Lõunandebele", "Language_nv": "Navaho", @@ -447,13 +447,13 @@ "Language_ps": "PuÅ¡tu", "Language_pt": "Portugali", "Language_qu": "KetÅ¡ua", - "Language_rm": "Retoromaani", + "Language_rm": "RomanÅ¡i", "Language_rn": "Rundi", "Language_ro": "Rumeenia", "Language_ru": "Vene", "Language_rw": "Ruanda", "Language_sa": "Sanskriti", - "Language_sc": "Sardiinia", + "Language_sc": "Sardi", "Language_sd": "Sindhi", "Language_se": "Põhjasaami", "Language_sg": "Sango", @@ -550,17 +550,25 @@ "Month_Short_StandAlone_8": "Aug", "Month_Short_StandAlone_9": "Sept", "NDays": "%s ööpäeva", - "NHoursShort": "%s h", + "NHoursShort": "%s t", "NMinutes": "%s minutit", "NMinutesShort": "%s min", "NSeconds": "%s sekundit", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ööpäev", "OneMinute": "1 minut", "OneMinuteShort": "1 min", "OriginalLanguageName": "Eesti", "PeriodDay": "päev", - "PeriodDays": "ööpäeva", + "PeriodDays": "ööpäevad", "PeriodMonth": "kuu", "PeriodMonths": "kuud", "PeriodWeek": "nädal", diff --git a/plugins/Intl/lang/eu.json b/plugins/Intl/lang/eu.json index 50ba4067ff0eb16cdd332592ff715434946e5c80..a102605b6dd91bd9b78ba65ddb4f81804e14c375 100644 --- a/plugins/Intl/lang/eu.json +++ b/plugins/Intl/lang/eu.json @@ -525,6 +525,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s segundo", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "% #,##0", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 egun", "OneMinute": "1 minutu", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/fa.json b/plugins/Intl/lang/fa.json index a3bf513df01669d66fce318928e55d51a86ee9c6..26110dfa0d0565ad3315bc499ee7b04e32d8c5b4 100644 --- a/plugins/Intl/lang/fa.json +++ b/plugins/Intl/lang/fa.json @@ -37,11 +37,11 @@ "Country_BM": "برمودا", "Country_BN": "برونئی", "Country_BO": "بولیوی", - "Country_BQ": "بونیر", + "Country_BQ": "جزایر کارائیب هلند", "Country_BR": "برزیل", "Country_BS": "باهاما", "Country_BT": "بوتان", - "Country_BV": "جزیره بووه", + "Country_BV": "جزیرهٔ بووه", "Country_BW": "بوتسوانا", "Country_BY": "بلاروس", "Country_BZ": "بلیز", @@ -228,7 +228,7 @@ "Country_TH": "تایلند", "Country_TJ": "تاجیکستان", "Country_TK": "توکلائو", - "Country_TL": "تیمور شرقی", + "Country_TL": "تیمور-لسته", "Country_TM": "ترکمنستان", "Country_TN": "تونس", "Country_TO": "تونگا", @@ -240,7 +240,7 @@ "Country_UA": "اوکراین", "Country_UG": "اوگاندا", "Country_UM": "جزایر دوراÙتادهٔ ایالات متØده", - "Country_US": "ایالات متØدهٔ امریکا", + "Country_US": "ایالات متØده", "Country_UY": "اروگوئه", "Country_UZ": "ازبکستان", "Country_VA": "واتیکان", @@ -329,13 +329,13 @@ "Language_ay": "آیمارایی", "Language_az": "ترکی آذربایجانی", "Language_ba": "باشغیری", - "Language_be": "بلوروسی", + "Language_be": "بلاروسی", "Language_bg": "بلغاری", "Language_bi": "بیسلاما", "Language_bm": "بامبارایی", "Language_bn": "بنگالی", "Language_bo": "تبتی", - "Language_br": "برتانیایی", + "Language_br": "برتون", "Language_bs": "بوسنیایی", "Language_ca": "کاتالان", "Language_ce": "Ú†Ú†Ù†ÛŒ", @@ -345,7 +345,7 @@ "Language_cs": "Ú†Ú©ÛŒ", "Language_cu": "اسلاوی کلیسایی", "Language_cv": "چوواشی", - "Language_cy": "ویلزی", + "Language_cy": "ولزی", "Language_da": "دانمارکی", "Language_de": "آلمانی", "Language_dv": "مالدیوی", @@ -398,7 +398,7 @@ "Language_kk": "قزاقی", "Language_kl": "گرینلندی", "Language_km": "خمری", - "Language_kn": "کاناده‌ای", + "Language_kn": "کانارا", "Language_ko": "کره‌ای", "Language_kr": "کانوریایی", "Language_ks": "کشمیری", @@ -406,7 +406,7 @@ "Language_kv": "کومیایی", "Language_kw": "کرنوالی", "Language_ky": "قرقیزی", - "Language_la": "لاتینی", + "Language_la": "لاتین", "Language_lb": "لوگزامبورگی", "Language_lg": "گاندایی", "Language_li": "لیمبورگی", @@ -426,12 +426,12 @@ "Language_mt": "مالتی", "Language_my": "برمه‌ای", "Language_na": "نائورویی", - "Language_nb": "بوکسمال نروژی", + "Language_nb": "نروژی بوک‌مÙÙ„", "Language_nd": "انده‌بله‌ای شمالی", "Language_ne": "نپالی", "Language_ng": "اندونگایی", "Language_nl": "هلندی", - "Language_nn": "نرس جدید نروژی", + "Language_nn": "نروژی نی‌نÙØ´Ú©", "Language_no": "نروژی", "Language_nr": "انده‌بله‌ای جنوبی", "Language_nv": "ناواهویی", @@ -452,14 +452,14 @@ "Language_ro": "رومانیایی", "Language_ru": "روسی", "Language_rw": "کینیارواندایی", - "Language_sa": "سنسکریت", + "Language_sa": "سانسکریت", "Language_sc": "ساردینیایی", "Language_sd": "سندی", "Language_se": "سامی شمالی", - "Language_sg": "سانگویی", + "Language_sg": "سانگو", "Language_si": "سینهالی", "Language_sk": "اسلواکی", - "Language_sl": "اسلووینیایی", + "Language_sl": "اسلوونیایی", "Language_sm": "ساموآیی", "Language_sn": "شونایی", "Language_so": "سومالیایی", @@ -554,7 +554,15 @@ "NMinutes": "%s دقیقه", "NMinutesShort": "%s دقیقه", "NSeconds": "%s ثانیه", - "NSecondsShort": "%sثانیه", + "NSecondsShort": "%s Ø«", + "NumberFormatCurrency": "‎¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": "Ù«", + "NumberSymbolGroup": "Ù¬", + "NumberSymbolMinus": "‎−", + "NumberSymbolPercent": "Ùª", + "NumberSymbolPlus": "‎+‎", "OneDay": "1 روز", "OneMinute": "1 دقیقه", "OneMinuteShort": "1 دقیقه", diff --git a/plugins/Intl/lang/fi.json b/plugins/Intl/lang/fi.json index 766f1a26e36684e39a21e184d08f9f0848bb891a..eb8f50332016311d944c11ac1c8b61203be407cd 100644 --- a/plugins/Intl/lang/fi.json +++ b/plugins/Intl/lang/fi.json @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekuntia", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 päivä", "OneMinute": "1 minuutti", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/fr.json b/plugins/Intl/lang/fr.json index fa0e99b349639fe274a4260b4d5993f7e574c355..57438a91f047d28a4730c990574a53bc9381d30b 100644 --- a/plugins/Intl/lang/fr.json +++ b/plugins/Intl/lang/fr.json @@ -153,7 +153,7 @@ "Country_MH": "ÃŽles Marshall", "Country_MK": "Macédoine", "Country_ML": "Mali", - "Country_MM": "Myanmar", + "Country_MM": "Myanmar (Birmanie)", "Country_MN": "Mongolie", "Country_MO": "R.A.S. chinoise de Macao", "Country_MP": "ÃŽles Mariannes du Nord", @@ -227,7 +227,7 @@ "Country_TG": "Togo", "Country_TH": "Thaïlande", "Country_TJ": "Tadjikistan", - "Country_TK": "Tokelau", + "Country_TK": "Tokélaou", "Country_TL": "Timor oriental", "Country_TM": "Turkménistan", "Country_TN": "Tunisie", @@ -375,7 +375,7 @@ "Language_hi": "Hindi", "Language_ho": "Hiri motu", "Language_hr": "Croate", - "Language_ht": "Haïtien", + "Language_ht": "Créole haïtien", "Language_hu": "Hongrois", "Language_hy": "Arménien", "Language_hz": "Héréro", @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s secondes", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 jour", "OneMinute": "1 minute", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/gl.json b/plugins/Intl/lang/gl.json index 8448d0da11bae60863f3d2db6fcd15710870bb2e..15c88b8530853d1f2ff749ec602d89b8f1b64a2f 100644 --- a/plugins/Intl/lang/gl.json +++ b/plugins/Intl/lang/gl.json @@ -22,7 +22,7 @@ "Country_AT": "Austria", "Country_AU": "Australia", "Country_AW": "Aruba", - "Country_AX": "Ã…land", + "Country_AX": "Illas Aland", "Country_AZ": "Acerbaixán", "Country_BA": "Bosnia e Hercegovina", "Country_BB": "Barbados", @@ -46,7 +46,7 @@ "Country_BY": "Bielorrusia", "Country_BZ": "Belice", "Country_CA": "Canadá", - "Country_CC": "Illas Cocos", + "Country_CC": "Illas Cocos (Keeling)", "Country_CD": "República Democrática do Congo", "Country_CF": "República Centroafricana", "Country_CG": "Congo", @@ -78,7 +78,7 @@ "Country_ES": "España", "Country_ET": "EtiopÃa", "Country_FI": "Finlandia", - "Country_FJ": "Fidxi", + "Country_FJ": "Fixi", "Country_FK": "Illas Malvinas", "Country_FM": "Micronesia", "Country_FO": "Illas Feroe", @@ -100,7 +100,7 @@ "Country_GS": "Xeorxia do Sur e Illas Sandwich", "Country_GT": "Guatemala", "Country_GU": "Guam", - "Country_GW": "Guinea-Bisau", + "Country_GW": "Guinea-Bissau", "Country_GY": "Güiana", "Country_HK": "Hong Kong RAE de China", "Country_HM": "Illa Heard e Illas McDonald", @@ -118,7 +118,7 @@ "Country_IR": "Irán", "Country_IS": "Islandia", "Country_IT": "Italia", - "Country_JE": "Illa de Jersey", + "Country_JE": "Jersey", "Country_JM": "Xamaica", "Country_JO": "Xordania", "Country_JP": "Xapón", @@ -127,39 +127,39 @@ "Country_KH": "Cambodia", "Country_KI": "Kiribati", "Country_KM": "Comores", - "Country_KN": "Saint Kitts e Nevis", + "Country_KN": "San Cristovo e Nevis", "Country_KP": "Corea do Norte", "Country_KR": "Corea do Sur", "Country_KW": "Kuwait", "Country_KY": "Illas Caimán", - "Country_KZ": "Casaquistán", + "Country_KZ": "Kazakhstan", "Country_LA": "Laos", "Country_LB": "LÃbano", "Country_LC": "Santa LucÃa", "Country_LI": "Liechtenstein", "Country_LK": "Sri Lanka", "Country_LR": "Liberia", - "Country_LS": "Lesoto", + "Country_LS": "Lesotho", "Country_LT": "Lituania", "Country_LU": "Luxemburgo", "Country_LV": "Letonia", "Country_LY": "Libia", "Country_MA": "Marrocos", "Country_MC": "Mónaco", - "Country_MD": "Moldavia", + "Country_MD": "Moldova", "Country_ME": "Montenegro", "Country_MF": "San Martiño", "Country_MG": "Madagascar", "Country_MH": "Illas Marshall", - "Country_MK": "República de Macedonia", - "Country_ML": "MalÃ", + "Country_MK": "Macedonia", + "Country_ML": "Mali", "Country_MM": "Myanmar (Birmania)", "Country_MN": "Mongolia", "Country_MO": "Macau RAE de China", "Country_MP": "Illas Marianas do norte", "Country_MQ": "Martinica", "Country_MR": "Mauritania", - "Country_MS": "Illa Montserrat", + "Country_MS": "Montserrat", "Country_MT": "Malta", "Country_MU": "Mauricio", "Country_MV": "Maldivas", @@ -178,7 +178,7 @@ "Country_NP": "Nepal", "Country_NR": "Nauru", "Country_NU": "Niue", - "Country_NZ": "Nova Zelandia", + "Country_NZ": "Nova Celandia", "Country_OM": "Omán", "Country_PA": "Panamá", "Country_PE": "Perú", @@ -192,7 +192,7 @@ "Country_PR": "Porto Rico", "Country_PS": "Territorios palestinos", "Country_PT": "Portugal", - "Country_PW": "Rep. das Palaus", + "Country_PW": "Palau", "Country_PY": "Paraguai", "Country_QA": "Qatar", "Country_RE": "Reunión", @@ -217,7 +217,7 @@ "Country_SR": "Surinam", "Country_SS": "Sudán do sur", "Country_ST": "San Tomé e PrÃncipe", - "Country_SV": "O Salvador", + "Country_SV": "El Salvador", "Country_SX": "Sint Maarten", "Country_SY": "Siria", "Country_SZ": "Suacilandia", @@ -227,9 +227,9 @@ "Country_TG": "Togo", "Country_TH": "Tailandia", "Country_TJ": "Taxiquistán", - "Country_TK": "Toquelau", + "Country_TK": "Tokelau", "Country_TL": "Timor Leste", - "Country_TM": "Turcomenistán", + "Country_TM": "Turkmenistán", "Country_TN": "Tunisia", "Country_TO": "Tonga", "Country_TR": "TurquÃa", @@ -285,7 +285,7 @@ "Day_Min_StandAlone_5": "Ven", "Day_Min_StandAlone_6": "Sáb", "Day_Min_StandAlone_7": "Dom", - "Day_Short_1": "Lun", + "Day_Short_1": "Luns", "Day_Short_2": "Mar", "Day_Short_3": "Mér", "Day_Short_4": "Xov", @@ -328,15 +328,16 @@ "Language_ba": "Baskir", "Language_be": "Bielorruso", "Language_bg": "Búlgaro", - "Language_bm": "Bambara", "Language_bn": "BengalÃ", "Language_bo": "Tibetano", "Language_br": "Bretón", "Language_bs": "Bosnio", "Language_ca": "Catalán", + "Language_ce": "Checheno", "Language_co": "Corso", "Language_cs": "Checo", "Language_cu": "Eslavo eclesiástico", + "Language_cv": "Chuvash", "Language_cy": "Galés", "Language_da": "Dinamarqués", "Language_de": "Alemán", @@ -374,20 +375,17 @@ "Language_ii": "Yi sichuanés", "Language_is": "Islandés", "Language_it": "Italiano", - "Language_iu": "Inuit", "Language_ja": "Xaponés", "Language_jv": "Xavanés", "Language_ka": "Xeorxiano", "Language_kg": "Kongo", "Language_ki": "Kikuyu", "Language_kk": "Casaco", - "Language_kl": "Groenlandés", "Language_km": "Cambodiano", "Language_kn": "Kannada", "Language_ko": "Coreano", "Language_ks": "Cachemir", "Language_ku": "Kurdo", - "Language_kw": "Córnico", "Language_ky": "Quirguiz", "Language_la": "LatÃn", "Language_lb": "Luxemburgués", @@ -395,7 +393,7 @@ "Language_ln": "Lingala", "Language_lo": "Laotiano", "Language_lt": "Lituano", - "Language_lu": "Luba-katanga", + "Language_lu": "Luba-Katanga", "Language_lv": "Letón", "Language_mg": "Malgaxe", "Language_mi": "MaorÃ", @@ -525,6 +523,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s segundos", "NSecondsShort": "%s s", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dÃa", "OneMinute": "1 minuto", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/he.json b/plugins/Intl/lang/he.json index c1a84f00336c7590ed4aa8b01aa5697b08e522a0..50c63fc1d4f8b89e7176839b86693e393f01f6bd 100644 --- a/plugins/Intl/lang/he.json +++ b/plugins/Intl/lang/he.json @@ -218,7 +218,7 @@ "Country_SS": "×“×¨×•× ×¡×•×“×Ÿ", "Country_ST": "ס×ו טומה ×•×¤×¨×™× ×¡×™×¤×”", "Country_SV": "×ל סלבדור", - "Country_SX": "×¡×™× ×˜ מ×רטן", + "Country_SX": "×¡× ×˜ מ×רטן", "Country_SY": "סוריה", "Country_SZ": "×¡×•×•×–×™×œ× ×“", "Country_TC": "××™×™ טורקס וק×יקוס", @@ -426,12 +426,12 @@ "Language_mt": "מלטית", "Language_my": "בורמזית", "Language_na": "× ×ורית", - "Language_nb": "â€× ורבגית ספרותית", + "Language_nb": "× ×•×¨×•×•×’×™×ª ספרותית", "Language_nd": "צפון × ×“×‘×œ×”", "Language_ne": "× ×¤×לית", "Language_ng": "× ×“×•× ×’×”", "Language_nl": "×”×•×œ× ×“×™×ª", - "Language_nn": "× ×•×¨×‘×’×™×ª חדשה", + "Language_nn": "× ×•×¨×•×•×’×™×ª חדשה", "Language_no": "× ×•×¨×‘×’×™×ª", "Language_nr": "×“×¨×•× × ×“×‘×œ×”", "Language_nv": "× ×‘×—×•", @@ -555,6 +555,14 @@ "NMinutesShort": "%s דק׳", "NSeconds": "%s ×©× ×™×•×ª", "NSecondsShort": "%s ×©× ×³", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "‎-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "‎+", "OneDay": "יו×", "OneMinute": "דקה", "OneMinuteShort": "דקה", diff --git a/plugins/Intl/lang/hi.json b/plugins/Intl/lang/hi.json index 225da598d41bac187b46c056630c63c51596e80b..73c68868e8e5fe2284625951b3fee961c7335bbb 100644 --- a/plugins/Intl/lang/hi.json +++ b/plugins/Intl/lang/hi.json @@ -386,7 +386,7 @@ "Language_ii": "सिचà¥à¤†à¤¨ यी", "Language_ik": "इनà¥à¤ªà¤¿à¤¯à¤¾à¤•à¥", "Language_io": "इडौ", - "Language_is": "आइसलैंडी", + "Language_is": "आइसलैंडिक", "Language_it": "इतालवी", "Language_iu": "इनूकीटूतà¥", "Language_ja": "जापानी", @@ -396,7 +396,7 @@ "Language_ki": "किकà¥à¤¯à¥‚", "Language_kj": "कà¥à¤µà¤¾à¤¨à¥à¤¯à¤¾à¤®à¤¾", "Language_kk": "कज़ाख़", - "Language_kl": "गà¥à¤°à¥€à¤¨à¤²à¥ˆà¤‚डिक", + "Language_kl": "कलालीसà¥à¤¤", "Language_km": "खमेर", "Language_kn": "कनà¥à¤¨à¤¡à¤¼", "Language_ko": "कोरियाई", @@ -555,6 +555,14 @@ "NMinutesShort": "%s मि.", "NSeconds": "%s सेकंड", "NSecondsShort": "%sसे.", + "NumberFormatCurrency": "¤#,##,##0.00", + "NumberFormatNumber": "#,##,##0.###", + "NumberFormatPercent": "#,##,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 दिन", "OneMinute": "1 मिनट", "OneMinuteShort": "1 मि.", diff --git a/plugins/Intl/lang/hr.json b/plugins/Intl/lang/hr.json index 46793d2519f124f12e3b4f1d1efb00abead364a0..48bcdd8a09596daee8065d6154f9cdbe3ddc148f 100644 --- a/plugins/Intl/lang/hr.json +++ b/plugins/Intl/lang/hr.json @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekundi", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dan", "OneMinute": "1 minuta", "OneMinuteShort": "1 min", "OriginalLanguageName": "Hrvatski", - "PeriodDay": "Dan", + "PeriodDay": "dan", "PeriodDays": "dani", - "PeriodMonth": "Mjesec", + "PeriodMonth": "mjesec", "PeriodMonths": "mjeseci", - "PeriodWeek": "Tjedan", + "PeriodWeek": "tjedan", "PeriodWeeks": "tjedni", - "PeriodYear": "Godina", + "PeriodYear": "godina", "PeriodYears": "godine", "Seconds": "sekunde", "Time_AM": "AM", diff --git a/plugins/Intl/lang/hu.json b/plugins/Intl/lang/hu.json index 7481dc75a9bda3236f06b9e207f4136b6ffa5351..4df06ba7067eb8e35bf4ac631e26528a093ab72a 100644 --- a/plugins/Intl/lang/hu.json +++ b/plugins/Intl/lang/hu.json @@ -9,7 +9,7 @@ "Continent_eur": "Európa", "Continent_oce": "Óceánia", "Country_AD": "Andorra", - "Country_AE": "Egyesült Arab Emirátus", + "Country_AE": "Egyesült Arab EmÃrségek", "Country_AF": "Afganisztán", "Country_AG": "Antigua és Barbuda", "Country_AI": "Anguilla", @@ -78,7 +78,7 @@ "Country_ES": "Spanyolország", "Country_ET": "Etiópia", "Country_FI": "Finnország", - "Country_FJ": "Fidzsi-szigetek", + "Country_FJ": "Fidzsi", "Country_FK": "Falkland-szigetek", "Country_FM": "Mikronézia", "Country_FO": "Feröer-szigetek", @@ -100,7 +100,7 @@ "Country_GS": "Déli-Georgia és Déli-Sandwich-szigetek", "Country_GT": "Guatemala", "Country_GU": "Guam", - "Country_GW": "Guinea-Bissau", + "Country_GW": "Bissau-Guinea", "Country_GY": "Guyana", "Country_HK": "Hongkong SAR KÃna", "Country_HM": "Heard-sziget és McDonald-szigetek", @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s másodperc", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 nap", "OneMinute": "1 perc", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/id.json b/plugins/Intl/lang/id.json index ff1028c94dc3124eb503a82df0a363a9d38c3273..ef6ae7fafaca59b1ae2e5e4be0d3414b546153cf 100644 --- a/plugins/Intl/lang/id.json +++ b/plugins/Intl/lang/id.json @@ -330,7 +330,7 @@ "Language_az": "Azerbaijan", "Language_ba": "Bashkir", "Language_be": "Belarusia", - "Language_bg": "Bulgar", + "Language_bg": "Bulgaria", "Language_bi": "Bislama", "Language_bm": "Bambara", "Language_bn": "Bengali", @@ -380,7 +380,7 @@ "Language_hy": "Armenia", "Language_hz": "Herero", "Language_ia": "Interlingua", - "Language_id": "Bahasa Indonesia", + "Language_id": "Indonesia", "Language_ie": "Interlingue", "Language_ig": "Igbo", "Language_ii": "Sichuan Yi", @@ -424,7 +424,7 @@ "Language_mr": "Marathi", "Language_ms": "Melayu", "Language_mt": "Malta", - "Language_my": "Burma", + "Language_my": "Myanmar", "Language_na": "Nauru", "Language_nb": "BokmÃ¥l Norwegia", "Language_nd": "Ndebele Utara", @@ -555,10 +555,18 @@ "NMinutesShort": "%s mnt", "NSeconds": "%s detik", "NSecondsShort": "%s dtk", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 hari", "OneMinute": "1 menit", "OneMinuteShort": "1 mnt", - "OriginalLanguageName": "Bahasa Indonesia", + "OriginalLanguageName": "Indonesia", "PeriodDay": "Hari", "PeriodDays": "hari", "PeriodMonth": "Bulan", diff --git a/plugins/Intl/lang/is.json b/plugins/Intl/lang/is.json index 03b1b59c38c28a068939b393ba11e5d9018f9dc5..1160564dd82535111cf7336467535dded7c4b111 100644 --- a/plugins/Intl/lang/is.json +++ b/plugins/Intl/lang/is.json @@ -33,7 +33,7 @@ "Country_BH": "Barein", "Country_BI": "BúrúndÃ", "Country_BJ": "BenÃn", - "Country_BL": "Saint Barthélemy", + "Country_BL": "Sankti Bartólómeusareyjar", "Country_BM": "Bermúdaeyjar", "Country_BN": "Brúnei", "Country_BO": "BólivÃa", @@ -78,7 +78,7 @@ "Country_ES": "Spánn", "Country_ET": "EþÃópÃa", "Country_FI": "Finnland", - "Country_FJ": "FÃdjieyjar", + "Country_FJ": "FÃdjÃeyjar", "Country_FK": "Falklandseyjar", "Country_FM": "MÃkrónesÃa", "Country_FO": "Færeyjar", @@ -148,7 +148,7 @@ "Country_MC": "Mónakó", "Country_MD": "Moldóva", "Country_ME": "Svartfjallaland", - "Country_MF": "Saint Martin", + "Country_MF": "St. Martin", "Country_MG": "Madagaskar", "Country_MH": "Marshalleyjar", "Country_MK": "MakedónÃa", @@ -218,7 +218,7 @@ "Country_SS": "Suður-Súdan", "Country_ST": "Saó Tóme og PrinsÃpe", "Country_SV": "El Salvador", - "Country_SX": "Sint Maarten", + "Country_SX": "Sankti Martin", "Country_SY": "Sýrland", "Country_SZ": "SvasÃland", "Country_TC": "Turks- og Caicoseyjar", @@ -553,6 +553,14 @@ "NMinutesShort": "%s mÃn.", "NSeconds": "%s sekúndur", "NSecondsShort": "%s sek.", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dagur", "OneMinute": "1 mÃnúta", "OneMinuteShort": "1 mÃn.", diff --git a/plugins/Intl/lang/it.json b/plugins/Intl/lang/it.json index 20aba2c4dbf5b8d62cd9e1a3e19472b5476512ef..5f8882536985f45ebfd329bdf45dbc3dc86d97d3 100644 --- a/plugins/Intl/lang/it.json +++ b/plugins/Intl/lang/it.json @@ -18,13 +18,13 @@ "Country_AO": "Angola", "Country_AQ": "Antartide", "Country_AR": "Argentina", - "Country_AS": "Samoa Americane", + "Country_AS": "Samoa americane", "Country_AT": "Austria", "Country_AU": "Australia", "Country_AW": "Aruba", - "Country_AX": "Isole Aland", + "Country_AX": "Isole Ã…land", "Country_AZ": "Azerbaigian", - "Country_BA": "Bosnia-Erzegovina", + "Country_BA": "Bosnia ed Erzegovina", "Country_BB": "Barbados", "Country_BD": "Bangladesh", "Country_BE": "Belgio", @@ -46,7 +46,7 @@ "Country_BY": "Bielorussia", "Country_BZ": "Belize", "Country_CA": "Canada", - "Country_CC": "Isole Cocos", + "Country_CC": "Isole Cocos (Keeling)", "Country_CD": "Congo - Kinshasa", "Country_CF": "Repubblica Centrafricana", "Country_CG": "Congo-Brazzaville", @@ -61,7 +61,7 @@ "Country_CU": "Cuba", "Country_CV": "Capo Verde", "Country_CW": "Curaçao", - "Country_CX": "Isola di Christmas", + "Country_CX": "Isola Christmas", "Country_CY": "Cipro", "Country_CZ": "Repubblica Ceca", "Country_DE": "Germania", @@ -73,7 +73,7 @@ "Country_EC": "Ecuador", "Country_EE": "Estonia", "Country_EG": "Egitto", - "Country_EH": "Sahara Occidentale", + "Country_EH": "Sahara occidentale", "Country_ER": "Eritrea", "Country_ES": "Spagna", "Country_ET": "Etiopia", @@ -81,13 +81,13 @@ "Country_FJ": "Figi", "Country_FK": "Isole Falkland", "Country_FM": "Micronesia", - "Country_FO": "Isole Faroe", + "Country_FO": "Isole Fær Øer", "Country_FR": "Francia", "Country_GA": "Gabon", "Country_GB": "Regno Unito", "Country_GD": "Grenada", "Country_GE": "Georgia", - "Country_GF": "Guiana Francese", + "Country_GF": "Guyana francese", "Country_GG": "Guernsey", "Country_GH": "Ghana", "Country_GI": "Gibilterra", @@ -97,7 +97,7 @@ "Country_GP": "Guadalupa", "Country_GQ": "Guinea Equatoriale", "Country_GR": "Grecia", - "Country_GS": "Georgia del Sud e isole Sandwich meridionali", + "Country_GS": "Georgia del Sud e isole Sandwich australi", "Country_GT": "Guatemala", "Country_GU": "Guam", "Country_GW": "Guinea-Bissau", @@ -113,7 +113,7 @@ "Country_IL": "Israele", "Country_IM": "Isola di Man", "Country_IN": "India", - "Country_IO": "Territorio Britannico dell’Oceano Indiano", + "Country_IO": "Territorio britannico dell’Oceano Indiano", "Country_IQ": "Iraq", "Country_IR": "Iran", "Country_IS": "Islanda", @@ -156,7 +156,7 @@ "Country_MM": "Myanmar (Birmania)", "Country_MN": "Mongolia", "Country_MO": "RAS di Macao", - "Country_MP": "Isole Marianne Settentrionali", + "Country_MP": "Isole Marianne settentrionali", "Country_MQ": "Martinica", "Country_MR": "Mauritania", "Country_MS": "Montserrat", @@ -165,7 +165,7 @@ "Country_MV": "Maldive", "Country_MW": "Malawi", "Country_MX": "Messico", - "Country_MY": "Malesia", + "Country_MY": "Malaysia", "Country_MZ": "Mozambico", "Country_NA": "Namibia", "Country_NC": "Nuova Caledonia", @@ -182,7 +182,7 @@ "Country_OM": "Oman", "Country_PA": "Panamá", "Country_PE": "Perù", - "Country_PF": "Polinesia Francese", + "Country_PF": "Polinesia francese", "Country_PG": "Papua Nuova Guinea", "Country_PH": "Filippine", "Country_PK": "Pakistan", @@ -195,13 +195,13 @@ "Country_PW": "Palau", "Country_PY": "Paraguay", "Country_QA": "Qatar", - "Country_RE": "Réunion", + "Country_RE": "Riunione", "Country_RO": "Romania", "Country_RS": "Serbia", - "Country_RU": "Federazione Russa", + "Country_RU": "Russia", "Country_RW": "Ruanda", "Country_SA": "Arabia Saudita", - "Country_SB": "Isole Solomon", + "Country_SB": "Isole Salomone", "Country_SC": "Seychelles", "Country_SD": "Sudan", "Country_SE": "Svezia", @@ -215,7 +215,7 @@ "Country_SN": "Senegal", "Country_SO": "Somalia", "Country_SR": "Suriname", - "Country_SS": "Sudan del Sud", + "Country_SS": "Sud Sudan", "Country_ST": "São Tomé e PrÃncipe", "Country_SV": "El Salvador", "Country_SX": "Sint Maarten", @@ -223,12 +223,12 @@ "Country_SZ": "Swaziland", "Country_TC": "Isole Turks e Caicos", "Country_TD": "Ciad", - "Country_TF": "Territori australi francesi", + "Country_TF": "Terre australi francesi", "Country_TG": "Togo", - "Country_TH": "Tailandia", + "Country_TH": "Thailandia", "Country_TJ": "Tagikistan", "Country_TK": "Tokelau", - "Country_TL": "Timor Est", + "Country_TL": "Timor Leste", "Country_TM": "Turkmenistan", "Country_TN": "Tunisia", "Country_TO": "Tonga", @@ -239,7 +239,7 @@ "Country_TZ": "Tanzania", "Country_UA": "Ucraina", "Country_UG": "Uganda", - "Country_UM": "Isole minori lontane dagli USA", + "Country_UM": "Altre isole americane del Pacifico", "Country_US": "Stati Uniti", "Country_UY": "Uruguay", "Country_UZ": "Uzbekistan", @@ -344,7 +344,7 @@ "Language_cr": "Cree", "Language_cs": "Ceco", "Language_cu": "Slavo della Chiesa", - "Language_cv": "Chuvash", + "Language_cv": "Ciuvascio", "Language_cy": "Gallese", "Language_da": "Danese", "Language_de": "Tedesco", @@ -369,7 +369,7 @@ "Language_gl": "Galiziano", "Language_gn": "GuaranÃ", "Language_gu": "Gujarati", - "Language_gv": "Manx", + "Language_gv": "Mannese", "Language_ha": "Hausa", "Language_he": "Ebraico", "Language_hi": "Hindi", @@ -396,7 +396,7 @@ "Language_ki": "Kikuyu", "Language_kj": "Kuanyama", "Language_kk": "Kazako", - "Language_kl": "Kalaallisut", + "Language_kl": "Groenlandese", "Language_km": "Khmer", "Language_kn": "Kannada", "Language_ko": "Coreano", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s secondi", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 giorno", "OneMinute": "1 minuto", "OneMinuteShort": "1 min", "OriginalLanguageName": "Italiano", - "PeriodDay": "Giorno", + "PeriodDay": "giorno", "PeriodDays": "giorni", - "PeriodMonth": "Mese", + "PeriodMonth": "mese", "PeriodMonths": "mesi", - "PeriodWeek": "Settimana", + "PeriodWeek": "settimana", "PeriodWeeks": "settimane", - "PeriodYear": "Anno", + "PeriodYear": "anno", "PeriodYears": "anni", "Seconds": "secondi", "Time_AM": "AM", diff --git a/plugins/Intl/lang/ja.json b/plugins/Intl/lang/ja.json index 9007463ce280addd9e009ef036a99628f34d6520..b1434f36d6ec6482be59e7f7488464aa0f5920f7 100644 --- a/plugins/Intl/lang/ja.json +++ b/plugins/Intl/lang/ja.json @@ -86,7 +86,7 @@ "Country_GA": "ガボン", "Country_GB": "イギリス", "Country_GD": "グレナダ", - "Country_GE": "グルジア", + "Country_GE": "ジョージア", "Country_GF": "ä»é ˜ã‚®ã‚¢ãƒŠ", "Country_GG": "ガーンジー", "Country_GH": "ガーナ", @@ -391,7 +391,7 @@ "Language_iu": "イヌクウティトット語", "Language_ja": "日本語", "Language_jv": "ジャワ語", - "Language_ka": "グルジア語", + "Language_ka": "ジョージア語", "Language_kg": "コンゴ語", "Language_ki": "ã‚クユ語", "Language_kj": "クワニャマ語", @@ -555,6 +555,14 @@ "NMinutesShort": "%s 分", "NSeconds": "%s 秒", "NSecondsShort": "%s秒", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 æ—¥", "OneMinute": "1 分", "OneMinuteShort": "1 分", diff --git a/plugins/Intl/lang/ka.json b/plugins/Intl/lang/ka.json index 7c6e7406e4cf7e5ab8b44938fb1c00d05697df15..819f7ba2a0903a2ed1f30aeda29cc7fcf60d7cb6 100644 --- a/plugins/Intl/lang/ka.json +++ b/plugins/Intl/lang/ka.json @@ -301,18 +301,18 @@ "Day_Short_StandAlone_7": "კვი", "EnglishLanguageName": "Georgian", "Format_DateTime_Long": "EEEE, dd MMMM, y HH:mm:ss", - "Format_DateTime_Short": "d MMM, y HH:mm:ss", + "Format_DateTime_Short": "d MMM. y HH:mm:ss", "Format_Date_Day_Month": "E, d MMM", "Format_Date_Long": "EEEE, dd MMMM, y", - "Format_Date_Short": "d MMM, y", + "Format_Date_Short": "d MMM. y", "Format_Interval_Long_D": "d–d MMMM, y", - "Format_Interval_Long_M": "dd MM – dd MM, y", - "Format_Interval_Long_Y": "dd MMMM, y – d MMMM, y", + "Format_Interval_Long_M": "dd MMMM. – dd MMMM. y", + "Format_Interval_Long_Y": "dd MMMM. y – d MMMM. y", "Format_Interval_Short_D": "d–d MMM, y", - "Format_Interval_Short_M": "dd MM – dd MM, y", - "Format_Interval_Short_Y": "dd MMM, y – d MMM, y", + "Format_Interval_Short_M": "dd MMM. – dd MMM. y", + "Format_Interval_Short_Y": "dd MMM. y – d MMM. y", "Format_Month_Long": "MMMM, y", - "Format_Month_Short": "MMM, y", + "Format_Month_Short": "MMM. y", "Format_Time": "HH:mm:ss", "Format_Year": "y", "Hours": "სáƒáƒáƒ—ი", @@ -536,6 +536,14 @@ "NMinutesShort": "%s წთ", "NSeconds": "%s წáƒáƒ›áƒ˜", "NSecondsShort": "%sწმ", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 დღე", "OneMinute": "1 წუთი", "OneMinuteShort": "1 წთ", diff --git a/plugins/Intl/lang/ko.json b/plugins/Intl/lang/ko.json index e59b06b83b237e3b36f2f1c53667e5b07ca9a3f8..70b13cb503d3f0814168cff8b172f2934388847f 100644 --- a/plugins/Intl/lang/ko.json +++ b/plugins/Intl/lang/ko.json @@ -9,7 +9,7 @@ "Continent_eur": "ìœ ëŸ½", "Continent_oce": "오세아니아", "Country_AD": "안ë„ë¼", - "Country_AE": "ì•„ëžì—미리트 ì—°í•©", + "Country_AE": "ì•„ëžì—미리트", "Country_AF": "아프가니스탄", "Country_AG": "앤티가 바부다", "Country_AI": "앵귈ë¼", @@ -46,13 +46,13 @@ "Country_BY": "벨ë¼ë£¨ìŠ¤", "Country_BZ": "벨리즈", "Country_CA": "ìºë‚˜ë‹¤", - "Country_CC": "ì½”ì½”ìŠ¤ì œë„", + "Country_CC": "코코스 ì œë„", "Country_CD": "ì½©ê³ -킨샤사", "Country_CF": "중앙 아프리카 공화êµ", "Country_CG": "ì½©ê³ ", "Country_CH": "스위스", "Country_CI": "코트디부아르", - "Country_CK": "ì¿¡ì œë„", + "Country_CK": "ì¿¡ ì œë„", "Country_CL": "ì¹ ë ˆ", "Country_CM": "카메룬", "Country_CN": "중êµ", @@ -76,7 +76,7 @@ "Country_EH": "서사하ë¼", "Country_ER": "ì—리트리아", "Country_ES": "스페ì¸", - "Country_ET": "ì´ë””오피아", + "Country_ET": "ì—티오피아", "Country_FI": "핀란드", "Country_FJ": "피지", "Country_FK": "í¬í´ëžœë“œ ì œë„", @@ -102,7 +102,7 @@ "Country_GU": "ê´Œ", "Country_GW": "기니비사우", "Country_GY": "ê°€ì´ì•„나", - "Country_HK": "í™ì½©, ì¤‘êµ íŠ¹ë³„í–‰ì •êµ¬", + "Country_HK": "í™ì½©(ì¤‘êµ íŠ¹ë³„í–‰ì •êµ¬)", "Country_HM": "허드 맥ë„ë„ë“œ ì œë„", "Country_HN": "온ë‘ë¼ìŠ¤", "Country_HR": "í¬ë¡œì•„í‹°ì•„", @@ -131,7 +131,7 @@ "Country_KP": "ì¡°ì„ ë¯¼ì£¼ì£¼ì˜ì¸ë¯¼ê³µí™”êµ", "Country_KR": "대한민êµ", "Country_KW": "ì¿ ì›¨ì´íŠ¸", - "Country_KY": "ì¼€ì´ë§¨ì œë„", + "Country_KY": "ì¼€ì´ë§¨ ì œë„", "Country_KZ": "ì¹´ìží스탄", "Country_LA": "ë¼ì˜¤ìŠ¤", "Country_LB": "ë ˆë°”ë…¼", @@ -148,14 +148,14 @@ "Country_MC": "모나코", "Country_MD": "몰ë„ë°”", "Country_ME": "몬테네그로", - "Country_MF": "ìƒ ë§ˆë¥´íƒ±", + "Country_MF": "ìƒë§ˆë¥´íƒ±", "Country_MG": "마다가스카르", - "Country_MH": "마샬 êµ°ë„", + "Country_MH": "마셜 ì œë„", "Country_MK": "마케ë„니아", "Country_ML": "ë§ë¦¬", "Country_MM": "미얀마", "Country_MN": "몽골", - "Country_MO": "마카오, ì¤‘êµ íŠ¹ë³„í–‰ì •êµ¬", + "Country_MO": "마카오(ì¤‘êµ íŠ¹ë³„í–‰ì •êµ¬)", "Country_MP": "ë¶ë§ˆë¦¬ì•„ë‚˜ì œë„", "Country_MQ": "마르티니í¬", "Country_MR": "모리타니", @@ -243,7 +243,7 @@ "Country_US": "미êµ", "Country_UY": "우루과ì´", "Country_UZ": "ìš°ì¦ˆë² í‚¤ìŠ¤íƒ„", - "Country_VA": "바티칸시êµ", + "Country_VA": "바티칸 ì‹œêµ", "Country_VC": "세ì¸íŠ¸ë¹ˆì„¼íŠ¸ê·¸ë ˆë‚˜ë”˜", "Country_VE": "ë² ë„¤ìˆ˜ì—˜ë¼", "Country_VG": "ì˜êµë ¹ 버진아ì¼ëžœë“œ", @@ -324,7 +324,7 @@ "Language_am": "암하ë¼ì–´", "Language_an": "ì•„ë¼ê³¤ì–´", "Language_ar": "ì•„ëžì–´", - "Language_as": "아샘어", + "Language_as": "아삼어", "Language_av": "ì•„ë°”ë¦ì–´", "Language_ay": "ì•„ì´ë§ˆë¼ì–´", "Language_az": "ì•„ì œë¥´ë°”ì´ìž”ì–´", @@ -363,7 +363,7 @@ "Language_fj": "피지어", "Language_fo": "페로어", "Language_fr": "프랑스어", - "Language_fy": "프리지아어", + "Language_fy": "서프리지아어", "Language_ga": "ì•„ì¼ëžœë“œì–´", "Language_gd": "스코틀랜드 게ì¼ì–´", "Language_gl": "갈리시아어", @@ -447,7 +447,7 @@ "Language_ps": "íŒŒìŠˆí† ì–´", "Language_pt": "í¬ë¥´íˆ¬ê°ˆì–´", "Language_qu": "케추아어", - "Language_rm": "ë ˆí† ë¡œë§Œì–´", + "Language_rm": "로만시어", "Language_rn": "룬디어", "Language_ro": "루마니아어", "Language_ru": "러시아어", @@ -492,7 +492,7 @@ "Language_vi": "ë² íŠ¸ë‚¨ì–´", "Language_vo": "ë³¼ë¼í“Œí¬ì–´", "Language_wa": "ì™ˆë¡ ì–´", - "Language_wo": "올로프어", + "Language_wo": "월로프어", "Language_xh": "코사어", "Language_yi": "ì´ë””시어", "Language_yo": "요루바어", @@ -555,6 +555,14 @@ "NMinutesShort": "%s분", "NSeconds": "%sì´ˆ", "NSecondsShort": "%sì´ˆ", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1ì¼", "OneMinute": "1분", "OneMinuteShort": "1분", diff --git a/plugins/Intl/lang/lt.json b/plugins/Intl/lang/lt.json index f41cb594c2b306cdc0af48ee2b9e73a018dba1f6..7dc87c76a14896cca2a12937e42286f3c7ca3178 100644 --- a/plugins/Intl/lang/lt.json +++ b/plugins/Intl/lang/lt.json @@ -308,10 +308,10 @@ "Format_Interval_Long_D": "y MMMM d–d", "Format_Interval_Long_M": "y MMMM d – MMMM d", "Format_Interval_Long_Y": "y MMMM d – y MMMM d", - "Format_Interval_Short_D": "y-MM-dd – y-MM-dd", - "Format_Interval_Short_M": "y-MM-dd – y-MM-dd", - "Format_Interval_Short_Y": "y-MM-dd – y-MM-dd", - "Format_Month_Long": "y LLLL", + "Format_Interval_Short_D": "y MMM d–d", + "Format_Interval_Short_M": "y MMM d – MMM d", + "Format_Interval_Short_Y": "y MMM d – y MMM d", + "Format_Month_Long": "y 'm'. LLLL", "Format_Month_Short": "y-MM", "Format_Time": "HH:mm:ss", "Format_Year": "y", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min.", "NSeconds": "%s sekundžių", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 diena", "OneMinute": "1 minutÄ—", "OneMinuteShort": "1 min.", "OriginalLanguageName": "Lietuvių", - "PeriodDay": "Diena", + "PeriodDay": "diena", "PeriodDays": "dienos", - "PeriodMonth": "MÄ—nuo", + "PeriodMonth": "mÄ—nuo", "PeriodMonths": "mÄ—nesiai", - "PeriodWeek": "SavaitÄ—", + "PeriodWeek": "savaitÄ—", "PeriodWeeks": "savaitÄ—s", - "PeriodYear": "Metai", + "PeriodYear": "metai", "PeriodYears": "metai", "Seconds": "sekundÄ—s", "Time_AM": "prieÅ¡piet", diff --git a/plugins/Intl/lang/lv.json b/plugins/Intl/lang/lv.json index 99c485e289958bb9dc625fcd0654ae64dcd04f15..2a91a4b6fb7fa59a5d1acfa1586991c586fea698 100644 --- a/plugins/Intl/lang/lv.json +++ b/plugins/Intl/lang/lv.json @@ -555,17 +555,25 @@ "NMinutesShort": "%s min.", "NSeconds": "%s sekundes", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 diena", "OneMinute": "1 minÅ«te", "OneMinuteShort": "1 min.", "OriginalLanguageName": "LatvieÅ¡u", "PeriodDay": "diena", "PeriodDays": "dienas", - "PeriodMonth": "MÄ“nesis", + "PeriodMonth": "mÄ“nesis", "PeriodMonths": "mÄ“neÅ¡i", "PeriodWeek": "nedēļa", "PeriodWeeks": "nedēļas", - "PeriodYear": "Gads", + "PeriodYear": "gads", "PeriodYears": "gadi", "Seconds": "sekundes", "Time_AM": "priekÅ¡pusdienÄ", diff --git a/plugins/Intl/lang/nb.json b/plugins/Intl/lang/nb.json index 21d1a4ba6c3cb10c986f3208f57a589c81e1f8b5..84d427bd0b4cfb4075621b1ed75b6304d95b201a 100644 --- a/plugins/Intl/lang/nb.json +++ b/plugins/Intl/lang/nb.json @@ -292,13 +292,13 @@ "Day_Short_5": "Fre.", "Day_Short_6": "Lør.", "Day_Short_7": "Søn.", - "Day_Short_StandAlone_1": "Ma.", - "Day_Short_StandAlone_2": "Ti.", - "Day_Short_StandAlone_3": "On.", - "Day_Short_StandAlone_4": "To.", - "Day_Short_StandAlone_5": "Fr.", - "Day_Short_StandAlone_6": "Lø.", - "Day_Short_StandAlone_7": "Sø.", + "Day_Short_StandAlone_1": "Man.", + "Day_Short_StandAlone_2": "Tir.", + "Day_Short_StandAlone_3": "Ons.", + "Day_Short_StandAlone_4": "Tor.", + "Day_Short_StandAlone_5": "Fre.", + "Day_Short_StandAlone_6": "Lør.", + "Day_Short_StandAlone_7": "Søn.", "EnglishLanguageName": "Norwegian BokmÃ¥l", "Format_DateTime_Long": "EEEE d. MMMM y HH.mm.ss", "Format_DateTime_Short": "d. MMM y HH.mm.ss", @@ -344,7 +344,7 @@ "Language_cr": "Cree", "Language_cs": "Tsjekkisk", "Language_cu": "Kirkeslavisk", - "Language_cv": "Tsjuvansk", + "Language_cv": "Tsjuvasjisk", "Language_cy": "Walisisk", "Language_da": "Dansk", "Language_de": "Tysk", @@ -415,7 +415,7 @@ "Language_lt": "Litauisk", "Language_lu": "Luba-katanga", "Language_lv": "Latvisk", - "Language_mg": "Madagassisk", + "Language_mg": "Gassisk", "Language_mh": "Marshallesisk", "Language_mi": "Maori", "Language_mk": "Makedonsk", @@ -470,7 +470,7 @@ "Language_su": "Sundanesisk", "Language_sv": "Svensk", "Language_sw": "Swahili", - "Language_ta": "Tamilsk", + "Language_ta": "Tamil", "Language_te": "Telugu", "Language_tg": "Tadsjikisk", "Language_th": "Thai", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekunder", "NSecondsShort": "%ss", + "NumberFormatCurrency": "¤ #,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 døgn", "OneMinute": "1 minutt", "OneMinuteShort": "1 min", "OriginalLanguageName": "Norsk bokmÃ¥l", - "PeriodDay": "Dag", + "PeriodDay": "dag", "PeriodDays": "døgn", - "PeriodMonth": "MÃ¥ned", + "PeriodMonth": "mÃ¥ned", "PeriodMonths": "mÃ¥neder", - "PeriodWeek": "Uke", + "PeriodWeek": "uke", "PeriodWeeks": "uker", - "PeriodYear": "Ã…r", + "PeriodYear": "Ã¥r", "PeriodYears": "Ã¥r", "Seconds": "sekunder", "Time_AM": "a.m.", diff --git a/plugins/Intl/lang/nl.json b/plugins/Intl/lang/nl.json index e3f6c279a99c03be48494c08cb2f29411ea3582f..8c9cfa595392ff2f106ffa37a58ef2b33cbd1deb 100644 --- a/plugins/Intl/lang/nl.json +++ b/plugins/Intl/lang/nl.json @@ -43,7 +43,7 @@ "Country_BT": "Bhutan", "Country_BV": "Bouveteiland", "Country_BW": "Botswana", - "Country_BY": "Wit-Rusland", + "Country_BY": "Belarus", "Country_BZ": "Belize", "Country_CA": "Canada", "Country_CC": "Cocoseilanden", @@ -223,7 +223,7 @@ "Country_SZ": "Swaziland", "Country_TC": "Turks- en Caicoseilanden", "Country_TD": "Tsjaad", - "Country_TF": "Franse Zuidelijke Gebieden", + "Country_TF": "Franse Gebieden in de zuidelijke Indische Oceaan", "Country_TG": "Togo", "Country_TH": "Thailand", "Country_TJ": "Tadzjikistan", @@ -473,7 +473,7 @@ "Language_ta": "Tamil", "Language_te": "Telugu", "Language_tg": "Tadzjieks", - "Language_th": "Thais", + "Language_th": "Thai", "Language_ti": "Tigrinya", "Language_tk": "Turkmeens", "Language_tl": "Tagalog", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s seconden", "NSecondsShort": "%s s", + "NumberFormatCurrency": "¤ #,##0.00;¤ -#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dag", "OneMinute": "1 minuut", "OneMinuteShort": "1 min", "OriginalLanguageName": "Nederlands", - "PeriodDay": "Dag", + "PeriodDay": "dag", "PeriodDays": "dagen", - "PeriodMonth": "Maand", + "PeriodMonth": "maand", "PeriodMonths": "maanden", - "PeriodWeek": "Week", + "PeriodWeek": "week", "PeriodWeeks": "weken", - "PeriodYear": "Jaar", + "PeriodYear": "jaar", "PeriodYears": "jaar", "Seconds": "seconden", "Time_AM": "a.m.", diff --git a/plugins/Intl/lang/nn.json b/plugins/Intl/lang/nn.json index 860fdaf1d7b4f946fa9d6d0531c27582872f07f2..6f913f08ead4cd6a48989e76fdec6c850f28f57c 100644 --- a/plugins/Intl/lang/nn.json +++ b/plugins/Intl/lang/nn.json @@ -551,6 +551,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s s", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 d", "OneMinute": "1 min", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/pl.json b/plugins/Intl/lang/pl.json index f3b23056a5bd0df0ae5dd264d10d99892092dbe6..7183cd5cbcc994107fd7fe4865cc829d4d51707d 100644 --- a/plugins/Intl/lang/pl.json +++ b/plugins/Intl/lang/pl.json @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekundy", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dzieÅ„", "OneMinute": "1 minuta", "OneMinuteShort": "1 min", diff --git a/plugins/Intl/lang/pt-br.json b/plugins/Intl/lang/pt-br.json index 500ac319c5926e7b09233e31e45ad9a9fc6acdfe..4e934e942dea2888ba10afbed5f608a1ba6ae1c4 100644 --- a/plugins/Intl/lang/pt-br.json +++ b/plugins/Intl/lang/pt-br.json @@ -344,7 +344,7 @@ "Language_cr": "Cree", "Language_cs": "Tcheco", "Language_cu": "Eslavo eclesiástico", - "Language_cv": "Chuvash", + "Language_cv": "Tchuvache", "Language_cy": "Galês", "Language_da": "Dinamarquês", "Language_de": "Alemão", @@ -451,7 +451,7 @@ "Language_rn": "Rundi", "Language_ro": "Romeno", "Language_ru": "Russo", - "Language_rw": "Kinyarwanda", + "Language_rw": "Quiniaruanda", "Language_sa": "Sânscrito", "Language_sc": "Sardo", "Language_sd": "Sindi", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s segundos", "NSecondsShort": "%s s", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dia", "OneMinute": "1 minuto", "OneMinuteShort": "1 min", "OriginalLanguageName": "Português do Brasil", - "PeriodDay": "Dia", + "PeriodDay": "dia", "PeriodDays": "dias", - "PeriodMonth": "Mês", + "PeriodMonth": "mês", "PeriodMonths": "meses", - "PeriodWeek": "Semana", + "PeriodWeek": "semana", "PeriodWeeks": "semanas", - "PeriodYear": "Ano", + "PeriodYear": "ano", "PeriodYears": "anos", "Seconds": "segundos", "Time_AM": "AM", diff --git a/plugins/Intl/lang/pt.json b/plugins/Intl/lang/pt.json index 5dbf6f299a9ffd32deb55532db7ea2dd5a2623fb..bacafa576db44460eab38d80dde2575ec7530873 100644 --- a/plugins/Intl/lang/pt.json +++ b/plugins/Intl/lang/pt.json @@ -22,11 +22,11 @@ "Country_AT": "Ãustria", "Country_AU": "Austrália", "Country_AW": "Aruba", - "Country_AX": "Ilhas Ã…land", + "Country_AX": "Alanda", "Country_AZ": "Azerbaijão", "Country_BA": "Bósnia e Herzegovina", "Country_BB": "Barbados", - "Country_BD": "Bangladesh", + "Country_BD": "Bangladeche", "Country_BE": "Bélgica", "Country_BF": "Burquina Faso", "Country_BG": "Bulgária", @@ -39,14 +39,14 @@ "Country_BO": "BolÃvia", "Country_BQ": "PaÃses Baixos Caribenhos", "Country_BR": "Brasil", - "Country_BS": "Bahamas", + "Country_BS": "Baamas", "Country_BT": "Butão", "Country_BV": "Ilha Bouvet", "Country_BW": "Botsuana", "Country_BY": "Bielorrússia", "Country_BZ": "Belize", "Country_CA": "Canadá", - "Country_CC": "Ilhas Cocos (Keeling)", + "Country_CC": "Ilhas dos Cocos (Keeling)", "Country_CD": "Congo-Kinshasa", "Country_CF": "República Centro-Africana", "Country_CG": "Congo-Brazzaville", @@ -61,11 +61,11 @@ "Country_CU": "Cuba", "Country_CV": "Cabo Verde", "Country_CW": "Curaçau", - "Country_CX": "Ilha Christmas", + "Country_CX": "Ilha do Natal", "Country_CY": "Chipre", "Country_CZ": "República Checa", "Country_DE": "Alemanha", - "Country_DJ": "Djibuti", + "Country_DJ": "Jibuti", "Country_DK": "Dinamarca", "Country_DM": "DomÃnica", "Country_DO": "República Dominicana", @@ -127,7 +127,7 @@ "Country_KH": "Camboja", "Country_KI": "Quiribati", "Country_KM": "Comores", - "Country_KN": "São Cristóvão e Nevis", + "Country_KN": "São Cristóvão e Neves", "Country_KP": "Coreia do Norte", "Country_KR": "Coreia do Sul", "Country_KW": "Kuwait", @@ -136,8 +136,8 @@ "Country_LA": "Laos", "Country_LB": "LÃbano", "Country_LC": "Santa Lúcia", - "Country_LI": "Liechtenstein", - "Country_LK": "Sri Lanka", + "Country_LI": "Listenstaine", + "Country_LK": "Sri Lanca", "Country_LR": "Libéria", "Country_LS": "Lesoto", "Country_LT": "Lituânia", @@ -163,7 +163,7 @@ "Country_MT": "Malta", "Country_MU": "MaurÃcia", "Country_MV": "Maldivas", - "Country_MW": "Malawi", + "Country_MW": "Maláui", "Country_MX": "México", "Country_MY": "Malásia", "Country_MZ": "Moçambique", @@ -173,7 +173,7 @@ "Country_NF": "Ilha Norfolk", "Country_NG": "Nigéria", "Country_NI": "Nicarágua", - "Country_NL": "Holanda", + "Country_NL": "PaÃses Baixos", "Country_NO": "Noruega", "Country_NP": "Nepal", "Country_NR": "Nauru", @@ -187,8 +187,8 @@ "Country_PH": "Filipinas", "Country_PK": "Paquistão", "Country_PL": "Polónia", - "Country_PM": "Saint Pierre e Miquelon", - "Country_PN": "Pitcairn", + "Country_PM": "São Pedro e Miquelão", + "Country_PN": "Ilhas Pitcairn", "Country_PR": "Porto Rico", "Country_PS": "Territórios palestinianos", "Country_PT": "Portugal", @@ -211,17 +211,17 @@ "Country_SJ": "Svalbard e Jan Mayen", "Country_SK": "Eslováquia", "Country_SL": "Serra Leoa", - "Country_SM": "São Marino", + "Country_SM": "São Marinho", "Country_SN": "Senegal", "Country_SO": "Somália", "Country_SR": "Suriname", "Country_SS": "Sudão do Sul", "Country_ST": "São Tomé e PrÃncipe", - "Country_SV": "El Salvador", + "Country_SV": "Salvador", "Country_SX": "Sint Maarten", "Country_SY": "SÃria", "Country_SZ": "Suazilândia", - "Country_TC": "Ilhas Turks e Caicos", + "Country_TC": "Ilhas Turcas e Caicos", "Country_TD": "Chade", "Country_TF": "Territórios Franceses do Sul", "Country_TG": "Togo", @@ -239,10 +239,10 @@ "Country_TZ": "Tanzânia", "Country_UA": "Ucrânia", "Country_UG": "Uganda", - "Country_UM": "Ilhas Menores Distantes dos EUA", + "Country_UM": "Ilhas Menores Afastadas dos EUA", "Country_US": "Estados Unidos", "Country_UY": "Uruguai", - "Country_UZ": "Uzbequistão", + "Country_UZ": "Usbequistão", "Country_VA": "Cidade do Vaticano", "Country_VC": "São Vicente e Granadinas", "Country_VE": "Venezuela", @@ -285,20 +285,20 @@ "Day_Min_StandAlone_5": "Sex", "Day_Min_StandAlone_6": "Sáb", "Day_Min_StandAlone_7": "Dom", - "Day_Short_1": "Seg", - "Day_Short_2": "Ter", - "Day_Short_3": "Qua", - "Day_Short_4": "Qui", - "Day_Short_5": "Sex", - "Day_Short_6": "Sáb", - "Day_Short_7": "Dom", - "Day_Short_StandAlone_1": "Seg", - "Day_Short_StandAlone_2": "Ter", - "Day_Short_StandAlone_3": "Qua", - "Day_Short_StandAlone_4": "Qui", - "Day_Short_StandAlone_5": "Sex", - "Day_Short_StandAlone_6": "Sáb", - "Day_Short_StandAlone_7": "Dom", + "Day_Short_1": "Segunda", + "Day_Short_2": "Terça", + "Day_Short_3": "Quarta", + "Day_Short_4": "Quinta", + "Day_Short_5": "Sexta", + "Day_Short_6": "Sábado", + "Day_Short_7": "Domingo", + "Day_Short_StandAlone_1": "Segunda", + "Day_Short_StandAlone_2": "Terça", + "Day_Short_StandAlone_3": "Quarta", + "Day_Short_StandAlone_4": "Quinta", + "Day_Short_StandAlone_5": "Sexta", + "Day_Short_StandAlone_6": "Sábado", + "Day_Short_StandAlone_7": "Domingo", "EnglishLanguageName": "Portuguese", "Format_DateTime_Long": "EEEE, d 'de' MMMM 'de' y HH:mm:ss", "Format_DateTime_Short": "dd\/MM\/y HH:mm:ss", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s segundos", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dia", "OneMinute": "1 minuto", "OneMinuteShort": "1 min", "OriginalLanguageName": "Português", - "PeriodDay": "Dia", + "PeriodDay": "dia", "PeriodDays": "dias", - "PeriodMonth": "Mês", + "PeriodMonth": "mês", "PeriodMonths": "meses", - "PeriodWeek": "Semana", + "PeriodWeek": "semana", "PeriodWeeks": "semanas", - "PeriodYear": "Ano", + "PeriodYear": "ano", "PeriodYears": "anos", "Seconds": "segundos", "Time_AM": "da manhã", diff --git a/plugins/Intl/lang/ro.json b/plugins/Intl/lang/ro.json index bb805dd6564a80741c9016b127a2300528c722e1..2e8973de3017c8ed8b9c2477d1d01e9f4032db7c 100644 --- a/plugins/Intl/lang/ro.json +++ b/plugins/Intl/lang/ro.json @@ -165,12 +165,12 @@ "Country_MV": "Maldive", "Country_MW": "Malawi", "Country_MX": "Mexic", - "Country_MY": "Malaezia", + "Country_MY": "Malaysia", "Country_MZ": "Mozambic", "Country_NA": "Namibia", "Country_NC": "Noua Caledonie", "Country_NE": "Niger", - "Country_NF": "Insulele Norfolk", + "Country_NF": "Insula Norfolk", "Country_NG": "Nigeria", "Country_NI": "Nicaragua", "Country_NL": "Țările de Jos", @@ -214,7 +214,7 @@ "Country_SM": "San Marino", "Country_SN": "Senegal", "Country_SO": "Somalia", - "Country_SR": "Surinam", + "Country_SR": "Suriname", "Country_SS": "Sudanul de Sud", "Country_ST": "Sao Tome È™i Principe", "Country_SV": "El Salvador", @@ -244,7 +244,7 @@ "Country_UY": "Uruguay", "Country_UZ": "Uzbekistan", "Country_VA": "Statul Cetății Vaticanului", - "Country_VC": "Saint Vincent È™i Grenadine", + "Country_VC": "Saint Vincent È™i Grenadinele", "Country_VE": "Venezuela", "Country_VG": "Insulele Virgine Britanice", "Country_VI": "Insulele Virgine S.U.A.", @@ -271,13 +271,13 @@ "Day_Long_StandAlone_5": "Vineri", "Day_Long_StandAlone_6": "Sâmbătă", "Day_Long_StandAlone_7": "Duminică", - "Day_Min_1": "Lu", - "Day_Min_2": "Ma", - "Day_Min_3": "Mi", - "Day_Min_4": "Jo", - "Day_Min_5": "Vi", - "Day_Min_6": "Sâ", - "Day_Min_7": "Du", + "Day_Min_1": "Lu.", + "Day_Min_2": "Ma.", + "Day_Min_3": "Mi.", + "Day_Min_4": "Jo.", + "Day_Min_5": "Vi.", + "Day_Min_6": "Sâ.", + "Day_Min_7": "Du.", "Day_Min_StandAlone_1": "Lu", "Day_Min_StandAlone_2": "Ma", "Day_Min_StandAlone_3": "Mi", @@ -285,20 +285,20 @@ "Day_Min_StandAlone_5": "Vi", "Day_Min_StandAlone_6": "Sâ", "Day_Min_StandAlone_7": "Du", - "Day_Short_1": "Lun", - "Day_Short_2": "Mar", - "Day_Short_3": "Mie", + "Day_Short_1": "Lun.", + "Day_Short_2": "Mar.", + "Day_Short_3": "Mie.", "Day_Short_4": "Joi", - "Day_Short_5": "Vin", - "Day_Short_6": "Sâm", - "Day_Short_7": "Dum", - "Day_Short_StandAlone_1": "Lun", - "Day_Short_StandAlone_2": "Mar", - "Day_Short_StandAlone_3": "Mie", + "Day_Short_5": "Vin.", + "Day_Short_6": "Sâm.", + "Day_Short_7": "Dum.", + "Day_Short_StandAlone_1": "Lun.", + "Day_Short_StandAlone_2": "Mar.", + "Day_Short_StandAlone_3": "Mie.", "Day_Short_StandAlone_4": "Joi", - "Day_Short_StandAlone_5": "Vin", - "Day_Short_StandAlone_6": "Sâm", - "Day_Short_StandAlone_7": "Dum", + "Day_Short_StandAlone_5": "Vin.", + "Day_Short_StandAlone_6": "Sâm.", + "Day_Short_StandAlone_7": "Dum.", "EnglishLanguageName": "Romanian", "Format_DateTime_Long": "EEEE, d MMMM y HH:mm:ss", "Format_DateTime_Short": "d MMM y HH:mm:ss", @@ -430,7 +430,7 @@ "Language_nd": "Ndebele de nord", "Language_ne": "Nepaleză", "Language_ng": "Ndonga", - "Language_nl": "Olandeză", + "Language_nl": "Neerlandeză", "Language_nn": "Norvegiană nynorsk", "Language_no": "Norvegiană", "Language_nr": "Ndebele de sud", @@ -555,6 +555,14 @@ "NMinutesShort": "%s min.", "NSeconds": "%s de secunde", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 zi", "OneMinute": "1 minut", "OneMinuteShort": "1 min.", diff --git a/plugins/Intl/lang/ru.json b/plugins/Intl/lang/ru.json index d6247dba3705a50f543f10e7e1ffa5f2f48956a6..b26d8829715701463e1ed4282bc85ffb2ab74ac1 100644 --- a/plugins/Intl/lang/ru.json +++ b/plugins/Intl/lang/ru.json @@ -102,7 +102,7 @@ "Country_GU": "Гуам", "Country_GW": "ГвинеÑ-БиÑау", "Country_GY": "Гайана", - "Country_HK": "Гонконг (оÑобый район)", + "Country_HK": "Гонконг (Ñпециальный админиÑтративный район)", "Country_HM": "О-ва Херд и Макдональд", "Country_HN": "ГондураÑ", "Country_HR": "ХорватиÑ", @@ -155,7 +155,7 @@ "Country_ML": "Мали", "Country_MM": "МьÑнма (Бирма)", "Country_MN": "МонголиÑ", - "Country_MO": "Макао (оÑобый район)", + "Country_MO": "Макао (Ñпециальный админиÑтративный район)", "Country_MP": "Северные МарианÑкие о-ва", "Country_MQ": "Мартиника", "Country_MR": "МавританиÑ", @@ -188,7 +188,7 @@ "Country_PK": "ПакиÑтан", "Country_PL": "Польша", "Country_PM": "Сен-Пьер и Микелон", - "Country_PN": "Питкерн", + "Country_PN": "ОÑтрова ПиткÑрн", "Country_PR": "ПуÑрто-Рико", "Country_PS": "ПалеÑтинÑкие территории", "Country_PT": "ПортугалиÑ", @@ -311,8 +311,8 @@ "Format_Interval_Short_D": "d–d MMM y 'г'.", "Format_Interval_Short_M": "d MMM – d MMM y 'г'.", "Format_Interval_Short_Y": "d MMM y – d MMM y 'г'.", - "Format_Month_Long": "LLLL y", - "Format_Month_Short": "LLL y", + "Format_Month_Long": "LLLL y 'г'.", + "Format_Month_Short": "LLL y 'г'.", "Format_Time": "H:mm:ss", "Format_Year": "y", "Hours": "чаÑÑ‹", @@ -430,7 +430,7 @@ "Language_nd": "Северный ндебели", "Language_ne": "ÐепальÑкий", "Language_ng": "Ðдонга", - "Language_nl": "ГолландÑкий", + "Language_nl": "ÐидерландÑкий", "Language_nn": "ÐорвежÑкий нюнорÑк", "Language_no": "ÐорвежÑкий", "Language_nr": "Ðдебели южный", @@ -530,11 +530,11 @@ "Month_Short_11": "ÐоÑб.", "Month_Short_12": "Дек.", "Month_Short_2": "Февр.", - "Month_Short_3": "Марта", + "Month_Short_3": "Мар.", "Month_Short_4": "Ðпр.", "Month_Short_5": "МаÑ", - "Month_Short_6": "ИюнÑ", - "Month_Short_7": "ИюлÑ", + "Month_Short_6": "Июн.", + "Month_Short_7": "Июл.", "Month_Short_8": "Ðвг.", "Month_Short_9": "Сент.", "Month_Short_StandAlone_1": "Янв.", @@ -555,21 +555,29 @@ "NMinutesShort": "%s мин", "NSeconds": "%s Ñекунды", "NSecondsShort": "%s Ñ", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 день", "OneMinute": "1 минута", "OneMinuteShort": "1 мин", "OriginalLanguageName": "РуÑÑкий", - "PeriodDay": "День", + "PeriodDay": "день", "PeriodDays": "дни", - "PeriodMonth": "МеÑÑц", + "PeriodMonth": "меÑÑц", "PeriodMonths": "меÑÑцы", - "PeriodWeek": "ÐеделÑ", + "PeriodWeek": "неделÑ", "PeriodWeeks": "недели", - "PeriodYear": "Год", + "PeriodYear": "год", "PeriodYears": "годы", "Seconds": "Ñекунды", - "Time_AM": "AM", - "Time_PM": "PM", + "Time_AM": "ДП", + "Time_PM": "ПП", "Today": "СегоднÑ", "Year_Short": "г.", "Yesterday": "Вчера" diff --git a/plugins/Intl/lang/sk.json b/plugins/Intl/lang/sk.json index 7d8482f6fe0ae6fd7b9291405da69a1a4612e217..d926c8f1bd6874b7c2f297504ff04a28a2d7f68b 100644 --- a/plugins/Intl/lang/sk.json +++ b/plugins/Intl/lang/sk.json @@ -302,17 +302,17 @@ "EnglishLanguageName": "Slovak", "Format_DateTime_Long": "EEEE, d. MMMM y H:mm:ss", "Format_DateTime_Short": "d. M. y H:mm:ss", - "Format_Date_Day_Month": "E, d. M.", + "Format_Date_Day_Month": "E d. M.", "Format_Date_Long": "EEEE, d. MMMM y", "Format_Date_Short": "d. M. y", - "Format_Interval_Long_D": "d. – d. MMMM y", - "Format_Interval_Long_M": "y MMMM d – MMMM d", - "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y", - "Format_Interval_Short_D": "d. – d. MMM y", - "Format_Interval_Short_M": "y MMM d – MMM d", - "Format_Interval_Short_Y": "d. MMM y – d. MMM y", + "Format_Interval_Long_D": "d. – d. M. y", + "Format_Interval_Long_M": "d. M. – d. M. y", + "Format_Interval_Long_Y": "d. M. y – d. M. y", + "Format_Interval_Short_D": "d. – d. M. y", + "Format_Interval_Short_M": "d. M. – d. M. y", + "Format_Interval_Short_Y": "d. M. y – d. M. y", "Format_Month_Long": "LLLL y", - "Format_Month_Short": "LLLL y", + "Format_Month_Short": "M\/y", "Format_Time": "H:mm:ss", "Format_Year": "y", "Hours": "hodiny", @@ -350,7 +350,7 @@ "Language_de": "NemÄina", "Language_dv": "Divehi", "Language_dz": "Dzongkä", - "Language_ee": "Ewe", + "Language_ee": "EweÅ¡tina", "Language_el": "GréÄtina", "Language_en": "AngliÄtina", "Language_eo": "Esperanto", @@ -367,7 +367,7 @@ "Language_ga": "ÃrÄina", "Language_gd": "Å kótska gaelÄina", "Language_gl": "GalÃcijÄina", - "Language_gn": "GuaranÃ", + "Language_gn": "GuaranÃjÄina", "Language_gu": "GudžarátÄina", "Language_gv": "ManÄina", "Language_ha": "HauÅ¡tina", @@ -413,7 +413,7 @@ "Language_ln": "LingalÄina", "Language_lo": "LaoÅ¡tina", "Language_lt": "LitovÄina", - "Language_lu": "Luba-katanga", + "Language_lu": "LubÄina (katanžská)", "Language_lv": "LotyÅ¡tina", "Language_mg": "MalgaÅ¡tina", "Language_mh": "Kajin-majol", @@ -426,12 +426,12 @@ "Language_mt": "MaltÄina", "Language_my": "BarmÄina", "Language_na": "Nauru", - "Language_nb": "Nórsky bokmÃ¥l", + "Language_nb": "NórÄina (bokmÃ¥l)", "Language_nd": "Severné ndebele", "Language_ne": "NepálÄina", "Language_ng": "Ndonga", "Language_nl": "HolandÄina", - "Language_nn": "Nórsky nynorsk", + "Language_nn": "NórÄina (nynorsk)", "Language_no": "NórÄina", "Language_nr": "Južná ndebelÄina", "Language_nv": "Navajo", @@ -455,7 +455,7 @@ "Language_sa": "Sanskrit", "Language_sc": "SardÃnÄina", "Language_sd": "SindhÄina", - "Language_se": "Severné sami", + "Language_se": "LaponÄina (severná)", "Language_sg": "Sango", "Language_si": "SinhalÄina", "Language_sk": "SlovenÄina", @@ -492,8 +492,8 @@ "Language_vi": "VietnamÄina", "Language_vo": "Volapük", "Language_wa": "ValónÄina", - "Language_wo": "Wolof", - "Language_xh": "Xhosa", + "Language_wo": "WolofÄina", + "Language_xh": "XhoÅ¡tina", "Language_yi": "JidiÅ¡", "Language_yo": "JorubÄina", "Language_za": "ÄŒuangÄina", @@ -555,6 +555,14 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekúnd", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 deň", "OneMinute": "1 minúta", "OneMinuteShort": "1 min", @@ -568,8 +576,8 @@ "PeriodYear": "rok", "PeriodYears": "roky", "Seconds": "sekundy", - "Time_AM": "dopoludnia", - "Time_PM": "odpoludnia", + "Time_AM": "AM", + "Time_PM": "PM", "Today": "Dnes", "Year_Short": "r.", "Yesterday": "VÄera" diff --git a/plugins/Intl/lang/sl.json b/plugins/Intl/lang/sl.json index 8b418062b6a0cc276a6c590f162ae450da820366..054f53ca8b1c4302a05f40621c596a30aff08eda 100644 --- a/plugins/Intl/lang/sl.json +++ b/plugins/Intl/lang/sl.json @@ -306,11 +306,11 @@ "Format_Date_Long": "EEEE, dd. MMMM y", "Format_Date_Short": "d. MMM y", "Format_Interval_Long_D": "d.–d. MMMM y", - "Format_Interval_Long_M": "d. MMMM – d. MMMM y", - "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y", + "Format_Interval_Long_M": "d. MMMM–d. MMMM y", + "Format_Interval_Long_Y": "d. MMMM y–d. MMMM y", "Format_Interval_Short_D": "d.–d. MMM y", - "Format_Interval_Short_M": "d. MMM – d. MMM y", - "Format_Interval_Short_Y": "d. MMM y – d. MMM y", + "Format_Interval_Short_M": "d. MMM–d. MMM y", + "Format_Interval_Short_Y": "d. MMM y–d. MMM y", "Format_Month_Long": "MMMM y", "Format_Month_Short": "MMM y", "Format_Time": "HH:mm:ss", @@ -492,7 +492,7 @@ "Language_vo": "Volapuk", "Language_wa": "ValonÅ¡Äina", "Language_wo": "VolofÅ¡Äina", - "Language_xh": "Xhosa", + "Language_xh": "KoÅ¡Äina", "Language_yi": "JidiÅ¡", "Language_yo": "JorubÅ¡Äina", "Language_zh": "KitajÅ¡Äina", @@ -553,17 +553,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekund", "NSecondsShort": "%s s", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dan", "OneMinute": "1 minuta", "OneMinuteShort": "1 min", "OriginalLanguageName": "SlovenÅ¡Äina", "PeriodDay": "Dan", "PeriodDays": "dni", - "PeriodMonth": "Mesec", + "PeriodMonth": "mesec", "PeriodMonths": "mesecev", - "PeriodWeek": "Teden", + "PeriodWeek": "teden", "PeriodWeeks": "tednov", - "PeriodYear": "Leto", + "PeriodYear": "leto", "PeriodYears": "let", "Seconds": "sekund", "Time_AM": "dop.", diff --git a/plugins/Intl/lang/sq.json b/plugins/Intl/lang/sq.json index 80de7ed92a1eab2e054ec2bc9e0df3aa0ee4d151..ee9aa0eae3a14bc4b9213192faeb193563eabc65 100644 --- a/plugins/Intl/lang/sq.json +++ b/plugins/Intl/lang/sq.json @@ -28,12 +28,12 @@ "Country_BB": "Barbados", "Country_BD": "Bangladesh", "Country_BE": "Belgjikë", - "Country_BF": "Burkina Faso", + "Country_BF": "Burkina-Faso", "Country_BG": "Bullgari", "Country_BH": "Bahrein", "Country_BI": "Burund", "Country_BJ": "Benin", - "Country_BL": "Shën Bartolemeo", + "Country_BL": "Shën-Bartolemeo", "Country_BM": "Bermudë", "Country_BN": "Brunej", "Country_BO": "Bolivi", @@ -41,12 +41,12 @@ "Country_BR": "Brazil", "Country_BS": "Bahamas", "Country_BT": "Butan", - "Country_BV": "Ishujt Bove", - "Country_BW": "Botsvanë", + "Country_BV": "Ishujt Bove’", + "Country_BW": "Botsuanë", "Country_BY": "Bjellorusi", "Country_BZ": "Belizë", "Country_CA": "Kanada", - "Country_CC": "Ishujt Kokos", + "Country_CC": "Ishujt Kokosë", "Country_CD": "Kongo-Kinshasa", "Country_CF": "Republika Afrikano-Qendrore", "Country_CG": "Kongo-Brazavilë", @@ -57,7 +57,7 @@ "Country_CM": "Kamerun", "Country_CN": "Kinë", "Country_CO": "Kolumbi", - "Country_CR": "Kosta Rikë", + "Country_CR": "Kosta-Rikë", "Country_CU": "Kubë", "Country_CV": "Kepi i Gjelbër", "Country_CW": "Kuraçao", @@ -97,13 +97,13 @@ "Country_GP": "Guadalupe", "Country_GQ": "Guineja Ekuatoriale", "Country_GR": "Greqi", - "Country_GS": "Xhorxha Jugore dhe Ishujt Senduiç të Jugut", + "Country_GS": "Xhorxha Jugore dhe Ishujt Senduiçë të Jugut", "Country_GT": "Guatemalë", "Country_GU": "Guam", "Country_GW": "Guine-Bisau", "Country_GY": "Guajanë", "Country_HK": "RVAK i Hong Kongut", - "Country_HM": "Ishulli Hërd dhe Ishujt Mekdonald", + "Country_HM": "Ishulli Hërd dhe Ishujt Mekdonaldë", "Country_HN": "Honduras", "Country_HR": "Kroaci", "Country_HT": "Haiti", @@ -127,7 +127,7 @@ "Country_KH": "Kamboxhia", "Country_KI": "Qiribati", "Country_KM": "Komore", - "Country_KN": "Shën Kits e Nevis", + "Country_KN": "Shën-Kits dhe Nevis", "Country_KP": "Koreja e Veriut", "Country_KR": "Koreja e Jugut", "Country_KW": "Kuvajt", @@ -135,9 +135,9 @@ "Country_KZ": "Kazakistan", "Country_LA": "Laos", "Country_LB": "Liban", - "Country_LC": "Shën Luçia", + "Country_LC": "Shën-Luçia", "Country_LI": "Lihtënshtajn", - "Country_LK": "Sri Lankë", + "Country_LK": "Sri-Lankë", "Country_LR": "Liberi", "Country_LS": "Lesoto", "Country_LT": "Lituani", @@ -148,7 +148,7 @@ "Country_MC": "Monako", "Country_MD": "Moldavi", "Country_ME": "Mali i Zi", - "Country_MF": "Shën Martin", + "Country_MF": "Shën-Martin", "Country_MG": "Madagaskar", "Country_MH": "Ishujt Marshallë", "Country_MK": "Maqedoni", @@ -170,7 +170,7 @@ "Country_NA": "Namibi", "Country_NC": "Kaledonia e Re", "Country_NE": "Niger", - "Country_NF": "Ishujt Norfolkë", + "Country_NF": "Ishulli Norfolk", "Country_NG": "Nigeri", "Country_NI": "Nikaragua", "Country_NL": "Holandë", @@ -187,9 +187,9 @@ "Country_PH": "Filipine", "Country_PK": "Pakistan", "Country_PL": "Poloni", - "Country_PM": "Shën Peir dhe Mikuelon", + "Country_PM": "Shën-Peir dhe Mikuelon", "Country_PN": "Ishujt Pitkernë", - "Country_PR": "Porto Riko", + "Country_PR": "Porto-Riko", "Country_PS": "Territoret Palestineze", "Country_PT": "Portugali", "Country_PW": "Palau", @@ -206,21 +206,21 @@ "Country_SD": "Sudan", "Country_SE": "Suedi", "Country_SG": "Singapor", - "Country_SH": "Shën Helena", + "Country_SH": "Shën-Helena", "Country_SI": "Slloveni", - "Country_SJ": "Svalbard e Zhan Majen", + "Country_SJ": "Svalbard e Zhan-Majen", "Country_SK": "Sllovaki", - "Country_SL": "Siera Leone", - "Country_SM": "San Marino", + "Country_SL": "Siera-Leone", + "Country_SM": "San-Marino", "Country_SN": "Senegali", "Country_SO": "Somali", "Country_SR": "Surinami", "Country_SS": "Sudani i Jugut", - "Country_ST": "Sao Tome e Prinsipe", + "Country_ST": "Sao-Tome e Prinsipe", "Country_SV": "El Salvador", - "Country_SX": "Shën Martin (Sint Maarten-pjesa e Mbretërisë së Holandës)", + "Country_SX": "Shën-Martin (Sint Maarten - pjesa e Mbretërisë së Holandës)", "Country_SY": "Siri", - "Country_SZ": "Svazilandë", + "Country_SZ": "Suazilandë", "Country_TC": "Ishujt Turke dhe Kaike", "Country_TD": "Çad", "Country_TF": "Territoret Australiane Franceze", @@ -244,7 +244,7 @@ "Country_UY": "Uruguai", "Country_UZ": "Uzbekistan", "Country_VA": "Vatikan", - "Country_VC": "Shën Vinsent dhe Grenadinet", + "Country_VC": "Shën-Vinsent dhe Grenadinet", "Country_VE": "Venezuelë", "Country_VG": "Ishujt e Virgjër Britanikë", "Country_VI": "Ishujt e Virgjër Amerikanë", @@ -300,8 +300,8 @@ "Day_Short_StandAlone_6": "Sht", "Day_Short_StandAlone_7": "Die", "EnglishLanguageName": "Albanian", - "Format_DateTime_Long": "EEEE, d MMMM y HH:mm:ss", - "Format_DateTime_Short": "d MMM y HH:mm:ss", + "Format_DateTime_Long": "EEEE, d MMMM y h:mm:ss a", + "Format_DateTime_Short": "d MMM y h:mm:ss a", "Format_Date_Day_Month": "E, d MMM", "Format_Date_Long": "EEEE, d MMMM y", "Format_Date_Short": "d MMM y", @@ -313,31 +313,33 @@ "Format_Interval_Short_Y": "d MMM y – d MMM y", "Format_Month_Long": "MMMM y", "Format_Month_Short": "MMM y", - "Format_Time": "HH:mm:ss", + "Format_Time": "h:mm:ss a", "Format_Year": "y", "Hours": "orë", "Language_ab": "Abkazisht", "Language_af": "Afrikanisht", "Language_ak": "Akanisht", - "Language_am": "Amarike", + "Language_am": "Amarikisht", "Language_ar": "Arabisht", "Language_as": "Asamezisht", - "Language_az": "Azere", + "Language_az": "Azerbajxhanisht", "Language_ba": "Bashkirisht", "Language_be": "Bjellorusisht", "Language_bg": "Bullgarisht", - "Language_bm": "Bambara", + "Language_bm": "Bambarisht", "Language_bn": "Bengalisht", "Language_bo": "Tibetisht", - "Language_br": "Bretone", + "Language_br": "Bretonisht", "Language_bs": "Boshnjakisht", "Language_ca": "Katalonisht", + "Language_ce": "Çeçenisht", "Language_co": "Korsikanisht", "Language_cs": "Çekisht", + "Language_cv": "Çuvashisht", "Language_cy": "Uellsisht", "Language_da": "Danisht", "Language_de": "Gjermanisht", - "Language_dz": "Xongka", + "Language_dz": "Xhongaisht", "Language_ee": "Juisht", "Language_el": "Greqisht", "Language_en": "Anglisht", @@ -347,40 +349,40 @@ "Language_eu": "Baskisht", "Language_fa": "Persisht", "Language_fi": "Finlandisht", - "Language_fj": "Fixhiane", + "Language_fj": "Fixhianisht", "Language_fo": "Faroisht", "Language_fr": "Frëngjisht", "Language_fy": "Frizianisht", - "Language_ga": "Irlandezçe", + "Language_ga": "Irlandisht", "Language_gl": "Galike", "Language_gn": "Guaranisht", "Language_gu": "Guxharatisht", - "Language_gv": "Mankse", + "Language_gv": "Manksisht", "Language_ha": "Hausisht", "Language_he": "Hebraisht", - "Language_hi": "Indishte", + "Language_hi": "Indisht", "Language_hr": "Kroatisht", - "Language_ht": "Haitiançe", + "Language_ht": "Haitianisht", "Language_hu": "Hungarisht", "Language_hy": "Armenisht", "Language_id": "Indonezisht", - "Language_ig": "Igbe", + "Language_ig": "Igboisht", "Language_ii": "Sishuanisht", "Language_is": "Islandisht", "Language_it": "Italisht", - "Language_iu": "Inuktitut", + "Language_iu": "Inuktitutisht", "Language_ja": "Japonisht", "Language_jv": "Javanisht", "Language_ka": "Gjeorgjisht", "Language_ki": "Kikujuisht", "Language_kk": "Kazakisht", - "Language_kl": "Kalalisute", + "Language_kl": "Kalalisutisht", "Language_km": "Kmere", "Language_kn": "Kanade", "Language_ko": "Koreanisht", "Language_ks": "Kashmire", "Language_ku": "Kurde", - "Language_kw": "Kornisht", + "Language_kw": "Kornishisht", "Language_ky": "Kirgizisht", "Language_la": "Latinisht", "Language_lb": "Luksemburgase", @@ -388,12 +390,12 @@ "Language_ln": "Lingalisht", "Language_lo": "Laosisht", "Language_lt": "Lituanisht", - "Language_lu": "Lubakatange", + "Language_lu": "Lubakatangisht", "Language_lv": "Letonisht", - "Language_mg": "Malageze", + "Language_mg": "Malagezisht", "Language_mi": "Maorisht", "Language_mk": "Maqedonisht", - "Language_ml": "Malajalame", + "Language_ml": "Malajalamisht", "Language_mn": "Mongolisht", "Language_mr": "Maratisht", "Language_ms": "Malajisht", @@ -405,22 +407,22 @@ "Language_nl": "Holandisht", "Language_nn": "Ninorske norvegjeze", "Language_om": "Oromoisht", - "Language_or": "Orije", - "Language_pa": "Panxhabe", + "Language_or": "Orijaisht", + "Language_pa": "Panxhabisht", "Language_pl": "Polonisht", - "Language_ps": "Pashto", + "Language_ps": "Pashtoisht", "Language_pt": "Portugalisht", - "Language_qu": "Keçua", + "Language_qu": "Keçuaisht", "Language_rm": "Rome", "Language_rn": "Rundisht", "Language_ro": "Rumanisht", "Language_ru": "Rusisht", "Language_rw": "Kiniaruandisht", "Language_sa": "Sanskritisht", - "Language_sd": "Sindi", + "Language_sd": "Sindisht", "Language_se": "Samishte veriore", "Language_sg": "Sangoisht", - "Language_si": "Sinhale", + "Language_si": "Sinhalisht", "Language_sk": "Sllovakisht", "Language_sl": "Sllovenisht", "Language_sn": "Shonisht", @@ -445,10 +447,10 @@ "Language_uz": "Uzbeke", "Language_vi": "Vietnamisht", "Language_wo": "Ulufisht", - "Language_xh": "Xhose", + "Language_xh": "Xhozaisht", "Language_yo": "Jorubisht", "Language_zh": "Kinezisht", - "Language_zu": "Zulu", + "Language_zu": "Zuluisht", "LayoutDirection": "ltr", "Minutes": "minuta", "Month_Long_1": "Janar", @@ -505,6 +507,14 @@ "NMinutesShort": "%s min.", "NSeconds": "%s sekonda", "NSecondsShort": "%s sek.", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ditë", "OneMinute": "1 minutë", "OneMinuteShort": "1 min.", @@ -518,8 +528,8 @@ "PeriodYear": "vit", "PeriodYears": "vjet", "Seconds": "sekonda", - "Time_AM": "paradite", - "Time_PM": "pasdite", + "Time_AM": "e paradites", + "Time_PM": "e pasdites", "Today": "Sot", "Year_Short": "vit", "Yesterday": "Dje" diff --git a/plugins/Intl/lang/sr.json b/plugins/Intl/lang/sr.json index ee7ccab1c6d45a9e8adf05e6d5ecdfd017f4bb0a..003e91483c3337e4cbdcba7feea1787d03a06062 100644 --- a/plugins/Intl/lang/sr.json +++ b/plugins/Intl/lang/sr.json @@ -46,7 +46,7 @@ "Country_BY": "БелоруÑија", "Country_BZ": "Белизе", "Country_CA": "Канада", - "Country_CC": "ÐšÐ¾ÐºÐ¾Ñ (Келинг) ОÑтрва", + "Country_CC": "КокоÑова (Килингова) ОÑтрва", "Country_CD": "Конго - КиншаÑа", "Country_CF": "Централноафричка Република", "Country_CG": "Конго - Бразавил", @@ -102,7 +102,7 @@ "Country_GU": "Гуам", "Country_GW": "Гвинеја-БиÑао", "Country_GY": "Гвајана", - "Country_HK": "Хонг Конг С. Ð. Ð . Кина", + "Country_HK": "СÐРХонгконг (Кина)", "Country_HM": "ОÑтрва Херд и Мекдоналд", "Country_HN": "ХондураÑ", "Country_HR": "ХрватÑка", @@ -170,7 +170,7 @@ "Country_NA": "Ðамибија", "Country_NC": "Ðова Каледонија", "Country_NE": "Ðигер", - "Country_NF": "Ðорфолк ОÑтрво", + "Country_NF": "ОÑтрво Ðорфок", "Country_NG": "Ðигерија", "Country_NI": "Ðикарагва", "Country_NL": "Холандија", @@ -369,13 +369,13 @@ "Language_gl": "ГалицијÑки", "Language_gn": "Гварани", "Language_gu": "Гуџарати", - "Language_gv": "МанкÑ", + "Language_gv": "МанÑки", "Language_ha": "ХауÑа", "Language_he": "ХебрејÑки", "Language_hi": "Хинди", "Language_ho": "Хири Моту", "Language_hr": "ХрватÑки", - "Language_ht": "ХаитÑки", + "Language_ht": "ХаићанÑки", "Language_hu": "МађарÑки", "Language_hy": "ЈерменÑки", "Language_hz": "Хереро", @@ -467,12 +467,12 @@ "Language_sr": "СрпÑки", "Language_ss": "Свати", "Language_st": "СеÑото", - "Language_su": "СуданÑки", + "Language_su": "СунданÑки", "Language_sv": "ШведÑки", "Language_sw": "Свахили", "Language_ta": "ТамилÑки", "Language_te": "Телугу", - "Language_tg": "Тађик", + "Language_tg": "Таџички", "Language_th": "ТајландÑки", "Language_ti": "Тигриња", "Language_tk": "ТуркменÑки", @@ -555,6 +555,14 @@ "NMinutesShort": "%s мин", "NSeconds": "%s Ñекунди", "NSecondsShort": "%s Ñек", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 дан", "OneMinute": "1 минут", "OneMinuteShort": "1 мин", diff --git a/plugins/Intl/lang/sv.json b/plugins/Intl/lang/sv.json index 393557236327badad36af63f87bd412edc187f53..c829d8841880b1608f28514530ffe331176b22b4 100644 --- a/plugins/Intl/lang/sv.json +++ b/plugins/Intl/lang/sv.json @@ -102,7 +102,7 @@ "Country_GU": "Guam", "Country_GW": "Guinea-Bissau", "Country_GY": "Guyana", - "Country_HK": "Hongkong (S.A.R. Kina)", + "Country_HK": "Hongkong, S.A.R. Kina", "Country_HM": "Heardön och McDonaldöarna", "Country_HN": "Honduras", "Country_HR": "Kroatien", @@ -155,7 +155,7 @@ "Country_ML": "Mali", "Country_MM": "Myanmar (Burma)", "Country_MN": "Mongoliet", - "Country_MO": "Macao (S.A.R. Kina)", + "Country_MO": "Macao, S.A.R. Kina", "Country_MP": "Nordmarianerna", "Country_MQ": "Martinique", "Country_MR": "Mauretanien", @@ -295,7 +295,7 @@ "Day_Short_StandAlone_1": "MÃ¥n", "Day_Short_StandAlone_2": "Tis", "Day_Short_StandAlone_3": "Ons", - "Day_Short_StandAlone_4": "Tor", + "Day_Short_StandAlone_4": "Tors", "Day_Short_StandAlone_5": "Fre", "Day_Short_StandAlone_6": "Lör", "Day_Short_StandAlone_7": "Sön", @@ -555,17 +555,25 @@ "NMinutesShort": "%s min", "NSeconds": "%s sekunder", "NSecondsShort": "%ss", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0 %", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "−", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 dygn", "OneMinute": "1 minut", "OneMinuteShort": "1 min", "OriginalLanguageName": "Svenska", - "PeriodDay": "Dag", + "PeriodDay": "dag", "PeriodDays": "dygn", - "PeriodMonth": "MÃ¥nad", + "PeriodMonth": "mÃ¥nad", "PeriodMonths": "mÃ¥nader", - "PeriodWeek": "Vecka", + "PeriodWeek": "vecka", "PeriodWeeks": "veckor", - "PeriodYear": "Ã…r", + "PeriodYear": "Ã¥r", "PeriodYears": "Ã¥r", "Seconds": "sekunder", "Time_AM": "fm", diff --git a/plugins/Intl/lang/ta.json b/plugins/Intl/lang/ta.json index 5db28a36aad042882df4d7b25c955e0adc93fcad..43708c2ba90f5fc7b23adf26cec4d1628d73950a 100644 --- a/plugins/Intl/lang/ta.json +++ b/plugins/Intl/lang/ta.json @@ -14,7 +14,7 @@ "Country_AG": "ஆணà¯à®Ÿà®¿à®•à¯à®µà®¾ மறà¯à®±à¯à®®à¯ பாரà¯à®ªà¯à®Ÿà®¾", "Country_AI": "à®…à®™à¯à®•à¯à®¯à¯à®²à®¾", "Country_AL": "அலà¯à®ªà¯‡à®©à®¿à®¯à®¾", - "Country_AM": "ஆரà¯à®®à¯‡à®©à®¿à®¯à®¾", + "Country_AM": "à®…à®°à¯à®®à¯‡à®©à®¿à®¯à®¾", "Country_AO": "à®…à®™à¯à®•à¯‹à®²à®¾", "Country_AQ": "அணà¯à®Ÿà®¾à®°à¯à®Ÿà®¿à®•à®¾", "Country_AR": "à®…à®°à¯à®œà¯†à®©à¯à®Ÿà®¿à®©à®¾", @@ -24,7 +24,7 @@ "Country_AW": "அரூபா", "Country_AX": "ஆலநà¯à®¤à¯ தீவà¯à®•à®³à¯", "Country_AZ": "அசரà¯à®ªà¯ˆà®œà®¾à®©à¯", - "Country_BA": "போஸà¯à®©à®¿à®¯à®¾ மறà¯à®±à¯à®®à¯ ஹெரà¯à®¸à®¿à®•à¯‹à®µà®¿à®©à®¾", + "Country_BA": "போஸà¯à®©à®¿à®¯à®¾ & ஹெரà¯à®¸à®•à¯‹à®µà®¿à®©à®¾", "Country_BB": "பாரà¯à®ªà®Ÿà¯‹à®¸à¯", "Country_BD": "பஙà¯à®•à®³à®¾à®¤à¯‡à®·à¯", "Country_BE": "பெலà¯à®œà®¿à®¯à®®à¯", @@ -95,18 +95,18 @@ "Country_GM": "காமà¯à®ªà®¿à®¯à®¾", "Country_GN": "கினியா", "Country_GP": "கà¯à®µà®¾à®¤à¯‡à®²à¯‹à®ªà¯", - "Country_GQ": "ஈகà¯à®•à¯à®µà®¾à®Ÿà¯‹à®°à®¿à®¯à®²à¯ கினியா", + "Country_GQ": "ஈகà¯à®µà®Ÿà¯‹à®°à®¿à®¯à®²à¯ கினியா", "Country_GR": "கிரீஸà¯", "Country_GS": "தென௠ஜியாரà¯à®œà®¿à®¯à®¾ மறà¯à®±à¯à®®à¯ தென௠சானà¯à®Ÿà¯à®µà®¿à®šà¯ தீவà¯à®•à®³à¯", "Country_GT": "கவà¯à®¤à®®à®¾à®²à®¾", "Country_GU": "கà¯à®µà®¾à®®à¯", - "Country_GW": "கினி-பிஸà¯à®¸à®¾à®µà¯", + "Country_GW": "கினியா-பிஸà¯à®¸à®¾à®µà¯", "Country_GY": "கயானா", "Country_HK": "ஹாஙà¯à®•à®¾à®™à¯ எஸà¯à®à®†à®°à¯ சீனா", "Country_HM": "ஹேரà¯à®Ÿà¯ மறà¯à®±à¯à®®à¯ மெகà¯à®Ÿà¯Šà®©à®¾à®²à¯à®Ÿà¯ தீவà¯à®•à®³à¯", "Country_HN": "ஹோணà¯à®Ÿà¯‚ராஸà¯", - "Country_HR": "கà¯à®°à¯‹à®šà®¿à®¯à®¾", - "Country_HT": "ஹெயà¯à®¤à®¿", + "Country_HR": "கà¯à®°à¯‡à®·à®¿à®¯à®¾", + "Country_HT": "ஹைடà¯à®Ÿà®¿", "Country_HU": "ஹஙà¯à®•à¯‡à®°à®¿", "Country_ID": "இநà¯à®¤à¯‹à®©à¯‡à®·à®¿à®¯à®¾", "Country_IE": "அயரà¯à®²à®¾à®¨à¯à®¤à¯", @@ -127,11 +127,11 @@ "Country_KH": "கமà¯à®ªà¯‹à®Ÿà®¿à®¯à®¾", "Country_KI": "கிரிபடி", "Country_KM": "கோமரோஸà¯", - "Country_KN": "செயினà¯à®Ÿà¯ கிடà¯à®¸à¯ மறà¯à®±à¯à®®à¯ நெவிஸà¯", + "Country_KN": "செயினà¯à®Ÿà¯ கிடà¯à®¸à¯ & நெவிஸà¯", "Country_KP": "வட கொரியா", "Country_KR": "தென௠கொரியா", "Country_KW": "கà¯à®µà¯ˆà®¤à¯", - "Country_KY": "கேமென௠தீவà¯à®•à®³à¯", + "Country_KY": "கெயà¯à®®à¯†à®©à¯ தீவà¯à®•à®³à¯", "Country_KZ": "கஸகஸà¯à®¤à®¾à®©à¯", "Country_LA": "லாவோஸà¯", "Country_LB": "லெபனானà¯", @@ -155,22 +155,22 @@ "Country_ML": "மாலி", "Country_MM": "மியானà¯à®®à®¾à®°à¯ (பரà¯à®®à®¾)", "Country_MN": "மஙà¯à®•à¯‹à®²à®¿à®¯à®¾", - "Country_MO": "மகாவோ எஸà¯à®à®†à®°à¯ சீனா", + "Country_MO": "மகாவ௠எஸà¯à®à®†à®°à¯ சீனா", "Country_MP": "வடகà¯à®•à¯ மரியானா தீவà¯à®•à®³à¯", "Country_MQ": "மாரà¯à®Ÿà®¿à®©à®¿à®•à¯", "Country_MR": "மௌரிடானியா", - "Country_MS": "மௌனà¯à®Ÿà¯à®šà¯†à®°à®¾à®Ÿà¯", + "Country_MS": "மாணà¯à®Ÿà¯à®šà¯†à®°à®¾à®Ÿà¯", "Country_MT": "மாலà¯à®Ÿà®¾", "Country_MU": "மொரிசியஸà¯", "Country_MV": "மாலதà¯à®¤à¯€à®µà¯", - "Country_MW": "மாலவி", + "Country_MW": "மலாவி", "Country_MX": "மெகà¯à®šà®¿à®•à¯‹", - "Country_MY": "மலேஷியா", + "Country_MY": "மலேசியா", "Country_MZ": "மொசாமà¯à®ªà®¿à®•à¯", "Country_NA": "நமீபியா", "Country_NC": "நியூ கேலிடோனியா", "Country_NE": "நைஜரà¯", - "Country_NF": "நாரà¯à®ƒà®ªà®¾à®•à¯ தீவà¯à®•à®³à¯", + "Country_NF": "நாரà¯à®ƒà®ªà¯‹à®•à¯ தீவà¯à®•à®³à¯", "Country_NG": "நைஜீரியா", "Country_NI": "நிகரகà¯à®µà®¾", "Country_NL": "நெதரà¯à®²à®¾à®¨à¯à®¤à¯", @@ -183,11 +183,11 @@ "Country_PA": "பனாமா", "Country_PE": "பெரà¯", "Country_PF": "பிரெஞà¯à®šà¯ பாலினேஷியா", - "Country_PG": "பாபà¯à®ªà¯à®µà®¾ நியூ கினி", + "Country_PG": "பபà¯à®ªà¯à®µà®¾ நியூ கினியா", "Country_PH": "பிலிபà¯à®ªà¯ˆà®©à¯à®¸à¯", "Country_PK": "பாகிஸà¯à®¤à®¾à®©à¯", "Country_PL": "போலநà¯à®¤à¯", - "Country_PM": "செயினà¯à®Ÿà¯ பியர௠மறà¯à®±à¯à®®à¯ மிகà¯à®µà¯‡à®²à®¾à®©à¯", + "Country_PM": "செயினà¯à®Ÿà¯ பியர௠& மிகà¯à®µà¯‡à®²à®¾à®©à¯", "Country_PN": "பிடà¯à®•à¯†à®¯à¯à®°à¯à®©à¯ தீவà¯à®•à®³à¯", "Country_PR": "பியூரà¯à®Ÿà¯‹ ரிகோ", "Country_PS": "பாலஸà¯à®¤à¯€à®©à®¿à®¯ பிரதேசஙà¯à®•à®³à¯", @@ -202,26 +202,26 @@ "Country_RW": "à®°à¯à®µà®¾à®©à¯à®Ÿà®¾", "Country_SA": "சவூதி அரேபியா", "Country_SB": "சாலமன௠தீவà¯à®•à®³à¯", - "Country_SC": "ஸேசேலà¯à®¸à¯", + "Country_SC": "சீஷெலà¯à®¸à¯", "Country_SD": "சூடானà¯", "Country_SE": "ஸà¯à®µà¯€à®Ÿà®©à¯", "Country_SG": "சிஙà¯à®•à®ªà¯à®ªà¯‚à®°à¯", "Country_SH": "செயினà¯à®Ÿà¯ ஹெலெனா", "Country_SI": "ஸà¯à®²à¯‹à®µà¯‡à®©à®¿à®¯à®¾", - "Country_SJ": "ஸà¯à®µà®²à¯à®ªà®¾à®°à¯à®Ÿà¯ மறà¯à®±à¯à®®à¯ ஜான௠மேயனà¯", + "Country_SJ": "ஸà¯à®µà®²à¯à®ªà®¾à®°à¯à®Ÿà¯ & ஜான௠மேயனà¯", "Country_SK": "ஸà¯à®²à¯‹à®µà®¾à®•à®¿à®¯à®¾", - "Country_SL": "சியரà¯à®°à®¾ லியோனà¯", - "Country_SM": "சான௠மெரினோ", + "Country_SL": "சியாரா லியோனà¯", + "Country_SM": "சான௠மரினோ", "Country_SN": "செனெகலà¯", "Country_SO": "சோமாலியா", "Country_SR": "சà¯à®°à®¿à®©à®¾à®®à¯", "Country_SS": "தெறà¯à®•à¯ சூடானà¯", - "Country_ST": "சாவ௠தோம௠மறà¯à®±à¯à®®à¯ பà¯à®°à®¿à®©à¯à®šà®¿à®ªà®¿", + "Country_ST": "சாவ௠தோம௠& பà¯à®°à®¿à®©à¯à®šà®¿à®ªà®¿", "Country_SV": "எல௠சாலà¯à®µà®Ÿà®¾à®°à¯", "Country_SX": "சினà¯à®Ÿà¯ மாரà¯à®Ÿà¯†à®©à¯", "Country_SY": "சிரியா", "Country_SZ": "ஸà¯à®µà®¾à®¸à®¿à®²à®¾à®¨à¯à®¤à¯", - "Country_TC": "டரà¯à®•à¯à®¸à¯ மறà¯à®±à¯à®®à¯ கைகோஸ௠தீவà¯à®•à®³à¯", + "Country_TC": "டரà¯à®•à¯à®¸à¯ & கைகோஸ௠தீவà¯à®•à®³à¯", "Country_TD": "சாடà¯", "Country_TF": "பிரெஞà¯à®šà¯ தெறà¯à®•à¯ பிரதேசஙà¯à®•à®³à¯", "Country_TG": "டோகோ", @@ -233,18 +233,18 @@ "Country_TN": "டà¯à®©à®¿à®šà®¿à®¯à®¾", "Country_TO": "டோஙà¯à®•à®¾", "Country_TR": "தà¯à®°à¯à®•à¯à®•à®¿", - "Country_TT": "டà¯à®°à®¿à®©à®¿à®Ÿà®¾à®Ÿà¯ மறà¯à®±à¯à®®à¯ டà¯à®ªà®¾à®•à¯‹", + "Country_TT": "டà¯à®°à®¿à®©à®¿à®Ÿà®¾à®Ÿà¯ & டொபாகோ", "Country_TV": "தà¯à®µà®¾à®²à¯‚", "Country_TW": "தைவானà¯", "Country_TZ": "தானà¯à®šà®¾à®©à®¿à®¯à®¾", "Country_UA": "உகà¯à®°à¯ˆà®©à¯", "Country_UG": "உகாணà¯à®Ÿà®¾", - "Country_UM": "யூஎஸ௠அவà¯à®Ÿà¯à®²à¯‡à®¯à®¿à®™à¯ தீவà¯à®•à®³à¯", + "Country_UM": "யூ.எஸà¯. வெளிபà¯à®ªà¯à®± தீவà¯à®•à®³à¯", "Country_US": "அமெரிகà¯à®•à®¾", "Country_UY": "உரà¯à®•à¯à®µà¯‡", "Country_UZ": "உஸà¯à®ªà¯†à®•à®¿à®¸à¯à®¤à®¾à®©à¯", "Country_VA": "வாடிகன௠நகரமà¯", - "Country_VC": "செயினà¯à®Ÿà¯ வினà¯à®šà¯†à®©à¯à®Ÿà¯ மறà¯à®±à¯à®®à¯ கிரெனடைனà¯à®¸à¯", + "Country_VC": "செயினà¯à®Ÿà¯ வினà¯à®šà¯†à®©à¯à®Ÿà¯ & கிரெனடைனà¯à®¸à¯", "Country_VE": "வெனிசà¯à®²à®¾", "Country_VG": "பிரிடà¯à®Ÿà¯€à®·à¯ கனà¯à®©à®¿à®¤à¯ தீவà¯à®•à®³à¯", "Country_VI": "யூ.எஸà¯. கனà¯à®©à®¿à®¤à¯ தீவà¯à®•à®³à¯", @@ -253,7 +253,7 @@ "Country_WF": "வாலிஸ௠மறà¯à®±à¯à®®à¯ ஃபà¯à®Ÿà¯à®©à®¾", "Country_WS": "சமோவா", "Country_YE": "à®à®®à®©à¯", - "Country_YT": "மயோதà¯", + "Country_YT": "மயோடà¯", "Country_ZA": "தென௠ஆபà¯à®ªà®¿à®°à®¿à®•à¯à®•à®¾", "Country_ZM": "ஜாமà¯à®ªà®¿à®¯à®¾", "Country_ZW": "ஜிமà¯à®ªà®¾à®ªà¯à®µà¯‡", @@ -285,23 +285,23 @@ "Day_Min_StandAlone_5": "வெ", "Day_Min_StandAlone_6": "ச", "Day_Min_StandAlone_7": "ஞா", - "Day_Short_1": "தி", - "Day_Short_2": "செ", - "Day_Short_3": "பà¯", - "Day_Short_4": "வி", - "Day_Short_5": "வெ", - "Day_Short_6": "ச", - "Day_Short_7": "ஞா", - "Day_Short_StandAlone_1": "தி", - "Day_Short_StandAlone_2": "செ", - "Day_Short_StandAlone_3": "பà¯", - "Day_Short_StandAlone_4": "வி", - "Day_Short_StandAlone_5": "வெ", - "Day_Short_StandAlone_6": "ச", - "Day_Short_StandAlone_7": "ஞா", + "Day_Short_1": "திஙà¯.", + "Day_Short_2": "செவà¯.", + "Day_Short_3": "பà¯à®¤.", + "Day_Short_4": "வியா.", + "Day_Short_5": "வெளà¯.", + "Day_Short_6": "சனி", + "Day_Short_7": "ஞாயி.", + "Day_Short_StandAlone_1": "திஙà¯.", + "Day_Short_StandAlone_2": "செவà¯.", + "Day_Short_StandAlone_3": "பà¯à®¤.", + "Day_Short_StandAlone_4": "வியா.", + "Day_Short_StandAlone_5": "வெளà¯.", + "Day_Short_StandAlone_6": "சனி", + "Day_Short_StandAlone_7": "ஞாயி.", "EnglishLanguageName": "Tamil", - "Format_DateTime_Long": "EEEE, d MMMM, y h:mm:ss a", - "Format_DateTime_Short": "d MMM, y h:mm:ss a", + "Format_DateTime_Long": "EEEE, d MMMM, y a h:mm:ss", + "Format_DateTime_Short": "d MMM, y a h:mm:ss", "Format_Date_Day_Month": "MMM d, E", "Format_Date_Long": "EEEE, d MMMM, y", "Format_Date_Short": "d MMM, y", @@ -313,7 +313,7 @@ "Format_Interval_Short_Y": "d MMM, y – d MMM, y", "Format_Month_Long": "MMMM y", "Format_Month_Short": "MMM y", - "Format_Time": "h:mm:ss a", + "Format_Time": "a h:mm:ss", "Format_Year": "y", "Hours": "மணிநேரஙà¯à®•à®³à¯", "Language_aa": "அஃபாரà¯", @@ -324,11 +324,11 @@ "Language_am": "à®…à®®à¯à®¹à®¾à®°à®¿à®•à¯", "Language_an": "ஆரà¯à®•à¯‹à®©à¯€à®¸à¯", "Language_ar": "அரபிகà¯", - "Language_as": "அஸà¯à®¸à®¾à®®à®¿", + "Language_as": "அஸà¯à®¸à®¾à®®à¯€à®¸à¯", "Language_av": "அவேரிகà¯", "Language_ay": "அயà¯à®®à®°à®¾", "Language_az": "அஸரà¯à®ªà¯ˆà®œà®¾à®©à®¿", - "Language_ba": "பாஷà¯à®•à®¿à®°à¯", + "Language_ba": "பஷà¯à®•à®¿à®°à¯", "Language_be": "பெலாரà¯à®·à®¿à®¯à®©à¯", "Language_bg": "பலà¯à®•à¯‡à®°à®¿à®¯à®©à¯", "Language_bi": "பிஸà¯à®²à®¾à®®à®¾", @@ -338,14 +338,14 @@ "Language_br": "பிரெடà¯à®Ÿà®©à¯", "Language_bs": "போஸà¯à®©à®¿à®¯à®©à¯", "Language_ca": "கேடà¯à®Ÿà®²à®¾à®©à¯", - "Language_ce": "செசெனà¯", + "Language_ce": "செசà¯à®šà¯†à®©à¯", "Language_ch": "சாமோரோ", - "Language_co": "கோரà¯à®šà®¿à®•à®©à¯", + "Language_co": "காரà¯à®šà®¿à®•à®©à¯", "Language_cr": "கà¯à®°à¯€", "Language_cs": "செகà¯", "Language_cu": "சரà¯à®šà¯ ஸà¯à®²à®¾à®µà®¿à®•à¯", "Language_cv": "சà¯à®µà®¾à®·à¯", - "Language_cy": "வெலà¯à®·à¯", + "Language_cy": "வேலà¯à®·à¯", "Language_da": "டேனிஷà¯", "Language_de": "ஜெரà¯à®®à®©à¯", "Language_dv": "திவேஹி", @@ -356,14 +356,14 @@ "Language_eo": "எஸà¯à®ªà®°à¯‡à®©à¯à®Ÿà¯‹", "Language_es": "ஸà¯à®ªà®¾à®©à®¿à®·à¯", "Language_et": "எஸà¯à®Ÿà¯‹à®©à®¿à®¯à®©à¯", - "Language_eu": "பஸà¯à®•à¯", + "Language_eu": "பாஸà¯à®•à¯", "Language_fa": "பெரà¯à®·à®¿à®¯à®©à¯", "Language_ff": "ஃபà¯à®²à®¾", "Language_fi": "ஃபினà¯à®©à®¿à®·à¯", "Language_fj": "ஃபிஜியனà¯", "Language_fo": "ஃபரோயிஸà¯", "Language_fr": "பிரெஞà¯à®šà¯", - "Language_fy": "மேறà¯à®•à®¤à¯à®¤à®¿à®¯ ஃபà¯à®°à®¿à®·à®¿à®¯à®©à¯", + "Language_fy": "மேறà¯à®•à¯ ஃபà¯à®°à®¿à®·à®¿à®¯à®©à¯", "Language_ga": "à®à®°à®¿à®·à¯", "Language_gd": "ஸà¯à®•à®¾à®Ÿà¯à®¸à¯ கேலிகà¯", "Language_gl": "காலிஸியனà¯", @@ -386,11 +386,11 @@ "Language_ii": "சிசà¯à®µà®¾à®©à¯ ஈ", "Language_ik": "இனà¯à®ªà®¿à®¯à®¾à®•à¯", "Language_io": "இடோ", - "Language_is": "à®à®¸à¯à®²à¯†à®©à¯à®Ÿà®¿à®•à¯", + "Language_is": "à®à®¸à¯à®²à¯‡à®£à¯à®Ÿà®¿à®•à¯", "Language_it": "இதà¯à®¤à®¾à®²à®¿à®¯à®©à¯", "Language_iu": "இனà¯à®•à®¿à®Ÿà¯‚டà¯", "Language_ja": "ஜபà¯à®ªà®¾à®©à®¿à®¯à®®à¯", - "Language_jv": "ஜாவானீஸà¯", + "Language_jv": "ஜாவனீஸà¯", "Language_ka": "ஜாரà¯à®œà®¿à®¯à®©à¯", "Language_kg": "காஙà¯à®•à¯‹", "Language_ki": "கிகà¯à®¯à¯‚", @@ -424,7 +424,7 @@ "Language_mr": "மராதà¯à®¤à®¿", "Language_ms": "மலாயà¯", "Language_mt": "மாலà¯à®Ÿà®¿à®¸à¯", - "Language_my": "பரà¯à®®à®¿à®¸à¯", + "Language_my": "பரà¯à®®à¯€à®¸à¯", "Language_na": "நவà¯à®°à¯‚", "Language_nb": "நாரà¯à®µà¯‡à®œà®¿à®¯à®©à¯ பொகà¯à®®à®¾à®²à¯", "Language_nd": "வடகà¯à®•à¯ தெபெலே", @@ -475,11 +475,11 @@ "Language_tg": "தாஜிகà¯", "Language_th": "தாயà¯", "Language_ti": "டிகà¯à®°à®¿à®©à¯à®¯à®¾", - "Language_tk": "டரà¯à®•à¯à®®à¯†à®©à¯", + "Language_tk": "தà¯à®°à¯à®•à¯à®®à¯†à®©à¯", "Language_tl": "டாகாலோகà¯", "Language_tn": "ஸà¯à®µà®¾à®©à®¾", "Language_to": "டோஙà¯à®•à®¾à®©à¯", - "Language_tr": "டரà¯à®•à®¿à®·à¯", + "Language_tr": "தà¯à®°à¯à®•à¯à®•à®¿à®·à¯", "Language_ts": "ஸோஙà¯à®•à®¾", "Language_tt": "டாடரà¯", "Language_tw": "டà¯à®µà®¿", @@ -552,9 +552,17 @@ "NDays": "%s நாடà¯à®•à®³à¯", "NHoursShort": "%s à®®.நே.", "NMinutes": "%s நிமிடஙà¯à®•à®³à¯", - "NMinutesShort": "%s நிமிடஙà¯à®•à®³à¯", + "NMinutesShort": "%s நிமிட", "NSeconds": "%s விநாடிகளà¯", "NSecondsShort": "%s வி.", + "NumberFormatCurrency": "¤ #,##,##0.00", + "NumberFormatNumber": "#,##,##0.###", + "NumberFormatPercent": "#,##,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 நாளà¯", "OneMinute": "1 நிமிடமà¯", "OneMinuteShort": "1 நிமிடமà¯", @@ -571,7 +579,7 @@ "Time_AM": "à®®à¯à®±à¯à®ªà®•à®²à¯", "Time_PM": "பிறà¯à®ªà®•à®²à¯", "Today": "இனà¯à®±à¯", - "Year_Short": "ஆணà¯à®Ÿà¯", + "Year_Short": "ஆ.", "Yesterday": "நேறà¯à®±à¯" } } \ No newline at end of file diff --git a/plugins/Intl/lang/te.json b/plugins/Intl/lang/te.json index 8b8a14f24b8c5af2be48213a30bb29751ebeb1ad..7c9679b3a13fe4bbd4dd5540a5f2e40e7e3d1b52 100644 --- a/plugins/Intl/lang/te.json +++ b/plugins/Intl/lang/te.json @@ -402,7 +402,7 @@ "Language_ko": "కొరియనà±", "Language_kr": "కానà±à°°à°¿", "Language_ks": "కాశà±à°®à±€à°°à°¿", - "Language_ku": "à°•à°°à±à°¡à°¿à°·à±", + "Language_ku": "à°•à±à°°à±à°¦à°¿à°·à±", "Language_kv": "కోమి", "Language_kw": "కోరà±à°¨à°¿à°·à±", "Language_ky": "à°•à°¿à°°à±à°—à°¿à°œà±", @@ -555,6 +555,14 @@ "NMinutesShort": "%s నిమి.", "NSeconds": "%s సెకనà±à°²à±", "NSecondsShort": "%sసె", + "NumberFormatCurrency": "¤#,##,##0.00", + "NumberFormatNumber": "#,##,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 రోజà±", "OneMinute": "1 నిమిషం", "OneMinuteShort": "1 నిమి.", diff --git a/plugins/Intl/lang/th.json b/plugins/Intl/lang/th.json index 085880e0d39a5c9ea5eeb10decff00c7384a7d34..afe4e21c493ed32e5ae4a30d9abf30a60d7be519 100644 --- a/plugins/Intl/lang/th.json +++ b/plugins/Intl/lang/th.json @@ -555,6 +555,14 @@ "NMinutesShort": "%s นาที", "NSeconds": "%s วินาที", "NSecondsShort": "%sวิ", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 วัน", "OneMinute": "1 นาที", "OneMinuteShort": "1 นาที", diff --git a/plugins/Intl/lang/tl.json b/plugins/Intl/lang/tl.json index 8a16e108850ebdffc966bdccaac552700d095f2e..caebf74edfd81e9900382177c8e4531ad6ea09f8 100644 --- a/plugins/Intl/lang/tl.json +++ b/plugins/Intl/lang/tl.json @@ -3,7 +3,7 @@ "Continent_afr": "Africa", "Continent_amc": "Gitnang Amerika", "Continent_amn": "Hilagang Amerika", - "Continent_ams": "South America", + "Continent_ams": "Timog Amerika", "Continent_ant": "Antarctica", "Continent_asi": "Asya", "Continent_eur": "Europe", @@ -128,8 +128,8 @@ "Country_KI": "Kiribati", "Country_KM": "Comoros", "Country_KN": "Saint Kitts and Nevis", - "Country_KP": "North Korea", - "Country_KR": "South Korea", + "Country_KP": "Hilagang Korea", + "Country_KR": "Timog Korea", "Country_KW": "Kuwait", "Country_KY": "Cayman Islands", "Country_KZ": "Kazakhstan", @@ -315,7 +315,7 @@ "Format_Month_Short": "MMM y", "Format_Time": "h:mm:ss a", "Format_Year": "y", - "Hours": "oras", + "Hours": "mga oras", "Language_ab": "Abkhazian", "Language_af": "Afrikaans", "Language_ak": "Akan", @@ -333,8 +333,10 @@ "Language_br": "Breton", "Language_bs": "Bosnian", "Language_ca": "Catalan", + "Language_ce": "Chechen", "Language_co": "Corsican", "Language_cs": "Czech", + "Language_cv": "Chuvash", "Language_cy": "Welsh", "Language_da": "Danish", "Language_de": "German", @@ -344,7 +346,7 @@ "Language_el": "Greek", "Language_en": "Ingles", "Language_eo": "Esperanto", - "Language_es": "Spanish", + "Language_es": "Espanyol", "Language_et": "Estonian", "Language_eu": "Basque", "Language_fa": "Persian", @@ -352,7 +354,7 @@ "Language_fj": "Fijian", "Language_fo": "Faroese", "Language_fr": "French", - "Language_fy": "Western Frisian", + "Language_fy": "Kanlurang Frisian", "Language_ga": "Irish", "Language_gd": "Scots Gaelic", "Language_gl": "Galician", @@ -406,7 +408,7 @@ "Language_mt": "Maltese", "Language_my": "Burmese", "Language_nb": "Norwegian Bokmal", - "Language_nd": "North Ndebele", + "Language_nd": "Hilagang Ndebele", "Language_ne": "Nepali", "Language_nl": "Dutch", "Language_nn": "Norwegian Nynorsk", @@ -428,7 +430,7 @@ "Language_rw": "Kinyarwanda", "Language_sa": "Sanskrit", "Language_sd": "Sindhi", - "Language_se": "Northern Sami", + "Language_se": "Hilagang Sami", "Language_sg": "Sango", "Language_si": "Sinhala", "Language_sk": "Slovak", @@ -468,7 +470,7 @@ "Language_zh": "Chinese", "Language_zu": "Zulu", "LayoutDirection": "ltr", - "Minutes": "minuto", + "Minutes": "mga minuto", "Month_Long_1": "Enero", "Month_Long_10": "Oktubre", "Month_Long_11": "Nobyembre", @@ -517,29 +519,37 @@ "Month_Short_StandAlone_7": "Hul", "Month_Short_StandAlone_8": "Ago", "Month_Short_StandAlone_9": "Set", - "NDays": "%s araw", - "NHoursShort": "%sh", - "NMinutes": "%s minuto", + "NDays": "%s na araw", + "NHoursShort": "%s oras", + "NMinutes": "%s na minuto", "NMinutesShort": "%s min.", - "NSeconds": "%s segundo", + "NSeconds": "%s na segundo", "NSecondsShort": "%ss", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 araw", "OneMinute": "1 minuto", "OneMinuteShort": "1 min.", "OriginalLanguageName": "Filipino", - "PeriodDay": "Araw", + "PeriodDay": "araw", "PeriodDays": "araw", - "PeriodMonth": "Buwan", - "PeriodMonths": "buwan", - "PeriodWeek": "Linggo", - "PeriodWeeks": "linggo", - "PeriodYear": "Taon", - "PeriodYears": "taon", - "Seconds": "segundo", + "PeriodMonth": "buwan", + "PeriodMonths": "mga buwan", + "PeriodWeek": "linggo", + "PeriodWeeks": "mga linggo", + "PeriodYear": "taon", + "PeriodYears": "mga taon", + "Seconds": "mga segundo", "Time_AM": "AM", "Time_PM": "PM", "Today": "Ngayong araw", - "Year_Short": "yr.", + "Year_Short": "taon", "Yesterday": "Kahapon" } } \ No newline at end of file diff --git a/plugins/Intl/lang/tr.json b/plugins/Intl/lang/tr.json index b4f8db1189da147c0a9d29d0ca31f56cbfd9949e..0d2b4082e6cf17af335d8c5573af43042dabd6c7 100644 --- a/plugins/Intl/lang/tr.json +++ b/plugins/Intl/lang/tr.json @@ -412,7 +412,7 @@ "Language_li": "Limburgca", "Language_ln": "Lingala", "Language_lo": "Laoca", - "Language_lt": "Litvanyaca", + "Language_lt": "Litvanca", "Language_lu": "Luba-Katanga", "Language_lv": "Letonca", "Language_mg": "Malgaşça", @@ -555,6 +555,14 @@ "NMinutesShort": "%s dk.", "NSeconds": "%s saniye", "NSecondsShort": "%ssn", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "%#,##0", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 gün", "OneMinute": "1 dakika", "OneMinuteShort": "1 dk.", diff --git a/plugins/Intl/lang/uk.json b/plugins/Intl/lang/uk.json index 3b677b7ee9cbde0361dc7d38856671637c2b2461..69ec802cbb394b9b14da0ff8f17e7f75a7499155 100644 --- a/plugins/Intl/lang/uk.json +++ b/plugins/Intl/lang/uk.json @@ -2,7 +2,7 @@ "Intl": { "Continent_afr": "Ðфрика", "Continent_amc": "Центральна Ðмерика", - "Continent_amn": "ПівнічноамериканÑький континент", + "Continent_amn": "Північна Ðмерика", "Continent_ams": "Південна Ðмерика", "Continent_ant": "Ðнтарктика", "Continent_asi": "ÐзіÑ", @@ -34,12 +34,12 @@ "Country_BI": "Бурунді", "Country_BJ": "Бенін", "Country_BL": "Сен-Бартельмі", - "Country_BM": "Бермуди", + "Country_BM": "БермудÑькі оÑтрови", "Country_BN": "Бруней", "Country_BO": "БолівіÑ", "Country_BQ": "ÐідерландÑькі КарибÑькі оÑтрови", "Country_BR": "БразиліÑ", - "Country_BS": "Багами", + "Country_BS": "БагамÑькі ОÑтрови", "Country_BT": "Бутан", "Country_BV": "ОÑтрів Буве", "Country_BW": "БотÑвана", @@ -155,7 +155,7 @@ "Country_ML": "Малі", "Country_MM": "МʼÑнма (Бірма)", "Country_MN": "МонголіÑ", - "Country_MO": "Макао О.Ð.Ð . Китаю", + "Country_MO": "Макао, О.Ð.РКитаю", "Country_MP": "Північні МаріанÑькі оÑтрови", "Country_MQ": "Мартиніка", "Country_MR": "МавританіÑ", @@ -228,7 +228,7 @@ "Country_TH": "Таїланд", "Country_TJ": "ТаджикиÑтан", "Country_TK": "Токелау", - "Country_TL": "Східний Тимор", + "Country_TL": "Тимор-Лешті", "Country_TM": "ТуркменіÑтан", "Country_TN": "ТуніÑ", "Country_TO": "Тонга", @@ -254,7 +254,7 @@ "Country_WS": "Самоа", "Country_YE": "Ємен", "Country_YT": "Майотта", - "Country_ZA": "ПÐÐ ", + "Country_ZA": "Південно-ÐфриканÑька РеÑпубліка", "Country_ZM": "ЗамбіÑ", "Country_ZW": "Зімбабве", "Day_Long_1": "Понеділок", @@ -363,7 +363,7 @@ "Language_fj": "Фіджі", "Language_fo": "ФарерÑька", "Language_fr": "Французька", - "Language_fy": "Західно-фризька", + "Language_fy": "Західнофризька", "Language_ga": "ІрландÑька", "Language_gd": "ГаельÑька", "Language_gl": "ГаліÑійÑька", @@ -555,17 +555,25 @@ "NMinutesShort": "%s хв", "NSeconds": "%s Ñекунди", "NSecondsShort": "%s Ñ", + "NumberFormatCurrency": "#,##0.00 ¤", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": " ", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 день", "OneMinute": "1 хвилина", "OneMinuteShort": "1 хв", "OriginalLanguageName": "УкраїнÑька", - "PeriodDay": "День", + "PeriodDay": "день", "PeriodDays": "дні", - "PeriodMonth": "МіÑÑць", + "PeriodMonth": "міÑÑць", "PeriodMonths": "міÑÑці", - "PeriodWeek": "Тиждень", + "PeriodWeek": "тиждень", "PeriodWeeks": "тижні", - "PeriodYear": "Рік", + "PeriodYear": "рік", "PeriodYears": "роки", "Seconds": "Ñекунди", "Time_AM": "дп", diff --git a/plugins/Intl/lang/vi.json b/plugins/Intl/lang/vi.json index 4d00266994292b0cbe5e88f7778ed8ecf6f77825..e89f2f527b26c65c0fa47485af171b78e2f1d420 100644 --- a/plugins/Intl/lang/vi.json +++ b/plugins/Intl/lang/vi.json @@ -33,7 +33,7 @@ "Country_BH": "Bahrain", "Country_BI": "Burundi", "Country_BJ": "Benin", - "Country_BL": "Saint Barthélemy", + "Country_BL": "St. Barthélemy", "Country_BM": "Bermuda", "Country_BN": "Brunei", "Country_BO": "Bolivia", @@ -102,8 +102,8 @@ "Country_GU": "Guam", "Country_GW": "Guinea-Bissau", "Country_GY": "Guyana", - "Country_HK": "Äặc khu hà nh chÃnh Hồng Kông - Trung Quốc", - "Country_HM": "Äảo Heard và Quần đảo McDonald", + "Country_HK": "Hồng Kông, Trung Quốc", + "Country_HM": "Quần đảo Heard và McDonald", "Country_HN": "Honduras", "Country_HR": "Croatia", "Country_HT": "Haiti", @@ -127,7 +127,7 @@ "Country_KH": "Campuchia", "Country_KI": "Kiribati", "Country_KM": "Comoros", - "Country_KN": "Saint Kitts và Nevis", + "Country_KN": "St. Kitts và Nevis", "Country_KP": "Triá»u Tiên", "Country_KR": "Hà n Quốc", "Country_KW": "Cô-oét", @@ -135,7 +135,7 @@ "Country_KZ": "Kazakhstan", "Country_LA": "Là o", "Country_LB": "Li-băng", - "Country_LC": "Saint Lucia", + "Country_LC": "St. Lucia", "Country_LI": "Liechtenstein", "Country_LK": "Sri Lanka", "Country_LR": "Liberia", @@ -148,14 +148,14 @@ "Country_MC": "Monaco", "Country_MD": "Moldova", "Country_ME": "Montenegro", - "Country_MF": "Saint Martin", + "Country_MF": "St. Martin", "Country_MG": "Madagascar", "Country_MH": "Quần đảo Marshall", "Country_MK": "Macedonia", "Country_ML": "Mali", "Country_MM": "Myanmar (Miến Äiện)", "Country_MN": "Mông Cổ", - "Country_MO": "Äặc khu hà nh chÃnh Macao - Trung Quốc", + "Country_MO": "Macao, Trung Quốc", "Country_MP": "Quần đảo Bắc Mariana", "Country_MQ": "Martinique", "Country_MR": "Mauritania", @@ -206,7 +206,7 @@ "Country_SD": "Sudan", "Country_SE": "Thụy Äiển", "Country_SG": "Singapore", - "Country_SH": "Saint Helena", + "Country_SH": "St. Helena", "Country_SI": "Slovenia", "Country_SJ": "Svalbard và Jan Mayen", "Country_SK": "Slovakia", @@ -244,7 +244,7 @@ "Country_UY": "Uruguay", "Country_UZ": "Uzbekistan", "Country_VA": "Thà nh Vatican", - "Country_VC": "Saint Vincent và Grenadines", + "Country_VC": "St. Vincent và Grenadines", "Country_VE": "Venezuela", "Country_VG": "Quần đảo Virgin thuá»™c Anh", "Country_VI": "Quần đảo Virgin thuá»™c Mỹ", @@ -301,15 +301,15 @@ "Day_Short_StandAlone_7": "CN", "EnglishLanguageName": "Vietnamese", "Format_DateTime_Long": "EEEE, 'ngà y' dd MMMM 'năm' y HH:mm:ss", - "Format_DateTime_Short": "dd-MM-y HH:mm:ss", - "Format_Date_Day_Month": "E, dd MMM", + "Format_DateTime_Short": "d MMM, y HH:mm:ss", + "Format_Date_Day_Month": "E, d MMM", "Format_Date_Long": "EEEE, 'ngà y' dd MMMM 'năm' y", - "Format_Date_Short": "dd-MM-y", - "Format_Interval_Long_D": "'Ngà y' dd - 'Ngà y' dd 'tháng' M 'năm' y", - "Format_Interval_Long_M": "'Ngà y' dd 'tháng' M - 'Ngà y' dd 'tháng' M 'năm' y", + "Format_Date_Short": "d MMM, y", + "Format_Interval_Long_D": "d – d MMMM, y", + "Format_Interval_Long_M": "d MMMM – d MMMM, y", "Format_Interval_Long_Y": "'Ngà y' dd 'tháng' M 'năm' y - 'Ngà y' dd 'tháng' M 'năm' y", - "Format_Interval_Short_D": "'Ngà y' dd - 'Ngà y' dd 'tháng' M 'năm' y", - "Format_Interval_Short_M": "'Ngà y' dd 'tháng' M - 'Ngà y' dd 'tháng' M 'năm' y", + "Format_Interval_Short_D": "d – d MMM, y", + "Format_Interval_Short_M": "d MMM – d MMM, y", "Format_Interval_Short_Y": "'Ngà y' dd 'tháng' M 'năm' y - 'Ngà y' dd 'tháng' M 'năm' y", "Format_Month_Long": "MMMM 'năm' y", "Format_Month_Short": "MMM y", @@ -467,7 +467,7 @@ "Language_sr": "Tiếng Serbia", "Language_ss": "Tiếng Swati", "Language_st": "Tiếng Sesotho", - "Language_su": "Tiếng Sudan", + "Language_su": "Tiếng Sunda", "Language_sv": "Tiếng Thụy Äiển", "Language_sw": "Tiếng Swahili", "Language_ta": "Tiếng Tamil", @@ -555,6 +555,14 @@ "NMinutesShort": "%s phút", "NSeconds": "%s giây", "NSecondsShort": "%s giây", + "NumberFormatCurrency": "¤ #,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ",", + "NumberSymbolGroup": ".", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 ngà y", "OneMinute": "1 phút", "OneMinuteShort": "1 phút", diff --git a/plugins/Intl/lang/zh-cn.json b/plugins/Intl/lang/zh-cn.json index c0907c8b49104f22f20b9ac54ac0c563d0355984..5b48c6c6d84ef1c681edf1158b5ca11e2cc2044a 100644 --- a/plugins/Intl/lang/zh-cn.json +++ b/plugins/Intl/lang/zh-cn.json @@ -555,6 +555,14 @@ "NMinutesShort": "%s分钟", "NSeconds": "%s秒钟", "NSecondsShort": "%s秒", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1天", "OneMinute": "1分钟", "OneMinuteShort": "1分钟", diff --git a/plugins/Intl/lang/zh-tw.json b/plugins/Intl/lang/zh-tw.json index 0200a46ad153dc91305e8765139b372f97606d6e..5fac85b0ec8cbe8d9a1a89b52a63fcf723f56a6b 100644 --- a/plugins/Intl/lang/zh-tw.json +++ b/plugins/Intl/lang/zh-tw.json @@ -103,7 +103,7 @@ "Country_GW": "幾內亞比索", "Country_GY": "蓋亞那", "Country_HK": "ä¸è¯äººæ°‘共和國香港特別行政å€", - "Country_HM": "赫德åŠéº¥ç•¶å‹žç¾¤å³¶", + "Country_HM": "赫德島和麥克å”ç´ç¾¤å³¶", "Country_HN": "å®éƒ½æ‹‰æ–¯", "Country_HR": "克羅埃西亞", "Country_HT": "海地", @@ -221,7 +221,7 @@ "Country_SX": "è·å±¬è–馬ä¸", "Country_SY": "敘利亞", "Country_SZ": "å²ç“¦æ¿Ÿè˜", - "Country_TC": "英屬土克凱å¯ç¾¤å³¶", + "Country_TC": "土克斯åŠé–‹ç§‘斯群島", "Country_TD": "查德", "Country_TF": "法屬å—方屬地", "Country_TG": "多哥", @@ -251,7 +251,7 @@ "Country_VN": "越å—", "Country_VU": "è¬é‚£æœ", "Country_WF": "瓦利斯和富圖ç´ç¾¤å³¶", - "Country_WS": "薩摩亞群島", + "Country_WS": "薩摩亞", "Country_YE": "葉門", "Country_YT": "馬約特", "Country_ZA": "å—éž", @@ -555,6 +555,14 @@ "NMinutesShort": "%s 分é˜", "NSeconds": "%s 秒", "NSecondsShort": "%s秒", + "NumberFormatCurrency": "¤#,##0.00", + "NumberFormatNumber": "#,##0.###", + "NumberFormatPercent": "#,##0%", + "NumberSymbolDecimal": ".", + "NumberSymbolGroup": ",", + "NumberSymbolMinus": "-", + "NumberSymbolPercent": "%", + "NumberSymbolPlus": "+", "OneDay": "1 天", "OneMinute": "1 分é˜", "OneMinuteShort": "1 分é˜", @@ -562,7 +570,7 @@ "PeriodDay": "æ—¥", "PeriodDays": "天", "PeriodMonth": "月", - "PeriodMonths": "個月", + "PeriodMonths": "月", "PeriodWeek": "週", "PeriodWeeks": "週", "PeriodYear": "å¹´", diff --git a/plugins/LeftMenu/API.php b/plugins/LeftMenu/API.php deleted file mode 100644 index 3d0d38b6468708a0fa2c6e8712fdcd118f1c9763..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/API.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\LeftMenu; - -/** - * API for plugin LeftMenu - * - * @method static \Piwik\Plugins\LeftMenu\API getInstance() - */ -class API extends \Piwik\Plugin\API -{ - /** - * Returns true if the left menu is enabled for the current user. - * - * @return bool - */ - public function isEnabled() - { - $settings = new Settings('LeftMenu'); - $default = $settings->globalEnabled->getValue(); - - if (!$settings->userEnabled->isReadableByCurrentUser()) { - return $default; - } - - $user = $settings->userEnabled->getValue(); - - if (empty($user) || $user === 'system') { - return $default; - } - - if ($user === 'no') { - return false; - } - - return true; - } -} diff --git a/plugins/LeftMenu/LeftMenu.php b/plugins/LeftMenu/LeftMenu.php deleted file mode 100755 index 522965e6b8a81bd799c89cf51eb8920ac38a090a..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/LeftMenu.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ - -namespace Piwik\Plugins\LeftMenu; - -class LeftMenu extends \Piwik\Plugin -{ - public function registerEvents() - { - return array( - 'AssetManager.getStylesheetFiles' => array('function' => 'getStylesheetFiles', 'after' => true), - 'Template.bodyClass' => 'addClassToBody' - ); - } - - public function addClassToBody(&$str, $layout) - { - if (API::getInstance()->isEnabled() && 'dashboard' === $layout) { - $str .= ' leftMenuPlugin'; - } - } - - public function getStylesheetFiles(&$stylesheets) - { - $stylesheets[] = "plugins/LeftMenu/stylesheets/theme.less"; - } - -} - diff --git a/plugins/LeftMenu/Settings.php b/plugins/LeftMenu/Settings.php deleted file mode 100644 index b22c1bc40a967f686bae41adb255602a43d25810..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/Settings.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\LeftMenu; - -use Piwik\Piwik; -use Piwik\Settings\SystemSetting; -use Piwik\Settings\UserSetting; - -/** - * Defines Settings for LeftMenu. - */ -class Settings extends \Piwik\Plugin\Settings -{ - /** @var SystemSetting */ - public $globalEnabled; - - /** @var UserSetting */ - public $userEnabled; - - protected function init() - { - $this->setIntroduction($this->t('SettingsIntroduction')); - - $this->createGlobalEnabledSetting(); - - $this->createUserEnabledSetting(); - } - - private function createGlobalEnabledSetting() - { - $this->globalEnabled = new SystemSetting('globalEnabled', $this->t('GlobalSettingTitle')); - $this->globalEnabled->type = static::TYPE_BOOL; - $this->globalEnabled->inlineHelp = $this->t('GlobalSettingDescription') . ' ' . $this->t('GlobalSettingInlineHelp'); - $this->globalEnabled->defaultValue = false; - $this->globalEnabled->readableByCurrentUser = true; - - $this->addSetting($this->globalEnabled); - } - - private function createUserEnabledSetting() - { - $this->userEnabled = new UserSetting('userEnabled', $this->t('UserSettingTitle')); - $this->userEnabled->type = static::TYPE_STRING; - $this->userEnabled->uiControlType = static::CONTROL_RADIO; - $this->userEnabled->defaultValue = 'system'; - $this->userEnabled->inlineHelp = $this->t('UserSettingInlineHelp'); - $this->userEnabled->availableValues = array( - 'system' => Piwik::translate('General_Default'), - 'yes' => Piwik::translate('General_Yes'), - 'no' => Piwik::translate('General_No') - ); - - $this->addSetting($this->userEnabled); - } - - private function t($key) - { - return Piwik::translate('LeftMenu_' . $key); - } - -} diff --git a/plugins/LeftMenu/lang/bg.json b/plugins/LeftMenu/lang/bg.json deleted file mode 100644 index 4c5cc8fc3670e22f1fbf2c84fe80e0b76199bc2a..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/bg.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "LeftMenu": { - "UserSettingTitle": "Ðктивиране на лÑвото меню за отчет" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/cs.json b/plugins/LeftMenu/lang/cs.json deleted file mode 100644 index e15938a574086816b06043197734a813c6330151..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/cs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "UmÃstit menu nástÄ›nky nalevo.", - "SettingsIntroduction": "Zásuvný modul levé menu pÅ™esune menu hlášenà na levou stranu (je-li povolen). To je pÅ™edevÅ¡Ãm užiteÄné na velkých displejÃch.", - "GlobalSettingTitle": "Levé menu je ve výchozÃm stavu povoleno", - "GlobalSettingDescription": "Definuje systémovou výchozà hodnotu pro vÅ¡echny uživatele.", - "GlobalSettingInlineHelp": "Uživatelé si mohou zakázat\/povolit levé menu nezávisle na systémové výchozà hodnotÄ›.", - "UserSettingTitle": "Povolit levé menu hlášenÃ", - "UserSettingInlineHelp": "Toto povolà nebo zakáže levé menu jen pro vás bez ohledu na jiné uživatele. Super uživatel může nastavit výchozà systémovou hodnotu." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/da.json b/plugins/LeftMenu/lang/da.json deleted file mode 100644 index 27da2b16515a247bd0886dd361eb9fea1951f92b..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/da.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Venstre menu udvidelsen vil flytte rapportmenuen fra toppen til venstre, hvis aktiveret. Dette er især nyttigt for store skærme.", - "GlobalSettingTitle": "Venstre menu aktiveret som standard", - "GlobalSettingDescription": "Definerer systemets standard indstillinger for alle brugerne.", - "GlobalSettingInlineHelp": "Brugerne er i stand til at aktivere\/deaktivere venstremenuen uafhængigt af systemets standard indstillinger.", - "UserSettingTitle": "Aktiver rapportmenu til venstre", - "UserSettingInlineHelp": "Dette vil kun aktivere eller deaktivere venstre menuen for dig og pÃ¥virker ikke andre brugere. En superbruger kan ændre standardindstillingen for alle brugere." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/de.json b/plugins/LeftMenu/lang/de.json deleted file mode 100644 index 997daaca2847f1a0cc70b9741dfc49ee74c6e8af..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/de.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Platziert das Dashboardmenü auf die linke Seite", - "SettingsIntroduction": "Das LeftMenu Plug-In verschiebt die Menüs für die Reporte auf die linke Seite. Dies ist für umfangreiche Reporte hilfreich.", - "GlobalSettingTitle": "LeftMenu aktiviert als Voreinstellung", - "GlobalSettingDescription": "Legt die Standardeinstellung für alle Benutzer fest.", - "GlobalSettingInlineHelp": "Die Benutzer können es unabhängig von der Vorgabe aktivieren\/deaktivieren.", - "UserSettingTitle": "LeftMenu aktiviert", - "UserSettingInlineHelp": "Legt die Einstellung für den aktuellen Benutzer fest, ob LeftMenu aktiviert oder deaktiviert sein soll. Ein Administrator kann die Standardeinstellung für alle Benutzer festlegen." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/el.json b/plugins/LeftMenu/lang/el.json deleted file mode 100644 index e8ef94446e17835c9c33d004f18b153c8d45df1a..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/el.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "ΤοποθÎτηση του Î¼ÎµÎ½Î¿Ï Ï„Î¿Ï… πίνακα ελÎγχου στα αÏιστεÏά.", - "SettingsIntroduction": "Το Ï€Ïόσθετο για το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î¸Î± μετακινήσει το Î¼ÎµÎ½Î¿Ï Î±Î½Î±Ï†Î¿Ïών από την κοÏυφή Ï€Ïος τα αÏιστεÏά αν ενεÏγοποιηθεί. Αυτό είναι ιδιαίτεÏα χÏήσιμο για μεγάλες οθόνες.", - "GlobalSettingTitle": "Το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï ÎµÎ¯Î½Î±Î¹ εξ' οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ½ÎµÏγοποιημÎνο.", - "GlobalSettingDescription": "ΟÏίζει την Ï€Ïοεπιλογή για όλους τους χÏήστες.", - "GlobalSettingInlineHelp": "Οι χÏήστες μποÏοÏν να απενεÏγοποιοÏν\/ενεÏγοποιοÏν το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î±Î½ÎµÎ¾Î¬Ïτητα από την Ï€ÏοεπιλεγμÎνη ÏÏθμιση του συστήματος.", - "UserSettingTitle": "ΕνεÏγοποίηση του αÏιστεÏÎ¿Ï Î¼ÎµÎ½Î¿Ï Î±Î½Î±Ï†Î¿Ïών", - "UserSettingInlineHelp": "Αυτό θα ενεÏγοποιήσει ή απενεÏγοποιήσει το αÏιστεÏÏŒ Î¼ÎµÎ½Î¿Ï Î¼ÏŒÎ½Î¿ για εσάς και δε θα επηÏεάσει άλλους χÏήστες. Ένας ΥπεÏχÏήστης μποÏεί να αλλάξει την Ï€ÏοκαθοÏισμÎνη ÏÏθμιση για όλους τους χÏήστες." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/en.json b/plugins/LeftMenu/lang/en.json deleted file mode 100644 index 2869b864792d3aa79f4590702d50aaff89fb1352..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/en.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Position the dashboard menu to the left.", - "SettingsIntroduction": "The left menu plugin will move the reporting menu from the top to the left if enabled. This is especially useful for large displays.", - "GlobalSettingTitle": "Left menu enabled by default", - "GlobalSettingDescription": "Defines the system default for all of your users.", - "GlobalSettingInlineHelp": "Users are able to disable/enable the left menu independent of the system default.", - "UserSettingTitle": "Enable left reporting menu", - "UserSettingInlineHelp": "This will enable or disable the left menu only for you and not affect any other users. A Super User can change the default for all users." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/es.json b/plugins/LeftMenu/lang/es.json deleted file mode 100644 index 66a3ed43f7ed1157feb6cbafb33e003b8fb1d347..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/es.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Ubicar el menú del tablero a la izquierda.", - "SettingsIntroduction": "El menú izquierdo del complemento moverá el menú de información desde la parte superior a la izquierda si es habilitado. Especialmente útil para pantallas grandes.", - "GlobalSettingTitle": "Menú izquierdo activado por defecto", - "GlobalSettingDescription": "Define el sistema predeterminado para todos sus usuarios.", - "GlobalSettingInlineHelp": "Los usuarios están habilitados a habilitar\/deshabilitar el menú izquierdo independientemente del sistema predeterminado.", - "UserSettingTitle": "Habilitar menú izquierdo de información", - "UserSettingInlineHelp": "Esto habilitará o deshabilitará el menú izquierdo solo para usted y no afectará a ningún otro usuario. Un Super Usuario puede cambiar el modo predeterminado para todos los demás usuarios." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/fi.json b/plugins/LeftMenu/lang/fi.json deleted file mode 100644 index d2007c8cf4bb0f69b17336dc7d5bbf110283a9e0..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/fi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "Vasen valikko oletuksena käytössä", - "GlobalSettingDescription": "Määrittää järjestelmän oletusasetuksen kaikille käyttäjille.", - "GlobalSettingInlineHelp": "Käyttäjät voivat poistaa käytöstä\/ottaa käyttöön vasemman valikon riippumatta järjestelmän oletusasetuksesta.", - "UserSettingTitle": "Ota vasen raportointivalikko käyttöön" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/fr.json b/plugins/LeftMenu/lang/fr.json deleted file mode 100644 index 52b8c6b0b8953f6f803b960ab345b852d1f46001..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/fr.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Positionne le menu du tableau de bord sur la gauche.", - "SettingsIntroduction": "Le composant de menu à gauche va déplacer le menu de rapport d'en haut vers la gauche s'il est activé. C'est particulièrement utile pour les affichages larges.", - "GlobalSettingTitle": "Menu de gauche activé par défaut", - "GlobalSettingDescription": "Définit les valeurs système par défaut pour tous les utilisateurs.", - "GlobalSettingInlineHelp": "Les utilisateurs peuvent activer\/désactiver le menu de gauche indépendant des valeurs par défaut du système.", - "UserSettingTitle": "Activer le menu de rapport de gauche", - "UserSettingInlineHelp": "Cela va activer ou désactiver le menu de gauche pour vous uniquement et ne pas affecter les autres utilisateurs. Un super utilisateur peut modifier le paramètre par défaut pour tous les utilisateurs." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/hi.json b/plugins/LeftMenu/lang/hi.json deleted file mode 100644 index b45521c7e659a65a8ebb75277981307353f95567..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/hi.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "बाईं ओर डैशबोरà¥à¤¡ मेनू सà¥à¤¥à¤¿à¤¤à¤¿à¥¤", - "SettingsIntroduction": "अगर सकà¥à¤°à¤¿à¤¯ बाà¤à¤ मेनू पà¥à¤²à¤—इन बाईं ओर ऊपर से रिपोरà¥à¤Ÿà¤¿à¤‚ग मेनू कदम होगा। इस बड़े डिसà¥à¤ªà¥à¤²à¥‡ के लिठविशेष रूप से उपयोगी है।", - "GlobalSettingTitle": "डिफ़ॉलà¥à¤Ÿ रूप से सकà¥à¤·à¤® बाà¤à¤ मेनू", - "GlobalSettingDescription": "आपके सà¤à¥€ उपयोगकरà¥à¤¤à¤¾à¤“ं के लिठसिसà¥à¤Ÿà¤® मूलà¤à¥‚त को परिà¤à¤¾à¤·à¤¿à¤¤ करता है।", - "GlobalSettingInlineHelp": "उपयोगकरà¥à¤¤à¤¾ निषà¥à¤•à¥à¤°à¤¿à¤¯ \/ सिसà¥à¤Ÿà¤® डिफ़ॉलà¥à¤Ÿ के बाईं ओर मेनू सà¥à¤µà¤¤à¤‚तà¥à¤° सकà¥à¤·à¤® करने में सकà¥à¤·à¤® हैं।", - "UserSettingTitle": "छोड़ दिया रिपोरà¥à¤Ÿà¤¿à¤‚ग मेनू सकà¥à¤·à¤® करें", - "UserSettingInlineHelp": "इस सकà¥à¤·à¤® है या केवल आप के लिठछोड़ दिया मेनू को अकà¥à¤·à¤® और किसी à¤à¥€ अनà¥à¤¯ उपयोगकरà¥à¤¤à¤¾à¤“ं को पà¥à¤°à¤à¤¾à¤µà¤¿à¤¤ नहीं करेगा । à¤à¤• सà¥à¤ªà¤° उपयोगकरà¥à¤¤à¤¾ सà¤à¥€ उपयोगकरà¥à¤¤à¤¾à¤“ं के लिठडिफ़ॉलà¥à¤Ÿ बदल सकते हैं।" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/it.json b/plugins/LeftMenu/lang/it.json deleted file mode 100644 index 844623abbc92a421674bb85a8f1a3f3dc2090e89..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/it.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiziona il menù dashboard sulla sinistra.", - "SettingsIntroduction": "Il plugin menù di sinistra sposta il menu di segnalazione dalla parte superiore a sinistra, se abilitato. Ciò è particolarmente utile per i display di grandi dimensioni.", - "GlobalSettingTitle": "Il menù di sinistra è abilitato di default", - "GlobalSettingDescription": "Definisce le impostazioni predefinite di sistema per tutti gli utenti.", - "GlobalSettingInlineHelp": "Gli utenti possono disabilitare o abilitare il menù di sinistra indipendentemente dalle impostazioni predefinite del sistema.", - "UserSettingTitle": "Abilita il menù di segnalazione di sinistra", - "UserSettingInlineHelp": "Questo abilita o disabilita il menù di sinistra solo per te e non ha effetto per gli altri utenti. Un Super User può cambiare per tutti gli utenti le impostazioni predefinite." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ja.json b/plugins/LeftMenu/lang/ja.json deleted file mode 100644 index 6d4e82e5ec44515c8b46aa296b31a5e092067525..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/ja.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "左メニューã®ãƒ—ラグインã¯ã€æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã‚‹å ´åˆã€ãƒ¬ãƒãƒ¼ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’トップã‹ã‚‰å·¦ã«ç§»å‹•ã—ã¾ã™ã€‚ã“ã®ç§»å‹•ã¯ã€ç‰¹ã«å¤§ããªãƒ‡ã‚£ã‚¹ãƒ—レイをãŠä½¿ã„ã®å ´åˆã€ä¾¿åˆ©ã§ã™ã€‚", - "GlobalSettingTitle": "デフォルトã«ã‚ˆã‚Šæœ‰åŠ¹åŒ–ã•ã‚ŒãŸå·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼", - "GlobalSettingDescription": "全サイトユーザーã®ãŸã‚ã®ã‚·ã‚¹ãƒ†ãƒ デフォルトを定義", - "GlobalSettingInlineHelp": "ユーザーã¯ã€ã‚·ã‚¹ãƒ†ãƒ デフォルトã®å·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ç‹¬ç«‹ã‚’無効 \/ 有効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚", - "UserSettingTitle": "å·¦ã®ãƒ¬ãƒãƒ¼ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’有効ã«ã™ã‚‹", - "UserSettingInlineHelp": "ã“ã‚Œã¯ã€å·¦ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’ã‚ãªãŸã®ãŸã‚ã ã‘ã«æœ‰åŠ¹ã¾ãŸã¯ç„¡åŠ¹ã«ã—ã€ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã¯å½±éŸ¿ã—ã¾ã›ã‚“。スーパーユーザーã¯ã€å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«å¯¾ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨å®šã‚’変更ã§ãã¾ã™ã€‚" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/nl.json b/plugins/LeftMenu/lang/nl.json deleted file mode 100644 index f3dcf078a814ce92d6e32674d892a872d10003f7..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/nl.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Plaats het dashboard menu aan de linkerzijde", - "SettingsIntroduction": "De linkermenu plugin verplaatst indien ingeschakeld het menu van bovenaan de pagina naar links. Deze optie is vooral handig bij het gebruik van een groot scherm.", - "GlobalSettingTitle": "Linker menu standaard ingeschakeld", - "GlobalSettingDescription": "Definieert het systeem standaard voor al uw gebruikers.", - "GlobalSettingInlineHelp": "De gebruikers hebben de mogelijkheid om het linkermenu in of uit te schakelen los van de algemene instellingen.", - "UserSettingTitle": "Schakel het linker menu in.", - "UserSettingInlineHelp": "Dit zal het linkermenu alleen voor u en niet voor andere gebruikers inschakelen. Een Super User kan de standaard instelling voor alle gebruikers aanpassen." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pl.json b/plugins/LeftMenu/lang/pl.json deleted file mode 100644 index c75b2ea5d800936fa50ad410f05d655c63d67f74..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/pl.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "Menu po lewej stronie domyÅ›lnie wÅ‚Ä…czone", - "GlobalSettingDescription": "Definiuje domyÅ›lne systemu dla wszystkich użytkowników." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pt-br.json b/plugins/LeftMenu/lang/pt-br.json deleted file mode 100644 index 69c7444974d6cc909fc5f91c5ab65375637e6249..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/pt-br.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiciona o menu do painel de controle à esquerda.", - "SettingsIntroduction": "O plugin de menu lateral irá mover o menu de relatórios do topo para a esquerda, se habilitado. Isto é útil especialmente para telas de grandes proporções.", - "GlobalSettingTitle": "Menu lateral habilitado por padrão", - "GlobalSettingDescription": "Define o padrão do sistema para todos os usuários.", - "GlobalSettingInlineHelp": "Usuários podem habilitar ou desabilitar o menu lateral independentemente do padrão do sistema.", - "UserSettingTitle": "Habilitar o menu lateral de relatórios", - "UserSettingInlineHelp": "Isto irá habilitar ou desabilitar o menu lateral apenas para você, sem afetar nenhum outro usuário. Um superusuário poderá alterar o padrão para todos os usuários." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/pt.json b/plugins/LeftMenu/lang/pt.json deleted file mode 100644 index 787044a2ec73b2edaaa0a0e09485d78262a3c698..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/pt.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Posiçionar o painel do menu na esquerda.", - "SettingsIntroduction": "O plugin menu à esquerda irá mover o menu dos relatórios do topo à esquerda se estiver ativado. Isto é especialmente útil para grandes ecrãs.", - "GlobalSettingTitle": "Menu esquerdo ativo por padrão.", - "GlobalSettingDescription": "Definição do sistema padrão para todos os usuários.", - "GlobalSettingInlineHelp": "Os utilizadores são capazes de ativar ou desativar o menu na esquerda independentemente da preferência padrão do sistema.", - "UserSettingTitle": "Ative o menu relatório na esquerda.", - "UserSettingInlineHelp": "Isso irá ativar ou desativar o menu à esquerda apenas para ti e não afecta quaisquer outros utilizadores. Um super user pode alterar o padrão para todos os utilizadores." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ro.json b/plugins/LeftMenu/lang/ro.json deleted file mode 100644 index fa63c4cac6924772cbcee86f5cea59e6ea480ca0..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/ro.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Modulul meniului din stânga va muta meniul de raportare din partea de sus în partea stângă dacă este activat. Acesta este folositor în special în cazul ecranelor mari.", - "GlobalSettingTitle": "Meniul din stânnga este activat implicit", - "GlobalSettingDescription": "DefineÈ™te valoarea implicită pentru toÈ›i utilizatorii.", - "GlobalSettingInlineHelp": "Utilizatorii pot dezactiva\/activa meniul din stânga independet de valoare implicită.", - "UserSettingTitle": "Activează meniul de raportare din stânga", - "UserSettingInlineHelp": "Acesta va activa sau dezactiva meniul din stânga doar pentru dumneavoastra È™i nu va afecta alÈ›i utilizatori. Un Super Utilizator va putea schimba modul implicit pentru toÈ›i utilizatorii." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/ru.json b/plugins/LeftMenu/lang/ru.json deleted file mode 100644 index e0d825348b4165d89048efe2a07f1ac67b18f3c1..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/ru.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "ЕÑли включить плагин LeftMenu, он перемеÑтит главное меню Ñверху налево. Ðто будет удобно Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… Ñкранов.", - "GlobalSettingTitle": "Левое меню включено поумолчанию", - "GlobalSettingDescription": "ОпределÑет значение по умолчанию Ð´Ð»Ñ Ð²Ñех пользователей.", - "GlobalSettingInlineHelp": "Пользователи имеют возможноÑÑ‚ÑŒ отключить\/включить левое меню незавиÑимо от Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию.", - "UserSettingInlineHelp": "Ðто включает или отключает левое меню только Ð´Ð»Ñ Ð²Ð°Ñ Ð¸ не влиÑет на других пользователей. Суперпользователь может изменить наÑтройки по умолчанию Ð´Ð»Ñ Ð²Ñех пользователей." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/sr.json b/plugins/LeftMenu/lang/sr.json deleted file mode 100644 index e2aaa6bbc15094efafab9f1d5324c1c621b9f2ac..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/sr.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Postavi meni za konzolu na levu stranu.", - "SettingsIntroduction": "Dodatak za levi meni će pomeriti meni za izveÅ¡taje sa vrha na levu stranu. Ovo je praktiÄno od velikih monitora.", - "GlobalSettingTitle": "Levi meni je podrazumevano ukljuÄen", - "GlobalSettingDescription": "Postavljanje podrazumevanih vrednosti za sve korisnike.", - "GlobalSettingInlineHelp": "Korisnici mogu da ukljuÄuju i iskljuÄuju levi meni nezavisno od podrazumevanih sistemskih podeÅ¡avanja.", - "UserSettingTitle": "Omogući meni sa leve strane", - "UserSettingInlineHelp": "Ova opcija će ukljuÄiti ili iskljuÄiti meni sa leve strane samo za vas a ne i za ostale korisnike. Superkorisnik može da promeni podrazumevane vrednosti za sve korisnike." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/sv.json b/plugins/LeftMenu/lang/sv.json deleted file mode 100644 index aeaa07d522745808c8846454b1dfc699c5006212..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/sv.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "LeftMenu": { - "PluginDescription": "Placera menyn till vänster.", - "SettingsIntroduction": "Tillägget för vänstermeny kommer, ifall det är aktiverat, flytta rapportmenyn till den vänstra sidan. Detta är speciellt användbart för större skärmar.", - "GlobalSettingTitle": "Vänster meny aktiverad som standard", - "GlobalSettingDescription": "Definierar systemets standardinställning för alla dina användare.", - "GlobalSettingInlineHelp": "Användare har möjlighet att aktivera\/deaktivera vänstermenyn oavhängigt systeminställningarna.", - "UserSettingTitle": "Aktivera vänster rapporteringsmeny", - "UserSettingInlineHelp": "Detta kommer aktivera\/deaktivera för dig utan att pÃ¥verka andra användare. En Super User kan ändra inställningen för samtliga användare." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/tl.json b/plugins/LeftMenu/lang/tl.json deleted file mode 100644 index 2a6a0045b6e1bf8aa9d0cf975ca52e998b56d870..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/tl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "LeftMenu": { - "SettingsIntroduction": "Ang kaliwang menu na may plugin ay pwedeng ilipat ang menu kung saan makikita ang ulat mula sa taas papunta sa kaliwa kung ito ay gumagana. Ito ay lalong mapapakinabangan sa malalaking display.", - "GlobalSettingTitle": "Ang kaliwa menu ay gumagana bilang default", - "GlobalSettingDescription": "Tinutukoy ang default system para sa lahat ng iyong mga user.", - "GlobalSettingInlineHelp": "Ang user ay maari makapag pagana o hindi makapag pagana ng menu sa kaliwa na independent sa system default.", - "UserSettingTitle": "Pagahanin ang kaliwang menu na pang ulat", - "UserSettingInlineHelp": "Ang menu sa kaliwa ay pwede mong paganahin o wag paganahin at hindi maapektuhan ang ibang mga user. Ang Super User ay pwedeng baguhin ang lahat pangunahing pagpipilian sa lahat ng users." - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/tr.json b/plugins/LeftMenu/lang/tr.json deleted file mode 100644 index ab8dbb51d8aaeae02348223b37b180dc62bbe28c..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/tr.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "LeftMenu": { - "UserSettingTitle": "Sol raporlama menüsünü etkinleÅŸtir" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/lang/zh-cn.json b/plugins/LeftMenu/lang/zh-cn.json deleted file mode 100644 index fef3e18afd1c7c8a887f95bc3433ec6a480c66e2..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/lang/zh-cn.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "LeftMenu": { - "GlobalSettingTitle": "å·¦èœå•é»˜è®¤æ‰“å¼€", - "UserSettingTitle": "å¼€å¯å·¦è¾¹çš„报表èœå•" - } -} \ No newline at end of file diff --git a/plugins/LeftMenu/stylesheets/theme.less b/plugins/LeftMenu/stylesheets/theme.less deleted file mode 100644 index 6c15ee301e197ca1c29274eb4f6d7c51a03c80e4..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/stylesheets/theme.less +++ /dev/null @@ -1,150 +0,0 @@ -.leftMenuPlugin { - - #container { - clear: left; - } - - #root .Menu--dashboard { - border: 0px; - - > .Menu-tabList { - margin-left: 5px; - margin-bottom: 0; - margin-top: 0.1em; - border: 1px solid @theme-color-background-lowContrast; - } - - > li { - border-bottom: 1px solid @theme-color-background-lowContrast; - } - } - - #content.home { - padding-top: 15px; - display:inline-block; - width:100%; - } - - .Menu--dashboard { - padding: 0; - float: left; - width: 240px; - padding-top: 24px; - clear: left; - - > .Menu-tabList { - -moz-background-size: 5px 100%; - background-size: 5px 100%; - background-position: 0 0, 100% 0; - background-repeat: no-repeat; - - > li { - > ul { - min-height: 0; - max-height: 0; - padding: 0; - overflow: hidden; - position: static; - float: none; - } - - > span, - > a { - display: block; - padding: 5px 10px; - font-size: 18px; - line-height: 24px; - text-decoration: none; - float: none; - } - } - - > .sfActive > ul { - padding-bottom: 5px; - max-height: 500px; /* That's a hack for CSS transitions */ - } - - li { - list-style: none; - margin: 0; - float: none; - border: 0; - border-radius: 0; - background: transparent; - - a:hover { - text-decoration: underline; - } - - li { - float: none; - text-align: left; - - a { - text-decoration: none; - padding: 0.6em 0.9em; - font: 14px Arial, Helvetica, sans-serif; - display: block; - - &.current { - background: #defdbb; - } - - &:link, - &:visited { - text-decoration: none; - } - } - - } - } - - a { - height: auto; - } - - > .sfActive > a, - > li > a:hover { - background: #f1f1f1; - } - - > .sfActive .sfHover > a { - font-weight: bold; - } - } - } - - .top_controls { - clear: none; - left: 34px; - } - - .nav_sep { - display: none; - } - - .top_bar_sites_selector { - float: left; - } - - .pageWrap { - margin-left: 240px; - margin-top: 0; - max-height: none; - } - - .widget:first-child { - margin-top: 0; - } - - .sites_selector_in_dashboard { - margin-top: 0px; - margin-left: 5px; - } - - .sites_autocomplete .custom_select_main_link { - padding-top: 7px; - padding-bottom: 7px; - } - -} diff --git a/plugins/LeftMenu/tests/Integration/APITest.php b/plugins/LeftMenu/tests/Integration/APITest.php deleted file mode 100644 index c53616590592d62073ee27973dbaede60761a25e..0000000000000000000000000000000000000000 --- a/plugins/LeftMenu/tests/Integration/APITest.php +++ /dev/null @@ -1,149 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -namespace Piwik\Plugins\LeftMenu\tests\Integration; - -use Piwik\Plugins\LeftMenu\API; -use Piwik\Plugins\LeftMenu\Settings; -use Piwik\Tests\Framework\Mock\FakeAccess; -use Piwik\Tests\Framework\TestCase\IntegrationTestCase; - -/** - * @group LeftMenu - * @group APITest - * @group Plugins - */ -class APITest extends IntegrationTestCase -{ - /** - * @var API - */ - private $api; - - /** - * @var Settings - */ - private $settings; - - public function setUp() - { - parent::setUp(); - - $this->api = API::getInstance(); - $this->createSettings(); - } - - public function test_isEnabled_shouldReturnFalse_ByDefault() - { - $this->assertLeftMenuIsDisabled(); - - $this->setUser(); - $this->assertLeftMenuIsDisabled(); - - $this->setSuperUser(); - $this->assertLeftMenuIsDisabled(); - } - - public function test_isEnabled_shouldReturnTrue_IfEnabledSystemWideAndNoUserPreference() - { - $this->enableLeftMenuForAll(); - - $this->assertLeftMenuIsEnabled(); - - $this->setUser(); - $this->assertLeftMenuIsEnabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsEnabled(); - } - - public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultDisabled() - { - $this->assertLeftMenuIsDisabled(); - - $this->setUser(); - $this->setUserSettingValue('yes'); - - $this->assertLeftMenuIsEnabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsDisabled(); - } - - public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultEnabled() - { - $this->enableLeftMenuForAll(); - - $this->assertLeftMenuIsEnabled(); - - $this->setUser(); - $this->setUserSettingValue('no'); - - $this->assertLeftMenuIsDisabled(); - - $this->setAnonymous(); - $this->assertLeftMenuIsEnabled(); - } - - private function assertLeftMenuIsEnabled() - { - $this->assertTrue($this->api->isEnabled()); - } - - private function assertLeftMenuIsDisabled() - { - $this->assertFalse($this->api->isEnabled()); - } - - private function setSuperUser() - { - FakeAccess::$superUser = true; - FakeAccess::$superUserLogin = 'superUserLogin'; - - $this->createSettings(); - } - - private function setAnonymous() - { - FakeAccess::clearAccess(); - $this->createSettings(); - } - - private function setUser() - { - FakeAccess::$idSitesView = array(1); - FakeAccess::$identity = 'userLogin'; - - $this->createSettings(); - } - - private function enableLeftMenuForAll() - { - $this->setSuperUser(); - $this->settings->globalEnabled->setValue(true); - $this->settings->save(); - } - - private function createSettings() - { - $this->settings = new Settings('LeftMenu'); - } - - private function setUserSettingValue($value) - { - $this->settings->userEnabled->setValue($value); - $this->settings->save(); - } - - public function provideContainerConfig() - { - return array( - 'Piwik\Access' => new FakeAccess() - ); - } -} diff --git a/plugins/Live/stylesheets/live.less b/plugins/Live/stylesheets/live.less index a071c10f0aa65f4fd6f98365c222310c4b8f6b66..230893a741a02c08037683007ceecba55b08110e 100644 --- a/plugins/Live/stylesheets/live.less +++ b/plugins/Live/stylesheets/live.less @@ -251,11 +251,18 @@ a.visitor-log-visitor-profile-link { .action-list-action-icon { float:left; - margin-top:6px; margin-right:4px; &.event { - margin-top: 1px; + margin-top: 0; + } + &.outlink { + margin-top: 4px; + margin-right: 4px; + margin-left: 4px; + } + &.search { + margin-right: 4px; } } diff --git a/plugins/Live/templates/_actionsList.twig b/plugins/Live/templates/_actionsList.twig index 3d6f1a107518dd06a3aefcbf2cd11825006b8718..82f651d7d30cc1775c52dbda2b8d5bed50d7c29c 100644 --- a/plugins/Live/templates/_actionsList.twig +++ b/plugins/Live/templates/_actionsList.twig @@ -83,7 +83,7 @@ {% endif %} {% if action.siteSearchKeyword is defined %} {% if action.type == 'search' %} - <img src='{{ action.icon }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}' class="action-list-action-icon"> + <img src='{{ action.icon }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}' class="action-list-action-icon search"> {% endif %} <span class="truncated-text-line">{{ action.siteSearchKeyword }}</span> {% endif %} @@ -94,7 +94,7 @@ {% if action.url is not empty %} {% if action.type == 'action' and action.pageTitle|default(false) is not empty %}<p>{% endif %} {% if action.type == 'download' or action.type == 'outlink' %} - <img src='{{ action.icon }}' class="action-list-action-icon"> + <img src='{{ action.icon }}' class="action-list-action-icon {{ action.type }}"> {% endif %} {% if action.eventCategory|default(false) is not empty diff --git a/plugins/MobileMessaging/ReportRenderer/Sms.php b/plugins/MobileMessaging/ReportRenderer/Sms.php index f3c19d77b4e2947b88ff921f1044ef3912e87b8b..96b72912404bc985c0dd95dd2626a9d760d6f30c 100644 --- a/plugins/MobileMessaging/ReportRenderer/Sms.php +++ b/plugins/MobileMessaging/ReportRenderer/Sms.php @@ -95,7 +95,8 @@ class Sms extends ReportRenderer $evolutionMetrics, function ($value) use ($floatRegex) { $matched = preg_match($floatRegex, $value, $matches); - return $matched ? sprintf("%+d", $matches[0]) : $value; + $formatted = $matched ? sprintf("%+d", $matches[0]) : $value; + return \Piwik\NumberFormatter::getInstance()->formatPercentEvolution($formatted); } ) ); diff --git a/plugins/MobileMessaging/templates/SMSReport.twig b/plugins/MobileMessaging/templates/SMSReport.twig index 6c0d38f2cdadd522ed503616492c0053dd4b1b4a..09f41ece8076a1dc588ce6d71c08f6212a205336 100644 --- a/plugins/MobileMessaging/templates/SMSReport.twig +++ b/plugins/MobileMessaging/templates/SMSReport.twig @@ -11,33 +11,33 @@ {%- if displaySiteName -%}{{ rowMetrics.label|raw }}: {% endif -%} {# visits #} - {{- rowMetrics.nb_visits }} {{ 'General_ColumnNbVisits'|translate }} - {%- if rowMetrics.visits_evolution != 0 %} ({{ rowMetrics.visits_evolution }}%){%- endif -%} + {{- rowMetrics.nb_visits|number }} {{ 'General_ColumnNbVisits'|translate }} + {%- if rowMetrics.visits_evolution != 0 %} ({{ rowMetrics.visits_evolution|percentEvolution }}){%- endif -%} {%- if rowMetrics.nb_visits != 0 -%} {#- actions -#} - , {{ rowMetrics.nb_actions }} {{ 'General_ColumnNbActions'|translate }} - {%- if rowMetrics.actions_evolution != 0 %} ({{ rowMetrics.actions_evolution }}%){%- endif -%} + , {{ rowMetrics.nb_actions|number }} {{ 'General_ColumnNbActions'|translate }} + {%- if rowMetrics.actions_evolution != 0 %} ({{ rowMetrics.actions_evolution|percentEvolution }}){%- endif -%} {%- if isGoalPluginEnabled -%} {# goal metrics #} {%- if rowMetrics.nb_conversions != 0 -%} , {{ 'General_ColumnRevenue'|translate }}: {{ rowMetrics.revenue|raw }} - {%- if rowMetrics.revenue_evolution != 0 %} ({{ rowMetrics.revenue_evolution }}%){%- endif -%} + {%- if rowMetrics.revenue_evolution != 0 %} ({{ rowMetrics.revenue_evolution|percentEvolution }}){%- endif -%} - , {{ rowMetrics.nb_conversions }} {{ 'Goals_GoalConversions'|translate }} - {%- if rowMetrics.nb_conversions_evolution != 0 %} ({{ rowMetrics.nb_conversions_evolution }}%){%- endif -%} + , {{ rowMetrics.nb_conversions|number }} {{ 'Goals_GoalConversions'|translate }} + {%- if rowMetrics.nb_conversions_evolution != 0 %} ({{ rowMetrics.nb_conversions_evolution|percentEvolution }}){%- endif -%} {%- endif -%} {# eCommerce metrics #} {%- if siteHasECommerce[rowMetadata.idsite] -%} , {{ 'General_ProductRevenue'|translate }}: {{ rowMetrics.ecommerce_revenue|raw }} - {%- if rowMetrics.ecommerce_revenue_evolution != 0 %} ({{ rowMetrics.ecommerce_revenue_evolution }}%){%- endif -%} + {%- if rowMetrics.ecommerce_revenue_evolution != 0 %} ({{ rowMetrics.ecommerce_revenue_evolution|percentEvolution }}){%- endif -%} - , {{ rowMetrics.orders }} {{ 'General_EcommerceOrders'|translate }} - {%- if rowMetrics.orders_evolution != 0 %} ({{ rowMetrics.orders_evolution }}%){%- endif -%} + , {{ rowMetrics.orders|number }} {{ 'General_EcommerceOrders'|translate }} + {%- if rowMetrics.orders_evolution != 0 %} ({{ rowMetrics.orders_evolution|percentEvolution }}){%- endif -%} {%- endif -%} {%- endif -%} diff --git a/plugins/Morpheus/Menu.php b/plugins/Morpheus/Menu.php index 740263e3818629977f8e8a8294974e1f5e33a3f2..c2bd081cdfc3cc2c1da31e46849713e46afcbc53 100644 --- a/plugins/Morpheus/Menu.php +++ b/plugins/Morpheus/Menu.php @@ -17,12 +17,23 @@ class Menu extends \Piwik\Plugin\Menu { public function configureAdminMenu(MenuAdmin $menu) { + $menu->registerMenuIcon('CoreAdminHome_MenuDevelopment', 'icon-admin-development'); + $menu->registerMenuIcon('CoreAdminHome_MenuDiagnostic', 'icon-admin-diagnostic'); + $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-admin-platform'); + $menu->registerMenuIcon('General_Settings', 'icon-admin-settings'); + $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-admin-administration'); + if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) { $menu->addDevelopmentItem('UI Demo', $this->urlForAction('demo')); } } + public function configureUserMenu(MenuUser $menu) { + $menu->registerMenuIcon('UsersManager_MenuPersonal', 'icon-user-personal'); + $menu->registerMenuIcon('CoreAdminHome_MenuManage', 'icon-user-manage'); + $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-user-platform'); + if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) { $menu->addPlatformItem('UI Demo', $this->urlForAction('demo'), $order = 15); } diff --git a/plugins/Morpheus/fonts/piwik.eot b/plugins/Morpheus/fonts/piwik.eot old mode 100644 new mode 100755 index bd41afad9edb7d1ea2aa18ac9b0b38e047a5082a..3bda40841acba8c6ab0a9fa6808758a9135b4e7f Binary files a/plugins/Morpheus/fonts/piwik.eot and b/plugins/Morpheus/fonts/piwik.eot differ diff --git a/plugins/Morpheus/fonts/piwik.ttf b/plugins/Morpheus/fonts/piwik.ttf old mode 100644 new mode 100755 index c81d69e10c28ed59c451ad46f2579a98e269dbb9..7887145303ba8702d9a7b59d1bfc9467cc7990bf Binary files a/plugins/Morpheus/fonts/piwik.ttf and b/plugins/Morpheus/fonts/piwik.ttf differ diff --git a/plugins/Morpheus/images/logo.svg b/plugins/Morpheus/images/logo.svg index d288e2072ec8f068fde88771531a55324440990e..8c0be81ce932426e9169e37e655e6fbce869d646 100644 --- a/plugins/Morpheus/images/logo.svg +++ b/plugins/Morpheus/images/logo.svg @@ -3,22 +3,22 @@ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="170.666px" height="45.704px" viewBox="0 0 170.666 45.704" enable-background="new 0 0 170.666 45.704" xml:space="preserve"> -<path fill="#D42A1F" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345 +<path fill="#d4291f" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345 c-0.592-2.071-2.441-3.417-4.477-3.492c-0.103-0.009-0.203-0.004-0.306-0.007c-0.102,0.003-0.203-0.003-0.306,0.007 c-2.036,0.075-3.885,1.421-4.477,3.492l-5.509,19.27l-5.509-19.27c-0.737-2.578-3.418-4.068-5.987-3.329 c-2.57,0.739-4.056,3.428-3.319,6.005l10.075,35.24c0.583,2.038,2.384,3.376,4.382,3.49c0.121,0.011,0.239,0.006,0.359,0.008 c0.12-0.002,0.238,0.004,0.359-0.008c1.998-0.114,3.799-1.451,4.382-3.49l5.551-19.416l5.551,19.416 c0.588,2.056,2.416,3.398,4.434,3.491c0.111,0.01,0.219,0.005,0.33,0.007c0.11-0.003,0.219,0.003,0.33-0.007 c2.019-0.093,3.846-1.435,4.434-3.491l10.075-35.24C111.05,4.444,109.564,1.756,106.995,1.016z"/> -<path fill="#D42A1F" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147 +<path fill="#d4291f" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147 c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44z"/> -<path fill="#D42A1F" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164 +<path fill="#d4291f" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164 c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.457z"/> -<path fill="#D42A1F" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0 +<path fill="#d4291f" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0 l-16.448,16.448V6.147c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44c0,2.972,2.35,5.322,5.322,5.322 c2.972,0,5.322-2.35,5.322-5.322v-7.544l2.669-2.669l13.618,13.857c1.957,1.992,5.079,2.019,7.071,0.062 c1.992-1.957,2.019-5.079,0.062-7.071L155.406,23.156z"/> -<path fill="#D42A1F" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177 +<path fill="#d4291f" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177 c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322v-7.63h11.371l-0.007-0.036 C30.505,32.372,37.292,25.396,37.292,16.816z M20.296,23.284l0-0.002h-9.651V10.491h9.464c3.535,0,6.401,2.866,6.401,6.401 C26.51,20.364,23.744,23.184,20.296,23.284z"/> diff --git a/plugins/Morpheus/images/signout.png b/plugins/Morpheus/images/signout.png new file mode 100644 index 0000000000000000000000000000000000000000..2d377ddf984d5b85c735cccb8c4a022da40df07e Binary files /dev/null and b/plugins/Morpheus/images/signout.png differ diff --git a/plugins/Morpheus/javascripts/piwikHelper.js b/plugins/Morpheus/javascripts/piwikHelper.js index a8048c9b51fd0d9e01d85872a38823464bd205ae..1e413fba146c82ee76563e6e14296037ca271621 100644 --- a/plugins/Morpheus/javascripts/piwikHelper.js +++ b/plugins/Morpheus/javascripts/piwikHelper.js @@ -125,7 +125,8 @@ var piwikHelper = { compileAngularComponents: function (selector) { var $element = $(selector); - if (!$element || !$element.length) { + if (!$element.length) { + return; } @@ -135,6 +136,18 @@ var piwikHelper = { }); }, + /** + * Detection works currently only for directives defining an isolated scope. Functionality might need to be + * extended if needed. Under circumstances you might call this method before calling compileAngularComponents() + * to avoid compiling the same element twice. + * @param selector + */ + isAlreadyCompiledAngularComponent: function (selector) { + var $element = $(selector); + + return ($element.length && $element.hasClass('ng-isolate-scope')); + }, + /** * Displays a Modal dialog. Text will be taken from the DOM node domSelector. * Given callback handles will be mapped to the buttons having a role attriute diff --git a/plugins/Morpheus/stylesheets/base/colors.less b/plugins/Morpheus/stylesheets/base/colors.less index 21ac03438df44f2f265188b80f7bea3e5474aee7..89ec7ff92dbbaa430c9be4c766e9220d6016202f 100644 --- a/plugins/Morpheus/stylesheets/base/colors.less +++ b/plugins/Morpheus/stylesheets/base/colors.less @@ -42,4 +42,3 @@ Qualitative data color series inspired from colorbrewer2.org/ next ones could be: #cab2d6 #ffff99 # #b2df8a */ - diff --git a/plugins/Morpheus/stylesheets/base/icons.css b/plugins/Morpheus/stylesheets/base/icons.css index 3424d8a65501d146980c2117e812250c0ccc2380..d11c5592e3ab19e9e61b7382aa4236f1db5e6824 100644 --- a/plugins/Morpheus/stylesheets/base/icons.css +++ b/plugins/Morpheus/stylesheets/base/icons.css @@ -26,27 +26,15 @@ .icon-alien:before { content: "\e600"; } -.icon-add:before { - content: "\e630"; -} .icon-annotation:before { content: "\e601"; } -.icon-arrow-bottom:before { - content: "\e63b"; -} -.icon-arrow-collapsed:before { - content: "\e60b"; -} .icon-arrow-left:before { content: "\e602"; } .icon-arrow-right:before { content: "\e603"; } -.icon-arrow-top:before { - content: "\e63a"; -} .icon-business:before { content: "\e604"; } @@ -56,24 +44,30 @@ .icon-chart-bar:before { content: "\e606"; } -.icon-chart-line:before { - content: "\e608"; -} .icon-chart-line-details:before { content: "\e607"; } +.icon-chart-line:before { + content: "\e608"; +} .icon-chart-pie:before { content: "\e609"; } .icon-close:before { content: "\e60a"; } -.icon-code:before { - content: "\e620"; +.icon-arrow-collapsed:before { + content: "\e60b"; } .icon-configure:before { content: "\e60c"; } +.icon-datepicker-arr-l:before { + content: "\e60d"; +} +.icon-datepicker-arr-r:before { + content: "\e60e"; +} .icon-delete:before { content: "\e60f"; } @@ -92,9 +86,6 @@ .icon-ecommerce-order:before { content: "\e614"; } -.icon-edit:before { - content: "\e622"; -} .icon-email:before { content: "\e615"; } @@ -110,26 +101,32 @@ .icon-finance:before { content: "\e619"; } -.icon-folder:before { - content: "\e61b"; -} .icon-folder-charts:before { content: "\e61a"; } +.icon-folder:before { + content: "\e61b"; +} .icon-fullscreen:before { content: "\e61c"; } .icon-goal:before { content: "\e61d"; } +.icon-help-alt:before { + content: "\e61e"; +} .icon-help:before { content: "\e61f"; } -.icon-help-alt:before { - content: "\e61e"; +.icon-code:before { + content: "\e620"; } -.icon-hide:before { - content: "\e638"; +.icon-warning:before { + content: "\e621"; +} +.icon-edit:before { + content: "\e622"; } .icon-image:before { content: "\e623"; @@ -140,13 +137,13 @@ .icon-insights:before { content: "\e625"; } -.icon-locked:before { - content: "\e627"; -} .icon-locked-2:before { content: "\e626"; } .icon-locked-3:before { + content: "\e627"; +} +.icon-locked:before { content: "\e628"; } .icon-locked-4:before { @@ -170,12 +167,12 @@ .icon-open-source:before { content: "\e62f"; } -.icon-play:before { - content: "\e643"; -} .icon-plus:before { content: "\e630"; } +.icon-add:before { + content: "\e630"; +} .icon-puzzle:before { content: "\e631"; } @@ -191,48 +188,115 @@ .icon-segment:before { content: "\e635"; } -.icon-server:before { - content: "\e637"; +.icon-users:before { + content: "\e635"; } .icon-server-alt:before { content: "\e636"; } +.icon-server:before { + content: "\e637"; +} +.icon-hide:before { + content: "\e638"; +} .icon-show:before { content: "\e639"; } +.icon-arrow-top:before { + content: "\e63a"; +} +.icon-arrow-bottom:before { + content: "\e63b"; +} .icon-star:before { content: "\e63c"; } .icon-success:before { content: "\e63d"; } -.icon-table:before { - content: "\e63f"; -} .icon-table-more:before { content: "\e63e"; } +.icon-table:before { + content: "\e63f"; +} .icon-tag-cloud:before { content: "\e640"; } -.icon-user:before { - content: "\e642"; -} .icon-user-add:before { content: "\e641"; } -.icon-users:before { - content: "\e635"; +.icon-user:before { + content: "\e642"; +} +.icon-play:before { + content: "\e643"; } .icon-visitor-profile:before { content: "\e644"; } -.icon-warning:before { - content: "\e621"; -} .icon-zoom-in:before { content: "\e645"; } .icon-zoom-out:before { content: "\e646"; } +.icon-sign-out:before { + content: "\e647"; +} +.icon-sign-in:before { + content: "\e648"; +} +.icon-menu-hamburger:before { + content: "\e649"; +} +.icon-more-horiz:before { + content: "\e64a"; +} +.icon-more-verti:before { + content: "\e64b"; +} +.icon-admin-administration:before { + content: "\e64c"; +} +.icon-admin-development:before { + content: "\e64d"; +} +.icon-admin-diagnostic:before { + content: "\e64e"; +} +.icon-admin-platform:before { + content: "\e64f"; +} +.icon-admin-settings:before { + content: "\e650"; +} +.icon-reporting-actions:before { + content: "\e651"; +} +.icon-reporting-dashboard:before { + content: "\e652"; +} +.icon-reporting-ecommerce:before { + content: "\e653"; +} +.icon-reporting-goal:before { + content: "\e654"; +} +.icon-reporting-referer:before { + content: "\e655"; +} +.icon-reporting-visitors:before { + content: "\e656"; +} +.icon-user-manage:before { + content: "\e657"; +} +.icon-user-personal:before { + content: "\e658"; +} +.icon-user-platform:before { + content: "\e659"; +} + diff --git a/plugins/Morpheus/stylesheets/base/mixins.less b/plugins/Morpheus/stylesheets/base/mixins.less index c9b6f5345d08283835d1abb2a51d3f3c1cceb582..2558a1446997ba3e86b8bc3cd47518119ccabcda 100644 --- a/plugins/Morpheus/stylesheets/base/mixins.less +++ b/plugins/Morpheus/stylesheets/base/mixins.less @@ -3,7 +3,7 @@ &:after { content: ""; display: table; - clear: both; + clear: right; } &:before { content: ""; diff --git a/plugins/Morpheus/stylesheets/general/_admin.less b/plugins/Morpheus/stylesheets/general/_admin.less index 1f81d7797f5437fedd5503f3614612ec3e0cd9a0..c0f34c5e2d2b9a87161c0c112e2e07e4c86cc0ea 100644 --- a/plugins/Morpheus/stylesheets/general/_admin.less +++ b/plugins/Morpheus/stylesheets/general/_admin.less @@ -1,39 +1,3 @@ -.Menu--admin { - .Menu-tabList { - .border-radius(0px); - border-color: @theme-color-background-lowContrast; - background-image: none; - padding-left: 0; - border-top: 0; - > li:first-child span { - border-bottom: 3px solid @theme-color-brand; - } - > li { - padding-bottom: 0px; - > span { - color: @theme-color-text; - .font-default(18px, 26px); - border-top: 1px solid @theme-color-background-lowContrast; - border-bottom: 1px solid @theme-color-background-lowContrast; - padding: 12px 15px; - } - ul { - background-color: @theme-color-menu-contrast-background; - - li { - a { - color: @theme-color-text-lighter !important; - padding: 0.8em 1.1em; - &:hover { - color: @theme-color-text; - text-decoration: none; - } - } - } - } - } - } -} .ui-state-highlight { border-color: @color-silver-l80 !important; @@ -52,26 +16,12 @@ cursor: pointer; min-height: 30px; } - - .sites_autocomplete { - position: static !important; - } } .sites_autocomplete { vertical-align: middle; } -#loadingError { - color: @theme-color-brand; - font-weight: normal; -} - -.sites_autocomplete .custom_select .custom_select_block .custom_select_container .custom_select_ul_list { - margin-top: 5px; - padding-bottom: 0; -} - .adminTable a { color: @theme-color-link; } diff --git a/plugins/Morpheus/stylesheets/general/_forms.less b/plugins/Morpheus/stylesheets/general/_forms.less index 49c5358f1d02d687089f155f4e170a585b555377..dcbe261807d02cc97f53a48ef642b580af602199 100644 --- a/plugins/Morpheus/stylesheets/general/_forms.less +++ b/plugins/Morpheus/stylesheets/general/_forms.less @@ -139,6 +139,7 @@ select { } .top_bar_sites_selector { + z-index: 143; .sites_autocomplete .custom_select { z-index: 139; } @@ -148,30 +149,6 @@ select { input { min-height: 0; } - .custom_select { - border-color: @theme-color-background-lowContrast; - .border-radius(0px); - background: @theme-color-background-base; - padding: 0; - color: @theme-color-text; - text-transform: uppercase; - .font-default(10px, 12px); - min-height: 30px; - .box-sizing(border-box); - a { - color: @theme-color-text; - &:hover { - text-decoration: none; - } - } - .custom_select_block { - .custom_select_container { - .custom_select_ul_list { - margin-top: 20px; - } - } - } - } } .ajaxError { @@ -184,19 +161,6 @@ select { font-weight: normal; } -.sites_autocomplete--dropdown { - .custom_select_main_link:not(.loading):before { - color: @theme-color-brand; - font-size: 0.7em; - top: 4px; - right: 10px; - content: ''; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 5px solid @theme-color-brand; - } -} - .limitSelection { > ul { position: relative; diff --git a/plugins/Morpheus/stylesheets/ieonly.css b/plugins/Morpheus/stylesheets/ieonly.css index 234631ce716159555cd1297156bdd61d2fcbed93..45523c856afddb7c47b2b68b82fc4b58889cde75 100644 --- a/plugins/Morpheus/stylesheets/ieonly.css +++ b/plugins/Morpheus/stylesheets/ieonly.css @@ -11,14 +11,10 @@ overflow: hidden; } -#topBars { +#topLeftBar { z-index: 300!important; } -.sites_autocomplete, .sites_autocomplete .custom_select { - z-index: 200!important; -} - .submit { height: 30px; } diff --git a/plugins/Morpheus/stylesheets/main.less b/plugins/Morpheus/stylesheets/main.less index 699fb1d159c25a48638a6ce17df8f15b136642dc..3bbe2602f5480d3f8329a90574224bd430f34111 100644 --- a/plugins/Morpheus/stylesheets/main.less +++ b/plugins/Morpheus/stylesheets/main.less @@ -72,110 +72,6 @@ table.entityTable tr td a:hover { #root { margin: 0 0 100px 0; padding: 0; - - #header { - margin: 0 15px; - #topBars { - a { - color: @theme-color-link; - text-decoration: none; - } - } - - .topBarElem { - padding: 0 3px; - color: @theme-color-text-lighter; - strong { - font-weight: normal; - color: @theme-color-text; - } - } - } - - .top_bar_sites_selector { - margin-right: 10px; - label { - padding-top: 9px; - .font-default(13px, 15px); - } - } - - .Menu--dashboard { - border-top: 1px solid @theme-color-background-lowContrast; - border-bottom: 0px; - > .Menu-tabList { - margin: 0; - a { - .font-default(18px, 22px); - padding: 14px 28px 11px; - } - > li { - .border-radius(0px); - border: 0; - background: none; - border-right: 1px solid @theme-color-background-lowContrast; - margin-bottom: -1px; - border-bottom: 0px; - - > ul { - li { - a { - color: @theme-color-menu-contrast-text; - .font-default(15px, 18px); - padding: 14px 22px 11px; - } - - &:hover, - &.sfHover { - a { - color: @theme-color-menu-contrast-textActive; - font-weight: normal; - } - - } - } - } - - &.sfActive { - > a { - color: @theme-color-text; - text-decoration: none; - position: relative; - &:after { - content: ''; - position: absolute; - bottom: -3px; - left: 0; - width: 100%; - height: 4px; - background: @theme-color-brand; - } - } - - } - - &.sfHover { - > a { - border: 0; - text-decoration: none; - color: @theme-color-text; - } - } - } - } - } - - .nav_sep { - background: @theme-color-menu-contrast-background; - min-height: 57px; - .border-radius(0px); - border-color: @theme-color-background-lowContrast !important; - border-top: 0px !important; - border-right: 0px !important; - border-left: 0px !important; - box-shadow: inset 0 2px 4px #d8d8d8; - } - .widgetize { width: auto; } @@ -186,9 +82,7 @@ table.entityTable tr td a:hover { border: 1px solid @theme-color-background-lowContrast; background: @theme-color-background-base; z-index: 10; - padding: 8px 10px 8px 10px; .border-radius(0px); - .font-default(10px, 12px); > span { position: relative; background: none; @@ -197,15 +91,16 @@ table.entityTable tr td a:hover { content: ''; border-left: 4px solid transparent; border-right: 4px solid transparent; - border-top: 5px solid @theme-color-brand; + border-top: 5px solid @color-silver-l20; position: absolute; top: 3px; - right: 0; + right: 7px; } } ul.submenu { margin-left: 0; + padding-right: 0; li { list-style-type: none; > div { @@ -236,24 +131,15 @@ table.entityTable tr td a:hover { .segmentEditorPanel { border: 1px solid @theme-color-background-lowContrast; background: @theme-color-background-base; - padding: 8px 10px 8px 10px; .border-radius(0px); - .segmentationTitle { - background: url(plugins/Morpheus/images/segment-users.png) no-repeat right 0; - text-transform: uppercase; - .font-default(10px, 12px); - position: relative; - } .dropdown-body { background:@theme-color-background-base; - padding:0 10px; + padding: 8px 19px 0; .border-radius(0px); - border: 1px solid @color-silver-l80; border-top-width: 0px; } &:hover .dropdown-body { background:@theme-color-background-base; - border-color: @color-silver-l80; } .segmentationContainer { > span > strong { @@ -299,32 +185,37 @@ table.entityTable tr td a:hover { /* Iframed Embed dashboard style */ #standalone { - #Dashboard:hover ul { - background: #f1f0eb; - border-color: #a9a399; - } - #Dashboard { - ul { + position: relative; - background: @theme-color-background-base; - border: 1px solid @color-silver-l80; - padding: 8px 10px 8px 10px; + &:hover ul { + background-color: @theme-color-background-base; + } + ul { + padding: 0 19px; color: @theme-color-text-light; - height: 30px; + min-height: 33px; line-height:0.5em; .border-radius(0px); + border: 0; + background-color: @theme-color-background-base; + } + > ul > li { + white-space: nowrap; + margin-right: 0px; + a { + padding-left: 0; + } + &.active { + a { + color: @theme-color-menu-contrast-textActive; + } + } } > ul > li:hover, - > ul > li:hover a, - > ul > li.sfHover, - > ul > li.sfHover a { + > ul > li:hover a { color: @theme-color-brand; } - > ul > li.sfHover, - > ul > li.sfHover a { - font-weight: normal; - } } } @@ -335,13 +226,17 @@ table.entityTable tr td a:hover { text-decoration: none; display: block; width: 100%; + margin-top: 14px; +} + +.rss li:first-child .rss-title { + margin-top: 0; } .rss-date { display: block; color: @color-silver-l60; - .font-default(11px, 14px); - margin-top: 15px; + .font-default(11px, 26px); } .rss-description { @@ -865,7 +760,7 @@ div.sparkline { #piwik-promo-share { border: 0px; - background: #f2f2f2; + background: @theme-color-background-tinyContrast; .font-default(10px, 16px); } @@ -877,13 +772,13 @@ tr:hover #token_auth { background: #FFFFF7; } -// previous style overrides -#header_message a { +#header_message .dropdown a, +#header_message #updateCheckLinkContainer:hover { text-decoration: underline; } -#header_message a:hover { - text-decoration: none; +#header_message #updateCheckLinkContainer:hover { + cursor: pointer; } #multisites table.dataTable { diff --git a/plugins/Morpheus/stylesheets/theme.less b/plugins/Morpheus/stylesheets/theme.less index 371b50183078a9cbe3446acfdb93b45e95793b9e..97eb216d2fa05fcf3f37ea64854ff8237ed106bf 100644 --- a/plugins/Morpheus/stylesheets/theme.less +++ b/plugins/Morpheus/stylesheets/theme.less @@ -12,8 +12,8 @@ @theme-color-link: @color-blue-piwik; @theme-color-base-series: #ee3024; -@theme-color-menu-contrast-text: @theme-color-text-lighter; -@theme-color-menu-contrast-textActive: @theme-color-text; +@theme-color-menu-contrast-text: @theme-color-text; +@theme-color-menu-contrast-textActive: @theme-color-brand; @theme-color-menu-contrast-background: @theme-color-background-tinyContrast; @theme-color-widget-title-text: @theme-color-text; diff --git a/plugins/Morpheus/stylesheets/ui/_components.less b/plugins/Morpheus/stylesheets/ui/_components.less index e9e9b8bc46bb623c29d185b58236030c4f94908e..630fda6fa6ab0c81cec0b93d8a1ec3bc50bb33dd 100644 --- a/plugins/Morpheus/stylesheets/ui/_components.less +++ b/plugins/Morpheus/stylesheets/ui/_components.less @@ -45,20 +45,15 @@ .segment-element { background: @color-white; border-color: @color-silver-l80; + line-height: 1.33; .segment-add-row { .border-radius(5px); } - .segment-nav { - h4.visits { - background: url('plugins/Morpheus/images/segment-users.png') no-repeat 3px 0px; - } - } - .custom_select_search { input { - margin-top: -10px; + margin-top: 1px; } } @@ -96,13 +91,13 @@ li { padding: 3px 0; &:hover { - background: #f2f2f2; + background: @theme-color-background-tinyContrast; border: 0; padding: 4px 0 3px; a { border: 0; - background-color: #f2f2f2; + background-color: @theme-color-background-tinyContrast; padding-right: 15px; } @@ -129,11 +124,13 @@ } a.dropdown { + display: inline; color: @theme-color-text; background: url('plugins/Morpheus/images/sort_subtable_desc.png') 100% -2px no-repeat; &.ui-autocomplete-input { background-position: 100% -2px; } + .font-default(10px, 12px); } } .segment-footer { @@ -155,25 +152,12 @@ } #periodString { - border: 1px solid @theme-color-background-lowContrast; - .border-radius(0px); - background: @theme-color-background-base; - &:hover { - background: @theme-color-background-base; - border-color: @color-silver-l80; - } - select { min-height: 0; background-position: 140%; padding-left: 5px; } - .calendar-icon { - width: 17px; - height: 17px; - } - label.selected-period-label { text-decoration: none !important; } @@ -191,34 +175,17 @@ } } } - - #date { - .border-radius(0px); - padding: 8px 10px; - color: @theme-color-text-lighter; - text-transform: uppercase; - .font-default(10px, 12px); - - strong { - color: @theme-color-text; - - } - } } #header_message { - border: 1px solid @theme-color-background-lowContrast; - padding: 8px 10px 8px 10px; height: auto; - background: @theme-color-background-base; .border-radius(0px); - .header_short { - .font-default(10px, 12px); - text-transform: uppercase; - } - .header_full { - .font-default(12px, 18px); + &.isPiwikDemo { + text-align: right; + position: absolute; + right: 0; + top: 8px; } } @@ -235,7 +202,7 @@ .loadingPiwikBelow, .loadingPiwik { - .font-default(10px, 12px); + .font-default(13px, 13px); color: @color-silver-l60; font-weight: normal; } @@ -256,7 +223,7 @@ .border-radius(6px); h2 { - background: #f2f2f2; + background: @theme-color-background-tinyContrast; border-bottom: 1px solid @color-gray; padding: 11px 15px 10px; } diff --git a/plugins/Morpheus/stylesheets/uibase/_header.less b/plugins/Morpheus/stylesheets/uibase/_header.less index b96b1b467ab94bf2d6667389a39f28b41b0e6cb7..ff7fd45ff23dfbec5949380059b13aba0e0115f7 100644 --- a/plugins/Morpheus/stylesheets/uibase/_header.less +++ b/plugins/Morpheus/stylesheets/uibase/_header.less @@ -1,28 +1,18 @@ -#header { - min-height: 60px; -} - -/* Clear fix */ -#header:after { - display: table; - clear: both; - content: ""; -} #root { #logo { - padding: 5px 0 0; + padding: 9px 0 0 4px; float: left; } #logo { img.default-piwik-logo { width: 82px; - margin-top: 14px; + margin-top: 8px; } img { - max-height: 50px; + max-height: 30px; } } @@ -53,23 +43,3 @@ padding: 15px; clear: both; } - -#topBars { - right: 0px; - position: absolute; - padding-left: 110px; - color: #acacac; - margin: 4px 10px 8px; - font-size: 13px; - z-index: 140; -} - -#topRightBar { - margin-bottom: 4px; - float: right; -} - -.topBarElem { - padding: 0 5px; - display: inline-block; -} diff --git a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less index 41cdc726b99a93fecbec2dbabce44e3b342d058f..1922c721a8f81934879b9af060e22309416a64f7 100644 --- a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less +++ b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less @@ -2,15 +2,21 @@ #header_message { z-index: 0; cursor: default; - position: absolute; - right: 0px; + float: right; overflow: hidden; display: block; height: 20px; - line-height: 20px; - padding: 5px 8px 5px 38px; font-size: 14px; border-radius: 4px; + + &.update_available .title { + color: #CA8100; + font-weight: bold; + } + + .icon-warning { + padding-left: 2px; + } } #header_message:hover, @@ -44,24 +50,6 @@ line-height: 1.7em; } -/* Orange alerts box */ -.header_alert { - background: #FFFDF7 url(plugins/Morpheus/images/ico_alert.png) no-repeat 7px 4px; - border: 1px solid #FF7F00; - font-weight: bold; -} - -.header_alert, -.header_alert a { - color: #FF7F00; -} - -/* Blue info box */ -.header_info { - background: #FAFAFA url(plugins/Morpheus/images/ico_info.png) no-repeat 7px 4px; - border: 1px solid #CBD9EB; -} - .header_info, .header_info a { color: @theme-color-text-light; } diff --git a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less index 032516350e2d98a26cd3d148db132f7a2c95324c..6161506aa8656a0cf75eaf186adf831125a5d37e 100644 --- a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less +++ b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less @@ -4,4 +4,21 @@ .items { margin-left: -50px; } + + .borderedControl { + transition: box-shadow 0s !important; + } +} + +#topRightBar .navbar-right .languageSelection { + // make padding of language selection clickable + margin: -14px -12px; + + .title { + padding: 14px 12px; + &:after { + top: 19px; + right: -3px; + } + } } \ No newline at end of file diff --git a/plugins/Morpheus/stylesheets/uibase/_loading.less b/plugins/Morpheus/stylesheets/uibase/_loading.less index e68d0f0a696b24b9a3249bf415f4e4566dde9466..e57e3d0a6d6c98e8b0059656ffba48fb9741c23d 100644 --- a/plugins/Morpheus/stylesheets/uibase/_loading.less +++ b/plugins/Morpheus/stylesheets/uibase/_loading.less @@ -9,17 +9,16 @@ } .loadingSegment { - color: grey; - font-size: 10pt; + color: @color-silver-l60; + font-size: 13px; margin-left: 28px; display:none; } #loadingError { - font-weight: bold; - font-size: 1.1em; - color: #F88D22; - padding: 0.5em; + font-size: 15px; + padding: 8px 0; display: none; - padding-top: 40px; + color: @theme-color-brand; + font-weight: normal; } \ No newline at end of file diff --git a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less index 767a2a70a1011e916ac9321880ed77e3de65a385..83c21f79993ea8ca2806e687fe3530cc07de1c2e 100644 --- a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less +++ b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less @@ -3,8 +3,6 @@ color: @theme-color-text-light; font-size: 14px; border: 1px solid #e4e5e4; - padding: 5px 30px 6px 10px; - border-radius: 4px; float: left; margin-right: 10px; position: absolute; @@ -22,23 +20,12 @@ height: 15px; display:inline-block; position:absolute; - right:9px; - top:7px; + right: 19px; + top: 9px; background: url("plugins/Morpheus/images/icon-calendar.gif") no-repeat scroll; cursor:pointer; } -#periodString #date{ - cursor:pointer; - padding:5px 10px 6px 10px; - margin:-5px -10px -6px -10px; -} - -#periodString #date img { - vertical-align: middle; - margin: 0 0 0 6px; -} - #periodString strong { color: #255792; } @@ -49,8 +36,6 @@ } #periodMore { - padding: 6px 0 0 0; - display: none; overflow: hidden; } @@ -62,7 +47,7 @@ #periodString .period-type { float: left; - padding: 0 20px 0 0; + padding: 0; } #periodString .period-type label { diff --git a/plugins/Morpheus/templates/_jsGlobalVariables.twig b/plugins/Morpheus/templates/_jsGlobalVariables.twig index 35643089eae36c081f7aab52be9d8a02ca3f284b..9acb9bebbb3c0bd100a5f43ab5691c0c5e0db0c4 100644 --- a/plugins/Morpheus/templates/_jsGlobalVariables.twig +++ b/plugins/Morpheus/templates/_jsGlobalVariables.twig @@ -3,6 +3,18 @@ piwik.token_auth = "{{ token_auth }}"; piwik.piwik_url = "{{ piwikUrl }}"; piwik.cacheBuster = "{{ cacheBuster }}"; + + piwik.numbers = { + patternNumber: "{{ 'Intl_NumberFormatNumber'|translate }}", + patternPercent: "{{ 'Intl_NumberFormatPercent'|translate }}", + patternCurrency: "{{ 'Intl_NumberFormatCurrency'|translate }}", + symbolPlus: "{{ 'Intl_NumberSymbolPlus'|translate }}", + symbolMinus: "{{ 'Intl_NumberSymbolMinus'|translate }}", + symbolPercent: "{{ 'Intl_NumberSymbolPercent'|translate }}", + symbolGroup: "{{ 'Intl_NumberSymbolGroup'|translate }}", + symbolDecimal: "{{ 'Intl_NumberSymbolDecimal'|translate }}" + }; + {% if userLogin %}piwik.userLogin = "{{ userLogin|e('js')}}";{% endif %} {% if idSite is defined %}piwik.idSite = "{{ idSite }}";{% endif %} diff --git a/plugins/Morpheus/templates/_piwikTag.twig b/plugins/Morpheus/templates/_piwikTag.twig deleted file mode 100644 index 101cb5dca7d08fe42300998a880c705ac8f39d12..0000000000000000000000000000000000000000 --- a/plugins/Morpheus/templates/_piwikTag.twig +++ /dev/null @@ -1,30 +0,0 @@ -{# Disabled by default, tracks activity of this Piwik instance #} - -{% if (piwikUrl == 'http://demo.piwik.org/' or enableMeasurePiwikForSiteId) %} - <div class="clear"></div> - <!-- Piwik --> - <script type="text/javascript"> - var _paq = _paq || []; - _paq.push(['setTrackerUrl', 'piwik.php']); - _paq.push(['setSiteId', {{ enableMeasurePiwikForSiteId }}]); - _paq.push(['setCookieDomain', '*.piwik.org']); - // set the domain the visitor landed on, in the Custom Variable - _paq.push([function () { - if (!this.getCustomVariable(1)) { - this.setCustomVariable(1, "Domain landed", document.domain); - } - }]); - // Set the selected Piwik language in a custom var - _paq.push(['setCustomVariable', 2, "Demo language", piwik.languageName]); - _paq.push(['setDocumentTitle', document.domain + "/" + document.title]); - _paq.push(['trackPageView']); - _paq.push(['enableLinkTracking', true]); - _paq.push(['enableJSErrorTracking']); - - (function() { - var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; - g.type='text/javascript'; g.async=true; g.defer=true; g.src='js/piwik.js'; s.parentNode.insertBefore(g,s); - })(); - </script> - <!-- End Piwik Code --> -{% endif %} diff --git a/plugins/Morpheus/templates/admin.twig b/plugins/Morpheus/templates/admin.twig index c51e3d378cdcb51c43e778b559625cbc891d8712..348cd71f72cb17d8fd52959a4e88e199ed3bd44d 100644 --- a/plugins/Morpheus/templates/admin.twig +++ b/plugins/Morpheus/templates/admin.twig @@ -22,27 +22,37 @@ {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} {{ postEvent("Template.beforeContent", "admin", currentModule) }} - <div id="container"> + <div class="page"> {% if showMenu is not defined or showMenu %} - {% include "@CoreAdminHome/_menu.twig" %} + {% import '@CoreHome/_menu.twig' as menu %} + {{ menu.menu(adminMenu, false, 'Menu--admin', currentModule, currentAction) }} {% endif %} - <div id="content" class="admin"> + <div class="pageWrap"> - {% include "@CoreHome/_headerMessage.twig" %} - {% include "@CoreHome/_notifications.twig" %} + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} - <div class="ui-confirm" id="alert"> - <h2></h2> - <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + {% include "@CoreHome/_headerMessage.twig" %} </div> - {% include "@CoreHome/_warningInvalidHost.twig" %} + <div class="admin" id="content"> + {% include "@CoreHome/_notifications.twig" %} + {% include "@CoreHome/_warningInvalidHost.twig" %} - {% block content %} - {% endblock %} + <div class="ui-confirm" id="alert"> + <h2></h2> + <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + </div> + {% block content %} + {% endblock %} + + </div> </div> </div> + + {% endblock %} diff --git a/plugins/Morpheus/templates/dashboard.twig b/plugins/Morpheus/templates/dashboard.twig index 08230e0e9be6e44709a09376983ef283f6722c6b..c9feafebe6ed708bd27d599ab7623a99becb9172 100644 --- a/plugins/Morpheus/templates/dashboard.twig +++ b/plugins/Morpheus/templates/dashboard.twig @@ -23,10 +23,6 @@ {% include "@CoreHome/_warningInvalidHost.twig" %} {% include "@CoreHome/_topScreen.twig" %} - {% block notification %} - {% include "@CoreHome/_notifications.twig" %} - {% endblock %} - <div class="ui-confirm" id="alert"> <h2></h2> <input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/> @@ -34,6 +30,37 @@ {{ postEvent("Template.beforeContent", "dashboard", currentModule) }} - {% block content %} - {% endblock %} + <div class="page"> + + {% if showMenu is defined and showMenu %} + <div id="secondNavBar" class="Menu--dashboard"> + <div id="search"> + <div piwik-quick-access class="borderedControl"></div> + </div> + <div piwik-reporting-menu></div> + </div> + {% endif %} + + <div class="pageWrap"> + + <a name="main"></a> + + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} + </div> + + {% block notification %} + {% include "@CoreHome/_notifications.twig" %} + {% endblock %} + + <div piwik-popover></div> + + {% block content %} + {% endblock %} + + <div class="clear"></div> + </div> + + </div> {% endblock %} diff --git a/plugins/Morpheus/templates/demo.twig b/plugins/Morpheus/templates/demo.twig index 0995add8c3d765db840333d9008e08c05958571c..51cdc9e86f09b099c70af1426ff066184b4d7c01 100644 --- a/plugins/Morpheus/templates/demo.twig +++ b/plugins/Morpheus/templates/demo.twig @@ -497,6 +497,9 @@ 'show', 'hide', 'search', + 'menu-hamburger', + 'more-horiz', + 'more-verti' ], 'Window-Widget': [ 'minimise', @@ -570,6 +573,8 @@ 'server-alt', 'tag-cloud', 'play', + 'sign-in', + 'sign-out' ], }; diff --git a/plugins/Morpheus/templates/layout.twig b/plugins/Morpheus/templates/layout.twig index ec57b81b6e5f3955f183a322ddceda5f2528807e..2229ba2ac74719283044c5a0d791bcf14fe7a4ae 100644 --- a/plugins/Morpheus/templates/layout.twig +++ b/plugins/Morpheus/templates/layout.twig @@ -22,7 +22,6 @@ {% include "@CoreHome/_favicon.twig" %} {% include "_jsGlobalVariables.twig" %} - {% include "_piwikTag.twig" %} {% include "_jsCssIncludes.twig" %} <!--[if IE]> @@ -48,5 +47,6 @@ {% endblock %} + {% include "@CoreHome/_adblockDetect.twig" %} </body> </html> diff --git a/plugins/Morpheus/templates/settingsMacros.twig b/plugins/Morpheus/templates/settingsMacros.twig index cbb410f4a523bed4b774e0fab6fefda51da22165..19a88bfa28554f1d24122de4a899faf904e11255 100644 --- a/plugins/Morpheus/templates/settingsMacros.twig +++ b/plugins/Morpheus/templates/settingsMacros.twig @@ -5,7 +5,7 @@ <div class="form-group"> {% if setting.introduction %} - <p>{{ setting.introduction }}</p> + <p class="settingIntroduction">{{ setting.introduction }}</p> {% endif %} {{ _self.field(setting, index) }} diff --git a/plugins/Morpheus/templates/user.twig b/plugins/Morpheus/templates/user.twig index 416f12e11678d5b58dc4b7f3d3e830f3598c1921..39710e2bb2e769c4c158e30cb3c545c87c1c3e3f 100644 --- a/plugins/Morpheus/templates/user.twig +++ b/plugins/Morpheus/templates/user.twig @@ -6,7 +6,7 @@ {% block body %} {% if userIsAnonymous %} - {% set topMenuModule = 'Feedback' %} + {% set topMenuModule = 'ScheduledReports' %} {% set topMenuAction = 'index' %} {% else %} {% if currentModule != 'Feedback' %} @@ -24,24 +24,33 @@ {{ ajax.requestErrorDiv(emailSuperUser|default('')) }} {{ postEvent("Template.beforeContent", "user", currentModule) }} - <div id="container"> + <div class="page"> {% if showMenu is not defined or showMenu %} - {% include "@CoreHome/_userMenu.twig" %} + {% import '@CoreHome/_menu.twig' as menu %} + {{ menu.menu(userMenu, false, 'Menu--admin', currentModule, currentAction) }} {% endif %} - <div id="content" class="admin user"> + <div class="pageWrap"> - {% include "@CoreHome/_notifications.twig" %} - - <div class="ui-confirm" id="alert"> - <h2></h2> - <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + <div class="top_controls"> + {% block topcontrols %} + {% endblock %} </div> - {% block content %} - {% endblock %} + <div id="content" class="admin user"> + + {% include "@CoreHome/_notifications.twig" %} + + <div class="ui-confirm" id="alert"> + <h2></h2> + <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/> + </div> + {% block content %} + {% endblock %} + + </div> </div> </div> {% endblock %} diff --git a/plugins/MultiSites/Dashboard.php b/plugins/MultiSites/Dashboard.php index b364482d902d071040541f10868883a2cc24f62e..a9032b6fd31a0ea122fd90aea192b13d9ba5320c 100644 --- a/plugins/MultiSites/Dashboard.php +++ b/plugins/MultiSites/Dashboard.php @@ -12,6 +12,7 @@ use Piwik\API\DataTablePostProcessor; use Piwik\API\ResponseBuilder; use Piwik\Config; use Piwik\Metrics\Formatter; +use Piwik\NumberFormatter; use Piwik\Period; use Piwik\DataTable; use Piwik\DataTable\Row; @@ -35,6 +36,12 @@ class Dashboard */ private $numSites = 0; + /** + * Array of metrics that will be displayed and will be number formatted + * @var array + */ + private $displayedMetricColumns = array('nb_visits', 'nb_pageviews', 'nb_actions', 'revenue'); + /** * @param string $period * @param string $date @@ -44,7 +51,7 @@ class Dashboard { $sites = API::getInstance()->getAll($period, $date, $segment, $_restrictSitesToLogin = false, $enhanced = true, $searchTerm = false, - $showColumns = array('nb_visits', 'nb_pageviews', 'nb_actions', 'revenue')); + $this->displayedMetricColumns); $sites->deleteRow(DataTable::ID_SUMMARY_ROW); /** @var DataTable $pastData */ @@ -98,15 +105,32 @@ class Dashboard public function getTotals() { - return array( + $totals = array( 'nb_pageviews' => $this->sitesByGroup->getMetadata('total_nb_pageviews'), 'nb_visits' => $this->sitesByGroup->getMetadata('total_nb_visits'), 'nb_actions' => $this->sitesByGroup->getMetadata('total_nb_actions'), 'revenue' => $this->sitesByGroup->getMetadata('total_revenue'), 'nb_visits_lastdate' => $this->sitesByGroup->getMetadata('total_nb_visits_lastdate') ? : 0, ); + $this->formatMetrics($totals); + return $totals; + } + + private function formatMetrics(&$metrics) + { + $formatter = new NumberFormatter(); + foreach($metrics as $metricName => &$value) { + if(in_array($metricName, $this->displayedMetricColumns)) { + + if( strpos($metricName, 'revenue') !== false) { + continue; + } + $value = $formatter->format($value); + } + } } + public function getNumSites() { return $this->numSites; @@ -312,6 +336,8 @@ class Dashboard $site['revenue'] = $formatter->getPrettyMoney($site['revenue'], $site['idsite']); } $site['main_url'] = Site::getMainUrlFor($site['idsite']); + + $this->formatMetrics($site); } return $sites; diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less index 99683c088f0f940cb753653e93151fc040f2e7ae..a200b3d626a9c28abf12d4d13ee6386c10dcb531 100644 --- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less +++ b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less @@ -3,6 +3,12 @@ font-size: 15px; } +.widget { + #multisites { + padding: 15px; + } +} + #multisites { border: 0; padding: 0 15px; @@ -10,6 +16,7 @@ h2 { border-bottom: 0px; + font-size: 24px; } .notification-error { @@ -79,10 +86,6 @@ } } - .top_controls { - height: 10px; - } - th:first-child { text-align:left; } diff --git a/plugins/MultiSites/templates/getSitesInfo.twig b/plugins/MultiSites/templates/getSitesInfo.twig index d1bdb81df054e4ac8b433be40c7405d5c0a1c4fd..94d13ee702a84b40b3cb55ce8a84e740344b62f4 100644 --- a/plugins/MultiSites/templates/getSitesInfo.twig +++ b/plugins/MultiSites/templates/getSitesInfo.twig @@ -1,14 +1,15 @@ {% extends isWidgetized ? 'empty.twig' : 'dashboard.twig' %} -{% block content %} -{% if not isWidgetized %} - <div class="top_controls"> +{% block topcontrols %} + {% if not isWidgetized %} {% include "@CoreHome/_periodSelect.twig" %} {% include "@CoreHome/_headerMessage.twig" %} - </div> -{% endif %} + {% endif %} +{% endblock %} + +{% block content %} +<div class="container" id="multisites"> -<div class="pageWrap container" id="multisites"> <div id="main"> <div piwik-multisites-dashboard display-revenue-column="{% if displayRevenueColumn %}true{% else %}false{%endif%}" diff --git a/plugins/MultiSites/tests/Integration/DashboardTest.php b/plugins/MultiSites/tests/Integration/DashboardTest.php index ca59b119d59332abc21e820359d78d846ac1cb78..7c79ce93e98d4fee0ba033bbe68ec146328a62b4 100644 --- a/plugins/MultiSites/tests/Integration/DashboardTest.php +++ b/plugins/MultiSites/tests/Integration/DashboardTest.php @@ -13,6 +13,7 @@ use Piwik\Period; use Piwik\Plugins\MultiSites\Dashboard; use Piwik\Tests\Framework\Fixture; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; +use Piwik\Translate; /** * @group MultiSites @@ -37,6 +38,8 @@ class DashboardTest extends IntegrationTestCase Fixture::createWebsite('2012-12-12 00:00:00', $ecommerce = 0, 'Site ' . $i); } + Translate::loadAllTranslations(); + $this->dashboard = $this->getMockBuilder('Piwik\Plugins\MultiSites\Dashboard') ->setMethods(null) ->disableOriginalConstructor() diff --git a/plugins/Overlay/stylesheets/overlay.css b/plugins/Overlay/stylesheets/overlay.css index d3db1a5126361043561c009c030627f5a0f04acd..4e30660775036addd2274c0ebe53360a7eb96364 100644 --- a/plugins/Overlay/stylesheets/overlay.css +++ b/plugins/Overlay/stylesheets/overlay.css @@ -23,7 +23,7 @@ a#overlayTitle { font-size: 12px; text-decoration: none; color: #4d4d4d; - margin-left: 15px; + margin-left: 10px; } a#overlayTitle .icon-help { margin-left: 4px; @@ -146,10 +146,16 @@ body .ui-tooltip.overlayTooltip { font-weight: bold; } -#topBars { +.navbar .navbar-right { + display: none; +} + +.top_controls { display: none; } .overlay-sidebar-container { width: 220px; + margin-left: -16px; + margin-top: 10px; } diff --git a/plugins/Referrers/Categories/ReferrersCategory.php b/plugins/Referrers/Categories/ReferrersCategory.php index 34c8f053bacc61bbce1f07e72be36316e676e6e3..bde0c76699c383111a7ccb46be42e664db839914 100644 --- a/plugins/Referrers/Categories/ReferrersCategory.php +++ b/plugins/Referrers/Categories/ReferrersCategory.php @@ -14,4 +14,5 @@ class ReferrersCategory extends Category { protected $id = 'Referrers_Referrers'; protected $order = 15; + protected $icon = 'icon-reporting-referer'; } diff --git a/plugins/Referrers/Controller.php b/plugins/Referrers/Controller.php index 2e1deea6afab69130dba4f9cd5fab7397ee7e538..8c0320eb47c555fb9af74e64754afca3fd2cb904 100644 --- a/plugins/Referrers/Controller.php +++ b/plugins/Referrers/Controller.php @@ -13,6 +13,7 @@ use Piwik\Common; use Piwik\DataTable\Filter\CalculateEvolutionFilter; use Piwik\DataTable\Map; use Piwik\Metrics; +use Piwik\NumberFormatter; use Piwik\Period\Range; use Piwik\Piwik; use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines; @@ -499,13 +500,16 @@ function DisplayTopKeywords($url = "") $currentValue = $currentValues[$name]; $evolutionName = $name . 'Evolution'; + $currentValueFormatted = NumberFormatter::getInstance()->format($currentValue); + $pastValueFormatted = NumberFormatter::getInstance()->format($pastValue); + $currentValues[$evolutionName] = array( 'currentValue' => $currentValue, 'pastValue' => $pastValue, 'tooltip' => Piwik::translate('General_EvolutionSummaryGeneric', array( - Piwik::translate('General_NVisits', $currentValue), + Piwik::translate('General_NVisits', $currentValueFormatted), $date, - Piwik::translate('General_NVisits', $pastValue), + Piwik::translate('General_NVisits', $pastValueFormatted), $lastPeriodDate, CalculateEvolutionFilter::calculate($currentValue, $pastValue, $precision = 1) )) diff --git a/plugins/Referrers/lang/bg.json b/plugins/Referrers/lang/bg.json index 937703c8e324a9505b1073f05ee906bcf8887c4d..886aaa52a30a15d062a687a21027f59e3e617001 100644 --- a/plugins/Referrers/lang/bg.json +++ b/plugins/Referrers/lang/bg.json @@ -45,6 +45,6 @@ "WidgetGetAll": "Ð’Ñички препоръчители", "WidgetSocials": "СпиÑък на Ñоциалните мрежи", "WidgetTopKeywordsForPages": "Ðай-използваните ключови думи", - "XPercentOfVisits": "%s%% от поÑещениÑ" + "XPercentOfVisits": "%s от поÑещениÑ" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/cs.json b/plugins/Referrers/lang/cs.json index f9640a6869c382d634b6b888492fb9cb5386a7a5..740d25a38bcfa3ea547dd2978887ebb97421235e 100644 --- a/plugins/Referrers/lang/cs.json +++ b/plugins/Referrers/lang/cs.json @@ -50,6 +50,6 @@ "WidgetGetAll": "VÅ¡echny referrery", "WidgetSocials": "Seznam sociálnÃch sÃtÃ", "WidgetTopKeywordsForPages": "NejÄastÄ›jÅ¡Ã klÃÄová slova pro URL stránky", - "XPercentOfVisits": "%s%% návÅ¡tÄ›v" + "XPercentOfVisits": "%s návÅ¡tÄ›v" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/da.json b/plugins/Referrers/lang/da.json index e48a828521c0324fe33708f3a1b1b9ba186e2308..3701ba19422d050005142298ee921f843922fee6 100644 --- a/plugins/Referrers/lang/da.json +++ b/plugins/Referrers/lang/da.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Alle henvisninger", "WidgetSocials": "Liste af sociale netværk", "WidgetTopKeywordsForPages": "Top søgeord til side URL", - "XPercentOfVisits": "%s%% af besøg" + "XPercentOfVisits": "%s af besøg" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/de.json b/plugins/Referrers/lang/de.json index f1aebccedcbd4909f81a3934b5e295fa770839d5..ea22dcfc620920092b241ec7140cc627b509242c 100644 --- a/plugins/Referrers/lang/de.json +++ b/plugins/Referrers/lang/de.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Alle Verweise", "WidgetSocials": "Liste Sozialer Netzwerke", "WidgetTopKeywordsForPages": "Top-Suchbegriffe für Seiten-URL", - "XPercentOfVisits": "%s%% aller Besuche" + "XPercentOfVisits": "%s aller Besuche" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/el.json b/plugins/Referrers/lang/el.json index d6533c4c68e6f8553bc5abeb205e2e1cb9ba338a..ec0a844319e8b91219f75904dc7163f72b02795d 100644 --- a/plugins/Referrers/lang/el.json +++ b/plugins/Referrers/lang/el.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Όλες οι ΠαÏαπομπÎÏ‚", "WidgetSocials": "Λίστα κοινωνικών δικτÏων", "WidgetTopKeywordsForPages": "ΔημοφιλÎστεÏες ΛÎξεις-Κλειδιά για τη ΔιεÏθυνση URL της σελίδας", - "XPercentOfVisits": "%s%% των επισκÎψεων" + "XPercentOfVisits": "%s των επισκÎψεων" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/en.json b/plugins/Referrers/lang/en.json index 1d3355299686a0e1e2e495854c4948df74e7cb28..14f106b9d0449145529bec1af8583663e437e152 100644 --- a/plugins/Referrers/lang/en.json +++ b/plugins/Referrers/lang/en.json @@ -50,6 +50,6 @@ "WidgetGetAll": "All Referrers", "WidgetSocials": "List of social networks", "WidgetTopKeywordsForPages": "Top Keywords for Page URL", - "XPercentOfVisits": "%s%% of visits" + "XPercentOfVisits": "%s of visits" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/es.json b/plugins/Referrers/lang/es.json index 32c8cb3a7bca73f066d78eb1ebdfd8add65d5bc2..9d38b45cc830a6c5cbd6f7f46b0db68f8fbadda0 100644 --- a/plugins/Referrers/lang/es.json +++ b/plugins/Referrers/lang/es.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Todas las referencias", "WidgetSocials": "Lista de redes sociales", "WidgetTopKeywordsForPages": "Principales palabras clave para el URL de página", - "XPercentOfVisits": "%s%% de visitas" + "XPercentOfVisits": "%s de visitas" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/et.json b/plugins/Referrers/lang/et.json index f2d0d0dc8a2232ac0cb972023d6c22eea81ba1a4..a91f3185bc1fa343b1c4625938934a6274c3b410 100644 --- a/plugins/Referrers/lang/et.json +++ b/plugins/Referrers/lang/et.json @@ -29,6 +29,6 @@ "WidgetGetAll": "Kõik viitajad", "WidgetSocials": "Nimekiri sotsiaalvõrgustikest", "WidgetTopKeywordsForPages": "Lehe URL peamised võtmesõnad", - "XPercentOfVisits": "%s%% külastustest" + "XPercentOfVisits": "%s külastustest" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/fi.json b/plugins/Referrers/lang/fi.json index 8131fe33a816b0f072b7a1e87f6cc7c9ceaf4156..7e2ac0ed16a96ea54bd400fd867960d03f8e0569 100644 --- a/plugins/Referrers/lang/fi.json +++ b/plugins/Referrers/lang/fi.json @@ -48,6 +48,6 @@ "WidgetGetAll": "Kaikki viittaukset", "WidgetSocials": "Sosiaalisten verkostojen lista", "WidgetTopKeywordsForPages": "Käytetyimmät avainsanat sivun URL:lle", - "XPercentOfVisits": "%s%% kävijöistä" + "XPercentOfVisits": "%s kävijöistä" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/fr.json b/plugins/Referrers/lang/fr.json index ff7aa07f750a284cd23b8b5a238a4341111e965e..864f8b31a36b8709a09b3ea9bf71d977126e3d7f 100644 --- a/plugins/Referrers/lang/fr.json +++ b/plugins/Referrers/lang/fr.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Tous les référents", "WidgetSocials": "Liste des réseaux sociaux", "WidgetTopKeywordsForPages": "Meilleurs mots-clés pour l'URL", - "XPercentOfVisits": "%s%% des visites" + "XPercentOfVisits": "%s des visites" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/it.json b/plugins/Referrers/lang/it.json index 94396a0dcd91bd1a5b794be18fafbec99a5671a8..5343975d95ab959551011aede0667d5e617e14af 100644 --- a/plugins/Referrers/lang/it.json +++ b/plugins/Referrers/lang/it.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Tutti i Referenti", "WidgetSocials": "Elenco di social network", "WidgetTopKeywordsForPages": "Top Keyword per URL Pagina", - "XPercentOfVisits": "%s%% di visite" + "XPercentOfVisits": "%s di visite" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/ja.json b/plugins/Referrers/lang/ja.json index db6978a8f1ac5b2065ef19c4531a37bd590e5dec..f5b1e178a432b7ae0e73b86397239a555db1ca51 100644 --- a/plugins/Referrers/lang/ja.json +++ b/plugins/Referrers/lang/ja.json @@ -50,6 +50,6 @@ "WidgetGetAll": "å…¨å‚照元", "WidgetSocials": "ソーシャルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã®ãƒªã‚¹ãƒˆ", "WidgetTopKeywordsForPages": "ページ URL ã®ãƒˆãƒƒãƒ—ã‚ーワード", - "XPercentOfVisits": "訪å•ã® %s%%" + "XPercentOfVisits": "訪å•ã® %s" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/nb.json b/plugins/Referrers/lang/nb.json index ee64f7ba5ab6ba6c8ea18e6b77f946e6cfb10018..c521750718359dc7f1d1e0f9e40a5ce1bce8e328 100644 --- a/plugins/Referrers/lang/nb.json +++ b/plugins/Referrers/lang/nb.json @@ -32,6 +32,6 @@ "WidgetExternalWebsites": "Liste over eksterne nettsteder", "WidgetGetAll": "Alle henvisere", "WidgetSocials": "Liste over sosiale nettverk", - "XPercentOfVisits": "%s%% av besøk" + "XPercentOfVisits": "%s av besøk" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/nl.json b/plugins/Referrers/lang/nl.json index 90630685820d8ed5f5a1f6de650f6a2d1fd26f7a..648c1f51a13f433dadf8f9e7dc588e5f648d56a8 100644 --- a/plugins/Referrers/lang/nl.json +++ b/plugins/Referrers/lang/nl.json @@ -47,6 +47,6 @@ "WidgetGetAll": "Alle Referers", "WidgetSocials": "Lijst van sociale netwerken", "WidgetTopKeywordsForPages": "Top sleutelwoorden voor pagina URL", - "XPercentOfVisits": "%s%% van de bezoeken" + "XPercentOfVisits": "%s van de bezoeken" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/pt-br.json b/plugins/Referrers/lang/pt-br.json index 64174e7f01248ee4b6d09212d927639531baafca..7204ca60696bd9dfd4b2e42d0182f18fc33d4cf8 100644 --- a/plugins/Referrers/lang/pt-br.json +++ b/plugins/Referrers/lang/pt-br.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Todos os Referenciadores", "WidgetSocials": "Lista de redes sociais", "WidgetTopKeywordsForPages": "Principais Palavras-chave para a URL da página", - "XPercentOfVisits": "%s%% de visitas" + "XPercentOfVisits": "%s de visitas" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/ro.json b/plugins/Referrers/lang/ro.json index bd6b9f538f46c4f39cf1a4279d08b003b13ce19b..ea2c7aec8260cd33a566e3bf70f3b88aa2fe3342 100644 --- a/plugins/Referrers/lang/ro.json +++ b/plugins/Referrers/lang/ro.json @@ -48,6 +48,6 @@ "WidgetGetAll": "Toti Referalii", "WidgetSocials": "Listă de reÅ£ele sociale", "WidgetTopKeywordsForPages": "Cuvinte cheie de top pentru URL-ul paginii", - "XPercentOfVisits": "%s%% de vizite" + "XPercentOfVisits": "%s de vizite" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/ru.json b/plugins/Referrers/lang/ru.json index 50dd18267de0a6258aac8afa490ce9fe1538ffe4..1a93015fc251db68d8baf90dafcbf3c16c894399 100644 --- a/plugins/Referrers/lang/ru.json +++ b/plugins/Referrers/lang/ru.json @@ -48,6 +48,6 @@ "WidgetGetAll": "Ð’Ñе иÑточники трафика", "WidgetSocials": "СпиÑок Ñоциальных Ñетей", "WidgetTopKeywordsForPages": "Топ ключевых Ñлов Ð´Ð»Ñ Ñтраницы URL", - "XPercentOfVisits": "%s%% поÑещений" + "XPercentOfVisits": "%s поÑещений" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/sr.json b/plugins/Referrers/lang/sr.json index 20949babe97c2aa195c945c5220081e3c41ecdd0..1766549e627eef10928f65663b11177177ca8bee 100644 --- a/plugins/Referrers/lang/sr.json +++ b/plugins/Referrers/lang/sr.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Sve reference", "WidgetSocials": "Spisak druÅ¡tvenih mreža", "WidgetTopKeywordsForPages": "Najbolje kljuÄne reÄi za URL", - "XPercentOfVisits": "%s%% poseta" + "XPercentOfVisits": "%s poseta" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/sv.json b/plugins/Referrers/lang/sv.json index 3deca310064be949ae67c21d7fa5645168410873..99319376dd613a56d7bf860412aff378e66b2534 100644 --- a/plugins/Referrers/lang/sv.json +++ b/plugins/Referrers/lang/sv.json @@ -50,6 +50,6 @@ "WidgetGetAll": "Alla hänvisningar", "WidgetSocials": "Lista över sociala nätverk", "WidgetTopKeywordsForPages": "Toppnyckelord för sid-URL", - "XPercentOfVisits": "%s%% av besökare" + "XPercentOfVisits": "%s av besökare" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/tl.json b/plugins/Referrers/lang/tl.json index bd973da30aed571c6ab50d3afe8a5bc6126cb58b..cd2b2f5adc009ec3e0d649fe4178d15cf31b219d 100644 --- a/plugins/Referrers/lang/tl.json +++ b/plugins/Referrers/lang/tl.json @@ -48,6 +48,6 @@ "WidgetGetAll": "Lahat ng mga Referrer", "WidgetSocials": "Listahan ng mga social network", "WidgetTopKeywordsForPages": "Nangungunang mga keyword para sa URL ng Pahina", - "XPercentOfVisits": "%s%% ng mga pagbisita" + "XPercentOfVisits": "%s ng mga pagbisita" } } \ No newline at end of file diff --git a/plugins/Referrers/lang/zh-cn.json b/plugins/Referrers/lang/zh-cn.json index 7fdef3a5f02784f40e92a7188efc1f9cd84d3d2a..983f89210b0c4381b3bd26d11dd23ddefac240ef 100644 --- a/plugins/Referrers/lang/zh-cn.json +++ b/plugins/Referrers/lang/zh-cn.json @@ -50,6 +50,6 @@ "WidgetGetAll": "所有æ¥æº", "WidgetSocials": "社交网络", "WidgetTopKeywordsForPages": "主è¦å…³é”®è¯", - "XPercentOfVisits": "%s%% 个访问" + "XPercentOfVisits": "%s 个访问" } } \ No newline at end of file diff --git a/plugins/Resolution/Resolution.php b/plugins/Resolution/Resolution.php index 5ab7692ccf6e1e54dad7d05b5bd7cdacd1079e0b..7bd8cc3be00b5233b3c5ee0c4ef1da304b506c55 100644 --- a/plugins/Resolution/Resolution.php +++ b/plugins/Resolution/Resolution.php @@ -23,6 +23,7 @@ class Resolution extends \Piwik\Plugin { return array( 'Live.getAllVisitorDetails' => 'extendVisitorDetails', + 'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction', ); } @@ -32,4 +33,11 @@ class Resolution extends \Piwik\Plugin $visitor['resolution'] = $instance->getResolution(); } + + public function renameUserSettingsModuleAndAction(&$module, &$action) + { + if ($module == 'UserSettings' && ($action == 'getResolution' || $action == 'getConfiguration')) { + $module = 'Resolution'; + } + } } diff --git a/plugins/Resolution/tests/System/UserSettingsBCTest.php b/plugins/Resolution/tests/System/UserSettingsBCTest.php new file mode 100644 index 0000000000000000000000000000000000000000..beae888701e876c87dae8d8ce73a964b5ae24cb9 --- /dev/null +++ b/plugins/Resolution/tests/System/UserSettingsBCTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\Resolution\tests\System; + +use Piwik\Tests\Fixtures\OneVisitorTwoVisits; +use Piwik\Tests\Framework\TestCase\SystemTestCase; + +/** + * @group Resolution + * @group Resolution_System + */ +class UserSettingsBCTest extends SystemTestCase +{ + /** + * @var OneVisitorTwoVisits + */ + public static $fixture; + + /** + * @dataProvider getApiForTesting + */ + public function test_Api($api, $params) + { + $this->runApiTests($api, $params); + } + + public function getApiForTesting() + { + $idSite = self::$fixture->idSite; + $dateTime = self::$fixture->dateTime; + + $api = array( + 'UserSettings.getResolution', + 'UserSettings.getConfiguration', + ); + + $result = array(); + + + foreach ($api as $method) { + list($module, $action) = explode('.', $method); + + // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing + // against Resolution & overwrite the module & action w/ otherRequestParameters) + $result[] = array('Resolution.getResolution', array('idSite' => $idSite, + 'date' => $dateTime, + 'periods' => array('day'), + 'testSuffix' => $module . '_' . $method . '_', + 'otherRequestParameters' => array( + 'method' => $method, + ), + )); + + // api metadata tests + $result[] = array('API.getMetadata', array( + 'idSite' => $idSite, + 'date' => $dateTime, + 'apiModule' => $module, + 'apiAction' => $action, + 'testSuffix' => $module . '_' . $method . '_', + )); + } + + return $result; + } + + public static function getPathToTestDirectory() + { + return dirname(__FILE__); + } +} + +UserSettingsBCTest::$fixture = new OneVisitorTwoVisits(); \ No newline at end of file diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..01fee599156f98159f2594eec541d8c5037b418b --- /dev/null +++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Settings</category> + <name>Visitor Configuration</name> + <module>Resolution</module> + <action>getConfiguration</action> + <dimension>Configuration</dimension> + <documentation>This report shows the most common overall configurations that your visitors had. A configuration is the combination of an operating system, a browser type and a screen resolution.</documentation> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Resolution&apiAction=getConfiguration&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Resolution&apiAction=getConfiguration&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>Resolution_getConfiguration</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..a4804d3e5dc7b6e50bdb9f2bf97b69f410f9ae8e --- /dev/null +++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>Windows / Firefox / 1024x768</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + </row> +</result> \ No newline at end of file diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..b99815c5574ee9a9157e168b4dc15153deefb832 --- /dev/null +++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Settings</category> + <name>Screen Resolution</name> + <module>Resolution</module> + <action>getResolution</action> + <dimension>Resolution</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Resolution&apiAction=getResolution&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Resolution&apiAction=getResolution&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>Resolution_getResolution</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..2d976569580c5522bf1a049765be128e69cea26b --- /dev/null +++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>1024x768</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>resolution==1024x768</segment> + </row> +</result> \ No newline at end of file diff --git a/plugins/SEO/Metric/Aggregator.php b/plugins/SEO/Metric/Aggregator.php index bdaf430000e1009453a93f18e9c302afac093be7..ef3c93e6063a203a44faf1a5b7eafd542f803c3e 100644 --- a/plugins/SEO/Metric/Aggregator.php +++ b/plugins/SEO/Metric/Aggregator.php @@ -50,7 +50,6 @@ class Aggregator implements MetricsProvider $container->get('Piwik\Plugins\SEO\Metric\Bing'), $container->get('Piwik\Plugins\SEO\Metric\Alexa'), $container->get('Piwik\Plugins\SEO\Metric\DomainAge'), - $container->get('Piwik\Plugins\SEO\Metric\Majestic'), $container->get('Piwik\Plugins\SEO\Metric\Dmoz'), ); diff --git a/plugins/SEO/Metric/Alexa.php b/plugins/SEO/Metric/Alexa.php index d9ec0209543f3e90d2220438caa97b156b05e934..87c5785d366f23111338a8ccacfc8a8bf97350c1 100644 --- a/plugins/SEO/Metric/Alexa.php +++ b/plugins/SEO/Metric/Alexa.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\SEO\Metric; use Piwik\Http; +use Piwik\NumberFormatter; use Psr\Log\LoggerInterface; /** @@ -35,7 +36,7 @@ class Alexa implements MetricsProvider $response = Http::sendHttpRequest(self::URL . urlencode($domain), $timeout = 10, @$_SERVER['HTTP_USER_AGENT']); $xml = @simplexml_load_string($response); - $value = $xml ? (string)$xml->SD->POPULARITY['TEXT'] : null; + $value = $xml ? NumberFormatter::getInstance()->formatNumber((int)$xml->SD->POPULARITY['TEXT']) : null; } catch (\Exception $e) { $this->logger->warning('Error while getting Alexa SEO stats: {message}', array('message' => $e->getMessage())); $value = null; diff --git a/plugins/SEO/Metric/Bing.php b/plugins/SEO/Metric/Bing.php index c01b23d57660e1f6c8705bc93596c0fad6ef0068..e85d585c132740d25193d20bdd64d91a590f37d8 100644 --- a/plugins/SEO/Metric/Bing.php +++ b/plugins/SEO/Metric/Bing.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\SEO\Metric; use Piwik\Http; +use Piwik\NumberFormatter; use Psr\Log\LoggerInterface; /** @@ -36,7 +37,7 @@ class Bing implements MetricsProvider $response = str_replace(' ', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT'])); if (preg_match('#([0-9\,]+) results#i', $response, $p)) { - $pageCount = (int)str_replace(',', '', $p[1]); + $pageCount = NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1])); } else { $pageCount = 0; } diff --git a/plugins/SEO/Metric/Dmoz.php b/plugins/SEO/Metric/Dmoz.php index 82ffd248bab1ce6e23e6080209ce4627b19280a8..d21be1e5ca3cbade46c702e8bb288805e01bf8c0 100644 --- a/plugins/SEO/Metric/Dmoz.php +++ b/plugins/SEO/Metric/Dmoz.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\SEO\Metric; use Piwik\Http; +use Piwik\NumberFormatter; use Psr\Log\LoggerInterface; /** @@ -36,9 +37,9 @@ class Dmoz implements MetricsProvider try { $response = Http::sendHttpRequest(self::URL . urlencode($domain), $timeout = 10, @$_SERVER['HTTP_USER_AGENT']); - preg_match('#Open Directory Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $response, $p); + preg_match('#DMOZ Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $response, $p); if (!empty($p[1])) { - $value = (int)$p[1]; + $value = NumberFormatter::getInstance()->formatNumber((int)$p[1]); } else { $value = 0; } diff --git a/plugins/SEO/Metric/Google.php b/plugins/SEO/Metric/Google.php index 84e021c2ea5c4f1dee26101ce32c5f7a80919891..cec1d96af946d4ba6f1820865c552004450320c0 100644 --- a/plugins/SEO/Metric/Google.php +++ b/plugins/SEO/Metric/Google.php @@ -9,6 +9,7 @@ namespace Piwik\Plugins\SEO\Metric; use Piwik\Http; +use Piwik\NumberFormatter; use Psr\Log\LoggerInterface; /** @@ -52,7 +53,7 @@ class Google implements MetricsProvider $response = str_replace(' ', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT'])); if (preg_match('#([0-9\,]+) results#i', $response, $p)) { - return (int)str_replace(',', '', $p[1]); + return NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1])); } else { return 0; } diff --git a/plugins/SEO/Metric/Majestic.php b/plugins/SEO/Metric/Majestic.php deleted file mode 100644 index f276232945d780478c1364d7e1741591b3fd86bb..0000000000000000000000000000000000000000 --- a/plugins/SEO/Metric/Majestic.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -namespace Piwik\Plugins\SEO\Metric; - -use Piwik\Http; -use Psr\Log\LoggerInterface; - -/** - * Client for Majestic SEO's HTTP API. - */ -class Majestic implements MetricsProvider -{ - const API_BASE = 'http://simpleapi.majesticseo.com/sapi/'; - const API_KEY = 'ETHPYY'; // please only use this key within Piwik - const LOGO = 'plugins/SEO/images/majesticseo.png'; - - /** - * @var LoggerInterface - */ - private $logger; - - /** - * @param LoggerInterface $logger - */ - public function __construct(LoggerInterface $logger) - { - $this->logger = $logger; - } - - public function getMetrics($domain) - { - try { - $stats = $this->getBacklinkStats($domain); - $backlinks = $stats['backlink_count']; - $referrers = $stats['referrer_domains_count']; - } catch (\Exception $e) { - $this->logger->warning('Error while getting Majestic SEO stats: {message}', array('message' => $e->getMessage())); - $backlinks = null; - $referrers = null; - } - - $link = $this->getLinkForUrl($domain); - - return array( - new Metric('external-backlinks', 'SEO_ExternalBacklinks', $backlinks, self::LOGO, $link, 'SEO_ViewBacklinksOnMajesticSEO'), - new Metric('referrer-domains', 'SEO_ReferrerDomains', $referrers, self::LOGO, $link, 'SEO_ViewBacklinksOnMajesticSEO'), - ); - } - - /** - * Returns a URL that can be used to view all SEO data for a particular website. - * - * @param string $targetSiteUrl The URL of the website for whom SEO stats should be - * accessible for. - * @return string - */ - private function getLinkForUrl($targetSiteUrl) - { - $domain = @parse_url($targetSiteUrl, PHP_URL_HOST); - return "http://www.majesticseo.com/reports/site-explorer/summary/$domain?IndexDataSource=F"; - } - - /** - * Returns backlink statistics including the count of backlinks and count of - * referrer domains (domains with backlinks). - * - * This method issues an HTTP request and waits for it to return. - * - * @param string $siteDomain The domain of the website to get stats for. - * @param int $timeout The number of seconds to wait before aborting - * the HTTP request. - * @return array An array containing the backlink count and referrer - * domain count: - * array( - * 'backlink_count' => X, - * 'referrer_domains_count' => Y - * ) - * If either stat is false, either the API returned an - * error, or the IP was blocked for this request. - */ - private function getBacklinkStats($siteDomain, $timeout = 300) - { - $apiUrl = $this->getApiUrl($method = 'GetBacklinkStats', $args = array( - 'items' => '1', - 'item0' => $siteDomain - )); - $apiResponse = Http::sendHttpRequest($apiUrl, $timeout); - - $result = array( - 'backlink_count' => false, - 'referrer_domains_count' => false - ); - - $apiResponse = json_decode($apiResponse, $assoc = true); - if (!empty($apiResponse) - && !empty($apiResponse['Data']) - ) { - $siteSeoStats = reset($apiResponse['Data']); - - if (isset($siteSeoStats['ExtBackLinks']) - && $siteSeoStats['ExtBackLinks'] !== -1 - ) { - $result['backlink_count'] = $siteSeoStats['ExtBackLinks']; - } - - if (isset($siteSeoStats['RefDomains']) - && $siteSeoStats['RefDomains'] !== -1 - ) { - $result['referrer_domains_count'] = $siteSeoStats['RefDomains']; - } - } - - return $result; - } - - private function getApiUrl($method, $args = array()) - { - $args['sak'] = self::API_KEY; - - $queryString = http_build_query($args); - return self::API_BASE . $method . '?' . $queryString; - } -} diff --git a/plugins/SEO/lang/bg.json b/plugins/SEO/lang/bg.json index 975eee439f0093bfeeb34bddf8ef045622da98bb..0f51ae5923b54abedaaf8f5cbce7e25b642100dd 100644 --- a/plugins/SEO/lang/bg.json +++ b/plugins/SEO/lang/bg.json @@ -5,11 +5,9 @@ "Bing_IndexedPages": "Bing индекÑирани Ñтраници", "Dmoz": "DMOZ запиÑи", "DomainAge": "ВъзраÑÑ‚ на домейна", - "ExternalBacklinks": "Външни препратки (Majestic)", "Google_IndexedPages": "Google индекÑирани Ñтраници", "Rank": "Ранг", "SeoRankings": "SEO ранг", - "SEORankingsFor": "SEO ранг за %s", - "ViewBacklinksOnMajesticSEO": "Преглед на доклада за външните препратки в MajesticSEO.com" + "SEORankingsFor": "SEO ранг за %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/cs.json b/plugins/SEO/lang/cs.json index 8e23d1e0549f96c34569c031c100b92004583750..643d16c5380293d4ae15471c279ed2ad46989025 100644 --- a/plugins/SEO/lang/cs.json +++ b/plugins/SEO/lang/cs.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Stránek zaindexovaných Bingem", "Dmoz": "Záznamů v katalogu DMOZ", "DomainAge": "Stařà domény", - "ExternalBacklinks": "Externà zpÄ›tné odkazy (Majestic)", "Google_IndexedPages": "Stránek zaindexovaných Googlem", "Rank": "HodnocenÃ", - "ReferrerDomains": "OdkazujÃcà domény (Majestic)", "SeoRankings": "Hodnocenà SEO", - "SEORankingsFor": "SEO hodnocenà pro %s", - "ViewBacklinksOnMajesticSEO": "Zobrazit externà zpÄ›tné odkazy na MajesticSEO.com" + "SEORankingsFor": "SEO hodnocenà pro %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/da.json b/plugins/SEO/lang/da.json index 75612e37b560aceb685eb619f697cfb8a3129653..63b4473075aa9ce942fe3a0aa6155a9655c9c64e 100644 --- a/plugins/SEO/lang/da.json +++ b/plugins/SEO/lang/da.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Bing indekserede sider", "Dmoz": "DMOZ angivelser", "DomainAge": "Domæne alder", - "ExternalBacklinks": "Eksterne backlinks (Majestic)", "Google_IndexedPages": "Google indekserede sider", "Rank": "Rang", - "ReferrerDomains": "Henvisende domæner (Majestic)", "SeoRankings": "SEO - søgemaskineoptimering", - "SEORankingsFor": "SEO for %s", - "ViewBacklinksOnMajesticSEO": "Se rapport om eksterne backlinks pÃ¥ MajesticSEO.com" + "SEORankingsFor": "SEO for %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/de.json b/plugins/SEO/lang/de.json index 471aecda0d992d260654b9f713f6fd2c3840091b..eea5590325ea71fd8f09926af691dd16db9da69e 100644 --- a/plugins/SEO/lang/de.json +++ b/plugins/SEO/lang/de.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Bing indizierte Seiten", "Dmoz": "DMOZ Einträge", "DomainAge": "Alter der Domain", - "ExternalBacklinks": "Externe Backlinks (Majestic)", "Google_IndexedPages": "Google indizierte Seiten", "Rank": "Rang", - "ReferrerDomains": "Referrer-Domains (Majestic)", "SeoRankings": "SEO-Bewertungen", - "SEORankingsFor": "SEO-Bewertungen für %s", - "ViewBacklinksOnMajesticSEO": "Externen Backlink-Bericht auf MajesticSEO.com ansehen" + "SEORankingsFor": "SEO-Bewertungen für %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/el.json b/plugins/SEO/lang/el.json index d8f03e9df5f992d4094b16dc666b3c11e24b9257..909aca8aa1cb042458d575157710b1836cd1371f 100644 --- a/plugins/SEO/lang/el.json +++ b/plugins/SEO/lang/el.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Σελίδες σε ευÏετήÏιο Bing", "Dmoz": "ΕισαγωγÎÏ‚ DMOZ", "DomainAge": "Ηλικία Domain", - "ExternalBacklinks": "ΕξωτεÏικοί ΣÏνδεσμοι για πίσω (Majestic)", "Google_IndexedPages": "Σελίδες σε ευÏετήÏιο Google", "Rank": "Βαθμολόγηση", - "ReferrerDomains": "ΑναφÎÏοντα ονόματα χώÏου (Majestic)", "SeoRankings": "Βαθμολόγηση BMA", - "SEORankingsFor": "Βαθμολόγηση BMA για %s", - "ViewBacklinksOnMajesticSEO": "Εμφάνιση της αναφοÏάς των εξωτεÏικών κατευθυνόμενων συνδÎσμων στο MajesticSEO.com" + "SEORankingsFor": "Βαθμολόγηση BMA για %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/en.json b/plugins/SEO/lang/en.json index 5052c37441a1492b803298160aa5a342bb1c052c..7007ad48f250601c626fc6f44cbe94305fa0965b 100644 --- a/plugins/SEO/lang/en.json +++ b/plugins/SEO/lang/en.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Bing indexed pages", "Dmoz": "DMOZ entries", "DomainAge": "Domain Age", - "ExternalBacklinks": "External Backlinks (Majestic)", "Google_IndexedPages": "Google indexed pages", "Rank": "Rank", - "ReferrerDomains": "Referrer Domains (Majestic)", "SeoRankings": "SEO Rankings", - "SEORankingsFor": "SEO Rankings for %s", - "ViewBacklinksOnMajesticSEO": "View External Backlinks report on MajesticSEO.com" + "SEORankingsFor": "SEO Rankings for %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/es.json b/plugins/SEO/lang/es.json index 4d1c0b484abfd3c6fd25b916b7ae75a1cf26cac0..ea767d4aa7962d787db7e3ea304895ae3f6758be 100644 --- a/plugins/SEO/lang/es.json +++ b/plugins/SEO/lang/es.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "páginas indexadas por Bing", "Dmoz": "Entradas DMOZ", "DomainAge": "Edad del dominio", - "ExternalBacklinks": "Enlaces entrantes externos (Majestic)", "Google_IndexedPages": "Páginas indexadas por Google", "Rank": "Rango", - "ReferrerDomains": "Dominios referidos (Majestic)", "SeoRankings": "Rankings SEO", - "SEORankingsFor": "Rankings SEO de %s", - "ViewBacklinksOnMajesticSEO": "Ver informe de enlaces entrantes externos en MajesticSEO.com" + "SEORankingsFor": "Rankings SEO de %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/fa.json b/plugins/SEO/lang/fa.json index c7184d2bc60af16b81f3733681298a326385f7c5..43d9a5706f8b1474283680e991cd60df3785bb89 100644 --- a/plugins/SEO/lang/fa.json +++ b/plugins/SEO/lang/fa.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "صÙØÙ‡ های نمایه (ایندکس) شده در بینگ", "Dmoz": "ورودی های DMOZ", "DomainAge": "سن دامنه", - "ExternalBacklinks": "لینک دهنده خارجی (Majestic)", "Google_IndexedPages": "صÙØÙ‡ های نمایه (ایندکس) شده در Ú¯ÙˆÚ¯Ù„", "Rank": "رنک", - "ReferrerDomains": "ارجاع دامنه (Majestic)", "SeoRankings": "رتبه سئو", - "SEORankingsFor": "رتبه سئو برای %s", - "ViewBacklinksOnMajesticSEO": "مشاهده گزارش لینک دهنده خارجی در MajesticSEO.com" + "SEORankingsFor": "رتبه سئو برای %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/fi.json b/plugins/SEO/lang/fi.json index b3436a49cd81170da4c192b87446cc3257be8e06..354270e2d38a4046a5f63a8e00fc43c94720d1e9 100644 --- a/plugins/SEO/lang/fi.json +++ b/plugins/SEO/lang/fi.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Bingin indeksoidut sivut", "Dmoz": "DMOZ tulossivut", "DomainAge": "Sivun ikä", - "ExternalBacklinks": "Ulkoiset paluulinkit (Majestic)", "Google_IndexedPages": "Googlen indeksoimat sivut", "Rank": "Sijoitus", - "ReferrerDomains": "Viittaavat domainit (Majestic)", "SeoRankings": "SEO-tulos", - "SEORankingsFor": "SEO-sijoitus %s:lle", - "ViewBacklinksOnMajesticSEO": "Näe ulkoiset paluulinkit raportissa MajesticSEO.com" + "SEORankingsFor": "SEO-sijoitus %s:lle" } } \ No newline at end of file diff --git a/plugins/SEO/lang/fr.json b/plugins/SEO/lang/fr.json index 39590d1f05d4b4b1379bc50fe1e003b6717d2cf4..1c0e31279e5deccacc3e7884708ca0d2b8dec82e 100644 --- a/plugins/SEO/lang/fr.json +++ b/plugins/SEO/lang/fr.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Pages indexées sur Bing", "Dmoz": "Entrées DMOZ", "DomainAge": "Âge du domaine", - "ExternalBacklinks": "Liens de retours externes (Majestic)", "Google_IndexedPages": "Page indexées sur Google", "Rank": "Notation", - "ReferrerDomains": "Domaines référents (Majestic)", "SeoRankings": "Notations des SEO", - "SEORankingsFor": "Notations SEO pour %s", - "ViewBacklinksOnMajesticSEO": "Visualiser les rapports de liens de retour externes sur MajesticSEO.com" + "SEORankingsFor": "Notations SEO pour %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/hi.json b/plugins/SEO/lang/hi.json index 14992335346f619079e136d343ee055223a60242..87fabc60f55d7c7d55b27e691852d77eaac72a0b 100644 --- a/plugins/SEO/lang/hi.json +++ b/plugins/SEO/lang/hi.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "बिंग अनà¥à¤•à¥à¤°à¤®à¤¿à¤¤ पृषà¥à¤ ों", "Dmoz": "डीमॉज़ पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¤¾à¤‚", "DomainAge": "डोमेन आयà¥", - "ExternalBacklinks": "बाहà¥à¤¯ बैकलिंक (राजसी)", "Google_IndexedPages": "गूगल पृषà¥à¤ ों से अनà¥à¤•à¥à¤°à¤®à¤¿à¤¤", "Rank": "शà¥à¤°à¥‡à¤£à¥€", - "ReferrerDomains": "संदरà¥à¤ डोमेन (राजसी)", "SeoRankings": "à¤à¤¸à¤ˆà¤“ रैंकिंग", - "SEORankingsFor": "%s के लिठà¤à¤¸à¤ˆà¤“ रैंकिंग", - "ViewBacklinksOnMajesticSEO": "MajesticSEO.com पर बाहà¥à¤¯ बैकलिंक रिपोरà¥à¤Ÿ देखें" + "SEORankingsFor": "%s के लिठà¤à¤¸à¤ˆà¤“ रैंकिंग" } } \ No newline at end of file diff --git a/plugins/SEO/lang/id.json b/plugins/SEO/lang/id.json index b9f9ed7bce85b4ea9970f2b16310f03390a8b25d..761690c352fdb97088bc6b9acf408b2844a55869 100644 --- a/plugins/SEO/lang/id.json +++ b/plugins/SEO/lang/id.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Halaman terindeks Bing", "Dmoz": "Msukan DMOZ", "DomainAge": "Umut Ranah", - "ExternalBacklinks": "Tautal Kembali Luar (Majestic)", "Google_IndexedPages": "Halaman terindeks Google", "Rank": "Peringkat", - "ReferrerDomains": "Ranah Pengarah (Majestic)", "SeoRankings": "Peringkat SEO", - "SEORankingsFor": "Peringkat SEO untuk %s", - "ViewBacklinksOnMajesticSEO": "Lihat Tautan Kembali Luar dalam MajesticSEO.com" + "SEORankingsFor": "Peringkat SEO untuk %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/it.json b/plugins/SEO/lang/it.json index 55b1b044e534dcc3bd6a7f2de940473089abdcd7..f3ef8e5e8974d1b45bc99546bf69e0c5c2a60e67 100644 --- a/plugins/SEO/lang/it.json +++ b/plugins/SEO/lang/it.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Pagine indicizzate da Bing", "Dmoz": "Voci DMOZ", "DomainAge": "Età del dominio", - "ExternalBacklinks": "Backlinks Esterni (Majestic)", "Google_IndexedPages": "Pagine indicizzate da Google", "Rank": "Rank", - "ReferrerDomains": "Domini Referenti (Majestic)", "SeoRankings": "Ranking SEO", - "SEORankingsFor": "SEO Ranking per %s", - "ViewBacklinksOnMajesticSEO": "Guarda il report sui Backlink Esterni su MajesticSEO.com" + "SEORankingsFor": "SEO Ranking per %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/ja.json b/plugins/SEO/lang/ja.json index 5763a533bc2b878e49e25e356333750110dcefa3..e0496470df8404d5c9d300bfab86c840198b95a4 100644 --- a/plugins/SEO/lang/ja.json +++ b/plugins/SEO/lang/ja.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Bing インデックスページ", "Dmoz": "DMOZ エントリー", "DomainAge": "ドメインエイジ", - "ExternalBacklinks": "外部ãƒãƒƒã‚¯ãƒªãƒ³ã‚¯ (Majestic)", "Google_IndexedPages": "Google インデックスページ", "Rank": "ランク", - "ReferrerDomains": "å‚照元ドメイン (Majestic)", "SeoRankings": "SEO ランã‚ング", - "SEORankingsFor": "%s ã® SEO ランã‚ング", - "ViewBacklinksOnMajesticSEO": "MajesticSEO.com ã®å¤–部ãƒãƒƒã‚¯ãƒªãƒ³ã‚¯ãƒ¬ãƒãƒ¼ãƒˆã‚’表示" + "SEORankingsFor": "%s ã® SEO ランã‚ング" } } \ No newline at end of file diff --git a/plugins/SEO/lang/nl.json b/plugins/SEO/lang/nl.json index 4b7bd6ac6b5ae20f45b328a61785433f5483d4c0..ef999bc4d7c052cb338ce681890247703539ea1a 100644 --- a/plugins/SEO/lang/nl.json +++ b/plugins/SEO/lang/nl.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Bing geindexeerde pagina's", "Dmoz": "DMOZ items", "DomainAge": "Domein leeftijd", - "ExternalBacklinks": "Externe terugkoppelingen (Majestic)", "Google_IndexedPages": "Google geindexeerde pagina's", "Rank": "Ranking", - "ReferrerDomains": "Verwijzende domeinen (Majestic)", "SeoRankings": "SEO rankings", - "SEORankingsFor": "SEO rankings voor %s", - "ViewBacklinksOnMajesticSEO": "Bekijk de Externe Backlinks rapportage op MajesticSEO.com" + "SEORankingsFor": "SEO rankings voor %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/pt-br.json b/plugins/SEO/lang/pt-br.json index 2d84aaf68cc7526ef75314e0928ef11dfd103701..08ea01fd07494feacdc770fdb98aee555ef3830b 100644 --- a/plugins/SEO/lang/pt-br.json +++ b/plugins/SEO/lang/pt-br.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Páginas indexadas no Bing", "Dmoz": "Entradas DMOZ", "DomainAge": "Idade de DomÃnio", - "ExternalBacklinks": "Backlinks externos (Majestic)", "Google_IndexedPages": "Páginas indexadas pelo Google", "Rank": "Classificação", - "ReferrerDomains": "DomÃnios Referenciadores (Majestic)", "SeoRankings": "Ranking SEO", - "SEORankingsFor": "Ranking SEO para %s", - "ViewBacklinksOnMajesticSEO": "Ver relatório de Backlinks Externos em MajesticSEO.com" + "SEORankingsFor": "Ranking SEO para %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/ro.json b/plugins/SEO/lang/ro.json index 114fb09e454a82b978af9f05329b69257e37f10c..b120d09e522e2ee3c041d08084c38f40b3033e2b 100644 --- a/plugins/SEO/lang/ro.json +++ b/plugins/SEO/lang/ro.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Pagini indexate de Bing", "Dmoz": "DMOZ intrari", "DomainAge": "Vechime domeniu", - "ExternalBacklinks": "Backlink-uri externe (Majestic)", "Google_IndexedPages": "Pagini indexate de Google", "Rank": "PoziÅ£ie", - "ReferrerDomains": "Referrer Domenii (Majestic)", "SeoRankings": "PoziÅ£ionări SEO", - "SEORankingsFor": "PoziÅ£ionări SEO pentru %s", - "ViewBacklinksOnMajesticSEO": "Vezi backlink externe cu raport pe MajesticSEO.com" + "SEORankingsFor": "PoziÅ£ionări SEO pentru %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/ru.json b/plugins/SEO/lang/ru.json index 62e25a0e9007a523c727f025339694ed61465b8b..5d2ed02d0249b6a1c1991807c6c7dacee0dfdd82 100644 --- a/plugins/SEO/lang/ru.json +++ b/plugins/SEO/lang/ru.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Страниц в индекÑе Bing", "Dmoz": "ЗапиÑей в каталоге DMOZ", "DomainAge": "ВозраÑÑ‚ домена", - "ExternalBacklinks": "Внешние обратные ÑÑылки (Majestic)", "Google_IndexedPages": "Страниц в индекÑе Google", "Rank": "Рейтинг", - "ReferrerDomains": "СÑылающиеÑÑ Ð´Ð¾Ð¼ÐµÐ½Ñ‹ (Majestic)", "SeoRankings": "SEO-Рейтинги", - "SEORankingsFor": "SEO Рейтинги Ð´Ð»Ñ %s", - "ViewBacklinksOnMajesticSEO": "ПоÑмотреть Внешние обратные ÑÑылки на Ñайте MajesticSEO.com" + "SEORankingsFor": "SEO Рейтинги Ð´Ð»Ñ %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/sr.json b/plugins/SEO/lang/sr.json index eff63967c012233269b5148ae3ddcc853949de4f..25ea4c2abd65e47e5d3b82dfc64329d9aff31f23 100644 --- a/plugins/SEO/lang/sr.json +++ b/plugins/SEO/lang/sr.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Stranice koje je indeksirao Bing", "Dmoz": "DMOZ stavke", "DomainAge": "Starost domena", - "ExternalBacklinks": "Eksterni povratni linkovi (Majestic)", "Google_IndexedPages": "Stranice koje je indeksirao Google", "Rank": "Rang", - "ReferrerDomains": "Domeni sa referencama (Majestic)", "SeoRankings": "SEO rangiranje", - "SEORankingsFor": "SEO rangiranje za %s", - "ViewBacklinksOnMajesticSEO": "Prikaži izveÅ¡taj o spoljnim povratnim linkovima sa MajesticSEO.com" + "SEORankingsFor": "SEO rangiranje za %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/sv.json b/plugins/SEO/lang/sv.json index f170280b4ce63d1b999b77dce803ff8c87f31e63..15184f8251dbbcb0f8d94a3b0d46ec8d4f517119 100644 --- a/plugins/SEO/lang/sv.json +++ b/plugins/SEO/lang/sv.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Bing indexerade sidor", "Dmoz": "DMOZ poster", "DomainAge": "DomänÃ¥lder", - "ExternalBacklinks": "Externa tillbakalänkar (Majestic)", "Google_IndexedPages": "Google indexerade sidor", "Rank": "Rank", - "ReferrerDomains": "Refererande Domäner (Majestic)", "SeoRankings": "SEO Ranking", - "SEORankingsFor": "SEO Ranking för %s", - "ViewBacklinksOnMajesticSEO": "Se externa länkrapporter pÃ¥ den här sidan: MajesticSEO.com" + "SEORankingsFor": "SEO Ranking för %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/tl.json b/plugins/SEO/lang/tl.json index 7e743740889f27ee3f1e3e4f2cdbe4bda87ce1f7..197d2d1f61ed33a4101d6691a254348dfee9235b 100644 --- a/plugins/SEO/lang/tl.json +++ b/plugins/SEO/lang/tl.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Mga na index na pahina ng bing", "Dmoz": "DMOZ entries", "DomainAge": "Edad ng Domain", - "ExternalBacklinks": "Panlabas na Backlink (Majestic)", "Google_IndexedPages": "Na index ng Google ang mga pahina", "Rank": "Ranggo", - "ReferrerDomains": "Referrer Domain (Majestic)", "SeoRankings": "Ranggo sa SEO", - "SEORankingsFor": "Ranggo ng SEO para sa %s", - "ViewBacklinksOnMajesticSEO": "Tingnan ang mga ulat sa External Backlinks sa MajesticSEO.com" + "SEORankingsFor": "Ranggo ng SEO para sa %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/vi.json b/plugins/SEO/lang/vi.json index 2a063b7ba74867807178228f8d075124811dfbfd..56b8072a16e7fc838fe50cc820a344a68bdf2548 100644 --- a/plugins/SEO/lang/vi.json +++ b/plugins/SEO/lang/vi.json @@ -4,12 +4,9 @@ "Bing_IndexedPages": "Các trang được láºp chỉ mục Bing", "Dmoz": "Các mục DMOZ", "DomainAge": "Tuổi tên miá»n", - "ExternalBacklinks": "Các backlink ngoà i (Majestic)", "Google_IndexedPages": "Các trang được láºp chỉ mục Google", "Rank": "Xếp hạng", - "ReferrerDomains": "Các tên miá»n giá»›i thiệu (Majestic)", "SeoRankings": "Xếp hạng SEO", - "SEORankingsFor": "Xếp hạng SEO cho %s", - "ViewBacklinksOnMajesticSEO": "Xem các báo cáo Backlink ngoà i trên MajesticSEO.com" + "SEORankingsFor": "Xếp hạng SEO cho %s" } } \ No newline at end of file diff --git a/plugins/SEO/lang/zh-cn.json b/plugins/SEO/lang/zh-cn.json index 77a35b915d7d7f7b565a1076b523f6d46b122a1e..62ee5e081599ed1c00ad89bf5bff5c176e4165e7 100644 --- a/plugins/SEO/lang/zh-cn.json +++ b/plugins/SEO/lang/zh-cn.json @@ -5,12 +5,9 @@ "Bing_IndexedPages": "Bing 索引页é¢", "Dmoz": "DMOZ æ¡ç›®", "DomainAge": "域åå¹´é™", - "ExternalBacklinks": "外部åå‘链接 (Majestic)", "Google_IndexedPages": "Google 索引页é¢", "Rank": "排å", - "ReferrerDomains": "æ¥æºåŸŸå (Majestic)", "SeoRankings": "SEO排å", - "SEORankingsFor": "%s çš„SEO排å", - "ViewBacklinksOnMajesticSEO": "查看 MajesticSEO.com 上的外部åå‘链接报表" + "SEORankingsFor": "%s çš„SEO排å" } } \ No newline at end of file diff --git a/plugins/SEO/templates/getRank.twig b/plugins/SEO/templates/getRank.twig index 80bf40ef7ba29e9ea2369595cc54955e4a7b79e1..6eb025d7e433d370f81325111fe521fc7d157e8e 100644 --- a/plugins/SEO/templates/getRank.twig +++ b/plugins/SEO/templates/getRank.twig @@ -28,11 +28,9 @@ {% set seoLink %}{% if rank.logo_link is not empty %}<a class="linkContent" href="?module=Proxy&action=redirect&url={{ rank.logo_link|url_encode }}" target="_blank" {% if rank.logo_tooltip is not empty %}title="{{ rank.logo_tooltip }}"{% endif %}>{% endif %}{% endset %} - {% set majesticLink %}{{ seoLink }}Majestic</a>{% endset %} <td>{% if rank.logo_link is not empty %}{{ seoLink|raw }}{% endif %}<img style='vertical-align:middle;margin-right:6px;' src='{{ rank.logo }}' border='0' - alt="{{ rank.label }}">{% if rank.logo_link is not empty %}</a>{% endif %} {{ rank.label|replace({"Majestic": - majesticLink})|raw }} + alt="{{ rank.label }}">{% if rank.logo_link is not empty %}</a>{% endif %} {{ rank.label|raw }} </td> <td> <div style="margin-left:15px;"> diff --git a/plugins/ScheduledReports/ScheduledReports.php b/plugins/ScheduledReports/ScheduledReports.php index c66a6ad0d68ea8f3c210370d0ea2c20f3155c18d..f306dd8d0515c7625b718ec8e76d4cb6694014d1 100644 --- a/plugins/ScheduledReports/ScheduledReports.php +++ b/plugins/ScheduledReports/ScheduledReports.php @@ -191,6 +191,9 @@ class ScheduledReports extends \Piwik\Plugin $filteredReportMetadata = array(); foreach ($availableReportMetadata as $reportMetadata) { // removing reports from the API category and MultiSites.getOne + if (empty($reportMetadata['category'])) { + var_dump($reportMetadata);exit; + } if ( $reportMetadata['category'] == 'API' || $reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard') diff --git a/plugins/ScheduledReports/templates/index.twig b/plugins/ScheduledReports/templates/index.twig index 65ba2ba53aca73f26526562acf2968c78f79297a..542fab8e70b06072d30dc4bfaf04bf7089617cc3 100644 --- a/plugins/ScheduledReports/templates/index.twig +++ b/plugins/ScheduledReports/templates/index.twig @@ -1,19 +1,17 @@ {% extends 'user.twig' %} - {% set title %}{{ 'ScheduledReports_PersonalEmailReports'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div class="emailReports"> <h2 piwik-enriched-headline help-url="http://piwik.org/docs/email-reports/">{{ title }}</h2> - {% include "@CoreHome/_siteSelectHeader.twig" %} - - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <span id="reportSentSuccess"></span> <span id="reportUpdatedSuccess"></span> diff --git a/plugins/SegmentEditor/SegmentSelectorControl.php b/plugins/SegmentEditor/SegmentSelectorControl.php index 4e88d2191f12803d74d538374c1e1fd84a88473b..e37354e1cd8a0ac81f82d9012c98cc91357ebaa7 100644 --- a/plugins/SegmentEditor/SegmentSelectorControl.php +++ b/plugins/SegmentEditor/SegmentSelectorControl.php @@ -31,7 +31,7 @@ class SegmentSelectorControl extends UIControl $this->jsClass = "SegmentSelectorControl"; $this->cssIdentifier = "segmentEditorPanel"; - $this->cssClass = "piwikTopControl"; + $this->cssClass = "piwikTopControl borderedControl piwikSelector"; $this->idSite = $idSite ?: Common::getRequestVar('idSite', false, 'int'); diff --git a/plugins/SegmentEditor/javascripts/Segmentation.js b/plugins/SegmentEditor/javascripts/Segmentation.js index f8def3655c5d1009a6e30c2a15d2679e4bd1e874..0e47bd7d195f1e8e58fd0928a8dce8ed9fc2b4ad 100644 --- a/plugins/SegmentEditor/javascripts/Segmentation.js +++ b/plugins/SegmentEditor/javascripts/Segmentation.js @@ -210,7 +210,7 @@ Segmentation = (function($) { if(!$.browser.mozilla) { checkSelected = encodeURIComponent(checkSelected); } - + if( checkSelected == self.currentSegmentStr){ injClass = 'class="segmentSelected"'; } @@ -258,7 +258,7 @@ Segmentation = (function($) { var closeAllOpenLists = function() { $(".segmentationContainer", self.target).each(function() { - if($(this).closest('.segmentEditorPanel').hasClass("visible")) + if($(this).closest('.segmentEditorPanel').hasClass("expanded")) $(this).trigger("click"); }); }; @@ -370,20 +370,22 @@ Segmentation = (function($) { var bindEvents = function () { self.target.on('click', '.segmentationContainer', function (e) { // hide all other modals connected with this widget - if (self.content.closest('.segmentEditorPanel').hasClass("visible")) { + if (self.content.closest('.segmentEditorPanel').hasClass("expanded")) { if ($(e.target).hasClass("jspDrag") === true || $(e.target).hasClass("segmentFilterContainer") === true || $(e.target).parents().hasClass("segmentFilterContainer") === true || $(e.target).hasClass("filterNoResults")) { e.stopPropagation(); } else { - self.jscroll.destroy(); - self.target.closest('.segmentEditorPanel').removeClass('visible'); + if (self.jscroll) { + self.jscroll.destroy(); + } + self.target.closest('.segmentEditorPanel').removeClass('expanded'); } } else { // for each visible segmentationContainer -> trigger click event to close and kill scrollpane - very important ! closeAllOpenLists(); - self.target.closest('.segmentEditorPanel').addClass('visible'); + self.target.closest('.segmentEditorPanel').addClass('expanded'); self.target.find('.segmentFilter').val(self.translations['General_Search']).trigger('keyup'); self.jscroll = self.target.find(".segmentList").jScrollPane({ autoReinitialise: true, @@ -1250,7 +1252,7 @@ $(document).ready(function() { } if ($(e.target).closest('.segmentListContainer').length === 0 - && self.$element.hasClass("visible") + && self.$element.hasClass("expanded") ) { $(".segmentationContainer", self.$element).trigger("click"); } @@ -1258,8 +1260,6 @@ $(document).ready(function() { $('body').on('mouseup', this.onMouseUp); - // re-initialize top controls since the size of the control is not the same after it's - // initialized. initTopControls(); }; diff --git a/plugins/SegmentEditor/stylesheets/segmentation.less b/plugins/SegmentEditor/stylesheets/segmentation.less index 0109d1183670fc7ceb69ba01d741b4fc42cf03cc..125a0c9f5639a22819afcd412ddd28de719adf2f 100644 --- a/plugins/SegmentEditor/stylesheets/segmentation.less +++ b/plugins/SegmentEditor/stylesheets/segmentation.less @@ -131,11 +131,6 @@ div.scrollable { padding: 0 0 8px 0; } -.segment-element .segment-nav h4.visits { - padding-left: 28px; - background: url(plugins/SegmentEditor/images/icon-users.png) 0 0 no-repeat; -} - .segment-element .segment-nav h4 a { color: #255792; text-decoration: none; @@ -403,7 +398,7 @@ div.scrollable { .segment-element .segment-footer { background: #eae8e3; - border-top: 1px solid #a9a399; + border-top: 1px solid @theme-color-background-tinyContrast; text-align: right; padding: 7px 10px; margin: 0 -4px -6px -4px; @@ -430,11 +425,14 @@ div.scrollable { z-index: 121; /* Should be bigger than 'Dashboard widget selector' (z-index: 120) */ background: #f7f7f7; border: 1px solid #e4e5e4; - padding: 5px 10px 6px 10px; margin-right: 10px; border-radius: 4px; color: @theme-color-text-light; font-size: 14px; + + .segmentListContainer { + line-height: 14px; + } } .top_controls .segmentEditorPanel { @@ -486,7 +484,6 @@ div.scrollable { .segmentationContainer ul.submenu { padding-top: 5px; display: none; - float: left; margin-bottom: 5px; } @@ -501,54 +498,53 @@ div.scrollable { height: 16px; } -.segmentEditorPanel.visible .segmentationContainer { - width: 200px; +.segmentEditorPanel.expanded .segmentationContainer { + width: 240px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } -.segmentEditorPanel.visible ul.submenu { - display: block; +.segmentEditorPanel.expanded ul.submenu { + display: inline-block; list-style: none; } .segmentFilterContainer { - margin-left: -10px; - margin-right: -10px; margin-bottom: 10px; + display: inline-block; } -.segmentEditorPanel.visible .segmentFilterContainer > input[type="text"] { - font-size: 13px; - width: 100%; +.segmentEditorPanel.expanded .segmentFilterContainer > input[type="text"] { + font-size: 11px; + width: 200px; padding: 0; - border: 1px solid #ccc; - border-width: 1px 0; + border: 1px solid #d0d0d0; + border-width: 1px; color: #999; - padding: 11px 32px 11px 12px; + padding: 7px 10px 7px 10px; } -.segmentEditorPanel.visible .segmentFilterContainer > span { +.segmentEditorPanel.expanded .segmentFilterContainer > span { position: absolute; width: 13px; height: 13px; - right: 12px; - top: 16px; + right: 23px; + top: 48px; cursor: pointer; } -.segmentEditorPanel.visible .segmentFilterContainer:hover > span { +.segmentEditorPanel.expanded .segmentFilterContainer:hover > span { background: url(plugins/SegmentEditor/images/reset_search.png); } -.segmentEditorPanel.visible .filterNoResults { +.segmentEditorPanel.expanded .filterNoResults { font-style: italic; } -.segmentEditorPanel.visible .add_new_segment { +.segmentEditorPanel.expanded .add_new_segment { clear: both; float: right; - margin: 12px 0 10px; + margin: 12px 9px 10px 0; } .segmentationContainer > ul.submenu > li { @@ -557,14 +553,6 @@ div.scrollable { cursor: pointer; } -span.segmentationTitle { - background: url(plugins/Morpheus/images/sort_subtable_desc.png) no-repeat right 0; - padding-right: 20px; - min-width: 180px; - display: block; - cursor: pointer; -} - .segmentList { max-height: 300px; margin-top: 5px; @@ -668,28 +656,26 @@ a.metric_category { z-index: 1000 !important; } +.ui-autocomplete.ui-menu.ui-widget { + box-shadow: 0 1px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12); +} + @media all and (max-width: 749px) { span.segmentationTitle, - .segmentEditorPanel.visible .segmentationContainer { + .segmentEditorPanel.expanded .segmentationContainer { width: auto; } } .dropdown-body { - position: absolute; - top: 100%; - left: -1px; background-color: #f7f7f7; - padding: 0px 10px; - border: 1px solid #e4e5e4; border-top-width: 0px; display: none; border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; } -.segmentEditorPanel.visible .dropdown-body { - display: block; +.segmentEditorPanel.expanded .dropdown-body { border-top-left-radius: 0; border-top-right-radius: 0; } @@ -699,7 +685,7 @@ a.metric_category { background: #f1f0eb } -.segmentEditorPanel.visible { +.segmentEditorPanel.expanded { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } @@ -711,7 +697,8 @@ a.metric_category { .available_segments { display: inline-block; - width: 160px; + width: 150px; + padding-left: 5px; } .segmentationTitle, @@ -722,7 +709,6 @@ a.metric_category { white-space: nowrap; } -.segmentationTitle, .segment-element .segment-nav a.dropdown { max-width: 180px; } @@ -731,8 +717,18 @@ a.metric_category { max-width: 145px; } -.segmentEditorPanel.visible .segmentationTitle { - max-width: 200px; +.segmentEditorPanel .segmentationTitle { + text-overflow: ellipsis; + display: inline-block; + max-width: 170px; +} + +.segmentEditorPanel a.title { + padding-bottom: 8px; +} + +.segmentEditorPanel.expanded .segmentationTitle { + max-width: 180px; overflow: visible; /* restore default */ white-space: normal; /* restore default */ } diff --git a/plugins/SegmentEditor/templates/_segmentSelector.twig b/plugins/SegmentEditor/templates/_segmentSelector.twig index d9d9f3fb9d8bb73126b46fae1836f9dbd5db6ddf..7a8019d37e8bf8d978ec949c978057cec5642517 100644 --- a/plugins/SegmentEditor/templates/_segmentSelector.twig +++ b/plugins/SegmentEditor/templates/_segmentSelector.twig @@ -1,7 +1,7 @@ <div class="SegmentEditor" style="display:none;"> - <div class="segmentationContainer listHtml"> - <span class="segmentationTitle"></span> - <div class="dropdown-body"> + <div class="segmentationContainer listHtml" title="{{ 'SegmentEditor_ChooseASegment'|translate|e('html_attr') }}"> + <a class="title"><span class="icon icon-segment"></span><span class="segmentationTitle"></span></a> + <div class="dropdown dropdown-body"> <div class="segmentFilterContainer"> <input class="segmentFilter" type="text" value="{{ 'General_Search'|translate }}"/> <span/> @@ -86,9 +86,10 @@ <a href="#">+ {{ 'SegmentEditor_AddANDorORCondition'|translate(andCondition)|raw }}</a> </div> </div> - <div class="segment-element"> + <div class="segment-element borderedControl expanded"> <div class="segment-nav"> - <h4 class="visits"><span class="available_segments"><strong> + <h4 class="visits"> + <span class="icon-segment"></span><span class="available_segments"><strong> <select class="available_segments_select"></select> </strong></span></h4> <div class="scrollable"> diff --git a/plugins/SitesManager/SitesManager.php b/plugins/SitesManager/SitesManager.php index 200f268a8aa659f626f8d2f6b4c27e60dc0135db..4b686e2bdefbacce85fa5f0e1df51a4e6b8cae89 100644 --- a/plugins/SitesManager/SitesManager.php +++ b/plugins/SitesManager/SitesManager.php @@ -10,6 +10,7 @@ namespace Piwik\Plugins\SitesManager; use Piwik\Common; use Piwik\Archive\ArchiveInvalidator; +use Piwik\Container\StaticContainer; use Piwik\Db; use Piwik\Plugins\PrivacyManager\PrivacyManager; use Piwik\Measurable\Settings\Storage; @@ -69,7 +70,7 @@ class SitesManager extends \Piwik\Plugin // we do not delete logs here on purpose (you can run these queries on the log_ tables to delete all data) Cache::deleteCacheWebsiteAttributes($idSite); - $archiveInvalidator = new ArchiveInvalidator(); + $archiveInvalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); $archiveInvalidator->forgetRememberedArchivedReportsToInvalidateForSite($idSite); $measurableStorage = new Storage(Db::get(), $idSite); diff --git a/plugins/SitesManager/lang/ko.json b/plugins/SitesManager/lang/ko.json index 33d1d5ab76899e1b0b0934a5923f6bf0d9ead211..dc44ef9dfbd77c69005c45ec352c7e068ae6ef13 100644 --- a/plugins/SitesManager/lang/ko.json +++ b/plugins/SitesManager/lang/ko.json @@ -1,6 +1,7 @@ { "SitesManager": { "AddSite": "새 사ì´íŠ¸ 추가", + "AddMeasurable": "새로운 ì¸¡ì •í• ê²ƒ 추가", "AdvancedTimezoneSupportNotFound": "ì´ ì„œë²„ì˜ PHPì—서는 확장 시간대가 지ì›ë˜ì§€ 않습니다 (PHP> = 5.2ì—ì„œ 지ì›). ì§ì ‘ UTC ì˜¤í”„ì…‹ì„ ì§€ì •í•©ë‹ˆë‹¤.", "AliasUrlHelp": "ì´ê²ƒì€ 권장ë˜ì§€ë§Œ 필수는 아닙니다. 사용ìžê°€ì´ 웹사ì´íŠ¸ì˜ ì ‘ê·¼ì— ì‚¬ìš©í•˜ëŠ” 다양한 URLì„ ì§€ì •í•˜ë ¤ë©´ í•œ ì¤„ì— í•˜ë‚˜ì˜ URLì„ ìž…ë ¥í•©ë‹ˆë‹¤. 웹사ì´íŠ¸ì˜ URL 별ì¹ì€ '소스'> 웹 사ì´íŠ¸ì˜ ë³´ê³ ì„œì— í‘œì‹œë˜ì§€ 않습니다. URLì˜ 'www'ì˜ ìœ ë¬´ëŠ” Piwikê°€ ìžë™ìœ¼ë¡œ íŒë‹¨í•©ë‹ˆë‹¤.", "ChangingYourTimezoneWillOnlyAffectDataForward": "시간대 ë³€ê²½ì€ í–¥í›„ì˜ ë°ì´í„°ì—만 ì ìš©ë˜ê³ ì´ì „ ë°ì´í„°ì—는 ì ìš©ë˜ì§€ 않습니다.", @@ -47,8 +48,9 @@ "NotFound": "웹사ì´íŠ¸ë¥¼ ì°¾ì„ ìˆ˜ 없습니다:", "NoWebsites": "ê´€ë¦¬í• ì›¹ì‚¬ì´íŠ¸ë¥¼ ê°€ì§€ê³ ìžˆì§€ 않습니다.", "OnlyOneSiteAtTime": "ì¼ë‹¨ 웹사ì´íŠ¸ëŠ” 하나만 íŽ¸ì§‘í• ìˆ˜ 있습니다. 웹사ì´íŠ¸ %sì˜ ë³€ê²½ 사í•ì„ ì €ìž¥í•˜ê±°ë‚˜ 취소하세요.", - "PiwikOffersEcommerceAnalytics": "Piwikì€ ê³ ê¸‰ ì „ìžìƒê±°ëž˜ ë¶„ì„ ë° ì¶”ì ê·¸ë¦¬ê³ ë¦¬í¬íŒ…í• ìˆ˜ 있습니다. %sì „ìžìƒ ìƒê±°ëž˜ 분ì„%sì— ëŒ€í•˜ì—¬ ë” ì•Œì•„ë³´ì„¸ìš”.", + "PiwikOffersEcommerceAnalytics": "Piwikì€ ê³ ê¸‰ ì „ìžìƒê±°ëž˜ ë¶„ì„ ë° ì¶”ì ê·¸ë¦¬ê³ ë¦¬í¬íŒ…í• ìˆ˜ 있습니다. %sì „ìžìƒê±°ëž˜ 분ì„%sì— ëŒ€í•˜ì—¬ ë” ì•Œì•„ë³´ì„¸ìš”.", "PiwikWillAutomaticallyExcludeCommonSessionParameters": "ì¼ë°˜ì ì¸ ì„¸ì…˜ 매개 변수 (%s)는 Piwikê°€ ìžë™ìœ¼ë¡œ ì œì™¸í•©ë‹ˆë‹¤.", + "PluginDescription": "웹사ì´íŠ¸ 관리ì—ì„œ 새로운 웹사ì´íŠ¸ë¥¼ ì¶”ê°€í•˜ê³ ê¸°ì¡´ì˜ ì›¹ì‚¬ì´íŠ¸ë¥¼ ìˆ˜ì •í• ìˆ˜ 있습니다.", "SearchCategoryDesc": "Piwik는 내부 사ì´íŠ¸ ê²€ìƒ‰ì–´ì— ëŒ€í•œ 검색 ì¹´í…Œê³ ë¦¬ë¥¼ 추ì í• ìˆ˜ 있습니다.", "SearchCategoryLabel": "ì¹´í…Œê³ ë¦¬ 매개변수", "SearchCategoryParametersDesc": "사ì´íŠ¸ 검색 ì¹´í…Œê³ ë¦¬ë¥¼ ì§€ì •í•˜ëŠ” ëª¨ë“ ì¿¼ë¦¬ 매개변수 ì´ë¦„를 쉼표로 구분하여 ëª¨ë‘ ìž…ë ¥í•©ë‹ˆë‹¤.", @@ -63,12 +65,20 @@ "ShowTrackingTag": "트래킹 태그 보기", "Sites": "웹사ì´íŠ¸", "SiteSearchUse": "ë‹¹ì‹ ì€ Piwik를 사용하여 웹사ì´íŠ¸ì˜ 내부검색 엔진ì—ì„œ 방문ìžê°€ ì–´ë–¤ ê²€ìƒ‰ì„ í–ˆëŠ”ì§€ 추ì í•˜ê³ ë³´ê³ ë°›ì„ ìˆ˜ 있습니다.", + "SiteWithoutDataTitle": "ì•„ì§ ì•„ë¬´ëŸ° ë°ì´í„°ê°€ 기ë¡ë˜ì§€ 않았습니다.", + "SiteWithoutDataDescription": "ì•„ì§ í•´ë‹¹ 사ì´íŠ¸ë¥¼ 추ì 하여 분ì„í•œ ë°ì´í„°ê°€ 없습니다.", + "SiteWithoutDataSetupTracking": "%1$sìžë°”스í¬ë¦½íŠ¸ 트래킹 코드%2$s를 ë‹¹ì‹ ì˜ ì›¹ì‚¬ì´íŠ¸ì— ì¶”ê°€í•˜ì‹œê³ , 페ì´ì§€ë¥¼ ìƒˆë¡œê³ ì¹¨í•´ 주세요.", + "SuperUserAccessCan": "ìŠˆí¼ ìœ ì €ëŠ” 새로운 사ì´íŠ¸ì— 대해서 %sì¼ë°˜ 웹사ì´íŠ¸ ì„¤ì •%sì„ í†µí•´ ê´€ë¦¬í• ìˆ˜ 있습니다.", "Timezone": "시간대", "TrackingSiteSearch": "사ì´íŠ¸ 내부 검색 추ì ", "TrackingTags": "%sì˜ ì¶”ì 코드", "Urls": "URL", "UTCTimeIs": "UTC ì‹œê°„ì€ %s입니다.", + "OnlyMatchedUrlsAllowed": "ìœ„ì— ì 혀진 URL들 중 하나ì—ì„œ 시작ë 경우ì—만 방문ìžë¥¼ 추ì 합니다.", + "OnlyMatchedUrlsAllowedHelp": "ì´ê²ƒì´ 활성화 ë 경우, Piwik는 페ì´ì§€ URLì´ ë‹¹ì‹ ì›¹ì‚¬ì´íŠ¸ì˜ ì•Œë ¤ì§„ URLì¼ ê²½ìš°ì—만 내부 추ì ë§Œì„ ìˆ˜í–‰í•œë‹¤. ì´ë¥¼ 통해, ì‚¬ëžŒë“¤ì´ ë¶„ì„ ê²°ê³¼ë¥¼ 통해 다른 사ì´íŠ¸ì— ìŠ¤íŒ¸ì„ ë³´ë‚´ëŠ” ê²ƒì„ ë°©ì§€í• ìˆ˜ 있다.", "WebsitesManagement": "웹사ì´íŠ¸ 관리", + "XManagement": "%s 관리", + "ChooseMeasurableTypeHeadline": "ë¬´ì—‡ì„ ì¸¡ì •í•˜ê³ ì‹¶ìœ¼ì‹ë‹ˆê¹Œ?", "YouCurrentlyHaveAccessToNWebsites": "현재 %sê°œì˜ ì›¹ì‚¬ì´íŠ¸ê°€ ì—°ê²°ë˜ì–´ 있습니다.", "YourCurrentIpAddressIs": "ë‹¹ì‹ ì˜ í˜„ìž¬ IP 주소는 %s입니다." } diff --git a/plugins/SitesManager/stylesheets/SitesManager.less b/plugins/SitesManager/stylesheets/SitesManager.less index 41d1035bb1147906e3604f255950b2ee2850620c..cd3a43f7c818d766fc599ea7d97dd7672829eeeb 100644 --- a/plugins/SitesManager/stylesheets/SitesManager.less +++ b/plugins/SitesManager/stylesheets/SitesManager.less @@ -104,9 +104,8 @@ td.editable-site-field:hover { } .site-without-data { - padding: 15px; h2 { - border-bottom: 1px solid #ccc; + border-bottom: 1px solid @theme-color-background-tinyContrast; margin: 25px 0; padding: 0 0 5px 0; font-size: 24px; diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig index 20b63266449075d844749b398e5e5c3db1066d5c..eafb7a287f2bf345bc5b74b22ad1b809396976f4 100644 --- a/plugins/SitesManager/templates/siteWithoutData.twig +++ b/plugins/SitesManager/templates/siteWithoutData.twig @@ -2,9 +2,11 @@ {% block notification %}{% endblock %} -{% block content %} - +{% block topcontrols %} {% include "@CoreHome/_siteSelectHeader.twig" %} +{% endblock %} + +{% block content %} <div class="site-without-data"> diff --git a/plugins/SitesManager/tests/Integration/SitesManagerTest.php b/plugins/SitesManager/tests/Integration/SitesManagerTest.php index b71695ae5bce125a89d800225f8d3f5940841127..15345fc231969994e220df6bb0d531b40f343090 100644 --- a/plugins/SitesManager/tests/Integration/SitesManagerTest.php +++ b/plugins/SitesManager/tests/Integration/SitesManagerTest.php @@ -11,6 +11,7 @@ namespace Piwik\Plugins\SitesManager\tests\Integration; use Piwik\Access; use Piwik\Cache; use Piwik\Archive\ArchiveInvalidator; +use Piwik\Container\StaticContainer; use Piwik\Date; use Piwik\Plugins\SitesManager\SitesManager; use Piwik\Tests\Framework\Fixture; @@ -54,7 +55,7 @@ class SitesManagerTest extends IntegrationTestCase public function test_onSiteDeleted_shouldRemoveRememberedArchiveReports() { - $archive = new ArchiveInvalidator(); + $archive = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); $archive->rememberToInvalidateArchivedReportsLater($this->siteId, Date::factory('2014-04-05')); $archive->rememberToInvalidateArchivedReportsLater($this->siteId, Date::factory('2014-04-06')); $archive->rememberToInvalidateArchivedReportsLater(4949, Date::factory('2014-04-05')); diff --git a/plugins/Transitions/javascripts/transitions.js b/plugins/Transitions/javascripts/transitions.js index 52e20800f688ad39fc4d5728f0e26d052cc9b8e3..cb98e3d045fe276ae994c3cf3dedda09eaf8fe1f 100644 --- a/plugins/Transitions/javascripts/transitions.js +++ b/plugins/Transitions/javascripts/transitions.js @@ -231,10 +231,10 @@ Piwik_Transitions.prototype.preparePopover = function () { var totalNbPageviews = self.model.getTotalNbPageviews(); if (totalNbPageviews > 0) { - var share = Math.round(self.model.pageviews / totalNbPageviews * 1000) / 10; + var share = NumberFormatter.formatPercent(Math.round(self.model.pageviews / totalNbPageviews * 1000) / 10); var text = Piwik_Transitions_Translations.ShareOfAllPageviews; - text = text.replace(/%s/, self.model.pageviews).replace(/%s/, share + '%'); + text = text.replace(/%s/, NumberFormatter.formatNumber(self.model.pageviews)).replace(/%s/, share); text += '<br /><em>' + Piwik_Transitions_Translations.DateRange + ' ' + self.model.date + '</em>'; var title = '<h3>' + piwikHelper.addBreakpointsToUrl(self.actionName) + '</h3>'; @@ -341,12 +341,12 @@ Piwik_Transitions.prototype.renderCenterBox = function () { var box = this.centerBox; Piwik_Transitions_Util.replacePlaceholderInHtml( - box.find('.Transitions_Pageviews'), this.model.pageviews); + box.find('.Transitions_Pageviews'), NumberFormatter.formatNumber(this.model.pageviews)); var self = this; var showMetric = function (cssClass, modelProperty, highlightCurveOnSide, groupCanBeExpanded) { var el = box.find('.Transitions_' + cssClass); - Piwik_Transitions_Util.replacePlaceholderInHtml(el, self.model[modelProperty]); + Piwik_Transitions_Util.replacePlaceholderInHtml(el, NumberFormatter.formatNumber(self.model[modelProperty])); if (self.model[modelProperty] == 0) { el.addClass('Transitions_Value0'); @@ -404,7 +404,7 @@ Piwik_Transitions.prototype.renderLoops = function () { } var loops = this.popover.find('#Transitions_Loops').show(); - Piwik_Transitions_Util.replacePlaceholderInHtml(loops, this.model.loops); + Piwik_Transitions_Util.replacePlaceholderInHtml(loops, NumberFormatter.formatNumber(this.model.loops)); this.addTooltipShowingPercentageOfAllPageviews(loops, 'loops'); @@ -562,7 +562,7 @@ Piwik_Transitions.prototype.renderOpenGroup = function (groupName, side, onlyBg) boxText: label, boxTextTooltip: isOthers || !shortened ? false : fullLabel, boxTextNumLines: 3, - curveText: data.percentage + '%', + curveText: NumberFormatter.formatPercent(data.percentage), curveTextTooltip: tooltip, onClick: onClick }); @@ -1375,8 +1375,9 @@ Piwik_Transitions_Model.prototype.getPercentage = function (metric, formatted) { var percentage = (this.pageviews == 0 ? 0 : this[metric] / this.pageviews); if (formatted) { + percentage = this.roundPercentage(percentage); - percentage += '%'; + return NumberFormatter.formatPercent(percentage); } return percentage; diff --git a/plugins/UserCountryMap/javascripts/realtime-map.js b/plugins/UserCountryMap/javascripts/realtime-map.js index 6096ce3786ddb13b1b3a556092dfeba3208ae820..f73259c5e7623323e8a66a9293472e05461451e5 100644 --- a/plugins/UserCountryMap/javascripts/realtime-map.js +++ b/plugins/UserCountryMap/javascripts/realtime-map.js @@ -57,11 +57,14 @@ }, _initStandaloneMap: function () { - $('.top_controls').hide(); - $('.Menu--dashboard').on('piwikSwitchPage', function (event, item) { - var clickedMenuIsNotMap = ($(item).attr('href').indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1); + $('#periodString').hide(); + initTopControls(); + $('#secondNavBar').on('piwikSwitchPage', function (event, item) { + var href = $(item).attr('href'); + var clickedMenuIsNotMap = (href.indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1); if (clickedMenuIsNotMap) { - $('.top_controls').show(); + $('#periodString').show(); + initTopControls(); } }); $('.realTimeMap_overlay').css('top', '0px'); diff --git a/plugins/UserCountryMap/javascripts/visitor-map.js b/plugins/UserCountryMap/javascripts/visitor-map.js index fb4d5ad25976b41896d9caab7557cc60dac979c5..b3b6d747a1f976a4cde64dca02b1d1ef9f78fee3 100644 --- a/plugins/UserCountryMap/javascripts/visitor-map.js +++ b/plugins/UserCountryMap/javascripts/visitor-map.js @@ -156,11 +156,13 @@ var val = data[metric] % 1 === 0 || Number(data[metric]) != data[metric] ? data[metric] : data[metric].toFixed(1); if (metric == 'bounce_rate') { - val += '%'; + val = NumberFormatter.formatPercent(val); } else if (metric == 'avg_time_on_site') { val = new Date(0, 0, 0, val / 3600, val % 3600 / 60, val % 60) .toTimeString() .replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1"); + } else { + val = NumberFormatter.formatNumber(val); } var v = _[metric].replace('%s', '<strong>' + val + '</strong>'); @@ -266,8 +268,10 @@ } function formatPercentage(val) { - if (val < 0.001) return '< 0.1%'; - return Math.round(1000 * val) / 10 + '%'; + if (val < 0.001) { + return '< ' + NumberFormatter.formatPercent(0.1); + } + return NumberFormatter.formatPercent(Math.round(1000 * val) / 10); } /* diff --git a/plugins/UserCountryMap/stylesheets/realtime-map.less b/plugins/UserCountryMap/stylesheets/realtime-map.less index c6c98ffda5bcf22a2b5027c870367de92e3ce148..b6dbd8a65bf0333b150a3bbb3ff55366c0cf8b9b 100644 --- a/plugins/UserCountryMap/stylesheets/realtime-map.less +++ b/plugins/UserCountryMap/stylesheets/realtime-map.less @@ -13,6 +13,10 @@ filter: alpha(opacity=3); } +.RealTimeMap:focus { + outline: none; +} + .RealTimeMap-black { position: absolute; right: 0; diff --git a/plugins/UserLanguage/UserLanguage.php b/plugins/UserLanguage/UserLanguage.php index be892d419659e15164c58633cab9440f12e3910f..7bb409a5e32b5736692eddf5963243d117b070b6 100644 --- a/plugins/UserLanguage/UserLanguage.php +++ b/plugins/UserLanguage/UserLanguage.php @@ -22,7 +22,8 @@ class UserLanguage extends \Piwik\Plugin public function registerEvents() { return array( - 'Live.getAllVisitorDetails' => 'extendVisitorDetails' + 'Live.getAllVisitorDetails' => 'extendVisitorDetails', + 'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction', ); } @@ -44,4 +45,11 @@ class UserLanguage extends \Piwik\Plugin $out .= '<h2 piwik-enriched-headline>' . Piwik::translate('UserLanguage_BrowserLanguage') . '</h2>'; $out .= FrontController::getInstance()->fetchDispatch('UserLanguage', 'getLanguage'); } -} \ No newline at end of file + + public function renameUserSettingsModuleAndAction(&$module, &$action) + { + if ($module == 'UserSettings' && ($action == 'getLanguage' || $action == 'getLanguageCode')) { + $module = 'UserLanguage'; + } + } +} diff --git a/plugins/UserLanguage/tests/System/UserSettingsBCTest.php b/plugins/UserLanguage/tests/System/UserSettingsBCTest.php new file mode 100644 index 0000000000000000000000000000000000000000..208048b8ccf79814a65444d7c04243b4dcca3c73 --- /dev/null +++ b/plugins/UserLanguage/tests/System/UserSettingsBCTest.php @@ -0,0 +1,78 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Plugins\UserLanguage\tests\System; + +use Piwik\Tests\Fixtures\OneVisitorTwoVisits; +use Piwik\Tests\Framework\TestCase\SystemTestCase; + +/** + * @group UserLanguage + * @group UserLanguage_System + */ +class UserSettingsBCTest extends SystemTestCase +{ + /** + * @var OneVisitorTwoVisits + */ + public static $fixture; + + /** + * @dataProvider getApiForTesting + */ + public function test_Api($api, $params) + { + $this->runApiTests($api, $params); + } + + public function getApiForTesting() + { + $idSite = self::$fixture->idSite; + $dateTime = self::$fixture->dateTime; + + $api = array( + 'UserSettings.getLanguage', + 'UserSettings.getLanguageCode', + ); + + $result = array(); + + foreach ($api as $method) { + list($module, $action) = explode('.', $method); + + // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing + // against UserLanguage & overwrite the module & action w/ otherRequestParameters) + $result[] = array('UserLanguage.getLanguage', array('idSite' => $idSite, + 'date' => $dateTime, + 'periods' => array('day'), + 'testSuffix' => $module . '_' . $method . '_', + 'otherRequestParameters' => array( + 'method' => $method, + ), + )); + + // api metadata tests + $result[] = array('API.getMetadata', array( + 'idSite' => $idSite, + 'date' => $dateTime, + 'apiModule' => $module, + 'apiAction' => $action, + 'testSuffix' => $module . '_' . $method . '_', + )); + } + + return $result; + } + + public static function getPathToTestDirectory() + { + return dirname(__FILE__); + } +} + +UserSettingsBCTest::$fixture = new OneVisitorTwoVisits(); \ No newline at end of file diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..9bf598e68fbfd50ff25d5931816a79c10bbf4fa0 --- /dev/null +++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Settings</category> + <name>Language code</name> + <module>UserLanguage</module> + <action>getLanguageCode</action> + <dimension>Language</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=UserLanguage&apiAction=getLanguageCode&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=UserLanguage&apiAction=getLanguageCode&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>UserLanguage_getLanguageCode</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..de31fc9d359ef1474002fc6334ea4f81862898f6 --- /dev/null +++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>French (fr)</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>languageCode==fr</segment> + </row> +</result> \ No newline at end of file diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..9e886e4c3fab5943bcb9c7d6a6563aa1457d3691 --- /dev/null +++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml @@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <category>Visitor Settings</category> + <name>Browser language</name> + <module>UserLanguage</module> + <action>getLanguage</action> + <dimension>Language</dimension> + <metrics> + <nb_visits>Visits</nb_visits> + <nb_uniq_visitors>Unique visitors</nb_uniq_visitors> + <nb_actions>Actions</nb_actions> + <nb_users>Users</nb_users> + </metrics> + <metricsDocumentation> + <nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits> + <nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors> + <nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions> + <nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users> + <nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit> + <avg_time_on_site>The average duration of a visit.</avg_time_on_site> + <bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate> + <conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate> + </metricsDocumentation> + <processedMetrics> + <nb_actions_per_visit>Actions per Visit</nb_actions_per_visit> + <avg_time_on_site>Avg. Time on Website</avg_time_on_site> + <bounce_rate>Bounce Rate</bounce_rate> + <conversion_rate>Conversion Rate</conversion_rate> + </processedMetrics> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=UserLanguage&apiAction=getLanguage&period=day&date=2010-03-06</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=UserLanguage&apiAction=getLanguage&period=day&date=2010-02-05,2010-03-06</imageGraphEvolutionUrl> + <uniqueId>UserLanguage_getLanguage</uniqueId> + </row> +</result> \ No newline at end of file diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e95d73c83758e43789f5032db344f0b2cc2d4f6 --- /dev/null +++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8" ?> +<result> + <row> + <label>French</label> + <nb_uniq_visitors>1</nb_uniq_visitors> + <nb_visits>2</nb_visits> + <nb_actions>8</nb_actions> + <nb_users>0</nb_users> + <max_actions>7</max_actions> + <sum_visit_length>1621</sum_visit_length> + <bounce_count>1</bounce_count> + <nb_visits_converted>2</nb_visits_converted> + <segment>languageCode==fr,languageCode=@fr-</segment> + </row> +</result> \ No newline at end of file diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig index 8c48ad2f33f8ae14555cfa0bd10fac8efb48b4ee..e2fb24dc9aca5c9f2cee433cce2ace6bb2f24ca2 100644 --- a/plugins/UsersManager/templates/index.twig +++ b/plugins/UsersManager/templates/index.twig @@ -10,8 +10,6 @@ <section class="sites_selector_container"> <p>{{ 'UsersManager_MainDescription'|translate }}</p> - <div class="sites_selector_title">{{ 'SitesManager_Sites'|translate }}:</div> - {% set applyAllSitesText %} <strong>{{ 'UsersManager_ApplyToAllWebsites'|translate }}</strong> {% endset %} diff --git a/plugins/UsersManager/templates/userSettings.twig b/plugins/UsersManager/templates/userSettings.twig index b202407a07358e4241d6c6c525d411f99c56acce..57e04dff8593326a71724dca908fe18247eea570 100644 --- a/plugins/UsersManager/templates/userSettings.twig +++ b/plugins/UsersManager/templates/userSettings.twig @@ -64,7 +64,7 @@ show-all-sites-item="false" showselectedsite="true" id="defaultReportSiteSelector" - style="position: relative"></div> + ></div> </div> <div class="form-group"> diff --git a/plugins/VisitsSummary/templates/_sparklines.twig b/plugins/VisitsSummary/templates/_sparklines.twig index 94682a928c3e1f2a6caa20b91fff42a09d2d711a..b00ba537a1a1199c57bdca299a3b57e3e166b3fc 100644 --- a/plugins/VisitsSummary/templates/_sparklines.twig +++ b/plugins/VisitsSummary/templates/_sparklines.twig @@ -5,14 +5,14 @@ <div class="sparkline"> {{ sparkline(urlSparklineNbVisits)|raw }} - {{ 'General_NVisits'|translate("<strong>"~nbVisits~"</strong>")|raw }}{% if displayUniqueVisitors %}, - {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors~"</strong>")|raw }}{% endif %} + {{ 'General_NVisits'|translate("<strong>"~nbVisits|number~"</strong>")|raw }}{% if displayUniqueVisitors %}, + {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors|number~"</strong>")|raw }}{% endif %} </div> {% if nbUsers > 0 %} {# Most of users will not have used `setUserId` so this would be confusingly zero #} <div class="sparkline"> {{ sparkline(urlSparklineNbUsers)|raw }} - {{ 'General_NUsers'|translate("<strong>"~nbUsers~"</strong>")|raw }} + {{ 'General_NUsers'|translate("<strong>"~nbUsers|number~"</strong>")|raw }} </div> {% endif %} <div class="sparkline"> @@ -22,11 +22,11 @@ </div> <div class="sparkline"> {{ sparkline(urlSparklineBounceRate)|raw }} - {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate~"</strong>")|raw }} + {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate|percent~"</strong>")|raw }} </div> <div class="sparkline"> {{ sparkline(urlSparklineActionsPerVisit)|raw }} - {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit~"</strong>")|raw }} + {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit|number(1)~"</strong>")|raw }} </div> {% if showActionsPluginReports|default(false) %} <div class="sparkline"> @@ -45,36 +45,36 @@ {% if showOnlyActions %} <div class="sparkline"> {{ sparkline(urlSparklineNbActions)|raw }} - {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions~"</strong>")|raw }} + {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions|number~"</strong>")|raw }} </div> {% else %} <div class="sparkline"> {{ sparkline(urlSparklineNbPageviews)|raw }} - {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews~"</strong>")|trim|raw }}, - {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews~"</strong>")|raw }} + {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews|number~"</strong>")|trim|raw }}, + {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews|number~"</strong>")|raw }} </div> {% if displaySiteSearch %} <div class="sparkline"> {{ sparkline(urlSparklineNbSearches)|raw }} - {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches~"</strong>")|trim|raw }}, - {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords~"</strong>")|raw }} + {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches|number~"</strong>")|trim|raw }}, + {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords|number~"</strong>")|raw }} </div> {% endif %} <div class="sparkline"> {{ sparkline(urlSparklineNbDownloads)|raw }} - {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads~"</strong>")|trim|raw }}, - {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads~"</strong>")|raw }} + {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads|number~"</strong>")|trim|raw }}, + {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads|number~"</strong>")|raw }} </div> <div class="sparkline"> {{ sparkline(urlSparklineNbOutlinks)|raw }} - {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks~"</strong>")|trim|raw }}, - {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks~"</strong>")|raw }} + {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks|number~"</strong>")|trim|raw }}, + {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks|number~"</strong>")|raw }} </div> {% endif %} {% endif %} <div class="sparkline"> {{ sparkline(urlSparklineMaxActions)|raw }} - {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions~"</strong>")|raw }} + {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions|number~"</strong>")|raw }} </div> {{ postEvent('Template.VisitsSummaryOverviewSparklines') }} diff --git a/plugins/Widgetize/Menu.php b/plugins/Widgetize/Menu.php index f796faf57e1bc1b8d264b573849b64b346ef2225..850df3e2daca63e4778fd1b277501269a7a6df13 100644 --- a/plugins/Widgetize/Menu.php +++ b/plugins/Widgetize/Menu.php @@ -18,7 +18,6 @@ class Menu extends \Piwik\Plugin\Menu $tooltip = Piwik::translate('Widgetize_TopLinkTooltip'); $urlParams = $this->urlForAction('index', array('segment' => false)); - $menu->addPlatformItem(null, $urlParams, 50, $tooltip); $menu->addPlatformItem('General_Widgets', $urlParams, 5, $tooltip); } diff --git a/plugins/Widgetize/templates/index.twig b/plugins/Widgetize/templates/index.twig index a7987239286fcb8288bd51be8b610f1c11f026b6..8ada9906cf2f2f31fa9f554ad93e6a77176db09e 100644 --- a/plugins/Widgetize/templates/index.twig +++ b/plugins/Widgetize/templates/index.twig @@ -2,6 +2,11 @@ {% set title %}{{ 'General_Widgets'|translate }}{% endset %} +{% block topcontrols %} + {% include "@CoreHome/_siteSelectHeader.twig" %} + {% include "@CoreHome/_periodSelect.twig" %} +{% endblock %} + {% block content %} <div> @@ -29,8 +34,6 @@ <h2 piwik-enriched-headline>{{ title }}</h2> -{% include "@CoreHome/_siteSelectHeader.twig" %} - <div class="widgetize"> <p>With Piwik, you can export your Web Analytics reports on your blog, website, or intranet dashboard... in one click. @@ -58,10 +61,6 @@ <h2>Widgetize reports</h2> <p>Select a report, and copy paste in your page the embed code below the widget: - <div class="top_controls"> - {% include "@CoreHome/_periodSelect.twig" %} - </div> - <div id="widgetPreview"></div> <div id='iframeDivToExport' style='display:none;'></div> diff --git a/plugins/ZenMode/ZenMode.php b/plugins/ZenMode/ZenMode.php deleted file mode 100644 index eee60c46032c1bf69cb4384e42616c39a7753792..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/ZenMode.php +++ /dev/null @@ -1,52 +0,0 @@ -<?php -/** - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - * - */ -namespace Piwik\Plugins\ZenMode; - -/** - */ -class ZenMode extends \Piwik\Plugin -{ - /** - * @see Piwik\Plugin::registerEvents - */ - public function registerEvents() - { - return array( - 'AssetManager.getJavaScriptFiles' => 'getJsFiles', - 'AssetManager.getStylesheetFiles' => 'getStylesheetFiles', - 'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys' - ); - } - - public function getClientSideTranslationKeys(&$translations) - { - $translations[] = 'SitesManager_Sites'; - $translations[] = 'General_Reports'; - $translations[] = 'MultiSites_LoadingWebsites'; - $translations[] = 'ZenMode_SearchForAnything'; - $translations[] = 'ZenMode_QuickAccessTitle'; - $translations[] = 'ZenMode_HowToSearch'; - $translations[] = 'ZenMode_HowToToggleZenMode'; - $translations[] = 'ZenMode_Activated'; - } - - public function getJsFiles(&$jsFiles) - { - $jsFiles[] = "plugins/ZenMode/javascripts/zen-mode.js"; - $jsFiles[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.js"; - $jsFiles[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js"; - $jsFiles[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js"; - } - - public function getStylesheetFiles(&$stylesheets) - { - $stylesheets[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.less"; - $stylesheets[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode.less"; - } -} diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html deleted file mode 100644 index efc284d9dac4b369fa5fc2336251a0897cd21d89..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html +++ /dev/null @@ -1,41 +0,0 @@ -<div class="quick-access" title="{{ 'ZenMode_QuickAccessTitle' | translate }}"> - <input ng-keydown="onKeypress($event)" - ng-change="search(search.term)" - ng-model="search.term" - type="text" - placeholder="{{ 'ZenMode_SearchForAnything' | translate }}"/> - <ul ng-show="search.term"> - <li class="quick-access-category" - ng-click="search('menuCategory')">Menu</li> - <li class="no-result" - ng-hide="menuItems | length">---</li> - <li class="result" - ng-class="{selected: $index == search.index}" - ng-click="selectMenuItem(entry.index)" - ng-mouseenter="search.index=$index" - ng-repeat="entry in menuItems"><a>{{ entry.name | trim }}</a></li> - - <li class="quick-access-category" - ng-click="search('reportCategory')">{{ 'General_Reports' | translate }}</li> - <li class="no-result" - ng-hide="reportEntries | length">---</li> - <li class="result" - ng-class="{selected: ((menuItems | length) + $index) == search.index}" - ng-mouseenter="search.index=((menuItems | length) + $index)" - ng-click="selectMenuItem(report.index)" - ng-repeat="report in reportEntries"><a>{{ report.name | trim }}</a></li> - - <li class="quick-access-category" - ng-click="search('%')">{{ 'SitesManager_Sites' | translate }}</li> - <li class="no-result" - ng-hide="(sitesModel.sites | length) || sitesModel.isLoading">---</li> - <li class="no-result" - ng-show="sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li> - <li class="result" - ng-show="!sitesModel.isLoading" - ng-mouseenter="search.index=((menuItems | length) + $index + (reportEntries | length))" - ng-class="{selected: ((menuItems | length) + $index + (reportEntries | length)) == search.index}" - ng-click="selectSite(site.idsite)" - ng-repeat="site in sitesModel.sites"><a>{{ site.name | trim }}</a></li> - </ul> -</div> \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js deleted file mode 100644 index c05fb5fbbce5448b770941037d83c225a50a54f6..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js +++ /dev/null @@ -1,140 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <div piwik-dialog="showDialog">...</div> - * Will show dialog once showDialog evaluates to true. - * - * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed. - */ -(function () { - angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective); - - QuickAccessDirective.$inject = ['$rootElement', '$timeout', '$filter', 'siteSelectorModel', 'piwik']; - - function QuickAccessDirective ($rootElement, $timeout, $filter, siteSelectorModel, piwik) { - - return { - restrict: 'A', - replace: true, - scope: {}, - templateUrl: 'plugins/ZenMode/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster, - link: function (scope, element, attrs) { - - var menuIndex = -1; - var menuItems = []; - var reportEntries = []; - - scope.reportEntries = []; - scope.menuItems = []; - scope.sitesModel = siteSelectorModel; - - function getMenuItems() - { - if (menuItems && menuItems.length) { - return menuItems; - } - - $rootElement.find('#topRightBar .topBarElem a').each(function (index, element) { - menuItems.push({name: $(element).text(), index: ++menuIndex, category: 'menuCategory'}); - $(element).attr('quick_access', menuIndex); - }); - - return menuItems; - } - - function getReportEntries() - { - if (reportEntries && reportEntries.length) { - return reportEntries; - } - - $rootElement.find('.Menu-tabList a').each(function (index, element) { - reportEntries.push({name: $(element).text(), category: 'reportCategory', index: ++menuIndex}); - $(element).attr('quick_access', menuIndex); - }); - - return reportEntries; - } - - function highlightPreviousItem() - { - if (0 >= (scope.search.index - 1)) { - scope.search.index = 0; - } else { - scope.search.index--; - } - } - - function highlightNextItem() - { - var numTotal = element.find('li.result').length; - - if (numTotal <= (scope.search.index + 1)) { - scope.search.index = numTotal - 1; - } else { - scope.search.index++; - } - } - - function executeMenuItem() - { - var results = element.find('li.result'); - if (results && results.length && results[scope.search.index]) { - var selectedMenuElement = $(results[scope.search.index]); - $timeout(function () { - selectedMenuElement.click(); - }, 20); - } - } - - scope.onKeypress = function (event) { - - if (38 == event.which) { - highlightPreviousItem(); - event.preventDefault(); - } else if (40 == event.which) { - highlightNextItem(); - event.preventDefault(); - } else if (13 == event.which) { - executeMenuItem(); - } - }; - - scope.search = function (searchTerm) { - this.search.index = 0; - - this.menuItems = $filter('filter')(getMenuItems(), searchTerm); - this.reportEntries = $filter('filter')(getReportEntries(), searchTerm); - this.sitesModel.searchSite(searchTerm); - }; - - scope.selectSite = function (idsite) { - this.sitesModel.loadSite(idsite); - }; - - scope.selectMenuItem = function (index) { - var target = $rootElement.find('[quick_access=' + index + ']'); - - if (target && target.length && target[0]) { - var actualTarget = target[0]; - - var href = $(actualTarget).attr('href'); - - if (href && href.length > 10) { - actualTarget.click(); - } else { - $(actualTarget).click(); - } - } - }; - - } - }; - } -})(); \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less deleted file mode 100644 index 52d29dafa99ca1f31610e2a52f09583da296ba94..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less +++ /dev/null @@ -1,20 +0,0 @@ -.quick-access { - .selected { - background-color: #f2f2f2 !important; - } - .quick-access-category { - text-align: left !important; - font-size: 14px; - padding: 5px; - cursor: pointer; - } - .result { - cursor: pointer; - } - .quick-access-category:hover { - background: none !important; - } - .no-result { - padding-left: 27px; - } -} \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js b/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js deleted file mode 100644 index 420020b75fd631f5a7da9c423c1919f99ae564a4..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <div piwik-zen-mode-switcher>...</div> - * Will toggle the zen mode on click on this element. - */ -(function () { - angular.module('piwikApp').directive('piwikReportingMenu', piwikZenModeSwitcher); - - piwikZenModeSwitcher.$inject = ['$rootElement', '$filter']; - - function piwikZenModeSwitcher($rootElement, $filter) { - - return { - restrict: 'A', - compile: function (element, attrs) { - - element.find('.Menu--dashboard').prepend( - '<span piwik-zen-mode-switcher class="deactivateZenMode">' - + '<img src="plugins/CoreHome/images/navigation_collapse.png" >' - + '</span>'); - - return function () { - }; - } - }; - - } -})(); \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js b/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js deleted file mode 100644 index 36ac43a39a596df73366e6082377bd28d3a7e5e8..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -/** - * Usage: - * <div piwik-zen-mode-switcher>...</div> - * Will toggle the zen mode on click on this element. - */ -(function () { - angular.module('piwikApp').directive('piwikZenModeSwitcher', piwikZenModeSwitcher); - - piwikZenModeSwitcher.$inject = ['$rootElement', '$filter']; - - function piwikZenModeSwitcher($rootElement, $filter) { - - function showZenModeIsActivatedNotification() { - var howToSearch = $filter('translate')('ZenMode_HowToSearch'); - var howToToggle = $filter('translate')('ZenMode_HowToToggleZenMode'); - var activated = $filter('translate')('ZenMode_Activated'); - - var message = '<ul><li>' + howToSearch + '</li><li>' + howToToggle + '</li></ul>'; - - var UI = require('piwik/UI'); - var notification = new UI.Notification(); - notification.show(message, { - title: activated, - context: 'info', - id: 'ZenMode_EnabledInfo' - }); - } - - return { - restrict: 'A', - compile: function (element, attrs) { - - element.on('click', function() { - $rootElement.trigger('zen-mode-toggle', {}); - - if ($rootElement.hasClass('zenMode')) { - showZenModeIsActivatedNotification(); - } - }); - - return function () { - }; - } - }; - - } -})(); \ No newline at end of file diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less b/plugins/ZenMode/angularjs/zen-mode/zen-mode.less deleted file mode 100644 index d637f202418ba8cffa60bd0d61633edc256ba3f1..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less +++ /dev/null @@ -1,93 +0,0 @@ -.deactivateZenMode { - float:right; - margin-right: 13px; - margin-top: 4px; - display: none; - img { - width: 16px; - height: 16px; - } -} - -.activateZenMode { - img { - margin-top: -3px; - margin-bottom: -3px; - width: 16px; - height: 16px; - } -} - -.Menu--dashboard #Searchmenu { - display: none; -} - -.zenMode { - - #header { - display: none; - } - - .Menu--dashboard { - border-bottom: 1px solid @theme-color-background-lowContrast !important; - - #Searchmenu { - display: block; - } - } - - .quick-access { - display: inline-block; - color: #999; - padding: 8px 20px 7px 20px; - input { - border:0px; - border-bottom: 1px solid #CCC; - font-size: 11px !important; - } - } - - .deactivateZenMode { - display: block; - } - - .activateZenMode { - display: none; - } - - .nav_sep { - display: none; - } - - /* MENU LEVEL2 HOVER */ - .Menu--dashboard > .Menu-tabList > li li { - float: none; - text-align: left; - } - - .Menu--dashboard > .Menu-tabList > li li:hover { - background-color: #f2f2f2; - } - - .Menu--dashboard > .Menu-tabList > li ul { - display: none; - } - - .Menu--dashboard > .Menu-tabList > li.sfHover ul, - .Menu--dashboard > .Menu-tabList > li:hover ul { - display: none; - z-index: 150; - background-color: @theme-color-background-base; - width: auto; - border: 1px solid #D9D9D9; - padding-top: 0px; - border-top: 4px solid #D3291F; - } - - #root .sites_selector_in_dashboard { - margin-top:0px; - margin-right: 0px; - display: none; - } - -} diff --git a/plugins/ZenMode/javascripts/zen-mode.js b/plugins/ZenMode/javascripts/zen-mode.js deleted file mode 100644 index e4e163db8b9953391e38349ea61597112993665b..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/javascripts/zen-mode.js +++ /dev/null @@ -1,130 +0,0 @@ -/*! - * Piwik - free/libre analytics platform - * - * @link http://piwik.org - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later - */ - -$(document).ready(function () { - - if (!isDashboard()) { - return; - } - - var addedElement = $('#topRightBar').append( - ' | <span class="topBarElem activateZenMode" piwik-zen-mode-switcher>' - + '<img src="plugins/CoreHome/images/navigation_expand.png">' - + ' </span>' - ); - - piwikHelper.compileAngularComponents(addedElement); - - angular.element(document).injector().invoke(handleZenMode); - - function handleZenMode ($rootElement, $cookies) { - - var zenMode = !!parseInt($cookies.zenMode, 10); - - $rootElement.on('zen-mode-toggle', toggleZenMode); - - function toggleZenMode() - { - zenMode = !zenMode; - - updateZenMode(); - } - - function updateZenMode() - { - $cookies.zenMode = zenMode ? '1' : '0'; - - if (zenMode) { - $rootElement.addClass('zenMode'); - initMenu(); - } else { - $rootElement.removeClass('zenMode'); - uninitMenu(); - } - - resetSubmenu(); - } - - if (zenMode) { - updateZenMode(); - } - - Mousetrap.bind('alt+z', function() { - toggleZenMode(); - }); - - Mousetrap.bind('alt+f', function(event) { - if (event.preventDefault) { - event.preventDefault(); - } else { - event.returnValue = false; // IE - } - - $('.quick-access input').focus(); - }); - } - - function isDashboard() - { - return !!$('[piwik-reporting-menu]').length; - } - - function initMenu () { - var menuNode = $('.Menu--dashboard'); - menuNode.on('piwikSwitchPage', resetSubmenu); - menuNode.on('mouseenter', 'li:has(ul)', overMainLI); - menuNode.on('mouseleave', 'li:has(ul)', outMainLI); - - $('#Searchmenu').on('keydown focus', '.quick-access input', showQuickAccessMenu); - $('#Searchmenu').on('blur', '.quick-access input', hideQuickAccessMenu); - } - - function uninitMenu () { - var menuNode = $('.Menu--dashboard'); - menuNode.off('piwikSwitchPage', resetSubmenu); - menuNode.off('mouseenter', 'li:has(ul)', overMainLI); - menuNode.off('mouseleave', 'li:has(ul)', outMainLI); - - $('#Searchmenu').off('keydown focus', '.quick-access input', showQuickAccessMenu); - $('#Searchmenu').off('blur', '.quick-access input', hideQuickAccessMenu); - } - - function overMainLI () { - var $this = $(this); - var position = $this.position(); - var width = $this.width(); - var height = $this.height(); - - $this.find('ul').css({ - left: position.left + 'px', - display: 'block', - minWidth: width + 'px', - position: 'absolute', - top: (position.top + height) + 'px', - maxHeight: 'none' - }); - } - - function outMainLI () { - $(this).find('ul').css({left: '', display: '', minWidth: '', position: '', top: '', maxHeight: ''}); - } - - function resetSubmenu() - { - $('.Menu--dashboard').find('li:has(ul)').mouseleave(); - } - - function showQuickAccessMenu() { - resetSubmenu(); - $('#Searchmenu').mouseenter(); - } - - function hideQuickAccessMenu() { - $('#Searchmenu').mouseleave(); - } -}); - diff --git a/plugins/ZenMode/lang/cs.json b/plugins/ZenMode/lang/cs.json deleted file mode 100644 index 9ff86d36151f9a5b2edb42294c3e668baf38f0c8..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/cs.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "NebuÄte ruÅ¡eni. Zen režim vÄ›ci zjednoduÅ¡Ã. Je dostupný pÅ™es ikonu v pravém hornÃm rohu obrazovky.", - "SearchForAnything": "Hledat cokoliv", - "QuickAccessTitle": "Hledat hlášenÃ, webové stránky nebo položky menu", - "HowToSearch": "Pokud chcete najÃt hlášenà nebo položky menu, použijte vyhledávacà pole v pravé hornà Äásti, nebo stisknÄ›te 'alt+f'.", - "HowToToggleZenMode": "Pokud chcete pÅ™epnout zen režim, použijte Å¡ipku v pravé hornà oblasti, nebo stisknÄ›te 'alt+z'.", - "Activated": "Zen režim aktivován" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/da.json b/plugins/ZenMode/lang/da.json deleted file mode 100644 index 8275461eaf0e73e22e111d363929fedc383fe961..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/da.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Søg efter alt", - "QuickAccessTitle": "Søg efter menupunkter, rapporter og hjemmesider", - "HowToSearch": "For at søge efter menupunkter, rapporter eller hjemmesider bruge søgefeltet øverst til højre, eller tryk pÃ¥ 'alt+f'.", - "HowToToggleZenMode": "Forlad eller kom i Zen-tilstand ved at klikke pÃ¥ pilen øverst til højre, eller tryk pÃ¥ 'alt+z'.", - "Activated": "Zen-tilstand aktiveret" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/de.json b/plugins/ZenMode/lang/de.json deleted file mode 100644 index 24ffa53ade495303b38e090680c14aa5f233f0d2..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/de.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Bleiben Sie \"Zen\" mit Piwik. Der \"Zen-Modus\" hält die Dinge einfach. Er ist verfügbar über das Icon am rechten, oberen Ende des Bildschirms.", - "SearchForAnything": "Nach etwas suchen", - "QuickAccessTitle": "Nach Menüeinträgen, Berichten oder Websites suchen", - "HowToSearch": "Um nach Menüeinträgen, Berichten oder Websites zu suchen, das Suchfeld oben benutzen oder Alt+f drücken.", - "HowToToggleZenMode": "Auf den oberen rechten Pfeil klicken um den Zen Modus zu verlassen oder Alt+t drücken.", - "Activated": "Zen Modus aktiviert" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/el.json b/plugins/ZenMode/lang/el.json deleted file mode 100644 index 5a29f9805a33e6958a0195632bcc7b2f5f8ca6d4..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/el.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Μείνετε στο Zen με το Piwik. Η κατάσταση Zen τηÏεί τα Ï€Ïάματα σε απλή κατάσταση. Είναι διαθÎσιμη ως εικονίδιο πάνω δεξιά στην οθόνη.", - "SearchForAnything": "Αναζήτηση για όλα", - "QuickAccessTitle": "Αναζήτηση για καταχωÏήσεις μενοÏ, αναφοÏÎÏ‚ και ιστοτόπους", - "HowToSearch": "Για να αναζητήσετε σε καταχωÏήσεις μενοÏ, αναφοÏÎÏ‚ ή ιστοτόπους χÏησιμοποιείστε το πλαίσιο αναζήτηση πάνω δεξιά ή πατήστε 'Alt+F'.", - "HowToToggleZenMode": "Για να βγείτε ή μεταβείτε σε κατάσταση Zen, πατήστε στο βÎλος πάνω δεξιά ή πατήστε 'Alt+Z'.", - "Activated": "Η κατάσταση Zen ενεÏγοποιήθηκε" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/en.json b/plugins/ZenMode/lang/en.json deleted file mode 100755 index 4a3aa78ee8a5960d40660dcd2d9529f18bd2e5af..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/en.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Stay Zen with Piwik. Zen mode keeps things simple. It is available via the icon in the top right of the screen.", - "SearchForAnything": "Search for anything", - "QuickAccessTitle": "Search for menu entries, reports and websites", - "HowToSearch": "To search for menu items, reports or websites use the search box on the top right or press 'alt+f'.", - "HowToToggleZenMode": "To leave or enter the zen mode click the arrow on the top right or press 'alt+z'.", - "Activated": "Zen mode activated" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/es.json b/plugins/ZenMode/lang/es.json deleted file mode 100644 index 27fcf38a62a1408e8ac639a54c90b095e1ff5821..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/es.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Permanecer Zen con Piwik. El modo Zen mantiene las cosas simples. Está disponible vÃa el icono en el extremo superior derecho de la pantalla.", - "SearchForAnything": "Buscar lo que quiera", - "QuickAccessTitle": "Buscar entradas de menú, reportes y sitios de internet", - "HowToSearch": "Para buscar entradas de menú, reportes o sitios de internet utilice la caja de búsqueda en la parte superior derecha o presione 'alt+f'.", - "HowToToggleZenMode": "Para salir o ingresar al modo Zen haga clic en la flecha en la parte superior derecha o presione 'alt+z'.", - "Activated": "Modo Zen activado" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/fa.json b/plugins/ZenMode/lang/fa.json deleted file mode 100644 index d221d07b5604ea6eaa497e8a89d18d176b423296..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/fa.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "جستجوی همه" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/fr.json b/plugins/ZenMode/lang/fr.json deleted file mode 100644 index bd8c99350c8508ce60e4817042d33c9034d10ace..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/fr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Restez zen avec Piwik. Le mode zen conserve les choses simples. Il est disponible via l'icône en haut à droite de l'écran.", - "SearchForAnything": "Rechercher tout", - "QuickAccessTitle": "Rechercher des éléments du menu, rapports et sites web", - "HowToSearch": "Pour rechercher des éléments du menu, rapports ou sites web utilisez la barre de recherche en haut à droite ou pressez 'alt+f'.", - "HowToToggleZenMode": "Pour quitter ou entrer en mode zen cliquez sur la flèche dans le coin supérieur droit ou pressez 'alt+z'.", - "Activated": "Mode zen activé" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/hi.json b/plugins/ZenMode/lang/hi.json deleted file mode 100644 index 44ac4ac168fc8a20b151d8d162941efb0610b4cc..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/hi.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Piwik साथ जेन रहें। ज़ेन मोड सरल बातें करती रहती है। यह सà¥à¤•à¥à¤°à¥€à¤¨ के ऊपर सही में आइकन के माधà¥à¤¯à¤® से उपलबà¥à¤§ है।", - "SearchForAnything": "कà¥à¤› के लिठखोज", - "QuickAccessTitle": "मेनू पà¥à¤°à¤µà¤¿à¤·à¥à¤Ÿà¤¿à¤¯à¥‹à¤‚, रिपोरà¥à¤Ÿà¥‹à¤‚ और वेबसाइटों के लिठखोज", - "Activated": "ज़ेन मोड सकà¥à¤°à¤¿à¤¯" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/it.json b/plugins/ZenMode/lang/it.json deleted file mode 100644 index cb5bcb529565f0ae269c83577fde2beb344254b5..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/it.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Sii Zen con Piwik. La modalità Zen rende le cose facili. È disponibile tramite l'icona che si trova nell'angolo in alto a destra dello schermo.", - "SearchForAnything": "Cerca tutto", - "QuickAccessTitle": "Ricerca elementi di menù, report e siti web", - "HowToSearch": "Per ricercare elementi di menù, report o siti web utilizza la casella di ricerca in alto a destra o premi 'alt+f'.", - "HowToToggleZenMode": "Per lasciare la modalità Zen o entrarvi, clicca sulla freccia in alto a destra o premi 'alt+z'.", - "Activated": "Modalità Zen attivata" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ja.json b/plugins/ZenMode/lang/ja.json deleted file mode 100644 index 3bc49cdb1e19a3fd3e14848b0ea9483e4504ce3e..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/ja.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "ãªã‚“ã§ã‚‚検索", - "QuickAccessTitle": "メニューエントリーã€ãƒ¬ãƒãƒ¼ãƒˆã€ã‚¦ã‚§ãƒ–サイトを検索", - "HowToSearch": "ãƒ¡ãƒ‹ãƒ¥ãƒ¼é …ç›®ã‚„ãƒ¬ãƒãƒ¼ãƒˆã€ã‚¦ã‚§ãƒ–サイトをãŠæŽ¢ã—ã®å ´åˆã€å³ä¸Šã®æ¤œç´¢ãƒœãƒƒã‚¯ã‚¹ã‚’ã”利用ã«ãªã‚‹ã‹ã€ã‚ーボード㮠'alt+f' を押ã—ã¦ãã ã•ã„。", - "HowToToggleZenMode": "禅モードを切り替ãˆã‚‹ã«ã¯ã€å³ä¸Šã®çŸ¢å°ã‚’クリックã™ã‚‹ã‹ã€ã‚ーボード㮠'alt+z' を押ã—ã¦ãã ã•ã„。", - "Activated": "禅モードを有効化" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/nb.json b/plugins/ZenMode/lang/nb.json deleted file mode 100644 index 0b5c865c5ebd0376f5124156bc61a82dc5b1a338..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/nb.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Søk etter noe", - "Activated": "Zen-modus aktivert" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/nl.json b/plugins/ZenMode/lang/nl.json deleted file mode 100644 index 930411c0edd3eb90feb151c67fd61d25427f27d9..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/nl.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Blijf zen met Piwik. Zen mode houdt de dingen eenvoudig. Het is beschikbaar via het icoon in de rechterbovenhoek van het scherm.", - "SearchForAnything": "Zoeken op alles", - "QuickAccessTitle": "Zoeken op menu-items, rapporten en websites", - "HowToSearch": "Om te zoeken op menu-items, rapporten of websites gebruik het zoekvak rechtsboven of druk op 'alt+f'.", - "HowToToggleZenMode": "Om de zen-modus te betreden of verlaten klik op pijl rechtsboven of druk 'alt+z'.", - "Activated": "Zen-modus geactiveerd" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/pl.json b/plugins/ZenMode/lang/pl.json deleted file mode 100644 index d638e2b0046f77fecd3ee2e49aeece2c027fce2c..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/pl.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Szukaj czegokolwiek", - "QuickAccessTitle": "Szukaj wpisów w menu, raportów i stron.", - "HowToToggleZenMode": "Aby wyjść albo wejść do trybu Zen należy kliknąć strzaÅ‚kÄ™ w górnym prawym rogu albo wcisnąć 'alt+z'.", - "Activated": "Tryb Zen zostaÅ‚ aktywowany" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/pt-br.json b/plugins/ZenMode/lang/pt-br.json deleted file mode 100644 index 640da2c93bfca8d77ed736eb450f6fbcbc938b97..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/pt-br.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Fique Zen com Piwik. O modo Zen mantém as coisas simples. Está disponÃvel através do Ãcone no canto superior direito da tela.", - "SearchForAnything": "Buscar por qualquer coisa", - "QuickAccessTitle": "Pesquisar por entradas do menu, relatórios e websites", - "HowToSearch": "Para procurar itens do menu, relatórios ou sites utilize a caixa de pesquisa no canto superior direito ou pressione 'alt+f'.", - "HowToToggleZenMode": "Para sair ou entrar no modo zen clique na seta no canto superior direito ou pressione 'alt+z'.", - "Activated": "Modo Zen ativado" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ro.json b/plugins/ZenMode/lang/ro.json deleted file mode 100644 index 495fd70b9e7f85a629626c248cefcd87972d3fe0..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/ro.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Caută orice", - "QuickAccessTitle": "Caută elemente de meniu, rapoarte ÅŸi site-uri", - "HowToSearch": "Pentru a căuta elemente de meniu, rapoarte sau site-uri, foloseÅŸte cutia de căutare din dreapta sus sau apasă 'alt+f'.", - "HowToToggleZenMode": "Pentru a intra sau a părăsi modul zen, dă click pe săgeata din dreapta sus sau apasă 'alt+z'.", - "Activated": "Modul Zen a fost activat" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ru.json b/plugins/ZenMode/lang/ru.json deleted file mode 100644 index 68799e808ccdd3d234e9240eca3e255f95923b5d..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/ru.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "ПоиÑк везде", - "QuickAccessTitle": "ПоиÑк по пунктам меню, отчетам и Ñайтам", - "HowToSearch": "Ð”Ð»Ñ Ð¿Ð¾Ð¸Ñка Ñлементов меню, отчетов и веб-Ñайтов иÑпользуйте окно поиÑка в правом верхнем углу или нажмите \"alt+f\"", - "HowToToggleZenMode": "Чтобы выйти или войти в Дзен режим нажмите на Ñтрелку в правом верхнем углу или нажмите \"alt+z\".", - "Activated": "Ðктивирован Дзен режим" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/sr.json b/plugins/ZenMode/lang/sr.json deleted file mode 100644 index 4f73c1cf1ab9fd730b5701cf718290414216c566..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/sr.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ZenMode": { - "PluginDescription": "Budite u Zenu sa Pivikom. Zen mod Äini stvari jednostavnim. Možete ga omogućiti preko sliÄice u gornjem desnom uglu ekrana.", - "SearchForAnything": "Pretraži sve", - "QuickAccessTitle": "Pretraživanje stavki menija, izveÅ¡taja i sajtova", - "HowToSearch": "Ukoliko želite da pretražujete stavke menija, izveÅ¡taje ili sajtove, upotrebite polje za pretraživanje u gornjem desnom uglu ili pritisnite Alt + f.", - "HowToToggleZenMode": "Ukoliko želite da napustite ili ponovo aktivirate zen mod, kliknite na strelicu u gornjem desnom uglu ili pritisnite Alt + z.", - "Activated": "Zen mod aktiviran" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/sv.json b/plugins/ZenMode/lang/sv.json deleted file mode 100644 index d42ff6428e8d5f67117248ff8d2ada808eb169e9..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/sv.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Sök efter vad som helst", - "QuickAccessTitle": "Sök efter meny-poster, rapporter och webbplatser", - "HowToSearch": "För att söka efter meny-poster, rapporter eller webbplatser - använd sökfältet uppe till höger eller tryck 'alt+f'.", - "HowToToggleZenMode": "För att gÃ¥ i\/ur zen mode, klicka pÃ¥ pilen uppe till höger eller tryck 'alt+z'.", - "Activated": "Zen mode aktiverat" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/ta.json b/plugins/ZenMode/lang/ta.json deleted file mode 100644 index c9c6a76d75ae885b23e61d4b3909751400ae1393..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/ta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "எதைபறà¯à®±à®¿à®¯à¯à®®à¯ தேடà¯", - "Activated": "ஜென௠நிலை செயறà¯à®ªà®¾à®Ÿà¯à®Ÿà®¿à®²à¯ உளà¯à®³à®¤à¯" - } -} \ No newline at end of file diff --git a/plugins/ZenMode/lang/tl.json b/plugins/ZenMode/lang/tl.json deleted file mode 100644 index 7f738608d18851765db0cc8c755715912ace91c4..0000000000000000000000000000000000000000 --- a/plugins/ZenMode/lang/tl.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "ZenMode": { - "SearchForAnything": "Paghahanap sa kahit ano", - "QuickAccessTitle": "Maghanap ng mga entry ng menu mga ulat at mga website.", - "HowToSearch": "Para maghanap ng items sa menu ulat o websites gamitin ang search box sa kanang tuktok o pindutin ang 'alt+f'.", - "HowToToggleZenMode": "Upang umalis o ipasok ang Zen mode i-click ang arrow sa kanang tuktok o pindutin ang 'alt + z'.", - "Activated": "Ang Zen mode ay na activate" - } -} \ No newline at end of file diff --git a/tests/PHPUnit/Fixtures/UITestFixture.php b/tests/PHPUnit/Fixtures/UITestFixture.php index 34c63a22e97003371ed91e31322b386a229708a0..93ae92a6dd39e6af2e5b0f284a82c4e6b36013c1 100644 --- a/tests/PHPUnit/Fixtures/UITestFixture.php +++ b/tests/PHPUnit/Fixtures/UITestFixture.php @@ -23,6 +23,7 @@ use Piwik\Plugins\UserCountry\LocationProvider; use Piwik\Plugins\UsersManager\API as UsersManagerAPI; use Piwik\Plugins\SitesManager\API as SitesManagerAPI; use Piwik\Tests\Framework\Fixture; +use Piwik\Plugins\VisitsSummary\API as VisitsSummaryAPI; /** * Fixture for UI tests. @@ -65,6 +66,9 @@ class UITestFixture extends SqlDump // create non super user UsersManagerAPI::getInstance()->addUser('oliverqueen', 'smartypants', 'oli@queenindustries.com'); UsersManagerAPI::getInstance()->setUserAccess('oliverqueen', 'view', array(1)); + + // launch archiving so UI test requests don't launch it + VisitsSummaryAPI::getInstance()->get('all', 'year', '2012-08-09'); } public function performSetUp($setupEnvironmentOnly = false) diff --git a/tests/PHPUnit/Integration/CronArchiveTest.php b/tests/PHPUnit/Integration/CronArchiveTest.php index f0e4b7c19c55a7278d966bebe275e193d9f1d438..c64f0c3e625d270c144300dfaa808ec10c41a903 100644 --- a/tests/PHPUnit/Integration/CronArchiveTest.php +++ b/tests/PHPUnit/Integration/CronArchiveTest.php @@ -10,6 +10,7 @@ namespace Piwik\Tests\Integration; use Piwik\Archiver\Request; use Piwik\CliMulti; +use Piwik\Container\StaticContainer; use Piwik\CronArchive; use Piwik\Archive\ArchiveInvalidator; use Piwik\Date; @@ -31,7 +32,7 @@ class CronArchiveTest extends IntegrationTestCase Fixture::createWebsite('2014-12-12 00:01:02'); Fixture::createWebsite('2014-12-12 00:01:02'); - $ar = new ArchiveInvalidator(); + $ar = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); $ar->rememberToInvalidateArchivedReportsLater(1, Date::factory('2014-04-05')); $ar->rememberToInvalidateArchivedReportsLater(2, Date::factory('2014-04-05')); $ar->rememberToInvalidateArchivedReportsLater(2, Date::factory('2014-04-06')); diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php index 6c1ff8cd8839da35b3e8d1974fd842adb9c6da1c..7501a34715cd84276bbb2023d6d5919173905e96 100644 --- a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php +++ b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php @@ -8,10 +8,20 @@ namespace Piwik\Tests\Integration\DataAccess; +use Piwik\ArchiveProcessor\Rules; +use Piwik\CronArchive\SitesToReprocessDistributedList; +use Piwik\DataAccess\ArchiveTableCreator; +use Piwik\DataAccess\ArchiveWriter; +use Piwik\DataAccess\Model; use Piwik\Date; +use Piwik\Db; use Piwik\Option; +use Piwik\Piwik; +use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList; +use Piwik\Plugins\PrivacyManager\PrivacyManager; use Piwik\Tests\Framework\TestCase\IntegrationTestCase; use Piwik\Archive\ArchiveInvalidator; +use Piwik\Segment; /** * @group Archiver @@ -20,16 +30,38 @@ use Piwik\Archive\ArchiveInvalidator; */ class ArchiveInvalidatorTest extends IntegrationTestCase { + const TEST_SEGMENT_1 = 'browserCode==FF'; + const TEST_SEGMENT_2 = 'countryCode==uk'; + /** * @var ArchiveInvalidator */ private $invalidator; + /** + * @var Segment + */ + private static $segment1; + + /** + * @var Segment + */ + private static $segment2; + + public static function setUpBeforeClass() + { + parent::setUpBeforeClass(); + + // these are static because it takes a long time to create new Segment instances (for some reason) + self::$segment1 = new Segment(self::TEST_SEGMENT_1, array()); + self::$segment2 = new Segment(self::TEST_SEGMENT_2, array()); + } + public function setUp() { parent::setUp(); - $this->invalidator = new ArchiveInvalidator(); + $this->invalidator = new ArchiveInvalidator(new Model()); } public function test_rememberToInvalidateArchivedReportsLater_shouldCreateAnEntryInCaseThereIsNoneYet() @@ -141,7 +173,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase Date::factory('2010-10-10'), ); - $this->invalidator->markArchivesAsInvalidated($idSites, $dates, false); + $this->invalidator->markArchivesAsInvalidated($idSites, $dates, 'week'); $reports = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated(); $expected = array( @@ -183,4 +215,452 @@ class ArchiveInvalidatorTest extends IntegrationTestCase $this->rememberReport(7, '2014-05-08'); $this->rememberReport(7, '2014-04-08'); } + + public function test_markArchivesAsInvalidated_DoesNotInvalidateDatesBeforePurgeThreshold() + { + PrivacyManager::savePurgeDataSettings(array( + 'delete_logs_enable' => 1, + 'delete_logs_older_than' => 180, + )); + + $dateBeforeThreshold = Date::factory('today')->subDay(190); + $thresholdDate = Date::factory('today')->subDay(180); + $dateAfterThreshold = Date::factory('today')->subDay(170); + + // can't test more than day since today will change, causing the test to fail w/ other periods randomly + $this->insertArchiveRow(1, $dateBeforeThreshold, 'day'); + $this->insertArchiveRow(1, $dateAfterThreshold, 'day'); + + /** @var ArchiveInvalidator $archiveInvalidator */ + $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator'); + $result = $archiveInvalidator->markArchivesAsInvalidated(array(1), array($dateBeforeThreshold, $dateAfterThreshold), 'day'); + + $this->assertEquals($thresholdDate->toString(), $result->minimumDateWithLogs); + + $expectedProcessedDates = array($dateAfterThreshold->toString()); + $this->assertEquals($expectedProcessedDates, $result->processedDates); + + $expectedWarningDates = array($dateBeforeThreshold->toString()); + $this->assertEquals($expectedWarningDates, $result->warningDates); + + $invalidatedArchives = $this->getInvalidatedIdArchives(); + + $countInvalidatedArchives = 0; + foreach ($invalidatedArchives as $idarchives) { + $countInvalidatedArchives += count($idarchives); + } + + $this->assertEquals(1, $countInvalidatedArchives); + } + + public function test_markArchivesAsInvalidated_CorrectlyModifiesDistributedLists() + { + /** @var ArchiveInvalidator $archiveInvalidator */ + $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator'); + + $idSites = array(1, 3, 5); + $dates = array( + Date::factory('2014-12-31'), + Date::factory('2015-01-01'), + Date::factory('2015-01-10'), + ); + $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, 'day'); + + $idSites = array(1, 3, 5); + $dates = array( + Date::factory('2014-12-21'), + Date::factory('2015-01-01'), + Date::factory('2015-03-08'), + ); + $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, 'week'); + + $expectedSitesToProcessListContents = array(1, 3, 5); + $this->assertEquals($expectedSitesToProcessListContents, $this->getSitesToReprocessListContents()); + + $expectedArchivesToPurgeListContents = array('2014_12', '2014_01', '2015_01', '2015_03'); + $this->assertEquals($expectedArchivesToPurgeListContents, $this->getArchivesToPurgeListContents()); + } + + /** + * @dataProvider getTestDataForMarkArchivesAsInvalidated + */ + public function test_markArchivesAsInvalidated_MarksCorrectArchivesAsInvalidated($idSites, $dates, $period, $segment, $cascadeDown, + $expectedIdArchives) + { + $dates = array_map(array('Piwik\Date', 'factory'), $dates); + + $this->insertArchiveRowsForTest(); + + if (!empty($segment)) { + $segment = new Segment($segment, $idSites); + } + + /** @var ArchiveInvalidator $archiveInvalidator */ + $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator'); + $result = $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, $period, $segment, $cascadeDown); + + $this->assertEquals($dates, $result->processedDates); + + $idArchives = $this->getInvalidatedArchives(); + $this->assertEquals($expectedIdArchives, $idArchives); + } + + public function getTestDataForMarkArchivesAsInvalidated() + { + return array( + // day period, multiple sites, multiple dates across tables, cascade = true + array( + array(1, 2), + array('2015-01-01', '2015-02-05', '2015-04-30'), + 'day', + null, + true, + array( + '2014_01' => array(), + '2015_03' => array(), + '2015_04' => array( + '1.2015-04-30.2015-04-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '2.2015-04-30.2015-04-30.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-04-27.2015-05-03.2.done', + '2.2015-04-27.2015-05-03.2.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-04-01.2015-04-30.3.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '2.2015-04-01.2015-04-30.3.done5447835b0a861475918e79e932abdfd8', + ), + '2014_12' => array(), + '2015_01' => array( + '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341', + '2.2015-01-01.2015-01-01.1.done.VisitsSummary', + '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341', + '2.2015-01-01.2015-01-31.3.done.VisitsSummary', + '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8', + '2.2015-01-01.2015-12-31.4.done', + '1.2015-01-01.2015-01-10.5.done.VisitsSummary', + ), + '2015_02' => array( + '1.2015-02-05.2015-02-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '2.2015-02-05.2015-02-05.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-02-02.2015-02-08.2.done', + '2.2015-02-02.2015-02-08.2.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-02-01.2015-02-28.3.done.VisitsSummary', + '2.2015-02-01.2015-02-28.3.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + ), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // month period, one site, one date, cascade = false + array( + array(1), + array('2015-01-01'), + 'month', + null, + false, + array( + '2014_01' => array(), + '2014_12' => array(), + '2015_01' => array( + '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8', + ), + '2015_02' => array(), + '2015_03' => array(), + '2015_04' => array(), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // month period, one site, one date, cascade = true + array( + array(1), + array('2015-01-15'), + 'month', + null, + true, + array( + '2014_01' => array(), + '2014_12' => array( + '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341', + + // doesn't need to be invalidated since the month won't use the week above, but very difficult + // to keep it valid, while keeping invalidation logic simple. + '1.2014-12-01.2014-12-31.3.done5447835b0a861475918e79e932abdfd8', + ), + '2015_01' => array( + '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-02.2015-01-02.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-03.2015-01-03.1.done.VisitsSummary', + '1.2015-01-04.2015-01-04.1.done', + '1.2015-01-05.2015-01-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-06.2015-01-06.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-07.2015-01-07.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-08.2015-01-08.1.done.VisitsSummary', + '1.2015-01-09.2015-01-09.1.done', + '1.2015-01-10.2015-01-10.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-11.2015-01-11.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-12.2015-01-12.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-13.2015-01-13.1.done.VisitsSummary', + '1.2015-01-14.2015-01-14.1.done', + '1.2015-01-15.2015-01-15.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-16.2015-01-16.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-17.2015-01-17.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-18.2015-01-18.1.done.VisitsSummary', + '1.2015-01-19.2015-01-19.1.done', + '1.2015-01-20.2015-01-20.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-21.2015-01-21.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-22.2015-01-22.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-23.2015-01-23.1.done.VisitsSummary', + '1.2015-01-24.2015-01-24.1.done', + '1.2015-01-25.2015-01-25.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-27.2015-01-27.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-28.2015-01-28.1.done.VisitsSummary', + '1.2015-01-29.2015-01-29.1.done', + '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-05.2015-01-11.2.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-12.2015-01-18.2.done.VisitsSummary', + '1.2015-01-19.2015-01-25.2.done', + '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-01.2015-01-10.5.done.VisitsSummary', + ), + '2015_02' => array(), + '2015_03' => array(), + '2015_04' => array(), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // week period, one site, multiple dates w/ redundant dates & periods, cascade = true + array( + array(1), + array('2015-01-02', '2015-01-03', '2015-01-31'), + 'week', + null, + true, + array( + '2014_01' => array(), + '2014_12' => array( + '1.2014-12-29.2014-12-29.1.done', + '1.2014-12-30.2014-12-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2014-12-31.2014-12-31.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341', + '1.2014-12-01.2014-12-31.3.done5447835b0a861475918e79e932abdfd8', + '1.2014-12-05.2015-01-01.5.done.VisitsSummary', + ), + '2015_01' => array( + '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-02.2015-01-02.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-03.2015-01-03.1.done.VisitsSummary', + '1.2015-01-04.2015-01-04.1.done', + '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-27.2015-01-27.1.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-28.2015-01-28.1.done.VisitsSummary', + '1.2015-01-29.2015-01-29.1.done', + '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8', + '1.2015-01-01.2015-01-10.5.done.VisitsSummary', + ), + '2015_02' => array( + '1.2015-02-01.2015-02-01.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-02-01.2015-02-28.3.done.VisitsSummary', + ), + '2015_03' => array(), + '2015_04' => array(), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // range period, one site, cascade = true + array( + array(1), + array('2015-01-02', '2015-03-05'), + 'range', + null, + true, + array( + '2014_01' => array(), + '2014_12' => array(), + '2015_01' => array( + '1.2015-01-01.2015-01-10.5.done.VisitsSummary', + ), + '2015_02' => array(), + '2015_03' => array( + '1.2015-03-04.2015-03-05.5.done.VisitsSummary', + '1.2015-03-05.2015-03-10.5.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + ), + '2015_04' => array(), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // week period, one site, cascade = true, segment + array( + array(1), + array('2015-01-05'), + 'month', + self::TEST_SEGMENT_1, + true, + array( + '2014_01' => array(), + '2014_12' => array( + '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341', + ), + '2015_01' => array( + '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-05.2015-01-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-06.2015-01-06.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-10.2015-01-10.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-11.2015-01-11.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-15.2015-01-15.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-16.2015-01-16.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-20.2015-01-20.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-21.2015-01-21.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-25.2015-01-25.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341', + '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341', + ), + '2015_02' => array(), + '2015_03' => array(), + '2015_04' => array(), + '2015_05' => array(), + '2015_06' => array(), + ), + ), + + // removing all periods + array( + array(1), + array('2015-05-05'), + '', + null, + false, + array( + '2014_01' => array(), + '2014_12' => array(), + '2015_01' => array( + '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8', + ), + '2015_02' => array(), + '2015_03' => array(), + '2015_04' => array(), + '2015_05' => array( + '1.2015-05-05.2015-05-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry', + '1.2015-05-04.2015-05-10.2.done5447835b0a861475918e79e932abdfd8', + '1.2015-05-01.2015-05-31.3.done3736b708e4d20cfc10610e816a1b2341', + ), + '2015_06' => array(), + ), + ), + ); + } + + private function getInvalidatedIdArchives() + { + $result = array(); + foreach (ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE) as $table) { + $date = ArchiveTableCreator::getDateFromTableName($table); + + $idArchives = Db::fetchAll("SELECT idarchive FROM $table WHERE name LIKE 'done%' AND value = ?", array(ArchiveWriter::DONE_INVALIDATED)); + $idArchives = array_map('reset', $idArchives); + + $result[$date] = $idArchives; + } + return $result; + } + + private function getInvalidatedArchives() + { + $result = array(); + foreach (ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE) as $table) { + $date = ArchiveTableCreator::getDateFromTableName($table); + + $sql = "SELECT CONCAT(idsite, '.', date1, '.', date2, '.', period, '.', name) FROM $table WHERE name LIKE 'done%' AND value = ?"; + + $archiveSpecs = Db::fetchAll($sql, array(ArchiveWriter::DONE_INVALIDATED)); + $archiveSpecs = array_map('reset', $archiveSpecs); + + $result[$date] = $archiveSpecs; + } + return $result; + } + + private function insertArchiveRowsForTest() + { + $periods = array('day', 'week', 'month', 'year'); + $sites = array(1,2,3); + + $startDate = Date::factory('2014-12-01'); + $endDate = Date::factory('2015-05-31'); + + foreach ($periods as $periodLabel) { + $nextEndDate = $endDate->addPeriod(1, $periodLabel); + for ($date = $startDate; $date->isEarlier($nextEndDate); $date = $date->addPeriod(1, $periodLabel)) { + foreach ($sites as $idSite) { + $this->insertArchiveRow($idSite, $date->toString(), $periodLabel); + } + } + } + + $rangePeriods = array('2015-03-04,2015-03-05', '2014-12-05,2015-01-01', '2015-03-05,2015-03-10', '2015-01-01,2015-01-10'); + foreach ($rangePeriods as $dateRange) { + $this->insertArchiveRow($idSite = 1, $dateRange, 'range'); + } + } + + private function insertArchiveRow($idSite, $date, $periodLabel) + { + $periodObject = \Piwik\Period\Factory::build($periodLabel, $date); + $dateStart = $periodObject->getDateStart(); + $dateEnd = $periodObject->getDateEnd(); + + $table = ArchiveTableCreator::getNumericTable($dateStart); + + $idArchive = (int) Db::fetchOne("SELECT MAX(idarchive) FROM $table WHERE name LIKE 'done%'"); + $idArchive = $idArchive + 1; + + $periodId = Piwik::$idPeriods[$periodLabel]; + + $doneFlag = 'done'; + if ($idArchive % 5 == 1) { + $doneFlag = Rules::getDoneFlagArchiveContainsAllPlugins(self::$segment1); + } else if ($idArchive % 5 == 2) { + $doneFlag .= '.VisitsSummary'; + } else if ($idArchive % 5 == 3) { + $doneFlag = Rules::getDoneFlagArchiveContainsOnePlugin(self::$segment1, 'UserCountry'); + } else if ($idArchive % 5 == 4) { + $doneFlag = Rules::getDoneFlagArchiveContainsAllPlugins(self::$segment2); + } + + $sql = "INSERT INTO $table (idarchive, name, idsite, date1, date2, period, ts_archived) + VALUES ($idArchive, 'nb_visits', $idSite, '$dateStart', '$dateEnd', $periodId, NOW()), + ($idArchive, '$doneFlag', $idSite, '$dateStart', '$dateEnd', $periodId, NOW())"; + Db::query($sql); + } + + private function getSitesToReprocessListContents() + { + $list = new SitesToReprocessDistributedList(); + $values = $list->getAll(); + return array_values($values); + } + + private function getArchivesToPurgeListContents() + { + $list = new ArchivesToPurgeDistributedList(); + $values = $list->getAll(); + return array_values($values); + } } diff --git a/tests/PHPUnit/Integration/DbTest.php b/tests/PHPUnit/Integration/DbTest.php index 486028fc21783feeeb80837f63b743433d127122..c21a2770618cd3e52dd03615542a9418dc279395 100644 --- a/tests/PHPUnit/Integration/DbTest.php +++ b/tests/PHPUnit/Integration/DbTest.php @@ -52,7 +52,7 @@ class DbTest extends IntegrationTestCase $this->assertInstanceOf($expectedClass, $db); $result = $db->fetchOne('SELECT @@SESSION.sql_mode'); - $expected = 'NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'; + $expected = 'NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'; $this->assertSame($expected, $result); } diff --git a/tests/PHPUnit/Integration/NumberFormatterTest.php b/tests/PHPUnit/Integration/NumberFormatterTest.php new file mode 100644 index 0000000000000000000000000000000000000000..981b289f2b29495dfc9ca54a1c8db586f3333f08 --- /dev/null +++ b/tests/PHPUnit/Integration/NumberFormatterTest.php @@ -0,0 +1,123 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +namespace Piwik\Tests\Integration; + +use Piwik\Container\StaticContainer; +use Piwik\NumberFormatter; +use Piwik\Translate; + +/** + * @group Core + * @group NumberFormatter + */ +class NumberFormatterTest extends \PHPUnit_Framework_TestCase +{ + public function setUp() + { + Translate::loadAllTranslations(); + } + + public function tearDown() + { + StaticContainer::get('Piwik\NumberFormatter')->unsetInstance(); + Translate::reset(); + } + + /** + * @dataProvider getNumberFormattingTestData + */ + public function testNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected) + { + StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); + $formatter = NumberFormatter::getInstance(); + $this->assertEquals($expected, $formatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits)); + } + + public function getNumberFormattingTestData() + { + return array( + // english formats + array('en', 5, 0, 0, '5'), + array('en', -5, 0, 3, '-5'), + array('en', 5.299, 0, 0, '5'), + array('en', 5.299, 3, 0, '5.299'), + array('en', -50, 3, 3, '-50.000'), + array('en', 5000, 0, 0, '5,000'), + array('en', 5000000, 0, 0, '5,000,000'), + array('en', -5000000, 0, 0, '-5,000,000'), + + // foreign languages + array('ar', 51239.56, 3, 0, '51Ù¬239Ù«56'), + array('be', 51239.56, 3, 0, '51 239,56'), + array('de', 51239.56, 3, 0, '51.239,56'), + array('bn', 152551239.56, 3, 0, '15,25,51,239.56'), + array('hi', 152551239.56, 0, 0, '15,25,51,240'), + array('lt', -152551239.56, 0, 0, '−152 551 240'), + ); + } + + /** + * @dataProvider getPercentNumberFormattingTestData + */ + public function testPercentNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected) + { + StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); + $formatter = NumberFormatter::getInstance(); + $this->assertEquals($expected, $formatter->formatPercent($value, $maximumFractionDigits, $minimumFractionDigits)); + } + + public function getPercentNumberFormattingTestData() + { + return array( + // english formats + array('en', 5, 0, 0, '5%'), + array('en', -5, 0, 3, '-5%'), + array('en', 5.299, 0, 0, '5%'), + array('en', 5.299, 3, 0, '5.299%'), + array('en', -50, 3, 3, '-50%'), + array('en', 5000, 0, 0, '5,000%'), + array('en', +5000, 0, 0, '5,000%'), + array('en', 5000000, 0, 0, '5,000,000%'), + array('en', -5000000, 0, 0, '-5,000,000%'), + + // foreign languages + array('ar', 51239.56, 3, 0, '51Ù¬239Ù«56Ùª'), + array('be', 51239.56, 3, 0, '51 239,56 %'), + array('de', 51239.56, 3, 0, '51.239,56 %'), + array('bn', 152551239.56, 3, 0, '15,25,51,239.56%'), + array('hi', 152551239.56, 0, 0, '15,25,51,240%'), + array('lt', -152551239.56, 0, 0, '−152 551 240 %'), + ); + } + + /** + * @dataProvider getPercentNumberEvolutionFormattingTestData + */ + public function testPercentEvolutionNumberFormatting($language, $value, $expected) + { + StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language); + $formatter = NumberFormatter::getInstance(); + $this->assertEquals($expected, $formatter->formatPercentEvolution($value)); + } + + public function getPercentNumberEvolutionFormattingTestData() + { + return array( + // english formats + array('en', 5, '+5%'), + array('en', -5, '-5%'), + array('en', 5.299, '+5%'), + array('en', -50, '-50%'), + array('en', 5000, '+5,000%'), + array('en', +5000, '+5,000%'), + array('en', 5000000, '+5,000,000%'), + array('en', -5000000, '-5,000,000%'), + ); + } +} diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php index 3c4bec7802dbd4fba629b994384bc50c04775792..9179c6d61a9b1e2770b4700283e5b1af8e498e94 100644 --- a/tests/PHPUnit/Integration/SegmentTest.php +++ b/tests/PHPUnit/Integration/SegmentTest.php @@ -12,6 +12,7 @@ use Exception; use Piwik\Cache; use Piwik\Common; use Piwik\Config; +use Piwik\Container\StaticContainer; use Piwik\Db; use Piwik\Segment; use Piwik\Tests\Framework\Mock\FakeAccess; @@ -25,6 +26,8 @@ use Piwik\Tracker\TableLogAction; */ class SegmentTest extends IntegrationTestCase { + public $tableLogActionCacheHits = 0; + public function setUp() { parent::setUp(); @@ -33,13 +36,6 @@ class SegmentTest extends IntegrationTestCase FakeAccess::$superUser = true; } - public function tearDown() - { - parent::tearDown(); - - TableLogAction\Cache::$hits = 0; - } - static public function removeExtraWhiteSpaces($valueToFilter) { if (is_array($valueToFilter)) { @@ -698,7 +694,7 @@ class SegmentTest extends IntegrationTestCase "found", )); - $cache = new TableLogAction\Cache(); + $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache'); $this->assertTrue( empty($cache->isEnabled) ); $this->assertCacheWasHit($hit = 0); $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); @@ -768,7 +764,7 @@ class SegmentTest extends IntegrationTestCase 3, // pageUrl!@not-found )); - $cache = new TableLogAction\Cache(); + $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache'); $this->assertTrue( !empty($cache->isEnabled) ); $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); @@ -836,7 +832,7 @@ class SegmentTest extends IntegrationTestCase "not-found", // pageUrl!@not-found )); - $cache = new TableLogAction\Cache(); + $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache'); $this->assertTrue( !empty($cache->isEnabled) ); $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query)); @@ -856,13 +852,6 @@ class SegmentTest extends IntegrationTestCase $this->assertCacheWasHit($hits = 2); } - public function provideContainerConfig() - { - return array( - 'Piwik\Access' => new FakeAccess() - ); - } - /** * @param $pageUrlFoundInDb * @return string @@ -896,7 +885,9 @@ class SegmentTest extends IntegrationTestCase private function assertCacheWasHit($expectedHits) { - $this->assertTrue(TableLogAction\Cache::$hits == $expectedHits, "expected cache was hit $expectedHits time(s), but got " . TableLogAction\Cache::$hits . " cache hits instead."); + $hits = $this->tableLogActionCacheHits; + $this->assertEquals($expectedHits, $hits, + "expected cache was hit $expectedHits time(s), but got $hits cache hits instead."); } private function disableSubqueryCache() @@ -908,4 +899,43 @@ class SegmentTest extends IntegrationTestCase { Config::getInstance()->General['enable_segments_subquery_cache'] = 1; } + + public function provideContainerConfig() + { + $self = $this; + + $cacheProxy = $this->getMock('Piwik\Cache\Lazy', array('fetch', 'contains', 'save', 'delete', 'flushAll'), + array(), '', $callOriginalConstructor = false); + $cacheProxy->expects($this->any())->method('fetch')->willReturnCallback(function ($id) { + $realCache = StaticContainer::get('Piwik\Cache\Lazy'); + return $realCache->fetch($id); + }); + $cacheProxy->expects($this->any())->method('contains')->willReturnCallback(function ($id) use ($self) { + $realCache = StaticContainer::get('Piwik\Cache\Lazy'); + + $result = $realCache->contains($id); + if ($result) { + ++$self->tableLogActionCacheHits; + } + + return $result; + }); + $cacheProxy->expects($this->any())->method('save')->willReturnCallback(function ($id, $data, $lifetime = 0) { + $realCache = StaticContainer::get('Piwik\Cache\Lazy'); + return $realCache->save($id, $data, $lifetime); + }); + $cacheProxy->expects($this->any())->method('delete')->willReturnCallback(function ($id) { + $realCache = StaticContainer::get('Piwik\Cache\Lazy'); + return $realCache->delete($id); + }); + $cacheProxy->expects($this->any())->method('flushAll')->willReturnCallback(function () { + $realCache = StaticContainer::get('Piwik\Cache\Lazy'); + return $realCache->flushAll(); + }); + + return array( + 'Piwik\Access' => new FakeAccess(), + 'Piwik\Tracker\TableLogAction\Cache' => \DI\object()->constructorParameter('cache', $cacheProxy), + ); + } } diff --git a/tests/PHPUnit/Integration/Tracker/VisitTest.php b/tests/PHPUnit/Integration/Tracker/VisitTest.php index e870fa6c51c01532d3b4200dea3ec87b0761ec4d..e686146f73c49961185c5ec99648f390957aa566 100644 --- a/tests/PHPUnit/Integration/Tracker/VisitTest.php +++ b/tests/PHPUnit/Integration/Tracker/VisitTest.php @@ -9,7 +9,7 @@ namespace Piwik\Tests\Integration\Tracker; use Piwik\Cache; -use Piwik\Archive\ArchiveInvalidator; +use Piwik\Container\StaticContainer; use Piwik\Date; use Piwik\Network\IPUtils; use Piwik\Plugin\Manager; @@ -411,7 +411,7 @@ class VisitTest extends IntegrationTestCase $visit->handle(); - $archive = new ArchiveInvalidator(); + $archive = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); $remembered = $archive->getRememberedArchivedReportsThatShouldBeInvalidated(); $this->assertSame($expectedRemeberedArchivedReports, $remembered); diff --git a/tests/PHPUnit/System/ArchiveInvalidationTest.php b/tests/PHPUnit/System/ArchiveInvalidationTest.php index b64aa82479498e0e75143047d706e4e05537bb61..7e41cd6eae3d773396bd90f4c7aae9b26f44b4d5 100644 --- a/tests/PHPUnit/System/ArchiveInvalidationTest.php +++ b/tests/PHPUnit/System/ArchiveInvalidationTest.php @@ -52,9 +52,9 @@ class ArchiveInvalidationTest extends SystemTestCase return array( array($apiToCall, array('idSite' => self::$fixture->idSite2, - 'testSuffix' => 'Website' . self::$fixture->idSite2 . "_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated", + 'testSuffix' => 'Website' . self::$fixture->idSite2 . "_NewDataShouldNotAppear_BecauseDayWasNotInvalidated", 'date' => self::$fixture->dateTimeFirstDateWebsite2, - 'periods' => 'week', + 'periods' => 'day', 'segment' => 'pageUrl=@category/', 'setDateLastN' => 4, // 4months ahead 'otherRequestParameters' => array('expanded' => 1)) @@ -99,8 +99,8 @@ class ArchiveInvalidationTest extends SystemTestCase public function testAnotherApi($api, $params) { if ($params['periods'] === 'month') { - // we do now need to invalidate weeks as well since months are based on weeks - $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2); + // we do now need to invalidate days as well since weeks are based on weeks + $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2, true); } $this->setBrowserArchivingTriggering(1); @@ -135,16 +135,15 @@ class ArchiveInvalidationTest extends SystemTestCase $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&idSites=" . self::$fixture->idSite1 . "&dates=" . $dateToInvalidate1->format('Y-m-d')); $this->assertApiResponseHasNoError($r->process()); - // Days & Months reports only are invalidated and we test our weekly report will still show old data. - $this->invalidateTestArchive(self::$fixture->idSite2, 'day', self::$fixture->dateTimeFirstDateWebsite2); - $this->invalidateTestArchive(self::$fixture->idSite2, 'month', self::$fixture->dateTimeFirstDateWebsite2); + // week reports only are invalidated and we test our daily report will still show old data. + $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2); } - private function invalidateTestArchive($idSite, $period, $dateTime) + private function invalidateTestArchive($idSite, $period, $dateTime, $cascadeDown = false) { $dates = new \DateTime($dateTime); $dates = $dates->format('Y-m-d'); - $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&period=$period&idSites=$idSite&dates=$dates"); + $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&period=$period&idSites=$idSite&dates=$dates&cascadeDown=" . (int)$cascadeDown); $this->assertApiResponseHasNoError($r->process()); } } diff --git a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php index 12cb4b15f875c6dd2fa50f8f4cebc8df1deb2d8c..cf22ba95cbf54d17796237c97783b9330fbdccae 100755 --- a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php +++ b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php @@ -9,9 +9,7 @@ namespace Piwik\Tests\System; use Piwik\Archive; use Piwik\Cache; -use Piwik\Archive\ArchiveInvalidator; -use Piwik\Option; -use Piwik\Plugins\Goals\Archiver; +use Piwik\Container\StaticContainer; use Piwik\Segment; use Piwik\Tests\Framework\TestCase\SystemTestCase; use Piwik\Tests\Fixtures\TwoSitesTwoVisitorsDifferentDays; @@ -166,7 +164,7 @@ class TwoVisitorsTwoWebsitesDifferentDaysConversionsTest extends SystemTestCase $this->assertEquals(array(self::$fixture->idSite1, self::$fixture->idSite2), $cache->fetch('Archive.SiteIdsOfRememberedReportsInvalidated')); - $invalidator = new ArchiveInvalidator(); + $invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator'); self::$fixture->trackVisits(); diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml deleted file mode 100644 index bcd758b7c59def8c1b05e3f1b2cdaf8e32888f26..0000000000000000000000000000000000000000 --- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<results> - <result date="From 2010-01-04 to 2010-01-10"> - <row> - <label>category</label> - <nb_visits>6</nb_visits> - <nb_hits>9</nb_hits> - <sum_time_spent>0</sum_time_spent> - <entry_nb_visits>2</entry_nb_visits> - <entry_nb_actions>18</entry_nb_actions> - <entry_sum_visit_length>2</entry_sum_visit_length> - <entry_bounce_count>0</entry_bounce_count> - <avg_time_on_page>0</avg_time_on_page> - <bounce_rate>0%</bounce_rate> - <exit_rate>0%</exit_rate> - <subtable> - <row> - <label>/Page1</label> - <nb_visits>2</nb_visits> - <nb_hits>3</nb_hits> - <sum_time_spent>0</sum_time_spent> - <entry_nb_visits>2</entry_nb_visits> - <entry_nb_actions>18</entry_nb_actions> - <entry_sum_visit_length>2</entry_sum_visit_length> - <entry_bounce_count>0</entry_bounce_count> - <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors> - <sum_daily_entry_nb_uniq_visitors>2</sum_daily_entry_nb_uniq_visitors> - <avg_time_on_page>0</avg_time_on_page> - <bounce_rate>0%</bounce_rate> - <exit_rate>0%</exit_rate> - <url>http://example.org/category/Page1</url> - </row> - <row> - <label>/Page2</label> - <nb_visits>2</nb_visits> - <nb_hits>3</nb_hits> - <sum_time_spent>0</sum_time_spent> - <sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors> - <avg_time_on_page>0</avg_time_on_page> - <bounce_rate>0%</bounce_rate> - <exit_rate>0%</exit_rate> - <url>http://example.org/category/Page2</url> - </row> - <row> - <label>/NewPage</label> - <nb_visits>1</nb_visits> - <nb_hits>2</nb_hits> - <sum_time_spent>0</sum_time_spent> - <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors> - <avg_time_on_page>0</avg_time_on_page> - <bounce_rate>0%</bounce_rate> - <exit_rate>0%</exit_rate> - <url>http://example.org/category/NewPage</url> - </row> - <row> - <label>/Page3</label> - <nb_visits>1</nb_visits> - <nb_hits>1</nb_hits> - <sum_time_spent>0</sum_time_spent> - <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors> - <avg_time_on_page>0</avg_time_on_page> - <bounce_rate>0%</bounce_rate> - <exit_rate>0%</exit_rate> - <url>http://example.org/category/Page3</url> - </row> - </subtable> - </row> - </result> - <result date="From 2010-01-11 to 2010-01-17" /> - <result date="From 2010-01-18 to 2010-01-24" /> - <result date="From 2010-01-25 to 2010-01-31" /> - <result date="From 2010-02-01 to 2010-02-07" /> -</results> \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml deleted file mode 100644 index c494788d70b5d79c3e6d71382ce1237abe7c371d..0000000000000000000000000000000000000000 --- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" ?> -<results> - <result date="From 2010-01-04 to 2010-01-10"> - <nb_uniq_visitors>2</nb_uniq_visitors> - <nb_users>1</nb_users> - <nb_visits>2</nb_visits> - <nb_actions>18</nb_actions> - <nb_visits_converted>0</nb_visits_converted> - <bounce_count>0</bounce_count> - <sum_visit_length>2</sum_visit_length> - <max_actions>12</max_actions> - <bounce_rate>0%</bounce_rate> - <nb_actions_per_visit>9</nb_actions_per_visit> - <avg_time_on_site>1</avg_time_on_site> - </result> - <result date="From 2010-01-11 to 2010-01-17" /> - <result date="From 2010-01-18 to 2010-01-24" /> - <result date="From 2010-01-25 to 2010-01-31" /> - <result date="From 2010-02-01 to 2010-02-07" /> -</results> \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml similarity index 76% rename from tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml rename to tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml index 3f580dfcf7a32545bfdb064b3078e73726dad24c..dea43adf43064b612956850ba5caf34755d4396c 100644 --- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml +++ b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" ?> <results> - <result date="From 2010-01-04 to 2010-01-10"> + <result date="2010-01-06"> <row> <label>category</label> <nb_visits>3</nb_visits> @@ -17,14 +17,14 @@ <row> <label>/Page1</label> <nb_visits>1</nb_visits> + <nb_uniq_visitors>1</nb_uniq_visitors> <nb_hits>1</nb_hits> <sum_time_spent>0</sum_time_spent> + <entry_nb_uniq_visitors>1</entry_nb_uniq_visitors> <entry_nb_visits>1</entry_nb_visits> <entry_nb_actions>6</entry_nb_actions> <entry_sum_visit_length>1</entry_sum_visit_length> <entry_bounce_count>0</entry_bounce_count> - <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors> - <sum_daily_entry_nb_uniq_visitors>1</sum_daily_entry_nb_uniq_visitors> <avg_time_on_page>0</avg_time_on_page> <bounce_rate>0%</bounce_rate> <exit_rate>0%</exit_rate> @@ -33,9 +33,9 @@ <row> <label>/Page2</label> <nb_visits>1</nb_visits> + <nb_uniq_visitors>1</nb_uniq_visitors> <nb_hits>1</nb_hits> <sum_time_spent>0</sum_time_spent> - <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors> <avg_time_on_page>0</avg_time_on_page> <bounce_rate>0%</bounce_rate> <exit_rate>0%</exit_rate> @@ -44,9 +44,9 @@ <row> <label>/Page3</label> <nb_visits>1</nb_visits> + <nb_uniq_visitors>1</nb_uniq_visitors> <nb_hits>1</nb_hits> <sum_time_spent>0</sum_time_spent> - <sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors> <avg_time_on_page>0</avg_time_on_page> <bounce_rate>0%</bounce_rate> <exit_rate>0%</exit_rate> @@ -55,8 +55,8 @@ </subtable> </row> </result> - <result date="From 2010-01-11 to 2010-01-17" /> - <result date="From 2010-01-18 to 2010-01-24" /> - <result date="From 2010-01-25 to 2010-01-31" /> - <result date="From 2010-02-01 to 2010-02-07" /> + <result date="2010-01-07" /> + <result date="2010-01-08" /> + <result date="2010-01-09" /> + <result date="2010-01-10" /> </results> \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml similarity index 65% rename from tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml rename to tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml index 75d267cfc4226333800fe2485fd44ae66dc0d107..241f0a7a02a797112990e673746f6921b16dbf4e 100644 --- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml +++ b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8" ?> <results> - <result date="From 2010-01-04 to 2010-01-10"> + <result date="2010-01-06"> <nb_uniq_visitors>1</nb_uniq_visitors> <nb_users>0</nb_users> <nb_visits>1</nb_visits> @@ -13,8 +13,8 @@ <nb_actions_per_visit>6</nb_actions_per_visit> <avg_time_on_site>1</avg_time_on_site> </result> - <result date="From 2010-01-11 to 2010-01-17" /> - <result date="From 2010-01-18 to 2010-01-24" /> - <result date="From 2010-01-25 to 2010-01-31" /> - <result date="From 2010-02-01 to 2010-02-07" /> + <result date="2010-01-07" /> + <result date="2010-01-08" /> + <result date="2010-01-09" /> + <result date="2010-01-10" /> </results> \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml index 953afdb0c94f1b2bc1d90dbe6946247130126416..d13ec927453e10accf2a59cdf3625eb352881f85 100644 --- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml +++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" ?> <result> <website>new name</website> - <prettyDate>Week March 1 – 7, 2010</prettyDate> + <prettyDate>week March 1 – 7, 2010</prettyDate> <metadata> <category>Actions</category> <subcategory>Pages</subcategory> diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml index 2bb327912b663bb819f6ab968f77f8c16772a554..097ddcd4c474702400426b95550c7d54d889125e 100644 --- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml +++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml @@ -80,6 +80,21 @@ <id>exit_nb_visits</id> <documentation>Number of visits that ended on this page.</documentation> </row> + <row> + <name>Impressions</name> + <id>nb_impressions</id> + <documentation>The number of times a content block, such as a banner or an ad, was displayed on a page.</documentation> + </row> + <row> + <name>Interaction Rate</name> + <id>interaction_rate</id> + <documentation>The ratio of content impressions to interactions.</documentation> + </row> + <row> + <name>Interactions</name> + <id>nb_interactions</id> + <documentation>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</documentation> + </row> <row> <name>Maximum value</name> <id>max_event_value</id> diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml index 700c9c5d342ffae3e10cf105b57866ad0fd2692f..58c2b694cd6c56a707772f9bb301f358154cdd1e 100644 --- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml +++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml @@ -1296,6 +1296,53 @@ <row> <category>Actions</category> <subcategory>Events</subcategory> + <name>Content Name</name> + <module>Contents</module> + <action>getContentNames</action> + <dimension>Content Name</dimension> + <metrics> + <nb_impressions>Impressions</nb_impressions> + <nb_interactions>Interactions</nb_interactions> + </metrics> + <metricsDocumentation> + <nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions> + <nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions> + <interaction_rate>The ratio of content impressions to interactions.</interaction_rate> + </metricsDocumentation> + <processedMetrics> + <interaction_rate>Interaction Rate</interaction_rate> + </processedMetrics> + <actionToLoadSubTables>getContentNames</actionToLoadSubTables> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentNames&period=day&date=2009-01-04</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentNames&period=day&date=2008-12-06,2009-01-04</imageGraphEvolutionUrl> + <uniqueId>Contents_getContentNames</uniqueId> + </row> + <row> + <category>Actions</category> + <name>Content Piece</name> + <module>Contents</module> + <action>getContentPieces</action> + <dimension>Content Piece</dimension> + <metrics> + <nb_impressions>Impressions</nb_impressions> + <nb_interactions>Interactions</nb_interactions> + </metrics> + <metricsDocumentation> + <nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions> + <nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions> + <interaction_rate>The ratio of content impressions to interactions.</interaction_rate> + </metricsDocumentation> + <processedMetrics> + <interaction_rate>Interaction Rate</interaction_rate> + </processedMetrics> + <actionToLoadSubTables>getContentPieces</actionToLoadSubTables> + <imageGraphUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentPieces&period=day&date=2009-01-04</imageGraphUrl> + <imageGraphEvolutionUrl>index.php?module=API&method=ImageGraph.get&idSite=1&apiModule=Contents&apiAction=getContentPieces&period=day&date=2008-12-06,2009-01-04</imageGraphEvolutionUrl> + <uniqueId>Contents_getContentPieces</uniqueId> + </row> + <row> + <category>Events</category> +>>>>>>> master <name>Event Categories</name> <module>Events</module> <action>getCategory</action> diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml index e3321058352e2f8a9332847e96f951841fbbdebe..d0c3b6b1314b1f942e4eb6c2c102fe688af73308 100644 --- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml +++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml @@ -122,7 +122,7 @@ </row> <row> <code>id</code> - <name>Bahasa Indonesia</name> + <name>Indonesia</name> <english_name>Indonesian</english_name> </row> <row> diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html index f30d629c3dca824cd15cce6676aa50a1d9c708d1..b81c8a37d0cc87bd202b9ecfa7289286e6729110 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html @@ -12,7 +12,7 @@ </h1> <p> - Mail Test report - Date range: Week April 4 – 10, 2011 + Mail Test report - Date range: week April 4 – 10, 2011 </p> diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt index d93abaaa9943e9721a87d7dd886ad7d8353d3aec..645d7467c3b2f27999d1d957d89b282ceca06978 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt @@ -1 +1 @@ -Week April 4 – 10, 2011. Piwik test: 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%). Piwik test: 2 Visits (+100%), 1 Actions (+100%), Revenue: $ 250 (+100%), 1 Goal conversions (+100%) \ No newline at end of file +week April 4 – 10, 2011. Piwik test: 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%). Piwik test: 2 Visits (+100%), 1 Actions (+100%), Revenue: $ 250 (+100%), 1 Goal conversions (+100%) \ No newline at end of file diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt index 3632f5fb811c3911aaf8eea565d32d730c4d1efd..f36a23fa6ec943da8dec69ccbada744140356165 100644 --- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt +++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt @@ -1 +1 @@ -Week April 4 – 10, 2011. 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%) \ No newline at end of file +week April 4 – 10, 2011. 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%) \ No newline at end of file diff --git a/tests/PHPUnit/Unit/AssetManagerTest.php b/tests/PHPUnit/Unit/AssetManagerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9fef76473362184b2ccd8aca957dab18815a11da --- /dev/null +++ b/tests/PHPUnit/Unit/AssetManagerTest.php @@ -0,0 +1,48 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ +namespace Piwik\Tests\Unit; + +use Piwik\Cache; +use Piwik\AssetManager; +use Piwik\Config; + +/** + * @group AssetManager + */ +class AssetManagerTest extends \PHPUnit_Framework_TestCase +{ + + public function testIsMergedAssetsDisabled() + { + $manager = new AssetManager(); + + // default + $this->assertFalse($manager->isMergedAssetsDisabled()); + + // with configuration + $defaultConfig = Config::getInstance()->Development['disable_merged_assets']; + + Config::getInstance()->Development['disable_merged_assets'] = false; + $this->assertFalse($manager->isMergedAssetsDisabled()); + + Config::getInstance()->Development['disable_merged_assets'] = true; + $this->assertTrue($manager->isMergedAssetsDisabled()); + + // reset the config + Config::getInstance()->Development['disable_merged_assets'] = $defaultConfig; + + // with $_GET parameter + $_GET['disable_merged_assets'] = '1'; + $this->assertTrue($manager->isMergedAssetsDisabled()); + unset($_GET['disable_merged_assets']); + + $_GET['disable_merged_assets'] = '0'; + $this->assertFalse($manager->isMergedAssetsDisabled()); + unset($_GET['disable_merged_assets']); + } +} diff --git a/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php new file mode 100644 index 0000000000000000000000000000000000000000..7d879aa0da517f47d426425ac5ae1ee4cb681594 --- /dev/null +++ b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php @@ -0,0 +1,106 @@ +<?php +/** + * Piwik - free/libre analytics platform + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + */ +namespace Piwik\Tests\Unit\DataAccess; + +use Piwik\DataAccess\ArchiveTableCreator; + +/** + * @group Core + */ +class ArchiveTableCreatorTest extends \PHPUnit_Framework_TestCase +{ + private $tables; + + public function setUp() + { + parent::setUp(); + + $this->tables = array( + 'archive_numeric_2015_02', + 'archive_blob_2015_05', + 'garbage', + 'archive_numeric_2014_03', + 'archive_blob_2015_01', + 'archive_blob_2015_02', + 'aslkdfjsd', + 'prefixed_archive_numeric_2012_01', + ); + } + + public function tearDown() + { + ArchiveTableCreator::clear(); + + parent::tearDown(); + } + + /** + * @dataProvider getTestDataForGetTablesArchivesInstalled + */ + public function test_getTablesArchivesInstalled_CorrectlyFiltersTableNames($type, $expectedTables) + { + ArchiveTableCreator::$tablesAlreadyInstalled = $this->tables; + + $tables = ArchiveTableCreator::getTablesArchivesInstalled($type); + + $this->assertEquals($expectedTables, $tables); + } + + public function getTestDataForGetTablesArchivesInstalled() + { + return array( + array( + ArchiveTableCreator::BLOB_TABLE, + array( + 'archive_blob_2015_05', + 'archive_blob_2015_01', + 'archive_blob_2015_02', + ), + ), + + array( + ArchiveTableCreator::NUMERIC_TABLE, + array( + 'archive_numeric_2015_02', + 'archive_numeric_2014_03', + 'prefixed_archive_numeric_2012_01', + ), + ), + + array( + 'qewroufsjdlf', + array(), + ), + + array( + '', + array( + 'archive_numeric_2015_02', + 'archive_blob_2015_05', + 'archive_numeric_2014_03', + 'archive_blob_2015_01', + 'archive_blob_2015_02', + 'prefixed_archive_numeric_2012_01', + ), + ), + + array( + null, + array( + 'archive_numeric_2015_02', + 'archive_blob_2015_05', + 'archive_numeric_2014_03', + 'archive_blob_2015_01', + 'archive_blob_2015_02', + 'prefixed_archive_numeric_2012_01', + ), + ), + ); + } +} \ No newline at end of file diff --git a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php index 8d797576d3c6a3620ae686d58d1687b568d52b3f..c123378941ad5bc3a35b82c2c82aef16fe0b72dd 100644 --- a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php +++ b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php @@ -72,6 +72,11 @@ class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Archive', 'getDataTableFromArchive'); $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Plugin', 'getListHooksRegistered'); $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Plugins\API\API', 'getLastDate'); + + $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\DevicesDetection\DevicesDetection', 'renameUserSettingsModuleAndAction'); + $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\Resolution\Resolution', 'renameUserSettingsModuleAndAction'); + $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\DevicePlugins\DevicePlugins', 'renameUserSettingsModuleAndAction'); + $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\UserLanguage\UserLanguage', 'renameUserSettingsModuleAndAction'); } private function assertDeprecatedMethodIsRemoved($className, $method, $removalDate) diff --git a/tests/PHPUnit/Unit/Metrics/FormatterTest.php b/tests/PHPUnit/Unit/Metrics/FormatterTest.php index f0f1e618a9e84ec6456dfe1ef3ed3080ed4bed80..e0ecfacccd0982427e23ebe0c60a07e6e1c825cf 100644 --- a/tests/PHPUnit/Unit/Metrics/FormatterTest.php +++ b/tests/PHPUnit/Unit/Metrics/FormatterTest.php @@ -7,7 +7,7 @@ */ namespace Piwik\Tests\Unit\Metrics; -use Piwik\Intl\Locale; +use Piwik\Container\StaticContainer; use Piwik\Metrics\Formatter; use Piwik\Translate; use Piwik\Plugins\SitesManager\API as SitesManagerAPI; @@ -57,6 +57,7 @@ class FormatterTest extends \PHPUnit_Framework_TestCase public function tearDown() { + StaticContainer::get('Piwik\NumberFormatter')->unsetInstance(); Translate::reset(); $this->unsetSiteManagerApiMock(); } @@ -74,13 +75,8 @@ class FormatterTest extends \PHPUnit_Framework_TestCase */ public function test_getPrettyNumber_ReturnsCorrectResult_WhenLocaleIsEuropean($number, $expected) { - $locale = setlocale(LC_ALL, array('de-AT', 'de_DE', 'de', 'ge', 'de_DE.utf8')); - if (empty($locale)) { - $this->markTestSkipped("de_DE locale is not present on this system"); - } - + StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage('de'); $this->assertEquals($expected, $this->formatter->getPrettyNumber($number, 2)); - Locale::setDefaultLocale(); } /** @@ -137,12 +133,11 @@ class FormatterTest extends \PHPUnit_Framework_TestCase public function getPrettyNumberLocaleTestData() { return array( - array(0.14, '0,14'), - array(0.14567, '0,15'), - array(100.1234, '100,12'), - // Those last two are commented because locales are platform dependent, on some platforms the separator is '' instead of '.' -// array(1000.45, '1.000,45'), -// array(23456789.00, '23.456.789,00'), + array(0.14, '0.14'), + array(0.14567, '0.15'), + array(100.1234, '100.12'), + array(1000.45, '1,000.45'), + array(23456789.00, '23,456,789.00'), ); } diff --git a/tests/PHPUnit/Unit/Period/MonthTest.php b/tests/PHPUnit/Unit/Period/MonthTest.php index 2779a2e582d1a8259d1c9a24e66f128306b5810a..a3abb80d073c1e54b98776407efe955c78c758e3 100644 --- a/tests/PHPUnit/Unit/Period/MonthTest.php +++ b/tests/PHPUnit/Unit/Period/MonthTest.php @@ -334,7 +334,7 @@ class MonthTest extends BasePeriodTest { return array( array('en', 'October 2024'), - array('lt', '2024 Spalis'), + array('lt', '2024 m. Spalis'), array('zh-cn', '2024å¹´10月'), ); } diff --git a/tests/PHPUnit/Unit/Period/RangeTest.php b/tests/PHPUnit/Unit/Period/RangeTest.php index 115a45fd8b0cfad74caf900f79dfa8830dbd7a13..9b0a8215511a6e6c21b8d2dfed06fb88fe64decc 100644 --- a/tests/PHPUnit/Unit/Period/RangeTest.php +++ b/tests/PHPUnit/Unit/Period/RangeTest.php @@ -10,6 +10,7 @@ namespace Piwik\Tests\Unit\Period; use Exception; use Piwik\Date; +use Piwik\Period; use Piwik\Period\Month; use Piwik\Period\Range; use Piwik\Period\Week; diff --git a/tests/PHPUnit/Unit/Period/WeekTest.php b/tests/PHPUnit/Unit/Period/WeekTest.php index 4adf7666a2af7b2a0c78cf911ba349dc13d9453a..5df53acb45b7c9de775b0af8dc1abf3ebac7e8b5 100644 --- a/tests/PHPUnit/Unit/Period/WeekTest.php +++ b/tests/PHPUnit/Unit/Period/WeekTest.php @@ -12,6 +12,11 @@ use Piwik\Container\StaticContainer; use Piwik\Date; use Piwik\Period\Week; +/** + * Class WeekTest + * @package Piwik\Tests\Unit\Period + * @group WeekTest + */ class WeekTest extends BasePeriodTest { /** @@ -122,7 +127,7 @@ class WeekTest extends BasePeriodTest { return array( array('en', array('Oct 7 – 13, 2024', 'Nov 25 – Dec 1, 2024', 'Dec 30, 2024 – Jan 5, 2025')), - array('lt', array('2024-10-07 – 2024-10-13', '2024-11-25 – 2024-12-01', '2024-12-30 – 2025-1-05')), + array('lt', array('2024 Spal. 7–13', '2024 Lapkr. 25 – Gruod. 1', '2024 Gruod. 30 – 2025 Saus. 5')), array('zh-cn', array('2024å¹´10月7日至13æ—¥', '2024å¹´11月25日至12月1æ—¥', '2024å¹´12月30日至2025å¹´01月5æ—¥')), ); } @@ -150,8 +155,8 @@ class WeekTest extends BasePeriodTest public function getLocalizedLongStrings() { return array( - array('en', array('Week October 7 – 13, 2024', 'Week November 25 – December 1, 2024', 'Week December 30, 2024 – January 5, 2025')), - array('lt', array('SavaitÄ— 2024 Spalio 7–13', 'SavaitÄ— 2024 LapkriÄio 25 – Gruodžio 1', 'SavaitÄ— 2024 Gruodžio 30 – 2025 Sausio 5')), + array('en', array('week October 7 – 13, 2024', 'week November 25 – December 1, 2024', 'week December 30, 2024 – January 5, 2025')), + array('lt', array('savaitÄ— 2024 Spalio 7–13', 'savaitÄ— 2024 LapkriÄio 25 – Gruodžio 1', 'savaitÄ— 2024 Gruodžio 30 – 2025 Sausio 5')), array('zh-cn', array('周 2024å¹´10月7日至13æ—¥', '周 2024å¹´11月25日至12月1æ—¥', '周 2024å¹´12月30日至2025å¹´01月5æ—¥')), ); } diff --git a/tests/PHPUnit/Unit/PeriodTest.php b/tests/PHPUnit/Unit/PeriodTest.php index c8dc2c757eafcb1d8629a6004b4c628f522e04d3..f4c7d4ee1d88568918f09d8d1fa30e187b4435a7 100644 --- a/tests/PHPUnit/Unit/PeriodTest.php +++ b/tests/PHPUnit/Unit/PeriodTest.php @@ -123,4 +123,91 @@ class PeriodTest extends \PHPUnit_Framework_TestCase array(3434), ); } + + /** + * @dataProvider getTestDataForGetAllOverlappingChildPeriods + */ + public function test_getAllOverlappingChildPeriods_ReturnsTheCorrectChildPeriods($periodType, $dateRange, $expectedChildPeriodRanges) + { + $period = Period\Factory::build($periodType, $dateRange); + + $overlappingPeriods = $period->getAllOverlappingChildPeriods(); + $overlappingPeriods = $this->getPeriodInfoForAssert($overlappingPeriods); + + $this->assertEquals($expectedChildPeriodRanges, $overlappingPeriods); + } + + public function getTestDataForGetAllOverlappingChildPeriods() + { + return array( + array( + 'month', + '2015-09-10', + array( + array('week', '2015-08-31,2015-09-06'), + array('week', '2015-09-07,2015-09-13'), + array('week', '2015-09-14,2015-09-20'), + array('week', '2015-09-21,2015-09-27'), + array('week', '2015-09-28,2015-10-04'), + array('day', '2015-09-01,2015-09-01'), + array('day', '2015-09-02,2015-09-02'), + array('day', '2015-09-03,2015-09-03'), + array('day', '2015-09-04,2015-09-04'), + array('day', '2015-09-05,2015-09-05'), + array('day', '2015-09-06,2015-09-06'), + array('day', '2015-09-07,2015-09-07'), + array('day', '2015-09-08,2015-09-08'), + array('day', '2015-09-09,2015-09-09'), + array('day', '2015-09-10,2015-09-10'), + array('day', '2015-09-11,2015-09-11'), + array('day', '2015-09-12,2015-09-12'), + array('day', '2015-09-13,2015-09-13'), + array('day', '2015-09-14,2015-09-14'), + array('day', '2015-09-15,2015-09-15'), + array('day', '2015-09-16,2015-09-16'), + array('day', '2015-09-17,2015-09-17'), + array('day', '2015-09-18,2015-09-18'), + array('day', '2015-09-19,2015-09-19'), + array('day', '2015-09-20,2015-09-20'), + array('day', '2015-09-21,2015-09-21'), + array('day', '2015-09-22,2015-09-22'), + array('day', '2015-09-23,2015-09-23'), + array('day', '2015-09-24,2015-09-24'), + array('day', '2015-09-25,2015-09-25'), + array('day', '2015-09-26,2015-09-26'), + array('day', '2015-09-27,2015-09-27'), + array('day', '2015-09-28,2015-09-28'), + array('day', '2015-09-29,2015-09-29'), + array('day', '2015-09-30,2015-09-30'), + ), + ), + + array( + 'week', + '2015-09-03', + array( + array('day', '2015-08-31,2015-08-31'), + array('day', '2015-09-01,2015-09-01'), + array('day', '2015-09-02,2015-09-02'), + array('day', '2015-09-03,2015-09-03'), + array('day', '2015-09-04,2015-09-04'), + array('day', '2015-09-05,2015-09-05'), + array('day', '2015-09-06,2015-09-06'), + ), + ), + + array( + 'day', + '2015-09-05', + array(), + ), + ); + } + + private function getPeriodInfoForAssert($periods) + { + return array_map(function (Period $period) { + return array($period->getLabel(), $period->getRangeString()); + }, $periods); + } } \ No newline at end of file diff --git a/tests/UI/expected-ui-screenshots b/tests/UI/expected-ui-screenshots index 7ae250b899595aa7e0c8c4512cae2bffe3c0b769..ae43d0c24150d059c9350c89fe20589d171fb40a 160000 --- a/tests/UI/expected-ui-screenshots +++ b/tests/UI/expected-ui-screenshots @@ -1 +1 @@ -Subproject commit 7ae250b899595aa7e0c8c4512cae2bffe3c0b769 +Subproject commit ae43d0c24150d059c9350c89fe20589d171fb40a diff --git a/tests/UI/specs/DashboardManager_spec.js b/tests/UI/specs/DashboardManager_spec.js index 77bfbcc9db33e4fc660761ec733bcc92fb1ea442..815fd6e2c98de686a3b48284d7ad9779accb7b4d 100644 --- a/tests/UI/specs/DashboardManager_spec.js +++ b/tests/UI/specs/DashboardManager_spec.js @@ -24,7 +24,7 @@ describe("DashboardManager", function () { it("should expand when clicked", function (done) { expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); }, done); }); diff --git a/tests/UI/specs/Dashboard_spec.js b/tests/UI/specs/Dashboard_spec.js index d02411d1a2e776d979c6d559a53e8f3a70ed5413..b268cff47be6525aa72e967241dd5941fc05f22c 100644 --- a/tests/UI/specs/Dashboard_spec.js +++ b/tests/UI/specs/Dashboard_spec.js @@ -84,7 +84,7 @@ describe("Dashboard", function () { }); it("should refresh widget when widget refresh icon clicked", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_refresh", function (page) { + expect.screenshot("widget_move_refresh").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#refresh'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -99,7 +99,7 @@ describe("Dashboard", function () { }); it("should unminimise widget when widget maximise icon is clicked after being minimised", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_unminimised", function (page) { + expect.screenshot("widget_move_unminimised").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#maximise'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -114,7 +114,7 @@ describe("Dashboard", function () { }); it("should close maximise dialog when minimise icon is clicked", function (done) { - expect.screenshot("widget_move").to.be.capture("widget_unmaximise", function (page) { + expect.screenshot("widget_move_unmaximise").to.be.capture(function (page) { page.mouseMove('.widgetTop'); page.click('.button#minimise'); page.mouseMove('.dashboard-manager'); // let widget top hide again @@ -123,7 +123,7 @@ describe("Dashboard", function () { it("should add a widget when a widget is selected in the dashboard manager", function (done) { expect.screenshot("widget_add_widget").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.mouseMove('.widgetpreview-categorylist>li:contains(Live!)'); // have to mouse move twice... otherwise Live! will just be highlighted page.mouseMove('.widgetpreview-categorylist>li:contains(Times):first'); @@ -140,6 +140,7 @@ describe("Dashboard", function () { page.mouseMove(widget + ' .widgetTop'); page.click(widget + ' .button#close'); + page.click('.ui-dialog button>span:contains(Yes)'); page.mouseMove('.dashboard-manager'); }, done); @@ -147,7 +148,7 @@ describe("Dashboard", function () { it("should change dashboard layout when new layout is selected", function (done) { expect.screenshot("change_layout").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=showChangeDashboardLayoutDialog]'); page.click('div[layout=50-50]'); page.click('.ui-dialog button>span:contains(Save)'); @@ -156,7 +157,7 @@ describe("Dashboard", function () { it("should rename dashboard when dashboard rename process completed", function (done) { expect.screenshot("rename").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=renameDashboard]'); page.evaluate(function () { $('#newDashboardName:visible').val('newname'); // don't use sendKeys or click, since in this test it appears to trigger a seg fault on travis @@ -167,7 +168,7 @@ describe("Dashboard", function () { it("should copy dashboard successfully when copy dashboard process completed", function (done) { expect.screenshot("copied").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=copyDashboardToUser]'); page.evaluate(function () { $('[id=copyDashboardName]:last').val(''); @@ -184,7 +185,7 @@ describe("Dashboard", function () { it("should reset dashboard when reset dashboard process completed", function (done) { expect.screenshot("reset").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=resetDashboard]'); page.click('.ui-dialog button>span:contains(Yes)', 4000); page.mouseMove('.dashboard-manager'); @@ -193,7 +194,7 @@ describe("Dashboard", function () { it("should remove dashboard when remove dashboard process completed", function (done) { expect.screenshot("removed").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=removeDashboard]'); page.click('.ui-dialog[aria-describedby=removeDashboardConfirm] button>span:contains(Yes)'); page.mouseMove('.dashboard-manager'); @@ -206,7 +207,7 @@ describe("Dashboard", function () { it("should not fail when default widget selection changed", function (done) { expect.screenshot("default_widget_selection_changed").to.be.capture(function (page) { page.load(url); - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=setAsDefaultWidgets]'); page.click('.ui-dialog button>span:contains(Yes)'); }, done); @@ -214,7 +215,7 @@ describe("Dashboard", function () { it("should create new dashboard with new default widget selection when create dashboard process completed", function (done) { expect.screenshot("create_new").to.be.capture(function (page) { - page.click('.dashboard-manager'); + page.click('.dashboard-manager .title'); page.click('li[data-action=createDashboard]'); page.sendKeys('#createDashboardName:visible', 'newdash2'); page.click('.ui-dialog[aria-describedby=createDashboardConfirm] button>span:contains(Yes)'); diff --git a/tests/UI/specs/EmptySite_spec.js b/tests/UI/specs/EmptySite_spec.js index 704bda87210ae028e15df89b75ada90b81bc9857..31b8524d6f6032702616d1f116327ffaae64b238 100644 --- a/tests/UI/specs/EmptySite_spec.js +++ b/tests/UI/specs/EmptySite_spec.js @@ -15,7 +15,7 @@ describe("EmptySite", function () { it('should show the tracking code if the website has no recorded data', function (done) { var urlToTest = "?" + generalParams + "&module=CoreHome&action=index"; - expect.screenshot('emptySiteDashboard').to.be.captureSelector('.site-without-data', function (page) { + expect.screenshot('emptySiteDashboard').to.be.captureSelector('.page', function (page) { page.load(urlToTest); }, done); }); diff --git a/tests/UI/specs/ImageGraph_spec.js b/tests/UI/specs/ImageGraph_spec.js index 570ebabe5bcd81843cbd83fc4dbcf2480856b8e1..057f7306e0553d9ac7c138620e7763d1068c21fe 100644 --- a/tests/UI/specs/ImageGraph_spec.js +++ b/tests/UI/specs/ImageGraph_spec.js @@ -23,7 +23,7 @@ describe("ImageGraph", function () { it("should render horizontal bar graphs correctly", function (done) { expect.screenshot('horizontal_bar').to.be.similar(.95).to.capture(function (page) { - page.load(getImageGraphUrl('DevicesDetection', 'getBrowsers', 'horizontalBar', 'year', '2012-01-01')); + page.load(getImageGraphUrl('UserSettings', 'getBrowser', 'horizontalBar', 'year', '2012-01-01')); }, done); }); diff --git a/tests/UI/specs/Login_spec.js b/tests/UI/specs/Login_spec.js index c58dd5fc53a765ad1901b14c2171965f7b409215..ed4ad31ba3da49821ff54e73f1f67b12e95eca2e 100644 --- a/tests/UI/specs/Login_spec.js +++ b/tests/UI/specs/Login_spec.js @@ -49,7 +49,7 @@ describe("Login", function () { it("should redirect to login when logout link clicked", function (done) { expect.screenshot("login_form").to.be.capture("logout_form", function (page) { - page.click("#topBars a:contains(Sign out)"); + page.click("#topRightBar .icon-sign-out"); }, done); }); @@ -89,7 +89,7 @@ describe("Login", function () { it("should login successfully when formless login used", function (done) { expect.page("").contains('#dashboard', 'formless_login', function (page) { - page.click("#topBars a:contains(Sign out)"); + page.click("#topRightBar .icon-sign-out"); page.load(formlessLoginUrl); }, done); }); diff --git a/tests/UI/specs/MeasurableManager_spec.js b/tests/UI/specs/MeasurableManager_spec.js index 539576a7c10b2f98e282b54c7293516749640f25..691af5c436e671f45693af0536ca05086d7978fd 100644 --- a/tests/UI/specs/MeasurableManager_spec.js +++ b/tests/UI/specs/MeasurableManager_spec.js @@ -31,7 +31,7 @@ describe("MeasurableManager", function () { }); it("should use measurable wording in menu", function (done) { - var selector = '.Menu-tabList *:contains(Administration):first'; + var selector = '#secondNavBar li:contains(Administration):first'; expect.screenshot('measurable_menu_item').to.be.captureSelector(selector, function (page) { }, done); diff --git a/tests/UI/specs/Menus_spec.js b/tests/UI/specs/Menus_spec.js index a79c282ce79323be280f266f99f6ae2b5b160f68..a9a070838472935fbe32cd834e62d4d6d905e96c 100644 --- a/tests/UI/specs/Menus_spec.js +++ b/tests/UI/specs/Menus_spec.js @@ -14,61 +14,55 @@ describe("Menus", function () { urlBase = 'module=CoreHome&action=index&' + generalParams ; + function openMenuItem(page, menuItem) + { + page.click('#secondNavBar .navbar a:contains('+ menuItem + ')'); + } + // main menu tests it('should load the main reporting menu correctly', function (done) { - expect.screenshot('mainmenu_loaded').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { + expect.screenshot('mainmenu_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=General_Actions&subcategory=General_Pages"); }, done); }); it('should change the menu when a upper menu item is clicked in the main menu', function (done) { - expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { - page.click('.menuItem:contains(Visitors)'); + expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('#secondNavBar', function (page) { + page.click('#secondNavBar .navbar a:contains:contains(Visitors)'); }, done); }); it('should change the menu when a lower menu item is clicked in the main menu', function (done) { - expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) { - page.click('.menuItem:contains(Visitor Log)'); - }, done); - }); - - // user menu tests - it('should load the user reporting menu correctly', function (done) { - expect.screenshot('user_loaded').to.be.captureSelector('.Menu--admin', function (page) { - page.load("?" + generalParams + "&module=UsersManager&action=userSettings"); - }, done); - }); - - it('should change the user page correctly when a user menu item is clicked', function (done) { - expect.screenshot('user_changed').to.be.captureSelector('.Menu--admin', function (page) { - page.click('.Menu--admin a:contains(API)'); + expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('#secondNavBar', function (page) { + page.click('#secondNavBar .navbar a:contains:contains(Visitor Log)'); }, done); }); // user menu tests it('should load the user reporting menu correctly', function (done) { - expect.screenshot('user_loaded').to.be.captureSelector('.Menu--admin', function (page) { + expect.screenshot('user_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=userSettings"); }, done); }); it('should change the user page correctly when a user menu item is clicked', function (done) { - expect.screenshot('user_changed').to.be.captureSelector('.Menu--admin', function (page) { - page.click('.Menu--admin a:contains(API)'); + expect.screenshot('user_changed').to.be.captureSelector('#secondNavBar', function (page) { + openMenuItem(page, 'Platform'); + openMenuItem(page, 'API'); }, done); }); // admin menu tests it('should load the admin reporting menu correctly', function (done) { - expect.screenshot('admin_loaded').to.be.captureSelector('.Menu--admin', function (page) { + expect.screenshot('admin_loaded').to.be.captureSelector('#secondNavBar', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings"); }, done); }); it('should change the admin page correctly when an admin menu item is clicked', function (done) { - expect.screenshot('admin_changed').to.be.captureSelector('.Menu--admin', function (page) { - page.click('.Menu--admin a:contains(Websites)'); + expect.screenshot('admin_changed').to.be.captureSelector('#secondNavBar', function (page) { + openMenuItem(page, 'Administration'); + openMenuItem(page, 'Websites'); }, done); }); }); diff --git a/tests/UI/specs/MultiSites_spec.js b/tests/UI/specs/MultiSites_spec.js index bab72a1d7710307208731a4852a181770a22de33..6037a196ef8c99bcd61386f7ea52bc731469cab0 100644 --- a/tests/UI/specs/MultiSites_spec.js +++ b/tests/UI/specs/MultiSites_spec.js @@ -11,7 +11,7 @@ describe("MultiSitesTest", function () { this.timeout(0); var generalParams = 'idSite=1&period=year&date=2012-08-09'; - var selector = '.pageWrap,.expandDataTableFooterDrawer'; + var selector = '#multisites,.expandDataTableFooterDrawer'; var createdSiteId = null; diff --git a/tests/UI/specs/PeriodSelector_spec.js b/tests/UI/specs/PeriodSelector_spec.js index 4706498ccbca9ffc3b4ab078c7c46656ee597ed9..7668d273758b7d107ce738ae5e62a402dc8e5849 100644 --- a/tests/UI/specs/PeriodSelector_spec.js +++ b/tests/UI/specs/PeriodSelector_spec.js @@ -84,7 +84,7 @@ describe("PeriodSelector", function () { expect.screenshot("date_range_selected").to.be.captureSelector('#periodString', function (page) { page.click('#calendarFrom .ui-datepicker-calendar a:contains(10)'); page.click('#calendarTo .ui-datepicker-calendar a:contains(18)'); - page.mouseMove('#calendarRangeApply'); + page.mouseMove('#calendarApply'); }, done); }); }); \ No newline at end of file diff --git a/tests/UI/specs/QuickAccess_spec.js b/tests/UI/specs/QuickAccess_spec.js new file mode 100644 index 0000000000000000000000000000000000000000..75879d2729672a5f391e9f695a7f46066813f0f5 --- /dev/null +++ b/tests/UI/specs/QuickAccess_spec.js @@ -0,0 +1,75 @@ +/*! + * Piwik - free/libre analytics platform + * + * ActionsDataTable screenshot tests. + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + */ + +describe("QuickAccess", function () { + var selectorToCapture = "#search,.quick-access"; + + this.timeout(0); + + var url = "?module=CoreHome&action=index&idSite=1&period=year&date=2012-08-09"; + + function enterSearchTerm(page, searchTermToAdd) + { + page.sendKeys("#search input", searchTermToAdd); + } + + function captureSelector(screenshotName, done, selector, callback) + { + expect.screenshot(screenshotName).to.be.captureSelector(selector, callback, done); + } + + function capture(screenshotName, done, callback) + { + captureSelector(screenshotName, done, selectorToCapture, callback); + } + + it("should be displayed", function (done) { + capture('initially', done, function (page) { + page.load(url); + }); + }); + + it("should search for something and update view", function (done) { + capture('search_1', done, function (page) { + enterSearchTerm(page, 'b'); + }); + }); + + it("should search again when typing another letter", function (done) { + capture('search_2', done, function (page) { + enterSearchTerm(page, 'a'); + }); + }); + + it("should show message if no results", function (done) { + capture('search_no_result', done, function (page) { + enterSearchTerm(page, 'x'); + }); + }); + + it("should be possible to activate via shortcut", function (done) { + capture('shortcut', done, function (page) { + page.load(url); + page.sendKeys("body", 'f'); + }); + }); + + it("should search for websites", function (done) { + capture('search_sites', done, function (page) { + enterSearchTerm(page, 'si'); + }); + }); + + it("clicking on a category should show all items that belong to that category", function (done) { + capture('search_category', done, function (page) { + page.click('.quick-access-category:first'); + }); + }); + +}); diff --git a/tests/UI/specs/SegmentSelectorEditor_spec.js b/tests/UI/specs/SegmentSelectorEditor_spec.js index f00a9e87d56c4e2748e09b32d11bff30676a28e8..0f53003c10066e425b9ca2bfa7850298492ab18d 100644 --- a/tests/UI/specs/SegmentSelectorEditor_spec.js +++ b/tests/UI/specs/SegmentSelectorEditor_spec.js @@ -23,13 +23,13 @@ describe("SegmentSelectorEditorTest", function () { it("should open selector when control clicked", function (done) { expect.screenshot("1_selector_open").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); it("should open segment editor when edit link clicked for existing segment", function (done) { expect.screenshot("2_segment_editor_update").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentList .editSegment'); + page.click('.segmentList .editSegment:first'); }, done); }); @@ -66,7 +66,7 @@ describe("SegmentSelectorEditorTest", function () { it("should open blank segment editor when create new segment link is clicked", function (done) { expect.screenshot("8_segment_editor_create").to.be.captureSelector(selectorsToCapture, function (page) { - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); page.click('.add_new_segment'); }, done); }); @@ -121,7 +121,7 @@ describe("SegmentSelectorEditorTest", function () { it("should show the new segment after page reload", function (done) { expect.screenshot("saved").to.be.captureSelector("saved_reload", selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); @@ -161,7 +161,7 @@ describe("SegmentSelectorEditorTest", function () { it("should show the updated segment after page reload", function (done) { expect.screenshot("updated").to.be.captureSelector("updated_reload", selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); @@ -181,14 +181,14 @@ describe("SegmentSelectorEditorTest", function () { expect.screenshot('deleted').to.be.captureSelector(selectorsToCapture + ',.ui-dialog', function (page) { page.click('.ui-dialog button>span:contains(Yes):visible'); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); it("should not show the deleted segment after page reload", function (done) { expect.screenshot('deleted').to.be.captureSelector('deleted_reload', selectorsToCapture, function (page) { page.reload(); - page.click('.segmentationContainer'); + page.click('.segmentationContainer .title'); }, done); }); }); \ No newline at end of file diff --git a/tests/UI/specs/SiteSelector_spec.js b/tests/UI/specs/SiteSelector_spec.js index 71ae7995588a2124fd3f5a445a76af12352beb5e..8ee2c71e0baab37c783173ceb0b61f24f6f28b6f 100644 --- a/tests/UI/specs/SiteSelector_spec.js +++ b/tests/UI/specs/SiteSelector_spec.js @@ -8,7 +8,7 @@ */ describe("SiteSelector", function () { - var selectorToCapture = '[piwik-siteselector],[piwik-siteselector] .custom_select'; + var selectorToCapture = '[piwik-siteselector],[piwik-siteselector] .dropdown'; this.timeout(0); @@ -22,7 +22,7 @@ describe("SiteSelector", function () { it("should display expanded when clicked", function (done) { expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) { - page.click('.sites_autocomplete'); + page.click('.sites_autocomplete .title'); }, done); }); diff --git a/tests/UI/specs/UIIntegration_spec.js b/tests/UI/specs/UIIntegration_spec.js index c58f50af4ffe099b8beb5d49d98c72673729cd0b..fbcaf5474d2f43abf96560992f5177ebd9a9d48f 100644 --- a/tests/UI/specs/UIIntegration_spec.js +++ b/tests/UI/specs/UIIntegration_spec.js @@ -110,6 +110,12 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }, done); }); + it('should redirect the old UserSettings index to visitors > software', function (done) { + expect.screenshot('usersettings_index').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + page.load("?" + urlBase + "#" + generalParams + "&module=UserSettings&action=index"); + }, done); + }); + it('should load the visitors > times page correctly', function (done) { expect.screenshot("visitors_times").to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=General_Visitors&subcategory=VisitTime_SubmenuTimes"); @@ -236,8 +242,14 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); // goals pages + it('should load the goals > ecommerce page correctly', function (done) { + expect.screenshot('goals_ecommerce').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { + page.load( "?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=General_Overview") + }, done); + }); + it('should load the goals > overview page correctly', function (done) { - expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load( "?" + urlBase + "#?" + generalParams + "&category=Goals_Goals&subcategory=General_Overview"); }, done); }); @@ -250,7 +262,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the goals > single goal page correctly', function (done) { - expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Goals&subcategory=1"); }, done); }); @@ -343,7 +355,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // Ecommerce it('should load the ecommerce overview page', function (done) { - expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=General_Overview"); }, done); }); @@ -355,20 +367,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the ecommerce products page', function (done) { - expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=Goals_Products"); }, done); }); it('should load the ecommerce sales page', function (done) { - expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) { + expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=Ecommerce_Sales"); }, done); }); // Admin user settings (plugins not displayed) it('should load the Manage > Websites admin page correctly', function (done) { - expect.screenshot('admin_manage_websites').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_websites').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=SitesManager&action=index"); page.evaluate(function () { $('.form-help:contains(UTC time is)').hide(); @@ -377,7 +389,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the Manage > Users admin page correctly', function (done) { - expect.screenshot('admin_manage_users').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_users').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=index"); // remove token auth which can be random @@ -393,25 +405,25 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the user settings admin page correctly', function (done) { - expect.screenshot('admin_user_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_user_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=UsersManager&action=userSettings"); }, done); }); it('should load the Manage > Tracking Code admin page correctly', function (done) { - expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=trackingCodeGenerator"); }, done); }); it('should load the Settings > General Settings admin page correctly', function (done) { - expect.screenshot('admin_settings_general').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_settings_general').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings"); }, done); }); it('should load the Settings > Privacy admin page correctly', function (done) { - expect.screenshot('admin_privacy_settings').to.be.captureSelector('#content,.ui-inline-help', function (page) { + expect.screenshot('admin_privacy_settings').to.be.captureSelector('.pageWrap,.ui-inline-help', function (page) { page.load("?" + generalParams + "&module=PrivacyManager&action=privacySettings"); }, done); }); @@ -423,43 +435,43 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the Settings > Mobile Messaging admin page correctly', function (done) { - expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=MobileMessaging&action=index"); }, done); }); it('should load the Settings > Mobile Messaging user page correctly', function (done) { - expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('#content', function (page) { + expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=MobileMessaging&action=userSettings"); }, done); }); it('should load the themes admin page correctly', function (done) { - expect.screenshot('admin_themes').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_themes').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CorePluginsAdmin&action=themes"); }, done); }); it('should load the plugins admin page correctly', function (done) { - expect.screenshot('admin_plugins').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_plugins').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CorePluginsAdmin&action=plugins"); }, done); }); it('should load the plugin settings admin page correctly', function (done) { - expect.screenshot('admin_plugin_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_plugin_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=adminPluginSettings"); }, done); }); it('should load the plugin settings user page correctly', function (done) { - expect.screenshot('user_plugin_settings').to.be.captureSelector('#content', function (page) { + expect.screenshot('user_plugin_settings').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CoreAdminHome&action=userPluginSettings"); }, done); }); it('should load the Settings > Visitor Generator admin page correctly', function (done) { - expect.screenshot('admin_visitor_generator').to.be.captureSelector('#content', function (page) { + expect.screenshot('admin_visitor_generator').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=VisitorGenerator&action=index"); page.evaluate(function () { @@ -471,7 +483,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // Notifications it('should load the notifications page correctly', function (done) { - expect.screenshot('notifications').to.be.captureSelector('#content', function (page) { + expect.screenshot('notifications').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=ExampleUI&action=notifications&idSite=1&period=day&date=yesterday"); page.evaluate(function () { $('#header').hide(); @@ -511,20 +523,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? // CustomAlerts plugin TODO: move to CustomAlerts plugin it('should load the custom alerts list correctly', function (done) { - expect.screenshot('customalerts_list').to.be.captureSelector('#content', function (page) { + expect.screenshot('customalerts_list').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CustomAlerts&action=index&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1"); }, done); }); it('should load the triggered custom alerts list correctly', function (done) { - expect.screenshot('customalerts_list_triggered').to.be.captureSelector('#content', function (page) { + expect.screenshot('customalerts_list_triggered').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=CustomAlerts&action=historyTriggeredAlerts&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1"); }, done); }); // top bar pages it('should load the widgets listing page correctly', function (done) { - expect.screenshot('widgets_listing').to.be.captureSelector('#content', function (page) { + expect.screenshot('widgets_listing').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=Widgetize&action=index"); page.mouseMove('.widgetpreview-categorylist>li:contains(Visitors)'); page.mouseMove('li[uniqueid="widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution"]'); @@ -532,7 +544,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the API listing page correctly', function (done) { - expect.screenshot('api_listing').to.be.captureSelector('#content', function (page) { + expect.screenshot('api_listing').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=API&action=listAllAPI"); page.evaluate(function () { // remove token_auth since it can change on each test run $('span#token_auth>strong').text('dummytokenauth'); @@ -541,7 +553,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the email reports page correctly', function (done) { - expect.screenshot('email_reports').to.be.captureSelector('#content', function (page) { + expect.screenshot('email_reports').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=ScheduledReports&action=index"); page.evaluate(function () { $('#header').hide(); @@ -550,7 +562,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? }); it('should load the feedback form when the feedback form link is clicked', function (done) { - expect.screenshot('feedback_form').to.be.captureSelector('#content', function (page) { + expect.screenshot('feedback_form').to.be.captureSelector('.pageWrap', function (page) { page.load("?" + generalParams + "&module=Feedback&action=index"); @@ -571,13 +583,15 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik? it('should reload to the correct date when a date range is selected in the period selector', function (done) { expect.screenshot('period_select_date_range_click').to.be.capture(function (page) { page.load("?" + urlBase + "#?" + generalParams + "&category=General_Visitors&subcategory=VisitTime_SubmenuTimes"); + page.wait(1000); + page.click('#date.title'); + // we need to make sure there to wait for a bit till date is opened and period selected + page.click('#period_id_range'); page.evaluate(function () { $(document).ready(function () { - $('#date').click(); - $('#period_id_range').click(); $('#inputCalendarFrom').val('2012-08-02'); $('#inputCalendarTo').val('2012-08-12'); - setTimeout(function () {$('#calendarRangeApply').click();}, 500); + setTimeout(function () {$('#calendarApply').click();}, 500); }); }); }, done); diff --git a/tests/angularjs/bootstrap.js b/tests/angularjs/bootstrap.js index 77e034051947ef416935ab008d1c5d1855696107..ef813f5d2ca215ba8cd817258cebf2e98fa6ab83 100644 --- a/tests/angularjs/bootstrap.js +++ b/tests/angularjs/bootstrap.js @@ -24,5 +24,19 @@ piwik.config = {"action_url_category_delimiter":"\/","autocomplete_min_sites":"5 var translations = {"CorePluginsAdmin_NoZipFileSelected":"Please select a ZIP file.","General_InvalidDateRange":"Invalid Date Range, Please Try Again","General_Loading":"Loading...","General_Show":"show","General_Hide":"hide","Intl_Year_Short":"yr","General_MultiSitesSummary":"All Websites","CoreHome_YouAreUsingTheLatestVersion":"You are using the latest version of Piwik!","CoreHome_IncludeRowsWithLowPopulation":"Rows with low population are hidden %s Show all rows","CoreHome_ExcludeRowsWithLowPopulation":"All rows are shown %s Exclude low population","CoreHome_DataTableIncludeAggregateRows":"Aggregate rows are hidden %s Show them","CoreHome_DataTableExcludeAggregateRows":"Aggregate rows are shown %s Hide them","CoreHome_Default":"default","CoreHome_PageOf":"%1$s of %2$s","CoreHome_FlattenDataTable":"The report is hierarchical %s Make it flat","CoreHome_UnFlattenDataTable":"The report is flat %s Make it hierarchical","CoreHome_ExternalHelp":"Help (opens in new tab)","SitesManager_NotFound":"No websites found for","Annotations_ViewAndAddAnnotations":"View and add annotations for %s...","General_RowEvolutionRowActionTooltipTitle":"Open Row Evolution","General_RowEvolutionRowActionTooltip":"See how the metrics for this row changed over time","Annotations_IconDesc":"View notes for this date range.","Annotations_IconDescHideNotes":"Hide notes for this date range.","Annotations_HideAnnotationsFor":"Hide annotations for %s...","General_LoadingPopover":"Loading %s...","General_LoadingPopoverFor":"Loading %s for","Intl_Month_Short_StandAlone_1":"Jan","Intl_Month_Short_StandAlone_2":"Feb","Intl_Month_Short_StandAlone_3":"Mar","Intl_Month_Short_StandAlone_4":"Apr","Intl_Month_Short_StandAlone_5":"May","Intl_Month_Short_StandAlone_6":"Jun","Intl_Month_Short_StandAlone_7":"Jul","Intl_Month_Short_StandAlone_8":"Aug","Intl_Month_Short_StandAlone_9":"Sep","Intl_Month_Short_StandAlone_10":"Oct","Intl_Month_Short_StandAlone_11":"Nov","Intl_Month_Short_StandAlone_12":"Dec","Intl_Month_Long_StandAlone_1":"January","Intl_Month_Long_StandAlone_2":"February","Intl_Month_Long_StandAlone_3":"March","Intl_Month_Long_StandAlone_4":"April","Intl_Month_Long_StandAlone_5":"May","Intl_Month_Long_StandAlone_6":"June","Intl_Month_Long_StandAlone_7":"July","Intl_Month_Long_StandAlone_8":"August","Intl_Month_Long_StandAlone_9":"September","Intl_Month_Long_StandAlone_10":"October","Intl_Month_Long_StandAlone_11":"November","Intl_Month_Long_StandAlone_12":"December","Intl_Day_Short_StandAlone_1":"Mon","Intl_Day_Short_StandAlone_2":"Tue","Intl_Day_Short_StandAlone_3":"Wed","Intl_Day_Short_StandAlone_4":"Thu","Intl_Day_Short_StandAlone_5":"Fri","Intl_Day_Short_StandAlone_6":"Sat","Intl_Day_Short_StandAlone_7":"Sun","Intl_Day_Long_StandAlone_1":"Monday","Intl_Day_Long_StandAlone_2":"Tuesday","Intl_Day_Long_StandAlone_3":"Wednesday","Intl_Day_Long_StandAlone_4":"Thursday","Intl_Day_Long_StandAlone_5":"Friday","Intl_Day_Long_StandAlone_6":"Saturday","Intl_Day_Long_StandAlone_7":"Sunday","Intl_Day_Min_StandAlone_1":"Mo","Intl_Day_Min_StandAlone_2":"Tu","Intl_Day_Min_StandAlone_3":"We","Intl_Day_Min_StandAlone_4":"Th","Intl_Day_Min_StandAlone_5":"Fr","Intl_Day_Min_StandAlone_6":"Sa","Intl_Day_Min_StandAlone_7":"Su","General_Search":"Search","General_MoreDetails":"More Details","General_Help":"Help","General_MetricsToPlot":"Metrics to plot","General_MetricToPlot":"Metric to plot","General_RecordsToPlot":"Records to plot","General_SaveImageOnYourComputer":"To save the image on your computer, right click on the image and select \"Save Image As...\"","General_ExportAsImage":"Export as Image","General_NoDataForGraph":"No data for this graph.","Widgetize_OpenInNewWindow":"Open in a new window","Dashboard_LoadingWidget":"Loading widget, please wait...","General_TransitionsRowActionTooltipTitle":"Open Transitions","General_TransitionsRowActionTooltip":"See what visitors did before and after viewing this page","Dashboard_AddPreviewedWidget":"Click to add widget to the dashboard","Dashboard_WidgetPreview":"Widget preview","Dashboard_Maximise":"Maximise","Dashboard_Minimise":"Minimise","Dashboard_WidgetNotFound":"Widget not found","Dashboard_DashboardCopied":"Current dashboard successfully copied to selected user.","General_Close":"Close","General_Refresh":"Refresh","General_Website":"Website","General_ColumnNbVisits":"Visits","General_ColumnPageviews":"Pageviews","General_ColumnRevenue":"Revenue","General_TotalVisitsPageviewsRevenue":"(Total: %s visits, %s pageviews, %s revenue)","General_EvolutionSummaryGeneric":"%1$s in %2$s compared to %3$s in %4$s. Evolution: %5$s","General_AllWebsitesDashboard":"All Websites dashboard","General_NVisits":"%s visits","MultiSites_Evolution":"Evolution","SitesManager_AddSite":"Add a new website","General_Next":"Next","General_Previous":"Previous","General_GoTo":"Go to %s","Dashboard_DashboardOf":"Dashboard of %s","Actions_SubmenuSitesearch":"Site Search","MultiSites_LoadingWebsites":"Loading websites","General_ErrorRequest":"Oops\u2026 problem during the request, please try again.","Goals_AddGoal":"Add Goal","Goals_UpdateGoal":"Update Goal","Goals_DeleteGoalConfirm":"Are you sure you want to delete the Goal %s?","UserCountry_FatalErrorDuringDownload":"A fatal error occurred while downloading this file. There might be something wrong with your internet connection, with the GeoIP database you downloaded or Piwik. Try downloading and installing it manually.","UserCountry_SetupAutomaticUpdatesOfGeoIP":"Setup automatic updates of GeoIP databases","General_Done":"Done","Feedback_ThankYou":"Thank you for helping us to make Piwik better!","Feedback_RateFeatureTitle":"Do you like the '%s' feature? Please rate and leave a comment","Feedback_RateFeatureThankYouTitle":"Thank you for rating '%s'!","Feedback_RateFeatureLeaveMessageLike":"We are glad you like it! Please let us know what you like the most or if you have a feature request.","Feedback_RateFeatureLeaveMessageDislike":"We are sorry to hear you don't like it! Please let us know how we can improve.","Feedback_SendFeedback":"Send Feedback","Feedback_RateFeatureSendFeedbackInformation":"Your Piwik platform will send us (the Piwik team) an email (including your email address) so we can get in contact with you if you have any question.","General_Ok":"Ok","General_OrCancel":"or %s Cancel %s","General_Save":"Save","UsersManager_DeleteConfirm":"Are you sure you want to delete the user %s?","UsersManager_ConfirmGrantSuperUserAccess":"Do you really want to grant '%s' Super User access? Warning: the user will have access to all websites and will be able to perform administrative tasks.","UsersManager_ConfirmProhibitOtherUsersSuperUserAccess":"Do you really want to remove Super User access from '%s'? The user will lose all permissions and access to all websites. Make sure to set permissions to needed websites afterwards if necessary.","UsersManager_ConfirmProhibitMySuperUserAccess":"%s, do you really want to remove your own Super User access? You will lose all permissions and access to all websites and will be logged out from Piwik.","SitesManager_OnlyOneSiteAtTime":"You can only edit one website at a time. Please Save or Cancel your current modifications to the website %s.","SitesManager_DeleteConfirm":"Are you sure you want to delete the website %s?","ScheduledReports_ReportSent":"Report sent","ScheduledReports_ReportUpdated":"Report updated","General_OverlayRowActionTooltipTitle":"Open Page Overlay","General_OverlayRowActionTooltip":"See analytics data directly on your website (opens new tab)","CustomAlerts_InvalidMetricValue":"Value must be numeric","Live_VisitorProfile":"Visitor profile","Live_NoMoreVisits":"There are no more visits for this visitor.","Live_ShowMap":"show map","Live_HideMap":"hide map","Live_PageRefreshed":"Number of times this page was viewed \/ refreshed in a row."}; if(typeof(piwik_translations) == 'undefined') { var piwik_translations = new Object; }for(var i in translations) { piwik_translations[i] = translations[i];} +var piwikUsageTracking = { + targets: [ + {url: 'http://localhost/piwik.php', idSite: 1, cookieDomain: ''}, + {url: 'http://127.0.0.1/piwik.php', idSite: 20, cookieDomain: ''}, + {url: 'http://localhost/piwik.php', idSite: 33, cookieDomain: ''}, + ], + visitorCustomVariables: [ + {id: 1, name: 'Access', value: 'user'} + ], + trackingDomain: 'http://demo.piwik.org', + exampleDomain: 'http://example.com' +}; + var expect = chai.expect - , should = chai.should(); \ No newline at end of file + , should = chai.should(); + diff --git a/tests/angularjs/karma.conf.js b/tests/angularjs/karma.conf.js index 237d39b57a4e90994b3cfc0d8814368f7327777e..9525c7e06b023b949168f0ef0ab31c153da9e024 100755 --- a/tests/angularjs/karma.conf.js +++ b/tests/angularjs/karma.conf.js @@ -30,7 +30,10 @@ module.exports = function(config) { 'plugins/CoreHome/angularjs/common/directives/directive.module.js', 'plugins/CoreHome/angularjs/piwikApp.js', 'plugins/*/angularjs/**/*.js', - 'plugins/*/angularjs/**/*.spec.js' + 'piwik.js', + 'plugins/AnonymousPiwikUsageMeasurement/javascripts/url.js', + 'plugins/AnonymousPiwikUsageMeasurement/javascripts/tracking.js', + 'plugins/*/**/*.spec.js' ], // list of files to exclude diff --git a/tests/lib/screenshot-testing/support/app.js b/tests/lib/screenshot-testing/support/app.js index e0838b7025cc6ab5edbbab0345c8cd13a36efab6..95995797c2cf2b0067736f70a8d0c5ff9e6e8d96 100644 --- a/tests/lib/screenshot-testing/support/app.js +++ b/tests/lib/screenshot-testing/support/app.js @@ -42,8 +42,8 @@ var isCorePlugin = function (pathToPlugin) { var Application = function () { this.runner = null; - var diffviewerDir = path.join(PIWIK_INCLUDE_PATH, 'tests/UI', config.screenshotDiffDir); - this.diffViewerGenerator = new DiffViewerGenerator(diffviewerDir); + this.diffviewerDir = path.join(PIWIK_INCLUDE_PATH, 'tests/UI', config.screenshotDiffDir); + this.diffViewerGenerator = new DiffViewerGenerator(this.diffviewerDir); }; Application.prototype.printHelpAndExit = function () { @@ -259,4 +259,9 @@ Application.prototype.finish = function () { phantom.exit(this.runner ? this.runner.failures : -1); }; +Application.prototype.appendMissingExpected = function (screenName) { + var missingExpectedFilePath = path.join(this.diffviewerDir, 'missing-expected.list'); + fs.write(missingExpectedFilePath, screenName + "\n", "a"); +}; + exports.Application = new Application(); \ No newline at end of file diff --git a/tests/lib/screenshot-testing/support/chai-extras.js b/tests/lib/screenshot-testing/support/chai-extras.js index 05cabf82da17501fdb74673a22c180b708d82ba8..aeb2d86b1bb38d7964d81742487e3209681727d6 100644 --- a/tests/lib/screenshot-testing/support/chai-extras.js +++ b/tests/lib/screenshot-testing/support/chai-extras.js @@ -137,6 +137,8 @@ function capture(screenName, compareAgainst, selector, pageSetupFn, comparisonTh } if (!testInfo.expected) { + app.appendMissingExpected(screenName); + fail("No expected screenshot found for " + screenshotFileName + "."); return; } @@ -404,4 +406,4 @@ chai.Assertion.addChainableMethod('pageContents', function (pageSetupFn, done) { var compareAgainst = this.__flags['object']; compareContents(compareAgainst, pageSetupFn, done); -}); \ No newline at end of file +}); diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js index 70231c3ca73e78f6deb6aee3432798597819d452..2bb909f721675e13eb44a38f13e2d69f9829160e 100644 --- a/tests/lib/screenshot-testing/support/page-renderer.js +++ b/tests/lib/screenshot-testing/support/page-renderer.js @@ -137,6 +137,8 @@ PageRenderer.prototype._sendMouseEvent = function (type, pos, callback) { PageRenderer.prototype._click = function (selector, modifiers, callback) { var position = this._getPosition(selector); + this._makeSurePositionIsInViewPort(position.x, position.y); + if (modifiers.length) { var self = this; modifiers = modifiers.reduce(function (previous, mStr) { @@ -152,6 +154,46 @@ PageRenderer.prototype._click = function (selector, modifiers, callback) { callback(); }; +PageRenderer.prototype._makeSurePositionIsInViewPort = function (width, height) { + + var currentWidth = this._getViewportWidth(); + var currentHeight = this._getViewportHeight(); + + var update = false; + + if (width && width > 0 && width >= currentWidth) { + currentWidth = width + 50; + update = true; + } + + if (height && height > 0 && height >= currentHeight) { + currentHeight = height + 50; + update = true; + } + + if (update) { + this._setCorrectViewportSize({width: currentWidth, height: currentHeight}); + } +}; + +PageRenderer.prototype._getViewportWidth = function () { + var width = 1350; + if (this._viewportSizeOverride && this._viewportSizeOverride.width) { + width = this._viewportSizeOverride.width; + } + + return width; +}; + +PageRenderer.prototype._getViewportHeight = function () { + var height = 768; + if (this._viewportSizeOverride && this._viewportSizeOverride.height) { + height = this._viewportSizeOverride.height; + } + + return height; +}; + PageRenderer.prototype._keypress = function (keys, callback) { this.webpage.sendEvent('keypress', keys); @@ -574,8 +616,10 @@ PageRenderer.prototype._waitForNextEvent = function (events, callback, i, waitTi }, waitTime); }; -PageRenderer.prototype._setCorrectViewportSize = function () { - var viewportSize = this._viewportSizeOverride || {width:1350, height:768}; +PageRenderer.prototype._setCorrectViewportSize = function (viewportSize) { + if (!viewportSize) { + viewportSize = {width: this._getViewportWidth(), height: this._getViewportHeight()}; + } this.webpage.viewportSize = viewportSize; var height = Math.max(viewportSize.height, this.webpage.evaluate(function() { diff --git a/tests/resources/screenshot-override/override.css b/tests/resources/screenshot-override/override.css index 9616c5acb86c32b59590c56b0cde73c26e0993cd..f74ae3545f8f135ab9319e0f32df841f8d578a04 100644 --- a/tests/resources/screenshot-override/override.css +++ b/tests/resources/screenshot-override/override.css @@ -1,5 +1,5 @@ -#header_message>.header_short { - display:none; +#header_message>.title { + visibility: hidden; } .visitor-profile-widget-link>strong { diff --git a/tests/travis b/tests/travis index 1d994a294112da5a67e229e7d02bda91806cbd03..73e688cb29439cb997ec99d68ff6379dd4486f5b 160000 --- a/tests/travis +++ b/tests/travis @@ -1 +1 @@ -Subproject commit 1d994a294112da5a67e229e7d02bda91806cbd03 +Subproject commit 73e688cb29439cb997ec99d68ff6379dd4486f5b