'initLanguage', 'Request.dispatchCoreAndPluginUpdatesScreen' => 'initLanguage', 'Request.dispatch' => 'initLanguage', 'Platform.initialized' => 'initLanguage', 'UsersManager.deleteUser' => 'deleteUserLanguage', 'Template.topBar' => 'addLanguagesManagerToOtherTopBar', 'Template.jsGlobalVariables' => 'jsGlobalVariables', 'Db.getTablesInstalled' => 'getTablesInstalled' ); } /** * Register the new tables, so Matomo knows about them. * * @param array $allTablesInstalled */ public function getTablesInstalled(&$allTablesInstalled) { $allTablesInstalled[] = Common::prefixTable('user_language'); } /** * Adds the languages drop-down list to topbars other than the main one rendered * in CoreHome/templates/top_bar.twig. The 'other' topbars are on the Installation * and CoreUpdater screens. */ public function addLanguagesManagerToOtherTopBar(&$str) { // piwik object & scripts aren't loaded in 'other' topbars $str .= ""; $file = PluginUmdAssetFetcher::getUmdFileToUseForPlugin('LanguagesManager'); $str .= ""; $str .= $this->getLanguagesSelector(); } /** * Adds the languages drop-down list to topbars other than the main one rendered * in CoreHome/templates/top_bar.twig. The 'other' topbars are on the Installation * and CoreUpdater screens. */ public function jsGlobalVariables(&$str) { // piwik object & scripts aren't loaded in 'other' topbars $str .= "piwik.languageName = '" . self::getLanguageNameForCurrentUser() . "';"; } /** * Renders and returns the language selector HTML. * * @return string */ public function getLanguagesSelector() { $view = new View("@LanguagesManager/getLanguagesSelector"); $view->languages = API::getInstance()->getAvailableLanguageNames(); $view->currentLanguageCode = self::getLanguageCodeForCurrentUser(); $view->currentLanguageName = self::getLanguageNameForCurrentUser(); $view->nonce = Nonce::getNonce(self::LANGUAGE_SELECTION_NONCE); return $view->render(); } public function initLanguage() { /** @var Translator $translator */ $translator = StaticContainer::get('Piwik\Translation\Translator'); $language = Common::getRequestVar('language', '', 'string'); if (empty($language)) { $userLanguage = self::getLanguageCodeForCurrentUser(); if (API::getInstance()->isLanguageAvailable($userLanguage)) { $language = $userLanguage; } } if (!empty($language) && API::getInstance()->isLanguageAvailable($language)) { $translator->setCurrentLanguage($language); } $locale = $translator->translate('General_Locale'); Locale::setLocale($locale); } public function deleteUserLanguage($userLogin) { $model = new Model(); $model->deleteUserLanguage($userLogin); } /** * @throws Exception if non-recoverable error */ public function install() { Model::install(); } /** * @throws Exception if non-recoverable error */ public function uninstall() { Model::uninstall(); } /** * @return boolean */ public static function uses12HourClockForCurrentUser() { try { $currentUser = Piwik::getCurrentUserLogin(); return Request::processRequest('LanguagesManager.uses12HourClockForUser', array('login' => $currentUser)); } catch (Exception $e) { return false; } } /** * @return string Two letters language code, eg. "fr" */ public static function getLanguageCodeForCurrentUser() { $languageCode = self::getLanguageFromPreferences(); if (!API::getInstance()->isLanguageAvailable($languageCode)) { $languageCode = Common::extractLanguageCodeFromBrowserLanguage(Common::getBrowserLanguage(), API::getInstance()->getAvailableLanguages()); } if (!API::getInstance()->isLanguageAvailable($languageCode)) { $languageCode = StaticContainer::get('Piwik\Translation\Translator')->getDefaultLanguage(); } return $languageCode; } /** * @return string Full english language string, eg. "French" */ public static function getLanguageNameForCurrentUser() { $languageCode = self::getLanguageCodeForCurrentUser(); $languages = API::getInstance()->getAvailableLanguageNames(); foreach ($languages as $language) { if ($language['code'] === $languageCode) { return $language['name']; } } return false; } /** * @return string|false if language preference could not be loaded */ protected static function getLanguageFromPreferences() { if (($language = self::getLanguageForSession()) != null) { return $language; } try { $currentUser = Piwik::getCurrentUserLogin(); return API::getInstance()->getLanguageForUser($currentUser); } catch (Exception $e) { return false; } } /** * Returns the language for the session * * @return string|null */ public static function getLanguageForSession() { $cookieName = Config::getInstance()->General['language_cookie_name']; $cookie = new Cookie($cookieName); if ($cookie->isCookieFound()) { return $cookie->get('language'); } return null; } /** * Set the language for the session * * @param string $languageCode ISO language code * @return bool */ public static function setLanguageForSession($languageCode) { if (!API::getInstance()->isLanguageAvailable($languageCode)) { return false; } $cookieName = Config::getInstance()->General['language_cookie_name']; $cookie = new Cookie($cookieName, 0); $cookie->set('language', $languageCode); $cookie->setSecure(ProxyHttp::isHttps()); $cookie->setHttpOnly(true); $cookie->save('Lax'); return true; } }