Yii i18n國際化,訊息翻譯

2021-07-25 14:48:48 字數 3734 閱讀 1354

實現國際化有兩種方式,基於檔案實現和基於資料庫實現。基於檔案實現的方式很簡單,網上有很多,請自行查詢使用。這裡主要說一下基於資料庫實現的方式。

前提資料庫實現是基於dbmessagesource類實現的。

首先需要兩張表:source_message表和message表,前者是儲存要被翻譯的語言,後者是儲存被翻譯後的語言,實現對映。

一、生成source_message 和 message表

#source_message表

create

table source_message (

id integer

primary

key auto_increment,

category varchar(32),

message text

);#message表

create

table message (

id integer,

language

varchar(16),

translation text,

primary

key (id, language),

constraint fk_message_source_message foreign

key (id)

references source_message (id) on

delete

cascade

onupdate

restrict

);

當然,兩張表的建立還有一種更便捷的方式,即yii自帶的命令:

yii migrate --migrationpath=@yii

/i18n/migrations/

這個命令會執行框架下的兩張表的建立檔案,如下:

vendor/yiisoft/yii2/i18n/migrations/m150207_210500_i18n_init.php
兩種方式任一 一種執行後,資料庫裡都會生成這兩張表。兩張表的表名是可以改的,但是需要在配置檔案中指定:

$sourcemessagetable

$messagetable

二、配置i18n元件

'components'

=> [

'i18n'

=> [

'translations'

=> [

=> [#對應source_message表中的category欄位

'class'

=>

'yii\i18n\dbmessagesource',

//'forcetranslation'

=>

true,#是否強制翻譯

'enablecaching'

=>

false,#是否開啟快取

//'cachingduration'

=>

1#快取時間

//......其他配置資訊]],

],

三、建立配置檔案

在需要翻譯的目錄,比如(frontend或者backend)目錄下手動建立messages目錄,執行命令:

yii message/config frontend/messages/config.php
在messages目錄下生成config.php檔案,內容大致如下:

return [

'color' => null,

'interactive' => true,

'sourcepath' => __dir__ . directory_separator . '..',#修改為待翻譯目錄

// 'sourcepath' => '@yii',

'messagepath' => '@yii/messages',

'languages' => ['zh-cn'],

'translator' => 'yii::t',#這裡是關鍵,預設即可

'sort' => false,

'overwrite' => true,

'removeunused' => false,

'markunused' => true,

'except' => [

'.svn',

'.git',

'.gitignore',

'.gitkeep',

'.hgignore',

'.hgkeep',

'/messages',

'/baseyii.php',

],'only' => [

'*.php',

],'format' => 'db',//預設生成時,是基於檔案翻譯,設定為db,預設是php

'db' => 'db',//設定

'sourcemessagetable' => '}',//待翻譯訊息表

'messagetable' => '}',//翻譯後訊息表

'catalog' => 'messages',

'ignorecategories' => ,

];

然後重新執行命令:

yii message frontend/messages/config.php
這樣,兩張表就會被初始化完成。最後是實現以下邏輯即可實現翻譯功能。

翻譯前和翻譯後的文字顯示邏輯

翻譯後的文字儲存邏輯

這樣檢視中基於t()方法顯示的訊息就會按照設定的文字顯示。

最後看看yii::t()方法到底做了什麼:

1.yii::t()是在baseyii類中,中間呼叫了translate()方法

public

static

function

t($category, $message, $params = , $language = null)

else

}

2.translate()方法

public

function

translate

($category, $message, $params, $language)

else

}

3.messagesource的translate()方法

public

function

translate

($category, $message, $language)

else

}

4.loadmessages()方法,根據key,以及緩衝設定進行載入

protected

function

loadmessages

($category, $language)

return

$messages;

} else

}

另外還有訊息格式化等,請自行查閱文件使用。

參考資料

jquery i18n(前端國際化)

昨天在做前端js的國際化的時候,因為遇到了需要從cookie中獲取語言資訊再進行資源載入的情況,索性就直接將判斷的條件以及i18n的初始化寫到了index頁面中,這裡是velocity的語法。script script foreach gc in request.getcookies if gc.v...

語言國際化 vue i18n

安裝依賴包 npm i vue i18n s 在根目錄建立乙個 lang的資料夾,並且在lang資料夾內建立cn.js 和 en.js 開啟 main.js,注入vue例項中 import vue from vue import vuei18n from vue i18n 語言國際化 vue.use...

vue i18n和ElementUI國際化使用總結

vue i18n 安裝 npm install vue i18n 在main.js同級建i18n資料夾,並裡面建i18n.js langs資料夾,langs資料夾下建en.js cn.js 目錄如下 assets logo.png components helloworld.vue i18n i18...