La fonction d'internationalisation est généralement peu utilisée, mais pour apprendre, il faut quand même entrer en contact avec elle.
La méthode d'internationalisation la plus couramment utilisée est Yii::t La documentation officielle est la suivante
t() public static method Translates a message to the specified language. This is a shortcut method of yii\i18n\I18N::translate(). The translation will be conducted according to the message category and the target language will be used. You can add parameters to a translation message that will be substituted with the corresponding value after translation. The format for this is to use curly brackets around the parameter name as you can see in the following example:
[code]$username = 'Alexander'; echo \Yii::t('app', 'Hello, {username}!', ['username' => $username]);
Further formatting of message parameters is supported using the PHPintl extensions message formatter. See yii\i18n\I18N::translate() formore details. public static stringt ($category, $message, $params = [],$language = null ) $category string The message category. $message string The message to be translated. $params array The parameters that will be used to replace the corresponding placeholders in the message. $language string The language code (e.g.en-US,en).If this is null, the current application language will be used. return string The translated message.
Il y a 4 paramètres. , mais ils sont couramment utilisés. Les deux premiers sont arrivés.
Le premier est le groupe, et la définition du groupe est placée sous config/main-local.php.
Yii2 utilise l'anglais (en-US) par défaut et ajoute désormais le support du chinois (zh-CN)
Ajoutez le bloc suivant sous le composant
'components' => [ ... 'i18n' => [ 'translations' => [ 'common' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@common/messages', 'fileMap' => [ 'common' => 'common.php', ], ], ], ], ... ],
Ce paragraphe Le code définit un groupe nommé common. La classe par défaut yiii18nPhpMessageSource est utilisée pour analyser le fichier de traduction. Le fichier de traduction est placé sous common/messages et le fichier de traduction est common.php.
Selon la configuration, établissez la structure de répertoires suivante
Les fichiers de traduction sont organisés dans un tableau et le contenu est le suivant
<?php return [ 'Signup' => '注册', 'Login' => '登陆', 'Logout' => '登出', 'Home' => '首页', 'Contact' => '反馈', 'About' => '关于', ];
Ensuite, nous effectuons la traduction dans le fichier layouts, et le modifions dans /views/layouts/main.php comme suit :
$menuItems = [ //['label' => 'Home', 'url' => ['/site/index']], //['label' => 'About', 'url' => ['/site/about']], //['label' => 'Contact', 'url' => ['/site/contact']], ['label' => \Yii::t('common', 'Home'), 'url' => ['/site/index']], ['label' => \Yii::t('common', 'About'), 'url' => ['/site/about']], ['label' => \Yii::t('common', 'Contact'), 'url' => ['/site/contact']], ];
Ouvrez la page et voyez si elle prend effet.
Malheureusement, ça ne marche pas. . . . .
La raison est que la langue racine du site Web est toujours en-US et doit être configurée comme zh-CN.
Dans common/config/main-local.php, ajoutez la configuration suivante :
<?php return [ 'language' => 'zh-CN', ... ];
Vérifiez à nouveau si elle prend effet.
Vous pouvez voir que la traduction a pris effet.
Mais la principale raison d'utiliser la méthode Yii::t est d'obtenir le multilingue. Si vous n'affichez qu'une seule langue, il est préférable de faire du code en dur (le framework yii2 fait en fait l'affichage de la langue en code dur)
Yii2 ne fournit pas de contrôle prêt à l'emploi pour changer de langue, nous devons donc en développer un nous-mêmes.
L'implémentation fait référence à http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-lingual-selector-widget-i18n/, et a été modérément simplifiée sans faire d'aspects SEO .
L'idée principale de la mise en œuvre est de sauvegarder la langue sélectionnée par l'utilisateur dans un cookie et de définir la langue sur la valeur dans le cookie avant que chaque utilisateur visite la page. Pourquoi devez-vous définir la langue à chaque fois ? Les raisons sont les suivantes
Remarque : si nous ne définissons pas Yii::app()->langue explicitement pour chaque requête, elle sera égale à sa valeur par défaut définie dans le fichier de configuration. Si elle n'est pas définie dans le fichier de configuration, elle sera égale à la valeur Yii::app()->sourceLanguage, qui est par défaut 'en_us'. Cela signifie probablement, sinon à chaque fois. Si vous définissez la valeur, le système utilisera la langue par défaut, qui est généralement l'anglais.
1. Préparez le matériel, des deux côtés du drapeau national, et placez-les sous frontend/web/image/ et nommez-les en.png et zh.png.
2. Configurez les langues disponibles dans /common/config/main-local.php pour que nous puissions appeler le contrôle
3. Créez un nouveau fichier php sous /common/widgets/ et nommez-le LanguageSelector.php. Le contenu est le suivant :<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], 'params' => [ 'availableLanguages' => [ 'zh-CN' => ['img' => 'image/zh.png', 'desc' => '中文'], 'en-US' => ['img' => 'image/en.png', 'desc' => 'English'], ], ], ... ];La principale chose à faire est :
<?php namespace common\widgets; use Yii; use yii\helpers\Html; use yii\helpers\Url; class LanguageSelector { public static function getMenu() { $lang = Yii::$app->language; $avLang = Yii::$app->params['availableLanguages']; $isMatch = false; foreach ($avLang as $key => $value) { if($key == $lang) { $tag = LanguageSelector::buildImgTag($value['img'], $value['desc']); $isMatch = true; } } if(!$isMatch) { $tag = LanguageSelector::buildImgTag($avLang[0]['img'], $avLang[0]['desc']); } $return = [ 'label' => $tag, 'items' => LanguageSelector::buildMenuItems($avLang), ]; return $return; } private static function buildImgTag($src, $desc) { return '<img src="' . $src . '" alt="' . $desc . '">'; } private static function buildMenuItems($langs) { foreach ($langs as $key => $value) { $link = Html::a(LanguageSelector::buildImgTag($value['img'], $value['desc']) . ' ' . $value['desc'], Url::home(), [ 'title' => LanguageSelector::buildImgTag($value['img'], $value['desc']) . ' ' . $value['desc'], 'onclick'=>" $.ajax({ type :'POST', cache : false, url : '" . Url::toRoute("ajax/lang") . "', data: { _lang : '" . $key . "' }, success : function(response) { window.location.reload(); } });return false;", ]); $menuItems[] = '<li>' . $link . '</li>'; } return $menuItems; } }
Lire le fichier principal. -local.php Les éléments de configuration forment un tableau.
Menu Rendu.
Liez un événement au bouton dans le menu, déclenchez une requête ajax lorsque vous cliquez dessus et actualisez la page après le retour ajax réussi.
4. Ajoutez un contrôleur qui gère ajax. Créez un nouveau AjaxController.php sous frontend/controllers et ajoutez le code suivant :
<?php namespace frontend\controllers; use Yii; use yii\web\Controller; use common\components\SelectLanguageBehavior; use yii\web\cookie; class AjaxController extends Controller { public $layout = false; public function actionLang() { if (isset($_POST['_lang'])) { $lang = SelectLanguageBehavior::getSelectedLanguage($_POST['_lang']); Yii::$app->language = $lang; $cookie = new cookie([ 'name' => '_lang', 'value' => $lang, ] ); $cookie->expire = time() + (60*60*24*365); // (1 year) Yii::$app->response->cookies->add($cookie); } return "success"; } }
5. Ajoutez une action (Comportements) pour modifier la langue à chaque fois que l'utilisateur visite la page.
Sous common/components (s'il n'existe pas de répertoire de ce type, créez un nouveau répertoire), créez un nouveau SelectLanguageBehavior.php avec le contenu suivant :
<?php namespace common\components; use yii\base\Application; use yii\base\Behavior; use yii\web\cookie; use Yii; class SelectLanguageBehavior extends Behavior { public function events() { return [ Application::EVENT_BEFORE_REQUEST => 'beforeRequest', ]; } public function beforeRequest($event) { $app = Yii::$app; $lang = SelectLanguageBehavior::getSelectedLanguage(Yii::$app->request->cookies->getValue('_lang')); $app->language = $lang; } public static function getSelectedLanguage($val) { $langs = Yii::$app->params['availableLanguages']; foreach ($langs as $key=>$value) { if($val == $key) { return $val; } } return key($langs); } }Ajoutez l'élément asbebeRequest dans common/config/main-local.php
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], ... 'as beginRequest' => [ 'class' => 'common\components\SelectLanguageBehavior', ], ];Dans frontend/views/layouts/main.php, ajoutez du code pour afficher notre contrôle Comme le contrôle contient du code html, nous devons l'empêcher de s'échapper
... if (Yii::$app->user->isGuest) { $menuItems[] = ['label' => Yii::t('common', 'Signup'), 'url' => ['/site/signup']]; $menuItems[] = ['label' => Yii::t('common', 'Login'), 'url' => ['/site/login']]; } else { $menuItems[] = [ 'label' => Yii::t('common', 'Logout') . ' (' . Yii::$app->user->identity->username . ')', 'url' => ['/site/logout'], 'linkOptions' => ['data-method' => 'post'] ]; } // add this line $menuItems[] = \common\widgets\LanguageSelector::getMenu(); echo Nav::widget([ 'options' => [ 'class' => 'navbar-nav navbar-right', ], 'items' => $menuItems, // add this line 'encodeLabels' => false, ]); ...
Ce qui précède sont les notes d'étude du cadre Yii2 (3) - contenu linguistique et internationalisation. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php). .cn ) !