Maison > php教程 > PHP开发 > le corps du texte

Notes d'étude du cadre Yii2 (3) -- Langue et internationalisation

黄舟
Libérer: 2016-12-30 09:44:13
original
1843 Les gens l'ont consulté

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:
Copier après la connexion
[code]$username = 'Alexander';
echo \Yii::t('app', 'Hello, {username}!', ['username' => $username]);
Copier après la connexion
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.
Copier après la connexion

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',
    				],
    			],
    		],	
    	],
        ...
    ],
Copier après la connexion

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

Notes détude du cadre Yii2 (3) -- Langue et internationalisation

Les fichiers de traduction sont organisés dans un tableau et le contenu est le suivant

<?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;,  
];
Copier après la connexion

Ensuite, nous effectuons la traduction dans le fichier layouts, et le modifions dans /views/layouts/main.php comme suit :

$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;]],  
    ];
Copier après la connexion

Ouvrez la page et voyez si elle prend effet.

Malheureusement, ça ne marche pas. . . . .

Notes détude du cadre Yii2 (3) -- Langue et internationalisation

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 [  
   &#39;language&#39; => &#39;zh-CN&#39;,  
   ...  
];
Copier après la connexion

Vérifiez à nouveau si elle prend effet.

Notes détude du cadre Yii2 (3) -- Langue et internationalisation

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.

Notes détude du cadre Yii2 (3) -- Langue et internationalisation2. 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 [  
    &#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;],  
        ],  
    ],  
    ...  
];
Copier après la connexion

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[&#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;
	}
}
Copier après la connexion

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 :

L'important est de définir $layouts sur false pour empêcher ajax de revenir pour rendre des choses inutiles.
<?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";
	}
	
}
Copier après la connexion

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 :

6.
<?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);
	}
}
Copier après la connexion
Ajoutez l'élément asbebeRequest dans common/config/main-local.php


7.Ajoutez le contrôle à la page.
<?php  
return [  
    &#39;language&#39; => &#39;zh-CN&#39;,  
  
    &#39;components&#39; => [  
        ...  
    ],  
    ...  
    &#39;as beginRequest&#39; => [  
            &#39;class&#39; => &#39;common\components\SelectLanguageBehavior&#39;,  
    ],  
];
Copier après la connexion
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


Ouvrir la page Afficher le. effet
...
    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,
    ]);
	...
Copier après la connexion

Notes détude du cadre Yii2 (3) -- Langue et internationalisation 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 ) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Recommandations populaires
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!