天天看點

Yii2語言國際化配置Yii2語言國際化配置

轉載

Yii2語言國際化配置

最近想将部落格做成支援多語言的,還好Yii2支援這個功能,于是檢視了下官方的文檔,哎,看了半天不知道幹嘛用的,于是各種百度,Google的搜尋,最終才明白原來很簡單,隻是官方寫的太複雜

下面介紹下具體的使用步驟,具體介紹我就不寫了,官方寫比我清楚,我就寫怎麼使用

第一步 建立i18n配置檔案

./yii message/config @app/config/i18.php // yii 在項目目錄下 Yii2建立的時候自動生成的           

執行完指令之後會在項目根目錄config下建立一個i18n.php檔案

為什麼要建立這個檔案,因為我們為了多語言處理,需要生成一個對應的映射檔案,隻要生成就好了,稍後的配置程式會自動調用處理

第二步 修改配置規則

打開config/i18n.php,看下生成的配置檔案的代碼,如下:

return [
    'color' => null,
    'interactive' => true,
    'help' => null,
    'sourcePath' => '@yii',
    'messagePath' => '@yii/messages',
    'languages' => [],
    'translator' => 'Yii::t',
    'sort' => false,
    'overwrite' => true,
    'removeUnused' => false,
    'markUnused' => true,
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/BaseYii.php',
    ],
    'only' => [
        '*.php',
    ],
    'format' => 'php',
    'db' => 'db',
    'sourceMessageTable' => '{{%source_message}}',
    'messageTable' => '{{%message}}',
    'catalog' => 'messages',
    'ignoreCategories' => [],
    'phpFileHeader' => '',
    'phpDocBlock' => null,
];           

修改後的代碼,如下:

return [
    'color' => null,
    'interactive' => true,
    'help' => null,
    'sourcePath' => '@app',
    'messagePath' => '@app/messages',
    'languages' => ['zh-CN', 'ru-RU'],
    'translator' => 'Yii::t',
    'sort' => false,
    'overwrite' => true,
    'removeUnused' => false,
    'markUnused' => true,
    'except' => [
        '.svn',
        '.git',
        '.gitignore',
        '.gitkeep',
        '.hgignore',
        '.hgkeep',
        '/messages',
        '/BaseYii.php',
        'vendor',
    ],
    'only' => [
        '*.php',
    ],
    'format' => 'php',
    'db' => 'db',
    'sourceMessageTable' => '{{%source_message}}',
    'messageTable' => '{{%message}}',
    'catalog' => 'messages',
    'ignoreCategories' => [],
    'phpFileHeader' => '',
    'phpDocBlock' => null,
];           

我這裡隻改了兩個地方

'sourcePath' => '@app', // 将@yii改為@app 隻處理我們自己應用中的代碼
'messagePath' => '@app/messages', // 将@yii/messages改為@app/messages 将需要翻譯的字段提取出來要放的目錄
'languages' => ['zh-CN', 'ru-RU'], // 要翻譯成目标的語言,我這裡定義了一個"中文"和"俄語"           

'except' => [
    '.svn',
    '.git',
    '.gitignore',
    '.gitkeep',
    '.hgignore',
    '.hgkeep',
    '/messages',
    '/BaseYii.php',
    'vendor', // 将vendor目錄下的過濾掉,不然可能太多了
],           

第三步 生成翻譯配置檔案

執行下面的指令

./yii message/extract @app/config/i18n.php           

執行完之後會在messages目錄下(如果沒有messages目錄的話需要手動建立下)得到如下的目錄結構

├── ru-RU
│   └── app.php
└── zh-CN
    └── app.php           

提示下再做這個操作之前,需要在自己的項目中有類似Yii:t()的調用,比如我這裡在components/HeaderWidget.php這個檔案中

Yii::t('app', 'Home')           

這裡的app的作用是用來進行檔案分類的,我這裡暫時沒有計劃生成的時候會将所有需要翻譯的字段放在app開頭命名的php檔案app.php檔案中

如果像下面這樣調用的話

Yii::t('appp', 'Home')           

會生成一個appp.php的檔案

第四步 翻譯配置檔案

看下中文的翻譯檔案messages/zh-CN/app.php,我的是下面這個

return [
    'Archive' => '',
    'Autokid' => '',
    'Blog' => '',
    'Ctime' => '',
    'IP位址' => '',
    'UserAgent' => '',
    '主題' => '',
    '内容' => '',
    '姓名' => '',
    '日期' => '',
    '郵箱位址' => '',
    '頁面路徑' => '',
    'Home' => '首頁', // 右邊的鍵值對應 Yii::t('app', 'Home')中的Home,隻需要在value中寫入需要的漢字就可以了。
];           

第五步 修改目标國際化語言

修改配置檔案

'language' => 'zh-CN', // 指定為要翻譯的語言           

再打開網頁,就可以看到已經翻譯成了對應需要的語言,當然這樣的配置很不靈活,如果是部署多态機器并通過域名或者其他方式來實作的話,也是可以的,這裡的話我建議如下方式

建立自己的Controller,然後将語言配置放在Session中,通過擷取Session中的語言來更換全站的語言。具體見後面分享

提示,網站很多地方提到要加個配置,官方也是

'i18n' => [
    'translations' => [
        'app*' => [
            'class' => 'yii\i18n\PhpMessageSource',
            'basePath' => '@app/messages',
            'sourceLanguage' => 'en-US',
            'fileMap' => [
                'app' => 'app.php',
            ],
        ],
    ],
],           

我這邊在配置的時候沒有加,運作也都是正常的,如有遇到問題,可以一起溝通交流下。