Heim  >  Artikel  >  php教程  >  Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung

黄舟
黄舟Original
2016-12-30 09:44:131844Durchsuche

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

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung

Die Übersetzungsdateien sind in einem Array organisiert und der Inhalt ist wie folgt

<?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;,  
];

Dann führen wir eine Übersetzung in der Layoutdatei durch und ändern sie in /views/layouts/main.php wie folgt:

$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;]],  
    ];

Öffnen Sie die Seite und prüfen Sie, ob sie wirksam wird.

Leider funktioniert es nicht. . . . .

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung

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 [  
   &#39;language&#39; => &#39;zh-CN&#39;,  
   ...  
];

Überprüfen Sie noch einmal, ob sie wirksam wird.

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung

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.

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung2. 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 [  
    &#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;],  
        ],  
    ],  
    ...  
];

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[&#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 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:

Wichtig ist, $layouts auf false zu setzen, um zu verhindern, dass Ajax zurückkehrt, um unnötige Dinge zu rendern.
<?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";
	}
	
}

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:

6 Binden Sie die Aktion an das System.
<?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);
	}
}
Fügen Sie das as beginRequest-Element in common/config/main-local.php hinzu


7. Fügen Sie das Steuerelement zur Seite hinzu.
<?php  
return [  
    &#39;language&#39; => &#39;zh-CN&#39;,  
  
    &#39;components&#39; => [  
        ...  
    ],  
    ...  
    &#39;as beginRequest&#39; => [  
            &#39;class&#39; => &#39;common\components\SelectLanguageBehavior&#39;,  
    ],  
];
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.


Öffnen Sie die Seite Wirkung
...
    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,
    ]);
	...

Anmerkungen zur Yii2-Rahmenstudie (3) – Sprache und Internationalisierung 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 )!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn