> php教程 > PHP开发 > 본문

Yii2 프레임워크 연구 노트(3) -- 언어 및 국제화

黄舟
풀어 주다: 2016-12-30 09:44:13
원래의
1881명이 탐색했습니다.

국제화 기능은 일반적으로 거의 사용되지 않지만 학습을 위해서는 여전히 접촉이 필요합니다.

국제화에 가장 일반적으로 사용되는 방법은 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개의 매개변수가 있습니다. , 그러나 그들은 일반적으로 사용됩니다. 처음 두 개가 도착했습니다.

첫 번째는 그룹이며, 그룹 정의는 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) -- 언어 및 국제화

그 이유는 웹 사이트의 루트 언어가 여전히 en-US이고 zh-CN으로 구성되어야 하기 때문입니다.

common/config/main-local.php에 다음 구성을 추가합니다.

<?php  
return [  
   &#39;language&#39; => &#39;zh-CN&#39;,  
   ...  
];
로그인 후 복사

적용되는지 다시 확인하세요.

Yii2 프레임워크 연구 노트(3) -- 언어 및 국제화

번역이 적용된 것을 확인할 수 있습니다. <… 🎜>
Yii2는 언어 전환을 위한 기성 컨트롤을 제공하지 않으므로 직접 개발해야 합니다.

구현은 http://www.yiiframework.com/wiki/294/seo-conform-multilingual-urls-언어-selector-widget-i18n/을 참조하며 SEO 측면을 수행하지 않고 적당히 단순화되었습니다. . 고려 사항.

구현의 주요 아이디어는 사용자가 선택한 언어를 쿠키에 저장하고, 사용자가 페이지를 방문하기 전에 매번 쿠키의 값에 언어를 설정하는 것입니다. 매번 언어를 설정해야 하는 이유는 다음과 같습니다

참고: 각 요청에 대해 Yii::app()->언어를 명시적으로 설정하지 않으면 다음과 같습니다. 구성 파일에 설정된 기본값입니다. 구성 파일에 설정되지 않은 경우 Yii::app()->sourceLanguage 값과 동일하며 기본값은

입니다. 아마도 매번은 아닐지라도 값을 설정하면 시스템은 기본 언어(일반적으로 영어)를 사용한다는 의미일 것입니다.

1. 국기 양면 자료를 준비하여 frontend/web/image/에 넣고 이름을 en.png, zh.png로 지정합니다.


2. 컨트롤에서 호출할 수 있도록 /common/config/main-local.php에서 사용 가능한 언어를 구성합니다. Yii2 프레임워크 연구 노트(3) -- 언어 및 국제화

3. /common/widgets/ 아래에 새 PHP 파일을 생성하고 이름을 LanguageSelector.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;],  
        ],  
    ],  
    ...  
];
로그인 후 복사

주요 작업은 다음과 같습니다.

<?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;
	}
}
로그인 후 복사
메인 읽기 -local.php 구성 항목이 배열을 형성합니다.

렌더링 메뉴.
메뉴의 버튼에 이벤트를 바인딩하고, 클릭 시 Ajax 요청을 트리거하고, Ajax가 성공적으로 반환되면 페이지를 새로 고칩니다.

4. Ajax를 처리하는 컨트롤러를 추가합니다. frontend/controllers 아래에 새로운 AjaxController.php를 생성하고 다음 코드를 추가합니다:


중요한 것은 $layouts를 false로 설정하여 Ajax가 불필요한 것을 렌더링하기 위해 반환되는 것을 방지하는 것입니다.

<?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. 사용자가 페이지를 방문할 때마다 언어를 수정하는 작업(행동)을 추가합니다.

common/comComponents(해당 디렉토리가 없는 경우 새 디렉토리 생성)에서 다음 콘텐츠로 새 SelectLanguageBehavior.php를 생성합니다.


6. 액션을 시스템에 바인딩합니다.

common/config/main-local.php에 startRequest 항목을 추가합니다.
<?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);
	}
}
로그인 후 복사


7. 페이지에 컨트롤을 추가합니다.

frontend/views/layouts/main.php에서 컨트롤을 표시하는 코드를 추가합니다. 컨트롤에 HTML 코드가 포함되어 있으므로 이스케이프되지 않도록 해야 합니다.
<?php  
return [  
    &#39;language&#39; => &#39;zh-CN&#39;,  
  
    &#39;components&#39; => [  
        ...  
    ],  
    ...  
    &#39;as beginRequest&#39; => [  
            &#39;class&#39; => &#39;common\components\SelectLanguageBehavior&#39;,  
    ],  
];
로그인 후 복사


8 페이지를 엽니다. 효과

...
    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,
    ]);
	...
로그인 후 복사

위 내용은 Yii2 프레임워크 학습 노트(3) - 언어 및 국제화 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php)를 참고해주세요. .cn)! Yii2 프레임워크 연구 노트(3) -- 언어 및 국제화


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿