1. 程式人生 > >雲客Drupal8原始碼分析之語言Language

雲客Drupal8原始碼分析之語言Language

據聯合國教科文組織曾釋出的《瀕危語言圖譜》的資料,在這顆星球上我們的文明有7000種語言,另據德國出版的《語言學及語言交際工具問題手冊》有5651種語言,具體有多少誰也說不清,但我們知道人類文明大體有數千種語言之多,中國就有129種語言,世界80%的人講83種主要語言,drupal系統預設提供的語言列表有95種,但非常可惜的是許多語言正在衰亡,人類是個大家庭,文明需要多樣性,計算機系統要將人類文明連線的更為緊密,對不同語言的處理是非常重要和有意義的,為此在RFC 5646中定義了語言識別標籤,雲客寫了篇博文簡述它的內容,請先閱讀,地址如下:
http://blog.csdn.net/u011474028/article/details/63516296
在drupal中使用語言程式碼來標識不同的語言,而語言程式碼就來自於語言識別標籤,是其簡化形式,所有語言的語言程式碼由語言標籤的第一部分和可選的其他部分構成;大多數語言從左到右書寫,但也有從右到左的,系統預設只允許向右或向左的語言;有些語言有專門的字元編碼集,如中文就有gbk,為了統一顯示一般使用utf8;以下列出一些使用人數眾多的自然語言,按人數排序,由於人口變動、統計方法、第二語言等等原因,排序可能會差異很大,不必在意,知道大致規模即可,如下:
1、 中文 14億
2、 英語 超過10億
3、 印地語 7億
4、 西班牙語 5億
5、 法語 3億多
6、 阿拉伯語 3億多 從右向左書寫
7、 俄語 2.8億
8、 葡萄牙語 2.2億
9、 德語 1.7億
10、 日語 1.2億
11、 烏爾都語 1億 從右向左書寫
12、 義大利語 1億

除了自然形成的自然語言外,還有人工語言,比如世界語、伊多語(Ido)、大同語(Mondlango)、邏輯語(Lojban)等;語言有非常多的知識,同一個國家或區域可能混雜許多語言,許多人會有第二語言,不同語言可能文字是一樣的,如粵語和普通話,同一種語言可能文字不一樣,如簡體中文和繁體中文;還有些有趣的現象,比如在四川成都的洛帶鎮,當地人同時講兩種方言,四川話和客家話,都是第一語言,他們發音差異很大,講客家話時連其他的四川人也聽不懂;在讀本主題前建議先了解更多的語言知識,如RFC 5646、各類百科等等,有利於對drupal多語言機制的理解。

核心語言元件:

本主題介紹核心語言元件(\core\lib\Drupal\Core\Language),而非核心語言模組(core\modules\language)前者是後者的前備知識,後者內容更多,將在後續主題中專門介紹,前者雖簡單但很重要,被用於接下來的學習中。
系統用一個物件來代表一種語言,從這個物件中可以得到這種語言的一些屬性資訊,該物件稱為語言物件,所有語言物件均需要實現以下介面:
Drupal\Core\Language\LanguageInterface
該介面定義了許多常量,被用於系統許多地方,通常用於陣列鍵名錶徵一種含義,這些常量介紹如下:
const LANGCODE_SYSTEM = 'system';
指示drupal原始碼中使用的語言,也就是開發語言,預設是英語,當將英語視為可被翻譯的目標語言時(預設英語是不可翻譯的),需要區分原始碼語言和英語的區別

const LANGCODE_NOT_SPECIFIED = 'und';
語言未指定,當我們知道內容是有語言屬性的,但卻沒有指定語言,則用這個常量表示

const LANGCODE_NOT_APPLICABLE = 'zxx';
當某內容沒有語言屬性時,也就是不適用任何語言,則用該常量表示

const LANGCODE_DEFAULT = 'x-default';
用於指定資料的預設語言(源語言),常做陣列鍵名,有時候我們不知道某資料的源語言是什麼,那麼就用這個常量,可以將其看做源語言的語言程式碼別名,後續的內容實體中會有體會

const LANGCODE_SITE_DEFAULT = 'site_default';
表示站點的預設語言

const STATE_CONFIGURABLE = 1;
指語言的可配置狀態,語言物件可以是一個實體,可以進行一些配置,該常量指代可配置性

const STATE_LOCKED = 2;
語言的鎖定狀態,有些語言是不可以被使用的,如有些語言物件表示未定義或不適應,雖然用語言物件去代表它,但它是鎖定的

const STATE_ALL = 3;
需要系統中所有語言時,用該常量表示

const STATE_SITE_DEFAULT = 4;
指代語言物件是否為站點預設語言

const TYPE_CONTENT = 'language_content';
const TYPE_INTERFACE = 'language_interface';
const TYPE_URL = 'language_url';
以上三個常量用於指代語言被用於的場景型別:內容、介面、連結

const DIRECTION_LTR = 'ltr';
const DIRECTION_RTL = 'rtl';
以上兩個常量指代語言的書寫方向

語言物件儲存著語言的一些資訊,有名字、語言程式碼、書寫方向等等,用以下方法獲取:
public function getName();
得到人類可讀的語言名字,英語方式
public function getId();
得到語言物件的語言程式碼,該程式碼常用於陣列鍵名,是語言的簡化表示,來自於語言識別標籤,是其簡化形式,所有語言的語言程式碼由語言標籤的第一部分和可選的其他部分構成
public function getDirection();
得到語言的書寫方向,從左到右或者從右到左,返回值定義在介面的方向常量裡
public function getWeight();
得到語言的排序值,用於在管理介面中語言排序,值越大越排後面
public function isDefault();
判斷該語言物件是否為站點預設語言,內部通過預設語言配置來比較
public function isLocked();
判斷語言物件是否是鎖定的

系統提供了一個預設的語言物件:
Drupal\Core\Language\Language
它的構造方法以陣列方式接收以上提到的那些語言資訊,在例項化它時最低限度是提供一個只含有語言id的陣列(通常也是這麼做的),id值為語言程式碼,它會通過預設語言列表來補全其他資訊,該預設語言列表一共記錄了95種常用語言並以語言程式碼的字母順序排序,由以下方法提供:
Drupal\Core\Language\LanguageManager::getStandardLanguageList();

如下列出以備查詢:

[
      'af' => ['Afrikaans', 'Afrikaans'],
      'am' => ['Amharic', 'አማርኛ'],
      'ar' => ['Arabic', /* Left-to-right marker "‭" */ 'العربية', LanguageInterface::DIRECTION_RTL],
      'ast' => ['Asturian', 'Asturianu'],
      'az' => ['Azerbaijani', 'Azərbaycanca'],
      'be' => ['Belarusian', 'Беларуская'],
      'bg' => ['Bulgarian', 'Български'],
      'bn' => ['Bengali', 'বাংলা'],
      'bo' => ['Tibetan', 'བོད་སྐད་'],
      'bs' => ['Bosnian', 'Bosanski'],
      'ca' => ['Catalan', 'Català'],
      'cs' => ['Czech', 'Čeština'],
      'cy' => ['Welsh', 'Cymraeg'],
      'da' => ['Danish', 'Dansk'],
      'de' => ['German', 'Deutsch'],
      'dz' => ['Dzongkha', 'རྫོང་ཁ'],
      'el' => ['Greek', 'Ελληνικά'],
      'en' => ['English', 'English'],
      'en-x-simple' => ['Simple English', 'Simple English'],
      'eo' => ['Esperanto', 'Esperanto'],
      'es' => ['Spanish', 'Español'],
      'et' => ['Estonian', 'Eesti'],
      'eu' => ['Basque', 'Euskera'],
      'fa' => ['Persian, Farsi', /* Left-to-right marker "‭" */ 'فارسی', LanguageInterface::DIRECTION_RTL],
      'fi' => ['Finnish', 'Suomi'],
      'fil' => ['Filipino', 'Filipino'],
      'fo' => ['Faeroese', 'Føroyskt'],
      'fr' => ['French', 'Français'],
      'fy' => ['Frisian, Western', 'Frysk'],
      'ga' => ['Irish', 'Gaeilge'],
      'gd' => ['Scots Gaelic', 'Gàidhlig'],
      'gl' => ['Galician', 'Galego'],
      'gsw-berne' => ['Swiss German', 'Schwyzerdütsch'],
      'gu' => ['Gujarati', 'ગુજરાતી'],
      'he' => ['Hebrew', /* Left-to-right marker "‭" */ 'עברית', LanguageInterface::DIRECTION_RTL],
      'hi' => ['Hindi', 'हिन्दी'],
      'hr' => ['Croatian', 'Hrvatski'],
      'ht' => ['Haitian Creole', 'Kreyòl ayisyen'],
      'hu' => ['Hungarian', 'Magyar'],
      'hy' => ['Armenian', 'Հայերեն'],
      'id' => ['Indonesian', 'Bahasa Indonesia'],
      'is' => ['Icelandic', 'Íslenska'],
      'it' => ['Italian', 'Italiano'],
      'ja' => ['Japanese', '日本語'],
      'jv' => ['Javanese', 'Basa Java'],
      'ka' => ['Georgian', 'ქართული ენა'],
      'kk' => ['Kazakh', 'Қазақ'],
      'km' => ['Khmer', 'ភាសាខ្មែរ'],
      'kn' => ['Kannada', 'ಕನ್ನಡ'],
      'ko' => ['Korean', '한국어'],
      'ku' => ['Kurdish', 'Kurdî'],
      'ky' => ['Kyrgyz', 'Кыргызча'],
      'lo' => ['Lao', 'ພາສາລາວ'],
      'lt' => ['Lithuanian', 'Lietuvių'],
      'lv' => ['Latvian', 'Latviešu'],
      'mg' => ['Malagasy', 'Malagasy'],
      'mk' => ['Macedonian', 'Македонски'],
      'ml' => ['Malayalam', 'മലയാളം'],
      'mn' => ['Mongolian', 'монгол'],
      'mr' => ['Marathi', 'मराठी'],
      'ms' => ['Bahasa Malaysia', 'بهاس ملايو'],
      'my' => ['Burmese', 'ဗမာစကား'],
      'ne' => ['Nepali', 'नेपाली'],
      'nl' => ['Dutch', 'Nederlands'],
      'nb' => ['Norwegian Bokmål', 'Norsk, bokmål'],
      'nn' => ['Norwegian Nynorsk', 'Norsk, nynorsk'],
      'oc' => ['Occitan', 'Occitan'],
      'pa' => ['Punjabi', 'ਪੰਜਾਬੀ'],
      'pl' => ['Polish', 'Polski'],
      'pt-pt' => ['Portuguese, Portugal', 'Português, Portugal'],
      'pt-br' => ['Portuguese, Brazil', 'Português, Brasil'],
      'ro' => ['Romanian', 'Română'],
      'ru' => ['Russian', 'Русский'],
      'sco' => ['Scots', 'Scots'],
      'se' => ['Northern Sami', 'Sámi'],
      'si' => ['Sinhala', 'සිංහල'],
      'sk' => ['Slovak', 'Slovenčina'],
      'sl' => ['Slovenian', 'Slovenščina'],
      'sq' => ['Albanian', 'Shqip'],
      'sr' => ['Serbian', 'Српски'],
      'sv' => ['Swedish', 'Svenska'],
      'sw' => ['Swahili', 'Kiswahili'],
      'ta' => ['Tamil', 'தமிழ்'],
      'ta-lk' => ['Tamil, Sri Lanka', 'தமிழ், இலங்கை'],
      'te' => ['Telugu', 'తెలుగు'],
      'th' => ['Thai', 'ภาษาไทย'],
      'tr' => ['Turkish', 'Türkçe'],
      'tyv' => ['Tuvan', 'Тыва дыл'],
      'ug' => ['Uyghur', /* Left-to-right marker "‭" */ 'ئۇيغۇرچە', LanguageInterface::DIRECTION_RTL],
      'uk' => ['Ukrainian', 'Українська'],
      'ur' => ['Urdu', /* Left-to-right marker "‭" */ 'اردو', LanguageInterface::DIRECTION_RTL],
      'vi' => ['Vietnamese', 'Tiếng Việt'],
      'xx-lolspeak' => ['Lolspeak', 'Lolspeak'],
      'zh-hans' => ['Chinese, Simplified', '簡體中文'],
      'zh-hant' => ['Chinese, Traditional', '繁體中文'],
    ];
該列表是一個數組,鍵名為語言程式碼,鍵值為一個索引陣列:
第一個元素為語言的名字,用英語表示
第二個元素也是語言的名字,用該語言自己表示
第三個元素可選提供,表示書寫方向,不提供預設為從左到右

系統預設語言:
在核心語言元件中定義了站點預設語言服務,用以得到站點的預設語言物件:
服務id: language.default
類:Drupal\Core\Language\LanguageDefault
它的引數是一個數組,是容器中的一個引數變數,指示當前站點的預設語言;在控制器中用以下程式碼得到該服務:
\Drupal::service(“language.default”);

語言管理器:
在核心語言元件中定義了語言管理器,但它實際扮演一個基類的角色,會被核心語言模組覆寫,系統真正使用的語言管理器是Drupal\language\ConfigurableLanguageManager
該語言管理器的服務id:language_manager 得到它可用\Drupal::languageManager()
這一塊內容在語言模組主題中介紹(core\modules\language),這涉及語言安裝、語言實體等和語言相關的多方面內容,後續將有專門的主題,本主題是基礎,大致瞭解後已經可以進行接下來的學習了。


補充說明:
1. 官方國際化主題文件:
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Language%21language.api.php/group/i18n/8.3.x
2. 聯合國官方機構使用五種工作語言,名字和語言程式碼如下:
阿拉伯語ar、簡體中文zh-hans、英語en、法語fr、俄語ru、西班牙語es


我是雲客,【雲遊天下,做客四方】,微訊號:PHP-world,歡迎轉載,但須註明出處,討論請加qq群203286137


相關推薦

Drupal8原始碼分析語言Language

據聯合國教科文組織曾釋出的《瀕危語言圖譜》的資料,在這顆星球上我們的文明有7000種語言,另據德國出版的《語言學及語言交際工具問題手冊》有5651種語言,具體有多少誰也說不清,但我們知道人類文明大體有數千種語言之多,中國就有129種語言,世界80%的人講83種主要語言,dr

Drupal8原始碼分析外掛系統(下)

以下內容僅是一個預覽,完整內容請見文尾: 至此本系列對外掛的介紹全部完成,涵蓋了系統外掛的所有知識 全文目錄(全文10476字): 例項化外掛 外掛對映Plugin mapping 外掛上下文  

Drupal8原始碼分析臨時儲存與訊息服務

前言:臨時儲存與訊息服務之間並沒有什麼直接關聯,由於她們都是系統基礎元件,內容也比較簡單,為後續主題做準備,所以放在一起講解。 臨時儲存概述: 臨時儲存用來儲存一些臨時性的資料,超期後會被刪除,比如節點在儲存前的預覽資料,她和快取不一樣,她是臨時性的、不能被重建的資料,依據

Drupal8原始碼分析塊系統block

在drupal中系統流程指向一個控制器,通常控制器返回一個代表特定內容的渲染陣列,那麼還需要其他內容怎麼辦?這就是塊系統要解決的,她讓頁面精彩紛呈,可展示多種資訊或工具,如果沒有她頁面會非常單調,某種程度上說她是系統必須的,給各模組展示資訊提供頁面視窗。 從控制器返回的渲染

Drupal8原始碼分析配置實體查詢

本系列已經發布過內容實體的實體查詢,配置實體也是有實體查詢的,比如:塊知識庫服務(\Drupal\block\BlockRepository)中就用到配置實體查詢,以查出相同主題下的塊配置實體。配置實體的資料通過配置系統儲存,先回顧一下我們獲取一個配置值的方式:

Drupal8原始碼分析前言

Drupal是一個非常優秀的網站系統,可以說她是一個網站應用開發框架,也可以說是一個cms,她在世界範圍內被廣泛使用,最為人所知的是美國白宮、聯合國等知名機構的官方網站使用了她,隨著Drupal8的來到,她又達到了一個全新的高度,全面的由面向過程開發轉為面向物件開發,程式碼

Drupal8原始碼分析實體Entity(二)配置實體基類

配置實體基類是系統定義的一個用於配置實體的抽象基類,繼承自實體基類,完成了配置實體的大部分通用功能,具體的配置實體往往會繼承它,比如使用者角色實體,這樣寫少量程式碼即可,類定義如下: Drupal\Core\Config\Entity\ConfigEntityBase 實

Drupal8原始碼分析實體Entity(五)內容實體基類

原始碼分析重點在於在自己的大腦中重現開發者的思維過程,內容實體基類是drupal中很大的一個類,她要處理眾多的問題,內容實體的大多數功能都集中在這裡,開發者有許多的考慮,要弄清楚她的所有細節,學習者可能會覺得有些困難,這時需要明白任何複雜龐大的事物都是一步步累積發展起來的,

Drupal8原始碼分析外掛系統(上)

各位《雲客drupal8原始碼分析》系列的讀者: 本系列一直以每週一篇的速度進行部落格原創更新,希望幫助大家理解drupal8底層原理,並縮短學習時間,但自《外掛系統(上)》主題開始部落格僅釋出前言和目錄,這是因為雲客在思考一個問題:drupal在國外如此流行但在國內卻很小

Drupal8原始碼分析主題鉤子註冊theme.registry

以下內容僅是一個預覽,完整內容請見文尾:全文目錄(全文11509字):主題鉤子定義:主題註冊服務:主題實現:主題鉤子註冊:主題鉤子型別:函式註冊:掃描註冊:註冊順序及覆寫:主題鉤子、主題函式、模板命名:

Drupal8原始碼分析實體查詢entityQuery

通過本系列前面內容的學習你已經知道實體在資料庫中是如何儲存的,簡單來說儲存實體的資料庫表分為兩大類,專用表和共享表,共享表必有基本表,可能有版本表、資料表、版本資料表,總之大多數情況下一個完整的實體被儲存在多張表中,比如我們在後臺建立一個內容型別,她的資料至少儲存在六張表中

Drupal8原始碼分析表單Form API

在閱讀本主題前建議你先閱讀本系列前面的《表單定義示例》主題,看一看在drupal8中是如何運用表單的。表單處理流程:一般情況下表單流程是先顯示一個表單,使用者填寫,然後提交,系統處理,如果有錯則重新顯示並給出錯誤提示,反之沒有錯誤那麼完成後給出一個響應或者一個重定向響應,這是

Drupal8原始碼分析資料驗證Validation

各位《雲客drupal8原始碼分析》系列的讀者: 本系列一直以每週一篇的速度進行部落格原創更新,希望幫助大家理解drupal8底層原理,並縮短學習時間,但自《外掛系統(上)》主題開始部落格僅釋出前言和目錄,這是因為雲客在思考一個問題:drupal在國外如此流行但在國內卻很小

Drupal8原始碼分析主題協商theme negotiator

drupal主題系統十分靈活,你可以全站使用一套主題,用響應式設計去相容移動端和pc端,如果響應式無法滿足要求,你可以在各端分別使用不同的主題,但其靈活性遠不止如此,實際上在同一個站點中你可以根據任意條件使用不同的主題,系統後臺設定的只是預設值而已,比如在pc端或移動端你可以

Drupal8原始碼分析響應附屬處理attachments_processor

在閱讀本主題前,你需要先閱讀本系列的渲染陣列、渲染器、渲染佔位符等主題 附屬物attachments就是渲染陣列的#attached部分,這裡稱為“附屬物”而不叫做“附件”,以便和圖片、檔案等概念相區別,附屬物有如下8個型別(以在#attached中的鍵名列出,如果添加了其

Drupal8原始碼分析資料庫系統及其使用

在開始本主題前請允許一點點題外話: 在我寫這個部落格的時候(2016年10月28日),《Begining Drupal 8》這本書已經翻譯完成並做成了PDF格式供給大家免費下載,這是一本引導新人學習drupal8的入門級教程,由drupal中文社群站http://drupa

Drupal8原始碼分析快取系統Cache

在介紹drupal8的快取系統前我們先了解一下快取系統的本質及特性,快取的存在依賴於兩個目的:節省資源和提高速度,起不到這兩作用則快取沒有存在的必要,當一個結果需要進行大量計算才能得到,而它又不會頻繁

Drupal8原始碼分析PHP程式碼儲存PhpStorage

在做專案時,有時需要儲存php程式碼,由於她是可執行的,我們並不希望被隨意執行或者修改,drupal提供了一個php程式碼儲存元件來保障這一點,她使用檔案系統儲存,本篇講解她的使用和原理。 前備知識點: 首先我們需要明確知道檔案系統操作的以下幾點: 一個檔案有三個時間:

Drupal8原始碼分析內容實體資料庫表結構及表對映table mapping

“欄位”概念 在drupal中提到“欄位”這個概念時,請不要理解為資料庫中表的一個列,這不是一個概念,它是指一個欄位物件,充當著實體物件的屬性,也是一個列表型別的型別化資料物件,當本系列提到“欄位field”一般均是指欄位物件或欄位定義物件,而資料庫表中的欄位列,則將其稱為

Drupal8原始碼分析快取上下文CacheContext

“上下文Context”這個詞是什麼意思呢?平常生活中它常見於語言、文字交流裡面,意思是當前交流處於一個特定的環境下,依託前面的內容交流才有意義 比如這句話:“他正在學習drupal”,如果單獨說是沒