diff options
author | Thomas Steur <tsteur@users.noreply.github.com> | 2021-10-18 11:30:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-18 11:30:55 +0300 |
commit | 9826875e0eed5399d3512c6b65adcdc70c3dd600 (patch) | |
tree | a4397849acc1ca8455f592b462a3abf3bc379c90 /plugins/SitesManager | |
parent | 76a120b95696545a2afc255f88e04b5530c5129e (diff) |
Cache translated timezone name in enrichSite (#18168)
* Cache timezone name
* fix tests
* fix test
Diffstat (limited to 'plugins/SitesManager')
-rw-r--r-- | plugins/SitesManager/API.php | 43 | ||||
-rw-r--r-- | plugins/SitesManager/tests/Integration/ApiTest.php | 6 |
2 files changed, 28 insertions, 21 deletions
diff --git a/plugins/SitesManager/API.php b/plugins/SitesManager/API.php index ba3a3c7362..666cada1cf 100644 --- a/plugins/SitesManager/API.php +++ b/plugins/SitesManager/API.php @@ -11,6 +11,7 @@ namespace Piwik\Plugins\SitesManager; use DateTimeZone; use Exception; use Piwik\Access; +use Piwik\CacheId; use Piwik\Common; use Piwik\Container\StaticContainer; use Piwik\Date; @@ -32,6 +33,7 @@ use Piwik\Tracker; use Piwik\Tracker\Cache; use Piwik\Tracker\TrackerCodeGenerator; use Piwik\Measurable\Type; +use Piwik\Translation\Translator; use Piwik\Url; use Piwik\UrlHelper; use Piwik\DataAccess\Model as CoreModel; @@ -75,15 +77,17 @@ class API extends \Piwik\Plugin\API private $settingsMetadata; /** - * @var Type\TypeManager + * @var Translator */ - private $typeManager; + private $translator; - public function __construct(SettingsProvider $provider, SettingsMetadata $settingsMetadata, Type\TypeManager $typeManager) + private $timezoneNameCache = []; + + public function __construct(SettingsProvider $provider, SettingsMetadata $settingsMetadata, Translator $translator) { $this->settingsProvider = $provider; $this->settingsMetadata = $settingsMetadata; - $this->typeManager = $typeManager; + $this->translator = $translator; } /** @@ -537,10 +541,15 @@ class API extends \Piwik\Plugin\API private function enrichSite(&$site) { - $site['timezone_name'] = $this->getTimezoneName($site['timezone']); + $cacheKey = $site['timezone'] . $this->translator->getCurrentLanguage(); + if (!isset($this->timezoneNameCache[$cacheKey])) { + //cached as this can be called VERY often and getTimezoneName is quite slow + $this->timezoneNameCache[$cacheKey] = $this->getTimezoneName($site['timezone']); + } + $site['timezone_name'] = $this->timezoneNameCache[$cacheKey]; $key = 'Intl_Currency_' . $site['currency']; - $name = Piwik::translate($key); + $name = $this->translator->translate($key); $site['currency_name'] = ($key === $name) ? $site['currency'] : $name; @@ -788,7 +797,7 @@ class API extends \Piwik\Plugin\API } $nbSites = count($idSites); if ($nbSites == 1) { - throw new Exception(Piwik::translate("SitesManager_ExceptionDeleteSite")); + throw new Exception($this->translator->translate("SitesManager_ExceptionDeleteSite")); } $this->getModel()->deleteSite($idSite); @@ -818,13 +827,13 @@ class API extends \Piwik\Plugin\API } } } - throw new Exception(Piwik::translate('SitesManager_ExceptionInvalidTimezone', array($timezone))); + throw new Exception($this->translator->translate('SitesManager_ExceptionInvalidTimezone', array($timezone))); } private function checkValidCurrency($currency) { if (!in_array($currency, array_keys($this->getCurrencyList()))) { - throw new Exception(Piwik::translate('SitesManager_ExceptionInvalidCurrency', array($currency, "USD, EUR, etc."))); + throw new Exception($this->translator->translate('SitesManager_ExceptionInvalidCurrency', array($currency, "USD, EUR, etc."))); } } @@ -861,7 +870,7 @@ class API extends \Piwik\Plugin\API foreach ($ips as $ip) { if (!$this->isValidIp($ip)) { - throw new Exception(Piwik::translate('SitesManager_ExceptionInvalidIPFormat', array($ip, "1.2.3.4, 1.2.3.*, or 1.2.3.4/5"))); + throw new Exception($this->translator->translate('SitesManager_ExceptionInvalidIPFormat', array($ip, "1.2.3.4, 1.2.3.*, or 1.2.3.4/5"))); } } @@ -1342,8 +1351,8 @@ class API extends \Piwik\Plugin\API $return = array(); foreach (array_keys($currency) as $currencyCode) { - $return[$currencyCode] = Piwik::translate('Intl_Currency_' . $currencyCode) . - ' (' . Piwik::translate('Intl_CurrencySymbol_' . $currencyCode) . ')'; + $return[$currencyCode] = $this->translator->translate('Intl_Currency_' . $currencyCode) . + ' (' . $this->translator->translate('Intl_CurrencySymbol_' . $currencyCode) . ')'; } asort($return); @@ -1399,7 +1408,7 @@ class API extends \Piwik\Plugin\API $timezones = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $countryCode); foreach ($timezones as $timezone) { if (!isset($continents[$continentCode])) { - $continents[$continentCode] = Piwik::translate('Intl_Continent_' . $continentCode); + $continents[$continentCode] = $this->translator->translate('Intl_Continent_' . $continentCode); } $continent = $continents[$continentCode]; @@ -1430,7 +1439,7 @@ class API extends \Piwik\Plugin\API public function getTimezoneName($timezone, $countryCode = null, $multipleTimezonesInCountry = null) { if (substr($timezone, 0, 3) === 'UTC') { - return Piwik::translate('SitesManager_Format_Utc', str_replace(array('.25', '.5', '.75'), array(':15', ':30', ':45'), substr($timezone, 3))); + return $this->translator->translate('SitesManager_Format_Utc', str_replace(array('.25', '.5', '.75'), array(':15', ':30', ':45'), substr($timezone, 3))); } if (!isset($countryCode)) { @@ -1454,11 +1463,11 @@ class API extends \Piwik\Plugin\API $multipleTimezonesInCountry = (count($timezonesInCountry) > 1); } - $return = Piwik::translate('Intl_Country_' . $countryCode); + $return = $this->translator->translate('Intl_Country_' . $countryCode); if ($multipleTimezonesInCountry) { $translationId = 'Intl_Timezone_' . str_replace(array('_', '/'), array('', '_'), $timezone); - $city = Piwik::translate($translationId); + $city = $this->translator->translate($translationId); // Fall back to English identifier, if translation is missing due to differences in tzdata in different PHP versions. if ($city === $translationId) { @@ -1555,7 +1564,7 @@ class API extends \Piwik\Plugin\API private function checkName($siteName) { if (empty($siteName)) { - throw new Exception(Piwik::translate("SitesManager_ExceptionEmptyName")); + throw new Exception($this->translator->translate("SitesManager_ExceptionEmptyName")); } } diff --git a/plugins/SitesManager/tests/Integration/ApiTest.php b/plugins/SitesManager/tests/Integration/ApiTest.php index d3ac952c09..3966c30c76 100644 --- a/plugins/SitesManager/tests/Integration/ApiTest.php +++ b/plugins/SitesManager/tests/Integration/ApiTest.php @@ -560,11 +560,9 @@ class ApiTest extends IntegrationTestCase API::getInstance()->addSite("site2", array("http://piwik.com/test/")); API::getInstance()->addSite("site3", array("http://piwik.org"), null, null, null, null, null, null, 'Asia/Tokyo'); - Fixture::loadAllTranslations(); - $resultWanted = array( - 0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'timezone_name' => 'UTC', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website', 'exclude_unknown_urls' => 0, 'currency_name' => 'US Dollar'), - 1 => array("idsite" => 3, "name" => "site3", "main_url" => "http://piwik.org", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'Asia/Tokyo', 'timezone_name' => 'Japan', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website', 'exclude_unknown_urls' => 0, 'currency_name' => 'US Dollar'), + 0 => array("idsite" => 1, "name" => "site1", "main_url" => "http://piwik.net", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'UTC', 'timezone_name' => 'SitesManager_Format_Utc', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website', 'exclude_unknown_urls' => 0, 'currency_name' => 'USD'), + 1 => array("idsite" => 3, "name" => "site3", "main_url" => "http://piwik.org", "ecommerce" => 0, "excluded_ips" => "", 'sitesearch' => 1, 'sitesearch_keyword_parameters' => '', 'sitesearch_category_parameters' => '', 'excluded_parameters' => '', 'excluded_user_agents' => '', 'timezone' => 'Asia/Tokyo', 'timezone_name' => 'Intl_Country_JP', 'currency' => 'USD', 'group' => '', 'keep_url_fragment' => 0, 'type' => 'website', 'exclude_unknown_urls' => 0, 'currency_name' => 'USD'), ); FakeAccess::setIdSitesAdmin(array(1, 3)); |