天天看点

云客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

我是云客,【云游天下,做客四方】,联系方式见主页,欢迎转载,但须注明出处

继续阅读