48. 语言Language
据联合国教科文组织曾发布的《濒危语言图谱》的数据,在这颗星球上我们的文明有7000种语言,另据德国出版的《语言学及语言交际工具问题手册》有5651种语言,具体有多少谁也说不清,但我们知道人类文明大体有数千种语言之多,中国就有129种语言,世界80%的人讲83种主要语言,drupal系统默认提供的语言列表有95种,但非常可惜的是许多语言正在衰亡,人类是个大家庭,文明需要多样性,计算机系统要将人类文明连接的更为紧密,对不同语言的处理是非常重要和有意义的,为此在RFC 5646中定义了语言识别标签,云客写了篇博文简述它的内容,请先阅读,地址如下:
http://blog.csdn.net/u011474028/article/details/63516296
在drupal中使用语言代码来标识不同的语言,而语言代码就来自于语言识别标签,是其简化形式,所有语言的语言代码由语言标签的第一部分和可选的其他部分构成;大多数语言从左到右书写,但也有从右到左的,系统默认只允许向右或向左的语言;有些语言有专门的字符编码集,如中文就有gbk,为了统一显示一般使用utf8;以下列出一些使用人数众多的自然语言,按人数排序,由于人口变动、统计方法、第二语言等等原因,排序可能会差异很大,不必在意,知道大致规模即可,如下:
中文 14亿
英语 超过10亿
印地语 7亿
西班牙语 5亿
法语 3亿多
阿拉伯语 3亿多 从右向左书写
俄语 2.8亿
葡萄牙语 2.2亿
德语 1.7亿
日语 1.2亿
乌尔都语 1亿 从右向左书写
意大利语 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…
2.联合国官方机构使用五种工作语言,名字和语言代码如下:
阿拉伯语ar、简体中文zh-hans、英语en、法语fr、俄语ru、西班牙语es