ホームページ  >  記事  >  php教程  >  Yii2 フレームワーク学習記 (3) -- 言語と国際化

Yii2 フレームワーク学習記 (3) -- 言語と国際化

黄舟
黄舟オリジナル
2016-12-30 09:44:131844ブラウズ

国際化機能は一般的にはほとんど使用されませんが、学習のためにはやはり触れる必要があります。

国際化に最も一般的に使用されるメソッドは 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 です。

設定に従って、次のディレクトリ構造を確立します

Yii2 フレームワーク学習記 (3) -- 言語と国際化

翻訳ファイルは配列で構成され、内容は次のとおりです

<?php  
return [  
    &#39;Signup&#39; => &#39;注册&#39;,  
    &#39;Login&#39; => &#39;登陆&#39;,  
    &#39;Logout&#39; => &#39;登出&#39;,  
    &#39;Home&#39; => &#39;首页&#39;,  
    &#39;Contact&#39; => &#39;反馈&#39;,  
    &#39;About&#39; => &#39;关于&#39;,  
];

次に、レイアウトファイルで翻訳を実行し、/でそれを変更します次のように views/layouts/main.php :

$menuItems = [  
        //[&#39;label&#39; => &#39;Home&#39;, &#39;url&#39; => [&#39;/site/index&#39;]],  
        //[&#39;label&#39; => &#39;About&#39;, &#39;url&#39; => [&#39;/site/about&#39;]],  
        //[&#39;label&#39; => &#39;Contact&#39;, &#39;url&#39; => [&#39;/site/contact&#39;]],  
        [&#39;label&#39; => \Yii::t(&#39;common&#39;, &#39;Home&#39;), &#39;url&#39; => [&#39;/site/index&#39;]],  
        [&#39;label&#39; => \Yii::t(&#39;common&#39;, &#39;About&#39;), &#39;url&#39; => [&#39;/site/about&#39;]],  
        [&#39;label&#39; => \Yii::t(&#39;common&#39;, &#39;Contact&#39;), &#39;url&#39; => [&#39;/site/contact&#39;]],  
    ];

ページを開いて、動作するかどうかを確認します。

残念ながら、それは機能しません。 。 。 。 。

Yii2 フレームワーク学習記 (3) -- 言語と国際化

その理由は、Web サイトのルート言語がまだ en-US であり、zh-CN として設定する必要があるためです。

common/config/main-local.php に次の設定を追加します:

<?php  
return [  
   &#39;language&#39; => &#39;zh-CN&#39;,  
   ...  
];

有効になっているかどうかを再度確認します。

Yii2 フレームワーク学習記 (3) -- 言語と国際化

翻訳が有効になっていることがわかります。

しかし、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 という名前を付けます。



2. コントロールで呼び出すために、/common/config/main-local.php で使用可能な言語を設定します

<?php  
return [  
    &#39;language&#39; => &#39;zh-CN&#39;,  
  
    &#39;components&#39; => [  
        ...  
    ],  
    &#39;params&#39; => [  
        &#39;availableLanguages&#39; => [  
            &#39;zh-CN&#39; => [&#39;img&#39; => &#39;image/zh.png&#39;, &#39;desc&#39; => &#39;中文&#39;],  
            &#39;en-US&#39; => [&#39;img&#39; => &#39;image/en.png&#39;, &#39;desc&#39; => &#39;English&#39;],  
        ],  
    ],  
    ...  
];
Yii2 フレームワーク学習記 (3) -- 言語と国際化3. /common/widgets/ に新しい php ファイルを作成し、名前を付けますLanguageSelector .php の内容は次のとおりです:

<?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[&#39;availableLanguages&#39;];
		$isMatch = false;
		foreach ($avLang as $key => $value) {
			if($key == $lang) {
				$tag = LanguageSelector::buildImgTag($value[&#39;img&#39;], $value[&#39;desc&#39;]);
				$isMatch = true;
			}
		}
		if(!$isMatch) {
			$tag = LanguageSelector::buildImgTag($avLang[0][&#39;img&#39;], $avLang[0][&#39;desc&#39;]);
		}
		$return = [
			&#39;label&#39; => $tag, 
			&#39;items&#39; => LanguageSelector::buildMenuItems($avLang),
		];
		
		return $return;
	}	
	
	private static function buildImgTag($src, $desc)
	{
		return &#39;<img src="&#39; . $src . &#39;" alt="&#39; . $desc . &#39;">&#39;;
	}
	
	private static function buildMenuItems($langs)
	{
		foreach ($langs as $key => $value) {
			$link = Html::a(LanguageSelector::buildImgTag($value[&#39;img&#39;], $value[&#39;desc&#39;]) . &#39; &#39; . $value[&#39;desc&#39;], Url::home(), [
					&#39;title&#39; => LanguageSelector::buildImgTag($value[&#39;img&#39;], $value[&#39;desc&#39;]) . &#39; &#39; . $value[&#39;desc&#39;],
					&#39;onclick&#39;=>"
					     $.ajax({
					    type     :&#39;POST&#39;,
					    cache    : false,
					    url  : &#39;" . Url::toRoute("ajax/lang") . "&#39;,
						data: { _lang : &#39;" . $key . "&#39; },
					    success  : function(response) {
					        window.location.reload();
					    }
					    });return false;",
			]);
			$menuItems[] = &#39;<li>&#39; . $link . &#39;</li>&#39;;
		}
		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[&#39;_lang&#39;]))
		{
			$lang = SelectLanguageBehavior::getSelectedLanguage($_POST[&#39;_lang&#39;]);
			Yii::$app->language = $lang;
			$cookie = new cookie([
					&#39;name&#39; => &#39;_lang&#39;,
					&#39;value&#39; => $lang,
			] );
			$cookie->expire = time() + (60*60*24*365); // (1 year)
			Yii::$app->response->cookies->add($cookie);
		}
		return "success";
	}
	
}

重要なことは、ajax が不要なものをレンダリングするために戻らないように $layouts を false に設定することです。

5. ユーザーがページにアクセスするたびに言語を変更するアクション (動作) を追加します。

common/components (そのようなディレクトリがない場合は、新しいディレクトリを作成します) の下に、次の内容を含む新しい SelectLanguageBehavior.php を作成します

<?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 => &#39;beforeRequest&#39;,
		];
	}
	
	public function beforeRequest($event) {
		$app = Yii::$app;
	
		$lang = SelectLanguageBehavior::getSelectedLanguage(Yii::$app->request->cookies->getValue(&#39;_lang&#39;));
		$app->language = $lang;
	}
	
	public static function getSelectedLanguage($val) {
		$langs = Yii::$app->params[&#39;availableLanguages&#39;];
		foreach ($langs as $key=>$value) {
			if($val == $key) {
				return $val;
			}
		}
		return key($langs);
	}
}

6 アクションをシステムにバインドします。
common/config/main-local.php に as beginRequest 項目を追加します
<?php  
return [  
    &#39;language&#39; => &#39;zh-CN&#39;,  
  
    &#39;components&#39; => [  
        ...  
    ],  
    ...  
    &#39;as beginRequest&#39; => [  
            &#39;class&#39; => &#39;common\components\SelectLanguageBehavior&#39;,  
    ],  
];

7 コントロールをページに追加します。

frontend/views/layouts/main.php に、コントロールを表示するコードを追加します。コントロールには HTML コードが含まれているため、エスケープを防ぐ必要があります

...
    if (Yii::$app->user->isGuest) {
        $menuItems[] = [&#39;label&#39; => Yii::t(&#39;common&#39;, &#39;Signup&#39;), &#39;url&#39; => [&#39;/site/signup&#39;]];
        $menuItems[] = [&#39;label&#39; => Yii::t(&#39;common&#39;, &#39;Login&#39;), &#39;url&#39; => [&#39;/site/login&#39;]];
    } else {
        $menuItems[] = [
            &#39;label&#39; => Yii::t(&#39;common&#39;, &#39;Logout&#39;) . &#39; (&#39; . Yii::$app->user->identity->username . &#39;)&#39;,
            &#39;url&#39; => [&#39;/site/logout&#39;],
            &#39;linkOptions&#39; => [&#39;data-method&#39; => &#39;post&#39;]
        ];
    }
	
	// add this line
        $menuItems[] = \common\widgets\LanguageSelector::getMenu();
	
	echo Nav::widget([
        &#39;options&#39; => [
        	&#39;class&#39; => &#39;navbar-nav navbar-right&#39;,
        	],
        &#39;items&#39; => $menuItems,
        // add this line
    	&#39;encodeLabels&#39; => false,
    ]);
	...

8 ページを開いて効果を確認します


。これは Yii2 フレームワークの学習メモ (3) - 言語と国際化に関するコンテンツです。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。

Yii2 フレームワーク学習記 (3) -- 言語と国際化


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。