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

 

 

本书共97小节:

评论 (写第一个评论)