Yii在地化(國際化)


I18N(國際化)是設計一種能夠適應於各種語言的應用程式的過程。 Yii 中提供了國際化支援。
語言環境(Locale)是一組引數用來指定使用者的語言和國家。例如,en-US代表的是英語語言環境和國家是美國。
Yii提供兩種型別的語言:源語言和目標語言。源語言是在應用程式中的所有文字訊息的語言。目標語言是應用於顯示內容到終端使用者的語言。
訊息轉換元件是可從源語言到目標語言翻譯(轉換)的文字訊息。
要翻譯文字訊息,文字訊息翻譯服務必須在訊息源中找到它。
要使用文字訊息翻譯服務,應該 -
  • 包裹想要翻譯文字訊息在 Yii::t() 方法中
  • 組態文字訊息源
  • 儲存文字訊息在訊息源中
第1步 - Yii::t() 方法可以像這樣使用,如下所示:
echo \Yii::t('app', 'This is a message to translate!');
在上面的程式碼片段中,'app' 代表文字訊息的類別
第2步 - 現在,修改 config/web.php 檔案。
<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'the-cookie-validate-key-of-tw511.com',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'i18n' => [
            'translations' => [
               'app*' => [
                  'class' => 'yii\i18n\PhpMessageSource',
                  'fileMap' => [
                     'app' => 'app.php'
                  ],
               ],
            ],
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => true,
         ],
         'log' => [
            'flushInterval' => 1,
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
               [
                  'class' => 'yii\log\FileTarget',
                  'exportInterval' => 1,
                  'logVars' => [],
               ],
            ],
         ],
         'db' => require(__DIR__ . '/db.php'),
      ],
      // set target language to be Chinese
      'language' => 'zh-CN',
      // set source language to be English
      'sourceLanguage' => 'en-US',
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>
在上面的程式碼中,我們定義了源和目標語言。
還指定是由 yii\i18n\PhpMessageSource 來支援訊息源。
app* 模式表示所有訊息開始程式類別必須使用這種特殊的訊息源進行翻譯(轉換)。
在上面的組態中,所有中文翻譯將設在 messages/zh-CN/app.php 檔案。

第3步 - 現在,建立 messages/zh-CN 的目錄結構。在 zh-CN 檔案夾中建立一個檔案:app.php 。這將儲存所有 EN → CN 的翻譯文字訊息。
<?php
   return [
      'This is a string to translate' => '這是一個翻譯的字串'
   ];
?>
第4步 - 在SiteController 中建立一個 actionTranslation() 函式。
public function actionTranslation() {
   echo \Yii::t('app', 'This is a string to translate');
}
第5步 - 在Web瀏覽器存取URL http://localhost:8080/index.php?r=site/translation ,會將看到以下內容。

該文字訊息會被翻譯成中文,因為設定的目標語言是 zh-CN。我們也可以動態地改變應用程式的語言。
第6步 - 修改 actionTranslation() 方法,如下程式碼。
public function actionTranslation() {
   \Yii::$app->language = 'en-US';
   echo \Yii::t('app', 'This is a string to translate!');
}
現在,以英文顯示文字訊息 -

第7步 - 在一個轉換(翻譯)的訊息,可以插入一個或多個引數。
public function actionTranslation() {
   $username = 'Username1';
   // display a translated message with username being "Vladimir"
   echo \Yii::t('app', 'Hello, {username}!', [
      'username' => $username,
   ]), "<br>";
   $username = 'username2';
   // display a translated message with username being "John"
   echo \Yii::t('app', 'Hello, {username}!', [
      'username' => $username,
   ]), "<br>";
   $price = 150;
   $count = 3;
   $subtotal = 450;
   echo \Yii::t('app', 'Price: {0}, Count: {1}, Subtotal: {2}', [$price, $count, $subtotal]);
}
以下是輸出結果:
Yii本地化(國際化)
可以翻譯整個檢視指令碼,而不是單獨的翻譯文字訊息。例如,如果目標語言是zh-CN,想翻譯是 views/site/index.php 檢視檔案,
那麼應該翻譯檢視並儲存在 views/site/zh-CN 目錄下。
第8步 - 建立 views/site/zh-CN 目錄。
然後,zh-CN 檔案夾中建立一個 index.php 檔案並使用下面的程式碼。
<?php
   /* @var $this yii\web\View */
   $this->title = 'My Yii Application';
?>

<div class = "site-index">
   <div class = "jumbotron">
      <h1>歡迎您存取!</h1>
   </div>
</div>
第9步 - 目標語言是zh-CN,所以存取URL:http://localhost:8080/index.php?r=site/index ,會看到中文翻譯的頁面。