天天看點

雲客Drupal源碼分析之國際化Internationalization:核心翻譯系統

各位《雲客drupal源碼分析》系列的讀者:

本系列一直以每周一篇的速度進行部落格原創更新,希望幫助大家了解drupal底層原理,并縮短學習時間,但自《插件系統(上)》主題開始部落格僅釋出前言和目錄,這是因為雲客在思考一個問題:drupal在國外如此流行但在國内卻很小衆,一個重要原因應該是中文資料的缺乏,我們是否能夠找到一種方式來激發中文資料的出産?此時同是積極推動者的晴空提出能否用付費閱讀的方式來鼓勵更多作者?并建立了一個付費閱讀drupal資料的網站,個人覺得也許這能激發高品質原創内容的出産,學習者支付很少費用可以節省大量學習時間是劃算的,作者也能配置設定精力去開發高品質内容而得到報酬,drupal普及開了對大家都有益處,為了支援晴空的這個項目,雲客決定将從《插件系統(上)》主題開始後續内容全部放在這個網站上收費閱讀,讀者隻需要付很少費用即可,雲客在這裡承諾該系列得到的所有訂閱費用全部捐獻給drupal深圳社群,用以組織活動等等,發展社群需要大家貢獻力量,該網站已于2017年3月29日上線,請移步:http://nowicode.com/ 閱讀本篇完整版

我是雲客,【雲遊天下,做客四方】,聯系方式見首頁,歡迎轉載,但須注明出處

****************************************以下為前言和目錄,請移步:http://nowicode.com/ 閱讀本篇完整版*******************************

前言:

在開始新系統的學習前,建議先閉上眼睛想一下如果是自己來設計,會怎麼實作呢,這會很有趣,而且對後面的學習大有幫助,也可避免出現填鴨式教育學習的飽腹感導緻的情緒上的波動甚至厭煩,比如翻譯系統我們就可以這樣思考:網站中有許多文本,短的如菜單文本、長的有整篇文章、中長的有功能提示說明等,各文本屬性又不同,有的屬于系統界面,有的屬于内容,而且來源也不同,有的是系統自帶,有的是使用者送出,怎麼儲存翻譯結果呢?又怎麼識别不同翻譯指的是同一文本内容呢?當使用者首選語言沒有對應的翻譯時如果能提供次選語言總比什麼都不提供好,這就需要使用者給出語言偏好排序的設定,有些文本是帶數字的,文本本身不會變化,隻是數字會變化,不可能每一個數字都去儲存一次,那麼數字應該作為參數傳遞給翻譯系統,在英語中由數字原因還出現了名詞的單複數形式需要進一步判斷,有些内容是不需要翻譯的,比如人名,如何應對?有些語言是從左到右書寫閱讀的,有些則相反,如果要求完美甚至還出現機關轉換,比如英寸轉化為米等等,我們帶着這些問題來看看drupal是如何實作的。

在drupal中,通常以英語作為基礎語言,這也導緻通常所講的“源字元串”是指英語,(源字元串是指t($str)函數的參數),但系統并未限制源字元串必須是英語,它可以是任意語言,但通常我們假設它是英語。翻譯系統由翻譯管理器掌管,它提供統一的使用接口,在内部它調用翻譯器來進行翻譯,可以向它注冊多個不同優先級的翻譯器,有許多概念如下:

語言代碼:

每種語言都有唯一對應的語言代碼,比如英語:en、簡體中文:zh-hans、繁體中文:zh-hant,語言代碼由标準化組織定義,見rfc5646文檔和https://www.w

翻譯上下文:

翻譯的核心:翻譯管理器TranslationManager:

T函數:

單複數的翻譯:

翻譯器Translators:

核心提供的翻譯器string_translator.custom_strings:

系統主要翻譯器string_translator.locale.lookup:

字元串翻譯特征StringTranslationTrait:

可選翻譯子產品:

補充:

繼續閱讀