This page is a translated version of the page Manual:Language and the translation is 93% complete.
i18n文档
另可参见Manual:MediaWiki架构#语言(是否应合并至此?)

在MediaWiki中,有各种语言:

  • 网站内容语言(基于$wgLanguageCode MediaWiki\MediaWikiServices::getContentLanguage中的ContentLanguage服务),只要维基存在,通常应保持不变。
  • 用户界面语言$contextSource->getLanguage(),以前是$wgLang ),可以在您的首选项中更改,或在URL中使用&uselang=xyz,但在使用wiki时通常也应保持不变。
  • 页面内容语言。即使站点和用户语言相同,每个页面也可能不同。它在title.php中的getPageLanguage()中定义,表示wiki文本源的编写语言。
    • 页面查看语言又名用户语言变体,它是页面内容语言的语言变体,由用户首选。 它也可以通过URL中的&variant(或$wgVariantArticlePath )进行设置(例如,通过选择其中一个选项卡),如果它是页面的内容语言的变体查看。 它在标题中的getPageViewLanguage()中定义,表示呈现的HTML内容的语言。

所有这三个都是语言对象

语言代码

別与维基媒体项目代码混淆了;另请参阅元维基上的语言代码

语言代码是MediaWiki所支持的语言的有效标准缩写,[1]使用此类代码作为语言的标准标识符(大多数符合ISO 639-3,除了ISO 639-1的“已建立”区域设置的双字母代码)并公开或要求它们接口和代码的许多要点。[2]

在下面的MediaWiki:Message/ar示例中,ar是Arabic的语言代码。

需要使用Unicode标准的一致性来提供良好的语言支持,特别是与CLDR合作,拥有ISO 639-3代码的是一项将一种语言添加到MediaWiki本地化中的要求

There are some special language codes for internal or development use: qqq (for message documentation, does not work with uselang etc.), qqx (shows message names for debugging), en-x-rtl (English, but pretends it is a right-to-left language), en-x-piglatin (when $wgUsePigLatinVariant is enabled, for LanguageConverter testing), x-xss (when $wgUseXssLanguage is enabled, tests XSS vulnerabilities in messages).

Names.php

Names.php是MediaWiki支持的语言的主注册表。 请注意,这与MediaWiki将显示l10n的语言(JSON文件)或MediaWiki已知名称的语言(通过CLDR )不同。

備援語言

 
備援鏈 (某些行顯示的並不准確,是由於在備援中有雙重語言。請檢查文字版中是否確實存在連接)

MediaWiki中的某些语言具有所谓的“備援序列”。 如果MediaWiki无法找到所需的语言,那么这将是另一种语言。 这方面的一个例子是语言代码frc(路易斯安那法语),它依赖于语言代码fr(法语)。 这样做的原因是有时语言中没有定义所有消息。

某個语言的備援可以在其关联的languages/messages/MessagesXX.php文件中找到。 例如MessagesFrc.php。您可以搜索所有用途的代码。 在這個phabricator評論中還有一個來自2020年9月的簡單列表。

站点内容语言

查看/获取站点语言

JavaScript :

mw.config.get( 'wgContentLanguage' );

用户界面语言

MediaWiki版本:
1.18
默认值
设置通过
  • Special:Preferences
  • &uselang=zxx在URL(见uselang
  • &variant=xy(或$wgVariantArticlePath )在网址如果它是您的用户语言的变体
问题
由于接口的訊息可能来自於備援语言,但該语言未返回,因此不知道每条消息的实际语言。

页面内容语言

MediaWiki版本:
1.18
默认值
  • 在特殊页面上为$wgLang。
  • 在CSS和JS页面上为英文。
  • 对于MediaWiki命名空间页面,该语言取决于子页面。例如,MediaWiki:Message/ar将设置为阿拉伯语(ar),MediaWiki:Message将为ContentLanguage
  • 所有其他页面默认为ContentLanguage
配置
扩展可以通过PageContentLanguage 钩子更改所有其他页面。 无法覆盖特殊页面、CSS、JS和MediaWiki命名空间页面的值。
例子
翻译扩展将其用于页面翻译功能。参见translatewiki:Project:About/ar作为translatewiki:Project:About的翻译。 因此,对于阿拉伯语,页面的方向性被正确地设置为从右到左。
MediaWiki版本:
1.24
手动更改页面语言
自MediaWiki 1.24以来,借助Special:PageLanguage,现在可以实现页面语言选择。
用户可以更改页面的内容语言,默认情况下是默认的Wiki语言(ContentLanguage)。无法更改MediaWiki名称空间中页面的语言。
需要使用$wgPageLanguageUseDB = true启用该功能,并且需要为pagelang设置权限。權限必須授予wiki用戶權限組(然後他們可以執行頁面語言更改)。
更改页面语言会使源翻译页面及其单位移动到正确的目标语言。如果目标语言翻译页面已存在,则不允许更改语言。
相应的API可以在API:设置页面语言 上找到。
它定义了什么?
  • 在SkinTemplate中,它在页面文本周围添加了<div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl"></div>。dir属性设置正确的写入方向。lang属性将始终是根代码,例如 “de”即使是“de-formal”。
    对于文件页面,它在ImagePage.php中设置,因为有很多用户语言的HTML。
  • 在Parser.php中,它设置目录(TOC)编号和语法之类的东西,尽管大多数情况下并不真正相关。要做到这一点,请使用parserOptions->setTargetLanguage()。
  • diff文本的方向(DifferenceEngine)设置为页面内容语言。在某些情况下,这不相同,在这种情况下可以使用$diffEngineObject->setTextLanguage($code)。
  • 1.19开始,它还设置时间和数字格式魔术字,包括方向标记,但不包括名字空间,因为真的取决于网站语言。请注意,在带有语言B的页面上包含标记为语言A的模板,将在该页面上使用语言B进行解析。
单个页面上的多种语言
理论上不支持单个页面上的多种语言,但这很简单<div lang="xyz" dir="ltr/rtl" class="mw-content-ltr/rtl">标签可用于将文本标记为使用其他语言编写。如果使用CSS类,当dir标记与页面内容语言的值相反时,ul/ol列表和编辑部分将很好地显示。然而,解析器中定义的内容(如TOC和魔术词)不会改变。
查看/获取页面语言
  • JavaScriptmw.config.get( 'wgPageContentLanguage' ):请注意,例如查看页面历史记录,它将返回它是历史记录的页面的页面语言,而历史记录页面没有mw-content-ltr/rtl类。即/wiki/Page和/w/index.php?title=Page&action=history都将返回Page的语言。 1.19+
  • 页面信息视图中提到了页面内容语言(action=info,在工具箱中链接) 1.21+
  • 可以通过api.php?action=query&prop=infoAPI中检索页面内容语言 1.22+

代码结构

首先,你有一个包含在Language.php 中的语言对象。 该对象包含所有可本地化的消息字符串,以及其他重要的特定语言设置和自定义行为(大写、小写、打印日期、格式化数字、方向自定义语法规则"等等")。

对象由两个来源构建:自身的子类版本(类)和消息文件(消息)。

还有 MessageCache 类,它通过 MediaWiki 命名空间处理文本输入。 目前,大多数国际化都是通过 Manual:Messages API 对象和使用 wfMessage() 快捷函数完成的,后者在 includes/GlobalFunctions.php 中定义。 传统代码可能仍在使用旧的 wfMsg*() 函数,而这些函数现在已被视为弃用,转而使用上述 Message 对象。

另见Manual:Messages API

语言对象

有两种获取语言对象的方法。 您可以使用 globals $wgLang ContentLanguage 服务(MediaWiki\MediaWikiServices::getContentLanguage),分别用于用户界面和内容语言。 对于任意一种语言,你都可以用$languageFactory->getLanguage( 'en' )来构造一个对象,只需将en替换为该语言的代码即可。 您可以用 Dependency Injection 得到 $languageFactory(一个 MediaWiki\Languages\LanguageFactory 类的对象)。 如果 $code 已经是语言对象,也可以使用 wfGetLangObj( $code );。 代码清单在includes/languages/data/Names.php之中。

需要使用语言对象来执行特定的语言功能,最常见的功能是进行数字、时间和日期格式化,也可用于构建列表和其他功能。 #備援语言有多层缓存和合并,但在正常使用中这些细节无关紧要。

舊的本地翻译系统

在 MediaWiki 1.3.0 中,我们建立了一个新的系统来本地化 MediaWiki。 用户可以直接在自己的维基中编辑界面字符串,而不用编辑语言文件并要求开发人员进行修改。 这是截至 2005 年 8 月使用的系统。 人们可以在Special:AllMessages中找到想要翻译的信息,然后在MediaWiki:命名空间中编辑相关字符串。 一经编辑,这些更改就会生效。 无需再申请更新,也无需再等待开发人员检查和更新文件。

这个系统对维基百科项目来说非常好,但它的副作用是,随软件一起提供的 MediaWiki 语言文件不再是最新的,开发人员更难保持元文件与真实语言文件的同步。

由于默认语言文件没有提供足够的翻译材料,我们面临着两个问题:

  1. 以一种长期未更新的语言创建的新维基媒体项目,需要对界面进行全面的重新翻译。
  2. MediaWiki的其他用户(包括使用相同语言的维基媒体项目)只能使用未经翻译的界面。 这对于译员不多的小语种来说尤其不幸。

这已经不是什么大问题了,因为 translatewiki.net 的广告很醒目,几乎所有翻译都在使用。 本地翻译有时仍会出现,但我们强烈反对。 本地信息大多需要删除,将相关翻译移至 translatewiki.net,只在维基上保留特定站点的定制内容;特别是在较早的项目中,会有大量积压,此工具 可以帮助清理。

保持信息集中和同步

英文信息很少与代码不同步。 经验表明,将所有英文信息放在同一个地方非常方便。 修订英文文本可以不参考法典,就像翻译一样。 程序员有时会对默认文本做出非常糟糕的选择。

什么可以本地化

MediaWiki 上有许多可本地化的内容,但并非所有内容都能直接在translatewiki.net 上使用:请参阅translatewiki:Translating:MediaWiki。 如果需要开发人员对代码进行干预,您可以在 Phabricator 上申请,如果您不知道具体该怎么做,也可以在translatewiki:支持询问。

 
语言備援图
  • 備援语言(它是在翻译的語言不存在时,所選用的其他更接近的语言,而不是默认的備援语言,即英语)
  • 方向性(从左到右或从右到左,簡稱RTL)
  • 决于RTL的方向标字符取
  • 取决于RTL的箭头
  • 不能使用斜体的语言
  • 数字格式化(逗号化、也就是添加或不添加数字分隔符;转换数字;转换分隔符)[3]
  • 截断(多字节)
  • 转折语言的语法转换
  • 复数转换
  • 將到期时间格式化[clarification needed]
  • 针对差异进行分段(中文)
  • 转换为语言的变体(不同正字法或脚本之间的转换)
  • 语言专屬的用户偏好选项
  • 链接路径和链接前缀 - $linkTrail. 这些字母可以粘贴在维基链接的收尾/开头括号之后/之前,但在屏幕上显示时就像链接的一部分(即是,可点击且颜色相同),例如[[foo]]bar。 默认情况下,链接路径为 "a-z";您可能需要在列表中添加您的语言所使用的重音字母或非拉丁字母。
  • 语言代码(最好根据 BCP 47 标准中的最新 RFC 使用,目前为RFC 5646,并有相关的 IANA 数据库。 避免使用废弃的、可重复使用的和私人使用的代码:查看这些代码在标准 ISO 639 中的含义,避免使用 ISO 639-5 中分配给语言集合/语族的代码,以及未导入 IANA 数据库 BCP 47 的 ISO 639 代码。)
  • 强调的类型
  • 引述 扩展的每种语言都有一个特殊的页面文件,cite_text-zyx是用於语言代码zyx

對齊功能:

  • I18N sprintfDate
  • 罗马数字格式

命名空间

目前,translatewiki.net 禁用了命名空间名称翻译功能,因此您需要自己在 Gerrit 中进行翻译,或者提交一个 Phabricator 任务,要求其他人进行翻译。[4]

要允许翻译扩展引入的自定义命名空间,请创建一个类似 MyExtension.i18n.namespaces.php 的文件:

<?php
/**
 *  MyExtension引入命名空间的翻译。
 *
 * @file
 */

$namespaceNames = [];

//  适用于未安装 MyExtension 扩展的维基。
if( !defined( 'NS_MYEXTENSION' ) ) {
	define( 'NS_MYEXTENSION', 2510 );
}

if( !defined( 'NS_MYEXTENSION_TALK' ) ) {
	define( 'NS_MYEXTENSION_TALK', 2511 );
}

/** English */
$namespaceNames['en'] = [
	NS_MYEXTENSION => 'MyNamespace',
	NS_MYEXTENSION_TALK => 'MyNamespace_talk',
];

/** Finnish (Suomi) */
$namespaceNames['fi'] = [
	NS_MYEXTENSION => 'Nimiavaruuteni',
	NS_MYEXTENSION_TALK => 'Keskustelu_nimiavaruudestani',
];

然后用ExtensionMessagesFiles从extension.json文件加载,像这样:

{
	"name": "MyExtension",
	"version": "0.0.1",
	"descriptionmsg": "myextension-desc",
    "ExtensionMessagesFiles": {
		"MyExtensionNamespaces": "MyExtension.i18n.namespaces.php"
	}
}

现在,当用户在其芬兰语(fi)维基上安装 MyExtension 时,自定义命名空间将被神奇地翻译成芬兰语,用户无需做任何事情!

此外,请记住在扩展默认命名空间 页面上注册扩展的命名空间。

特殊页面的别名

有关最新信息,请参阅特殊页面手册页。 以下内容似乎无效。


按此格式为特殊页面的别名创建一个新文件:

<?php
/**
 * Aliases for the MyExtension extension.
 *
 * @file
 * @ingroup Extensions
 */

$aliases = [];

/** English */
$aliases['en'] = [
	'MyExtension' => [ 'MyExtension' ]
];

/** Finnish (Suomi) */
$aliases['fi'] = [
	'MyExtension' => [ 'Lisäosani' ]
];

然后用ExtensionMessagesFiles从extension.json文件加载,像这样:

{
	"name": "MyExtension",
	"version": "0.0.1",
	"descriptionmsg": "myextension-desc",
    "ExtensionMessagesFiles": {
		"MyExtensionAlias": "MyExtension.i18n.alias.php"
	}
}

当您的特殊页面代码使用SpecialPage::getTitleFor( 'MyExtension' )$this->getTitle()时(在提供Special:MyExtension的类中),如果有本地化的别名,将使用该别名。

命名空间的别名

命名空间的名称别名是可用于寻址现有命名空间的附加名称。 它们很少會需要,但如果需要時沒有,這通常会给现有的维基造成严重破坏。

您需要命名空间名称的别名:

  1. 当一种语言有变体,而这些变体对某些名称空间的拼写不同时,您希望编辑人员能够使用这些变体拼写。 可在用户首选项中选择变体。 除了在维基文本中,用户总能看到自己选择的变体,但在编辑或搜索时,可以使用任意变体。
  2. 当现有维基的语言、备用语言或本地化发生变化时,一些命名空间的名称也会随之改变。 So as not to break the links already present in the wiki, that are using the old namespace names, you need to add each of the altered previous namespace names to its namespace name aliases, when, or before, the change is made.

The generic English namespace names are always present as namespace name aliases in all localisations, so you need not, and should not, add those.

Aliases can't be translated on Translatewiki.net , but can be requested there or on Bugzilla : see translatewiki:Translating:MediaWiki#Namespace name aliases.

区域设置

Some linguistic settings vary across geographies; MediaWiki doesn't have a concept of region, it only has languages and language variants.

These settings need to be set once as a language's default, then individual wikis can change them as they wish in their configuration.

时间和日期格式

Time and dates are shown on special pages and alike. The default time and date format is used for signatures, so it should be the most used and most widely understood format for users of that language. Also anonymous users see the default format. Registered users can choose other formats in their preferences.

If you are familiar with PHP's time() format, you can try to construct formats yourself. MediaWiki uses a similar format string, with some extra features. If you don't understand the previous sentence, that's OK. You can provide a list of examples for 开发人员 .

注释

  1. 参见includes/languages/data/Names.php
  2. 尽管如此,截至2012年,语言代码验证尚未解决。 见2012年8月28日的Niklas Laxström的MediaWiki中的语言验证
  3. 这些都是在相应的 language/classes/LanguageXx.phplanguage/messages/MessagesXx.php 文件中按语言配置的。
  4. https://gerrit.wikimedia.org/r/211677

参见