국제화 기능은 일반적으로 거의 사용되지 않지만 학습을 위해서는 여전히 접촉이 필요합니다.
국제화에 가장 일반적으로 사용되는 방법은 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입니다.
구성에 따라 다음 디렉터리 구조를 설정합니다
번역 파일은 배열로 구성되며 내용은 다음과 같습니다
<?php return [ 'Signup' => '注册', 'Login' => '登陆', 'Logout' => '登出', 'Home' => '首页', 'Contact' => '反馈', 'About' => '关于', ];
그런 다음 레이아웃 파일을 번역하고 /views/layouts/main.php에서 다음과 같이 수정합니다.
$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']], ];
페이지를 열고 적용되는지 확인합니다.
안타깝게도 작동하지 않습니다. . . . .
그 이유는 웹 사이트의 루트 언어가 여전히 en-US이고 zh-CN으로 구성되어야 하기 때문입니다.
common/config/main-local.php에 다음 구성을 추가합니다.
<?php return [ 'language' => 'zh-CN', ... ];
적용되는지 다시 확인하세요.
번역이 적용된 것을 확인할 수 있습니다. <… 🎜>
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에서 사용 가능한 언어를 구성합니다.
3. /common/widgets/ 아래에 새 PHP 파일을 생성하고 이름을 LanguageSelector.php로 지정합니다. 내용은 다음과 같습니다.
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], 'params' => [ 'availableLanguages' => [ 'zh-CN' => ['img' => 'image/zh.png', 'desc' => '中文'], 'en-US' => ['img' => 'image/en.png', 'desc' => 'English'], ], ], ... ];
주요 작업은 다음과 같습니다.
<?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; } }
렌더링 메뉴.
메뉴의 버튼에 이벤트를 바인딩하고, 클릭 시 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['_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"; } }
common/comComponents(해당 디렉토리가 없는 경우 새 디렉토리 생성)에서 다음 콘텐츠로 새 SelectLanguageBehavior.php를 생성합니다.
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 => '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); } }
7. 페이지에 컨트롤을 추가합니다.
<?php return [ 'language' => 'zh-CN', 'components' => [ ... ], ... 'as beginRequest' => [ 'class' => 'common\components\SelectLanguageBehavior', ], ];
8 페이지를 엽니다. 효과
... 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, ]); ...
위 내용은 Yii2 프레임워크 학습 노트(3) - 언어 및 국제화 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php)를 참고해주세요. .cn)!