網站要做成一個中英文的,資料也要是中英文的,要怎麼搞?
下面是我的一些想法:
建個模組,網站預設是中文,英文就放到英文的那個模組裡,是英文的時候就調用英文的資料?
中文一套模板,英文一套模板?
'modules' => [ 'en' => ['class' => '\app\modules\english\Module'], ]
那資料要怎麼存呢?給每條資料都加一個欄位,lang = 'en' / lang = 'zh'
這樣?
還是個資料多加幾個欄位, 像下面這樣,title
存中文, title_en
存英文?
CREATE TABLE `courses` ( `id` int(11) unsigned NOT NULL auto_increment, `title` varchar(255) NOT NULL default '', `title_en` varchar(255) NOT NULL default '', `cover` varchar(255) NOT NULL default '' comment '封面', `text` text, `text_en` text, `start_date` int(11) unsigned NOT NULL default 0 comment '開始日期', `end_date` int(11) unsigned NOT NULL default 0 comment '結束日期', `days` int(11) unsigned NOT NULL default 0 comment '有效天數', `maxnum` int(11) unsigned NOT NULL default 0 comment '最多報名人數', `has_num` int(11) unsigned NOT NULL default 0 comment '已報名人數', `price` decimal(10,2) comment '課程費', `created_at` int(11) unsigned default '0', `updated_at` int(11) unsigned default '0', `status` varchar(16) default 'on' comment 'on開啟 off關閉 expire到期', `extra` text comment '額外的一些資料 可以使用序列化資料 serialize', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
求比較好的解決方案,像 蘋果官網
的多語言是如何做的,資料是怎麼存的?
回複內容:
網站要做成一個中英文的,資料也要是中英文的,要怎麼搞?
下面是我的一些想法:
建個模組,網站預設是中文,英文就放到英文的那個模組裡,是英文的時候就調用英文的資料?
中文一套模板,英文一套模板?
'modules' => [ 'en' => ['class' => '\app\modules\english\Module'], ]
那資料要怎麼存呢?給每條資料都加一個欄位,lang = 'en' / lang = 'zh'
這樣?
還是個資料多加幾個欄位, 像下面這樣,title
存中文, title_en
存英文?
CREATE TABLE `courses` ( `id` int(11) unsigned NOT NULL auto_increment, `title` varchar(255) NOT NULL default '', `title_en` varchar(255) NOT NULL default '', `cover` varchar(255) NOT NULL default '' comment '封面', `text` text, `text_en` text, `start_date` int(11) unsigned NOT NULL default 0 comment '開始日期', `end_date` int(11) unsigned NOT NULL default 0 comment '結束日期', `days` int(11) unsigned NOT NULL default 0 comment '有效天數', `maxnum` int(11) unsigned NOT NULL default 0 comment '最多報名人數', `has_num` int(11) unsigned NOT NULL default 0 comment '已報名人數', `price` decimal(10,2) comment '課程費', `created_at` int(11) unsigned default '0', `updated_at` int(11) unsigned default '0', `status` varchar(16) default 'on' comment 'on開啟 off關閉 expire到期', `extra` text comment '額外的一些資料 可以使用序列化資料 serialize', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
求比較好的解決方案,像 蘋果官網
的多語言是如何做的,資料是怎麼存的?
1、英語翻譯成別的語言比較方便,Yii設定檔裡可以配置sourceLanguage=>‘en-US',lanaguae=>'zh-CN',同時Yii::$app->language是一個可讀可寫的全域變數。
Yii::t() 方法的用法如下,
echo \Yii::t('app', 'This is a string to translate!');
第一個參數指儲存訊息來源的類別名稱,第二個參數指需要被翻譯的訊息。
這個 Yii::t() 方法會調用 i18n 應用組件 來實現翻譯工作。這個組件可以在應用程式中按下面的代碼來配置,
'components' => [
// ...'i18n' => [ 'translations' => [ 'app*' => [ 'class' => 'yii\i18n\PhpMessageSource', //'basePath' => '@app/messages', //'sourceLanguage' => 'en-US', 'fileMap' => [ 'app' => 'app.php', 'app/error' => 'error.php', ], ], ],], ], 在上面的代碼中,配置了由 yii\i18n\PhpMessageSource 所支援的訊息來源。模式 app* 表示所有以 app 開頭的訊息類別名稱都使用這個翻譯的訊息來源。該 yii\i18n\PhpMessageSource 類使用 PHP
檔案來儲存訊息翻譯。 每 PHP 檔案對應單一類別的訊息。預設情況下,檔案名稱應該與類別名稱相同。但是,你可以配置
yii\i18n\PhpMessageSource::fileMap 來映射一個類別到不同名稱的 PHP 檔案。在上面的例子中, 類別
app/error 被映射到PHP檔案 @app/messages/ru-RU/error.php(假設 ru-RU
為目標語言)。如果沒有此配置, 該類別將被映射到 @app/messages/ru-RU/app/error.php 。
除了在PHP檔案中儲存訊息來源,也可以使用下面的訊息來源在不同的儲存來儲存翻譯的訊息:
yii\i18n\GettextMessageSource 使用 GNU Gettext 的 MO 或 PO 檔案儲存翻譯的訊息。
yii\i18n\DbMessageSource 使用一個資料庫表來儲存翻譯的訊息。
補充一下Yii::t('app', 'This is a string to translate!',"zh-CN")這個方法可以傳入目標語言參數。
2、資料庫的內容,建議考慮多張表儲存不同語言的那部分。如果每個語言一張表的話,擴充性較差;可以在表裡加入language欄位,根據Yii::$app->language和外鍵配置好關聯也是很方便的。
資料庫考慮可以建立結構完全一致的2個表:article_en、article_zn
使用同一個model,用url參數或者其他方法判斷當前語言,在model中使用如下方法,切換對應的資料表:
public static function tableName(){ if (//如果是中文) { $table_name = 'article_zn'; } else { $table_name = 'article_en'; } return $table_name;}
那要是支援10個國家的語言呢?都用資料庫太浪費了。
可以借鑒tp架構的多語言,它是把不同的語言放入檔案中。根據cookie或者session來區分語言,載入相應的語言檔案。不過局限性也在於它好像只能做靜態頁面。
現在的騷年們使用架構前都不過一遍文檔的嗎?
Yii是支援多語言機制的。
趕緊戳這裡看看吧。