簡體   English   中英

Yii:多語言網站 - 最佳實踐

[英]Yii: Multi-language website - best practices

我發現Yii很棒的框架,用yiic shell創建的示例網站是一個很好的起點...但不幸的是,它沒有涉及多語言網站的主題。 文檔涵蓋了翻譯短消息的主題,但沒有保留多語言內容......

我即將開始在一個需要至少兩種語言的網站上工作,我想知道保持內容的最佳方法是什么......問題是內容與公共元素廣泛混合(比如嵌入的視頻文件)。

我需要避免重復那些公共...到目前為止我曾經有一個包含文本的數組(通常不超過1-2個短段),然后視圖文件只是從數組渲染文本。

現在我想避免將它保留在數組中(當引用雙引號時需要注意一些“”並且通常不方便......)。

那么,保留這些短段落的最佳方法是什么? 我應該將它們保存在DB(id | msg_id | language | content)中,然后通過msg_id和語言選擇它們嗎? 這還需要我創建一些msg_id並將它們嵌入到視圖文件中......

是否有任何推薦的范例Yii有一些解決方案?

謝謝,m。

Gettext很容易翻譯,但默認的PHP實現不是線程安全的。 因此,Yii使用自己的解包器,與php陣列相比,顯着增加了處理時間。

由於我正在建立一個高容量,高交易網站,因此性能損失是不可接受的。 此外,通過使用APC,我們可以緩存PHP轉換,從而進一步提高性能。

因此,我的方法是使用PHP數組,但是為了便於翻譯,將翻譯保留在數據庫中,在翻譯時更改生成所需的文件。

DB與此類似:

TABLE Message            // stores source language, updated by script
 id INT UNSIGNED
 category VARCHAR(20)         // first argument to Yii::t()
 key TEXT                     // second argument to Yii::t()
 occurences TINYINT UNSIGNED  // number of times found in sources

TABLE MessageTranslation // stores target language, translated by human  
 id INT UNSIGNED
 language VARCHAR(3)          // ISO 639-1 or 639-3, as used by Yii
 messageId INT UNSIGNED       // foreign key on Message table
 value TEXT
 version VARCHAR(15)
 creationTime TIMESTAMP DEFAULT NOW()
 lastModifiedTime TIMESTAMP DEFAULT NULL
 lastModifiedUserId INT UNSIGNED

然后,我修改了CLI工具yiic'message'命令,將收集的字符串轉儲到DB中。

http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/

一旦進入數據庫,就可以設置一個簡單的CMS,為翻譯提供一種簡單的翻譯方式,同時提供版本信息,恢復舊版本,檢查翻譯質量等等......

另一個腳本也是從yiic修改的,然后獲取DB信息並將其編譯成PHP數組。 基本上是每種語言的兩個表的JOIN,然后使用'Message'構建一個數組。'key'和'MessageTranslation'。'value'as(還有什么?)key => value ...保存到名為'的文件'消息'。'類別'在語言指定的文件夾中。

生成的文件由Yii CPhpMessageSource正常加載。

對於圖像,這很簡單,只需將它們放在具有適當語言的文件夾中,並在鏈接時獲取應用程序語言。

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

請注意,在現實生活中,我寫了一個小幫手方法來從語言字符串中刪除國家,'en_us'應該是'en'。

Yii應用程序默認使用yii :: t()方法來翻譯文本消息,消息源有3種不同的類型:

  1. CPhpMessageSource :翻譯作為鍵值對存儲在PHP數組中。
  2. CGettextMessageSource :翻譯存儲為GNU Gettext文件。 (PO文件)
  3. CDbMessageSource :消息轉換存儲在數據庫表中。

如果我沒有誤解,你使用經典數組進行翻譯。 我建議您使用帶有Yii的GetText和PO文件進行翻譯操作。

您可以在此官方文檔頁面中找到有關翻譯和i18n的大量信息。

我認為這里關注的是如何在頁面上翻譯靜態文本/消息,Yii使用Yii很好地解決了它:t()和Edigu的答案就是它。

我查看FlexicaCMS關於翻譯數據庫中動態內容的帖子,最終解決靜態文本/消息問題后將是下一個,這是使用Yii行為的真正好方法。 不確定FlexicaCMS作者是否過於雄心勃勃地支持翻譯,因為它會使內容翻譯成為一件無憂無慮的事情 - 真的很棒。

他們沒有提到的一件事是翻譯頁面的網址。 例如your.site.com/fr/translated_article_title.html。 我的意思是網址必須包含/ language_id / part,所以它可以幫助SEO。

在Yii1和Yii2中,yii \\ i18n \\ GettextMessageSource無論如何都不使用Yii完美緩存引擎(查看源代碼)來增強PO或MO文件的負載。 不建議使用php純代碼(包括yii \\ i18n \\ GettextMessageSource)加載這些文件(它比php數組idx慢得多): http ://mel.melaxis.com/devblog/2006/04/10/benchmarking- PHP的定位,是-gettext的,足夠快的/

然而,MO文件的php gettext ext比翻譯php數組快一些,因為它使用緩存,但負面的一點是:MO中的每個更改都需要服務器重啟。

我認為最好的解決方案是在您自己的代碼庫中擴展yii \\ i18n \\ GettextMessageSource,並將緩存功能添加到GettextMessageSource以增強其性能並使用擴展版本作為組件。

protected function loadMessages($category, $language);

只是不要檢查每個負載中的MO修改日期以與緩存進行比較,而是在更改MO或PO文件時清除緩存(可以是計划)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM