天天看點

雲客Drupal源碼分析之語言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

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

繼續閱讀