Die Internationalisierungsfunktion wird im Allgemeinen selten genutzt, aber zum Lernen ist es dennoch notwendig, damit in Kontakt zu treten.
Die am häufigsten verwendete Methode zur Internationalisierung ist Yii::t. Die offizielle Dokumentation lautet wie folgt:
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.
Es gibt 4 Parameter , aber sie werden häufig verwendet. Die ersten beiden sind angekommen.
Die erste ist die Gruppe, und die Definition der Gruppe wird unter config/main-local.php platziert.
Yii2 verwendet standardmäßig Englisch (en-US) und fügt jetzt chinesische Unterstützung (zh-CN) hinzu
Fügen Sie den folgenden Block unter der Komponente hinzu
'components' => [ ... 'i18n' => [ 'translations' => [ 'common' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@common/messages', 'fileMap' => [ 'common' => 'common.php', ], ], ], ], ... ],
Dieser Absatz Der Code definiert eine Gruppe mit dem Namen common. Die Standardklasse yiii18nPhpMessageSource wird zum Parsen der Übersetzungsdatei verwendet. Die Übersetzungsdatei wird unter common/messages abgelegt und die Übersetzungsdatei ist common.php.
Entsprechend der Konfiguration legen Sie die folgende Verzeichnisstruktur fest
Die Übersetzungsdateien sind in einem Array organisiert und der Inhalt ist wie folgt
<?php return [ 'Signup' => '注册', 'Login' => '登陆', 'Logout' => '登出', 'Home' => '首页', 'Contact' => '反馈', 'About' => '关于', ];
Dann führen wir eine Übersetzung in der Layoutdatei durch und ändern sie in /views/layouts/main.php wie folgt:
$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']], ];
Öffnen Sie die Seite und prüfen Sie, ob sie wirksam wird.
Leider funktioniert es nicht. . . . .
Der Grund dafür ist, dass die Stammsprache der Website immer noch en-US ist und als zh-CN konfiguriert werden muss.
Fügen Sie in common/config/main-local.php die folgende Konfiguration hinzu:
<?php return [ 'language' => 'zh-CN', ... ];
Überprüfen Sie noch einmal, ob sie wirksam wird.
Sie können sehen, dass die Übersetzung wirksam geworden ist.
Aber der Hauptgrund für die Verwendung der Yii::t-Methode ist die Erzielung einer Mehrsprachigkeit. Wenn Sie nur eine Sprache anzeigen, ist es besser, Hardcode durchzuführen (das yii2-Framework übernimmt tatsächlich die Hardcode-Sprachanzeige)
Yii2 bietet keine vorgefertigte Steuerung zum Wechseln der Sprache, daher müssen wir selbst eine entwickeln.
Die Implementierung bezieht sich auf http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-Language-Selector-widget-i18n/ und wurde moderat vereinfacht, ohne SEO-Aspekte zu berücksichtigen . Rücksichtnahme.
Die Hauptidee der Implementierung besteht darin, die vom Benutzer ausgewählte Sprache in einem Cookie zu speichern und die Sprache jedes Mal auf den Wert im Cookie zu setzen, bevor der Benutzer die Seite besucht. Warum müssen Sie die Sprache jedes Mal festlegen? Die Gründe sind wie folgt:
Hinweis: Wenn wir Yii::app()->Sprache nicht explizit für jede Anfrage festlegen, ist sie gleich Der in der Konfigurationsdatei festgelegte Standardwert entspricht dem Wert Yii::app()->sourceLanguage, der standardmäßig auf „en_us“ eingestellt ist Bedeutet wahrscheinlich, dass, wenn nicht jedes Mal, wenn der Wert festgelegt wird, das System die Standardsprache verwendet, die normalerweise Englisch ist.
1. Bereiten Sie Materialien auf beiden Seiten der Flagge vor, platzieren Sie sie unter frontend/web/image/ und benennen Sie sie en.png und zh.png.
2. Konfigurieren Sie die verfügbaren Sprachen in /common/config/main-local.php, damit wir die Steuerung aufrufen können
3. Erstellen Sie eine neue PHP-Datei unter /common/widgets/ und nennen Sie sie LanguageSelector.php. Der Inhalt lautet wie folgt:<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], 'params' => [ 'availableLanguages' => [ 'zh-CN' => ['img' => 'image/zh.png', 'desc' => '中文'], 'en-US' => ['img' => 'image/en.png', 'desc' => 'English'], ], ], ... ];Das Wichtigste ist:
<?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 lesen -local.php Die Konfigurationselemente bilden ein Array.
Render-Menü.
Binden Sie ein Ereignis an die Schaltfläche im Menü, lösen Sie beim Klicken eine Ajax-Anfrage aus und aktualisieren Sie die Seite, nachdem Ajax erfolgreich zurückgegeben wurde.
4. Fügen Sie einen Controller hinzu, der Ajax verarbeitet. Erstellen Sie unter frontend/controllers eine neue AjaxController.php und fügen Sie den folgenden Code hinzu:
<?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. Fügen Sie eine Aktion (Verhalten) hinzu, um die Sprache jedes Mal zu ändern, wenn der Benutzer die Seite besucht.
Erstellen Sie unter common/components (falls kein solches Verzeichnis vorhanden ist, ein neues Verzeichnis) eine neue SelectLanguageBehavior.php mit folgendem Inhalt:
<?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); } }Fügen Sie das as beginRequest-Element in common/config/main-local.php hinzu
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], ... 'as beginRequest' => [ 'class' => 'common\components\SelectLanguageBehavior', ], ];Fügen Sie in frontend/views/layouts/main.php Code hinzu, um unser Steuerelement anzuzeigen. Da das Steuerelement HTML-Code enthält, müssen wir verhindern, dass es maskiert wird.
... 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, ]); ...
Die oben genannten sind die Yii2-Framework-Studiennotizen (3) – Sprach- und Internationalisierungsinhalte. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php .cn )!