%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/i18n/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/components/i18n/I18N.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2017 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\components\i18n; use humhub\libs\I18NHelper; use Yii; use yii\base\InvalidArgumentException; use humhub\models\forms\ChooseLanguage; use yii\i18n\I18N as BaseI18N; /** * I18N provides features related with internationalization (I18N) and localization (L10N). * * @inheritdoc */ class I18N extends BaseI18N { /** * @var string path which contains message overwrites */ public $messageOverwritePath = '@config/messages'; /** * Languages which are not supported by Yii. * To overwrite this languages, a language file called "humhub.yii.php" * needs to be placed in the messages folder. * * @var array list of languages */ public $unsupportedYiiLanguages = ['an']; /** * Called before the translate method is executed. * e.g. to modify translations on the fly. * * @since 1.4 * @var callable */ public $beforeTranslateCallback; /** * Automatically sets the current locale and time zone */ public function autosetLocale() { if (!Yii::$app->params['installed'] || Yii::$app->user->isGuest) { $this->setGuestLocale(); } else { $this->setUserLocale(Yii::$app->user->getIdentity()); } } /** * Sets the current locale and time zone for a given user. * If no user is given the currently logged in user will be used. * * @param \humhub\modules\user\models\User $user */ public function setUserLocale($user) { if ($user === null) { throw new InvalidArgumentException('User cannot be null!'); } if (!empty($user->language)) { $this->setLocale($user->language); } else { $this->setDefaultLocale(); } if (!empty($user->time_zone)) { Yii::$app->formatter->timeZone = $user->time_zone; } else { Yii::$app->formatter->timeZone = Yii::$app->timeZone; } Yii::$app->formatter->defaultTimeZone = Yii::$app->timeZone; } /** * Sets the locale for the current guest user. * * The language is determined by the a cookie */ public function setGuestLocale() { if (is_a(Yii::$app, 'yii\console\Application')) { $this->setDefaultLocale(); return; } $languageChooser = new ChooseLanguage(); if ($languageChooser->load(Yii::$app->request->post()) && $languageChooser->save()) { $this->setLocale($languageChooser->language); } else { $language = $languageChooser->getSavedLanguage(); if ($language === null) { // Use browser preferred language $this->setLocale(Yii::$app->request->getPreferredLanguage(array_keys($this->getAllowedLanguages()))); } else { $this->setLocale($language); } } } /** * Sets the system default locale */ public function setDefaultLocale() { $this->setLocale(Yii::$app->settings->get('defaultLanguage')); } /** * Sets the language locale of `Yii::$app->language` and `Yii::$app->formatter`. * * @param $locale */ protected function setLocale($locale) { if (!empty($locale)) { Yii::$app->language = $locale; Yii::$app->formatter->locale = $locale; } } /** * @inheritdoc */ public function translate($category, $message, $params, $language) { if ($category === 'yii' && in_array($language, $this->unsupportedYiiLanguages)) { $category = 'humhub.yii'; } if (is_callable($this->beforeTranslateCallback)) { list($category, $message, $params, $language) = $this->beforeTranslateCallback->call($this, $category, $message, $params, $language); } return parent::translate($category, $message, $params, $language); } /** * @inheritdoc */ public function getMessageSource($category) { // Requested MessageSource already loaded if (isset($this->translations[$category]) && $this->translations[$category] instanceof \yii\i18n\MessageSource) { return $this->translations[$category]; } // Try to automatically assign Module->MessageSource foreach (Yii::$app->moduleManager->getModules(['includeCoreModules' => true, 'returnClass' => true]) as $moduleId => $className) { $moduleCategory = I18NHelper::getModuleTranslationCategory($moduleId); if (substr($category, 0, strlen($moduleCategory)) === $moduleCategory) { $this->translations[$moduleCategory . '*'] = [ 'class' => 'humhub\components\i18n\ModuleMessageSource', 'moduleId' => $moduleId ]; } } return parent::getMessageSource($category); } /** * Returns an array of allowed/available language codes * * @return array the allowed languages */ public function getAllowedLanguages() { $availableLanguages = Yii::$app->params['availableLanguages']; $allowedLanguages = Yii::$app->params['allowedLanguages']; if ($allowedLanguages != null && count($allowedLanguages) > 0) { $result = []; foreach ($allowedLanguages as $lang) { $result[$lang] = $availableLanguages[$lang]; } return $result; } return $availableLanguages; } /** * Check if the provided or browser language is allowed in system, otherwise return default language * * @since 1.12.2 * @param string|null $language NULL - to get a language from browser * @return string|null */ public function getAllowedLanguage(?string $language = null): ?string { if (empty($language)) { $language = Yii::$app->language; } if (array_key_exists($language, $this->getAllowedLanguages())) { return $language; } return Yii::$app->settings->get('defaultLanguage'); } /** * @inheritdoc */ public function format($message, $params, $language) { if (count($params) !== 0) { $fixedParams = []; // Try to fix old placeholder formats foreach ($params as $param => $value) { if (substr($param, 0, 1) === "%" && substr($param, -1, 1) === "%" && strlen($param) > 2) { // Fix: %param% style params $fixedParam = str_replace("%", "", $param); $fixedParams[$fixedParam] = $value; $message = str_replace('%' . $fixedParam . '%', '{' . $fixedParam . '}', $message); } elseif (substr($param, 0, 1) == "%") { // Fix: %param style params $fixedParam = str_replace("%", "", $param); $fixedParams[$fixedParam] = $value; $message = str_replace('%' . $fixedParam, '{' . $fixedParam . '}', $message); } elseif (substr($param, 0, 1) === "{" && substr($param, -1, 1) === "}") { // Fix: {param} style params $fixedParam = str_replace(['{', '}'], "", $param); $fixedParams[$fixedParam] = $value; } elseif (substr($param, 0, 1) === ":") { // Fix: :param style params $fixedParam = str_replace(':', "", $param); $fixedParams[$fixedParam] = $value; $message = str_replace(':' . $fixedParam, '{' . $fixedParam . '}', $message); } else { $fixedParams[$param] = $value; } } return parent::format($message, $fixedParams, $language); } return parent::format($message, $params, $language); } }