簡體   English   中英

PHP本地化-gettext還是數組?

[英]PHP Localization - gettext or array?

設置多語言站點現在,我需要確定該站點上的靜態文本需要使用哪個選項。 讓我解釋一下我的網站設置,然后再解釋是否可以決定使用哪種解決方案。

該站點是CMS系統,它允許多個域指向同一目錄並根據域名提供內容。 因此,所有域共享相同的代碼。 在該站點上,我創建了稱為模塊的代碼塊,它們可以完成特定的工作。 因此,我可能擁有一個模塊,它所要做的就是顯示數據庫中的最新新聞。 然后,我可以決定該模塊可以顯示在哪個頁面上以及該模塊可以顯示在哪個站點上。 所以我的問題是,gettext是否可以在可能在不同頁面上顯示不同模塊的多個域中工作? 還是我應該為每個模塊創建一個語言文件,其中每個模塊包含一個包含該特定模塊的語言對話的數組? 因此,如果我有10個模塊,則每個模塊將具有自己的語言文件,每個模塊顯示的頁面僅指向該模塊的語言文件中的數組來決定要顯示什么文本? 希望這是有道理的,我閱讀了很多有關gettext和使用數組版本的文章,但無法確定哪種類型更適合這種站點設置。

在我看來,PHP gettext是必經之路。 在我所有的項目中,我都使用wordpress風格進行翻譯。 http://codex.wordpress.org/Translate_WordPress,並使用相同的函數命名約定:

__('message') // Return the translation
_e('message') // echo's the translation
_n('singular_message', 'plural_message', count ) // return singular or plural

我使用poedit http://www.poedit.net/從PHP源代碼中提取可翻譯字符串,並將其翻譯為其他語言。 在所需的PHP gettext目錄結構中存儲和編譯文件,如下所示:

en_US/LC_MESSAGES/default.mo
nl_NL/LC_MESSAGES/default.mo
de_DE/LC_MESSAGES/default.mo

請注意,.mo文件由PHP緩存,並且在重新啟動Web服務器之前,.mo文件中的更改不存在。 在開發過程中拔出頭發,我遇到了這個非常有用的解決方案: http : //blog.ghost3k.net/articles/php/11/gettext-caching-in-php

整個gettext事情花了我一段時間,但還是值得的。 到位后,它為我節省了大量時間,並允許我的客戶自己為其項目進行翻譯。

如果您想激活一個社區來翻譯您的項目,請查看基於Web的翻譯工具Pootle

實際上,我發現gettext更容易:

  1. 您可以echo / print _("your text"); 以后再翻譯
  2. 使用getext編輯器很容易獲得幫助
  3. 要生成boostrap po文件(iirc,/ source /文件),可以使用etags ,這些etags將在文件上生成某種grep。 因此,您只需要稍后翻譯令牌即可。

因此,基本上,從項目開始就一切正常,然后更容易啟動,並且更便於上規模使用。

許多CMS使用陣列版本。 對於可伸縮應用程序,我也見過GetText。 陣列版本更簡單,尤其是當您要從Web界面管理轉換時。

當然,這是一個優先事項。

以我的經驗,原始的gettext並非非常適合網站上下文,在該上下文中內容會隨着時間的流逝而變化,通常在正式發布周期之外。

我建議您看一下Zend_Translate (和Zend_Locale ,如果您想本地化日期,數字等)。 Zend_Translate是一個高級庫,具有適用於各種基礎方法(包括gettext和數組)的適配器。

它有充分的文檔記錄,可以用作獨立組件。

我建議使用gettext。 這是一套完善的工具。 有一個工具可以從源代碼(xgettext)中自動提取文本字符串,還有其他工具可以幫助您翻譯本地化文件,例如poedit( http://www.poedit.net/ )。

如果您正在運行PHP 5.3和/或安裝了intl擴展,那么還有另一個選擇:messageformatter:

http://php.net/manual/zh/class.messageformatter.php

這是非常強大的功能,但是-在我看來-缺少一些文檔,對於您的目的而言可能有些過分。 您可以在ICU項目的頁面上找到有關此信息的更多信息:

http://userguide.icu-project.org/formatparse/messages

暫無
暫無

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

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