国際化機能は一般的にはほとんど使用されませんが、学習のためにはやはり触れる必要があります。
国際化に最も一般的に使用されるメソッドは Yii::t です。公式ドキュメントは次のとおりです
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.
パラメーターは 4 つありますが、最初の 2 つがよく使用されます。
最初のものはグループであり、グループの定義は config/main-local.php の下に配置されます。
Yii2 はデフォルトで英語 (en-US) を使用し、中国語サポート (zh-CN) を追加します
コンポーネントの下に次のブロックを追加します
'components' => [ ... 'i18n' => [ 'translations' => [ 'common' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@common/messages', 'fileMap' => [ 'common' => 'common.php', ], ], ], ], ... ],
このコードは、翻訳ファイルを解析するために common という名前のグループを定義しますデフォルト クラス yiii18nPhpMessageSourceを使用し、翻訳ファイルは common/messages の下に配置され、翻訳ファイルは common.php です。
設定に従って、次のディレクトリ構造を確立します
翻訳ファイルは配列で構成され、内容は次のとおりです
<?php return [ 'Signup' => '注册', 'Login' => '登陆', 'Logout' => '登出', 'Home' => '首页', 'Contact' => '反馈', 'About' => '关于', ];
次に、レイアウトファイルで翻訳を実行し、/でそれを変更します次のように views/layouts/main.php :
$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']], ];
ページを開いて、動作するかどうかを確認します。
残念ながら、それは機能しません。 。 。 。 。
その理由は、Web サイトのルート言語がまだ en-US であり、zh-CN として設定する必要があるためです。
common/config/main-local.php に次の設定を追加します:
<?php return [ 'language' => 'zh-CN', ... ];
有効になっているかどうかを再度確認します。
翻訳が有効になっていることがわかります。
しかし、Yii::t メソッドを使用する主な理由は、多言語を実現するためです。1 つの言語のみを表示する場合は、ハードコードを実行する方が良いです (yii2 フレームワークは実際にハードコード言語の表示を行います)。既製のスイッチング言語を提供します。 コントロールを制御するには、自分で開発する必要があります。
実装は http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls- language-selector-widget-i18n/ を参照しており、SEO を考慮せずに適度に簡素化されています。
実装の主なアイデアは、ユーザーが選択した言語を Cookie に保存し、各ユーザーがページにアクセスする前にその言語を Cookie の値に設定することです。毎回言語を設定する必要がある理由は次のとおりです
注: 各リクエストに対して Yii::app()->言語を明示的に設定しない場合、それは、 config ファイルに設定されていない場合、値は Yii::app()->sourceLanguage と等しくなります。一般的な意味は、値がそうでない場合です。毎回設定すると、システムはデフォルトの言語 (通常は英語) を使用します。
1. 旗の両側のマテリアルを準備し、frontend/web/image/ の下に配置し、en.png と zh.png という名前を付けます。
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], 'params' => [ 'availableLanguages' => [ 'zh-CN' => ['img' => 'image/zh.png', 'desc' => '中文'], 'en-US' => ['img' => 'image/en.png', 'desc' => 'English'], ], ], ... ];
<?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; } }
主な動作は次のとおりです:
main-local.php 内の構成項目を読み取り、配列を形成します。
レンダリングメニュー。 メニュー内のボタンにイベントをバインドします。クリックすると、ajax リクエストがトリガーされ、ajax が正常に返された後、ページが更新されます。
4. ajaxを処理するコントローラーを追加します。新しい AjaxController.php をfrontend/controllers の下に作成し、次のコードを追加します:
<?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"; } }
<?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); } }
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], ... 'as beginRequest' => [ 'class' => 'common\components\SelectLanguageBehavior', ], ];
frontend/views/layouts/main.php に、コントロールを表示するコードを追加します。コントロールには HTML コードが含まれているため、エスケープを防ぐ必要があります
... 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, ]); ...