Localisation/zh


 * 对于维基媒体基金会本地化团队，请参阅. 
 * 要翻译此Wiki上的页面，请参阅. 

本页提供了 MediaWiki 的国际化和本地化 （i18n和L10n）系统的技术描述，并给出了编码器应注意的提示. 我们的口头禅是i18n不能事后思考: 它是软件的最初阶段以来必不可少的组件，也是MediaWiki的核心内容之一.

translatewiki.net
translatewiki.net supports in-wiki translation of all the messages of core, extensions and skins. If you would like to have nothing to do with all the technicalities in this page about editing files, Git, creating patches, and so forth, go directly to translatewiki.net.

All translation of MediaWiki user interface messages should go through translatewiki.net and not committed directly to code. Only the English messages and their initial documentation must be done in the source code.

Core MediaWiki and extensions must use system messages for any text displayed in the user interface. For an example of how to do this, please see. If the extension is well written, it will probably be included in in a few days, after its staff notices it on. 如果没有被注意到，请联系他们. 如果它太不稳定而无法翻译，请在代码中注明或提交并在必要时与他们联系.

See also Overview of the localisation system and What can be localised.

查找消息
explains how to find a particular string you want to translate. In particular, note the, which was introduced in.

本地化邮件列表
您可以订阅mediawiki-i18n@列表. 目前它的流量很低.

代码结构
首先，您要在有一个语言对象. This object contains all the localisable, as well as other important language-specific settings and custom behaviour (uppercasing, lowercasing, printing dates, formatting numbers, , etc.).

The object is constructed from two sources: sub-classed versions of itself (classes) and Message files (messages).

There's also the MessageCache class, which handles input of text via the MediaWiki namespace. Most internationalisation is nowadays done via objects and by using the   shortcut function, which is defined in. Legacy code might still be using the old  functions, which are now considered deprecated in favour of the above-mentioned Message objects.

一般使用（对于开发者）
参见.

语言对象
有两种方法可以获得语言对象. You can use the globals and  for user interface and content language respectively. For an arbitrary language you can construct an object by using, by replacing   with the code of the language. You can also use  if   could already be a language object. 代码列表位于.

Language objects are needed for doing language-specific functions, most often to do number, time and date formatting, but also to construct lists and other things. There are multiple layers of caching and merging with, but the details are irrelevant in normal use.

使用消息
MediaWiki uses a central repository of messages which are referenced by keys in the code. This is different from, for example,, which just extracts the translatable strings from the source files. The key-based system makes some things easier, like refining the original texts and tracking changes to messages. The drawback is of course that the list of used messages and the list of source texts for those keys can get out of sync. In practice this isn't a big problem, and the only significant problem is that sometimes extra messages that are not used anymore still stay up for translation.

To make message keys more manageable and easy to find, also with grep, always write them completely and don't rely too much on creating them dynamically. You may concatenate parts of message keys if you feel that it gives your code better structure, but put a comment nearby with a list of the possible resulting keys. 例如：

PHP

JS

To use a message in JavaScript, you have to list it in the definition of your ResourceLoader module, in the  property.

PHP和JavaScript消息函数的详细使用可以在找到. ''' This is an important documentation page, and you should read it before you write code that uses messages. '''

添加新消息
參見：

选择消息密钥
參見：

消息密钥必须是全域唯一的. 这包括MediaWiki核心和所有扩展和皮肤.

坚持在信息名称中使用小写字母，数字和短划线; 大多数其他字符介于不实用或根本不工作之间. 根据MediaWiki常规，第一个字符不区分大小写，其他字符区分大小写.

请遵循全域或本地命名常规进行命名. 对于扩展，请使用标准前缀，最好是小写的扩展名，后跟连字符（“-”）. 例外情况有：


 * API使用的消息. 这些必须以,  ,  开头.  在此前缀之后加上扩展名前缀.  (请注意，这些消息应位于单独的文件中，通常在includes/i18/api下. )
 * 与日志相关的消息. 这些必须以,  ,  开头.
 * 用户权限. Special:ListGroupRights 上显示的右侧名称的键必须以   开头.  完成句子""的操作的名称必须以   开头
 * 修订标签必须以 开头.
 * 特殊页面标题必须以 开头.

创建消息时要注意的其他事项
如果你的消息是核心的一部分，它通常应添加到 ，尽管某些组件（例如 Installer、EXIF 标记和 ApiHelp）都有自己的消息文件
 * 1) 确保您对消息使用适当的处理（分析、 -replacement、HTML 转义等）
 * 1) 如果您的消息在扩展名中，请将其添加到相应的子目录中的   文件或   文件 特别是，仅由开发人员（而不是大多数最终用户）看到的 API 消息通常位于单独的文件中，例如  .  如果扩展包含大量消息，则可以在   下创建子目录.  所有消息目录（包括默认  ）都必须列在   中的   部分或  变量中.
 * 2) 暂停并考虑消息的措辞.  它尽可能清楚吗？ 能被误解吗？如果可能，请征求其他开发人员或本地化人员的意见.  跟隨#國際化提示.
 * 3) 在同一目录中将文档添加到 .  阅读更多关于消息文档的信息.

不应翻译的消息

 * 1) 忽略消息是那些应该只存在于英语消息文件中.  它们是不需要翻译的邮件，因为它们只引用其他消息或语言中立功能，比如消息" ".
 * 2) 可选 消息只有在目标语言中更改时才能翻译.

标记此类消息：


 * （可选）使用  消息文档中的模板，即分别
 * 或
 * (required) tell the extension used on  what to do with the messages by submitting a patch listing them as appropriate (see also ):
 * for core, in add the message keys
 * under  or
 * under ;
 * for extensions, in add a line under the extension's name like
 * or
 * or

删除现有消息
Remove it from  and. 不要打扰其他语言. Updates from will handle those automatically.

In addition, check whether the message appears anywhere in translatewiki configuration, for example in the list of optional or most used messages (a simple git grep should be enough). Remove it from these lists if needed.

更改现有消息
This also includes changes in message handling (parsing, escaping, parameters, etc.). Improving the phrasing of a message without technical changes is usually not a reason for changing a key. At translatewiki.net, the translations will be marked as outdated so that they can be targeted by translators. Changing a message key does not require talking to the i18n team or filing a support request. However, if you have special circumstances or questions, ask in [Irc://irc.freenode.org/mediawiki-i18n #mediawiki-i18n] or in the support page at. If needed, the translatewiki.net team will take care of updating the translations, marking them as outdated, cleaning up the file or renaming keys where possible. This also applies when you're only changing things like HTML tags which you could change in other languages without speaking those languages. Most of these actions will take place in translatewiki.net and will reach Git with about one day of delay.
 * 1) Consider updating the message documentation (see #Adding new messages).
 * 1) Change the message key if old translations are not suitable for the new meaning.
 * 1) If the extension is supported by, please only change the English source message and/or key, and the accompanying entry in.

本地化名字空间和特殊页面别名
和特殊页面名称（例如“Special:RecentChanges”中的“RecentChanges”）也可以被翻译.

名字空间


Currently making namespace name translations is disabled on translatewiki.net, so you need to do this yourself in Gerrit, or file a task asking for someone else to do it.

To allow custom namespaces introduced by your extension to be translated, create a  file that looks like this:

然后通过加载名字空间转换文件

Now, when a user installs MyExtension on their Finnish (fi) wiki, the custom namespace will be translated into Finnish magically, and the user doesn't need to do a thing!

Also remember to register your extension's namespace(s) on the page.

特殊页面别名
See for up-to-date information. The following does not appear to be valid.

以此格式为特殊页面别名创建新文件：

然后将其加载到扩展程序的安装文件中，如下所示：

When your special page code uses either  or   (in the class that provides Special:MyExtension), the localised alias will be used, if it's available.

信息参数
一些消息采用参数. They are represented by,  ,  , … in the (static) message texts, and replaced at run time. Typical parameter values are numbers (the "3" in "Delete 3 versions?"), or user names (the "Bob" in "Page last edited by Bob"), page names, links and so on, or sometimes other messages. 它们可以是任意复杂的.

The list of parameters defined for each specific message is placed in special file "qqq.json" located in "languages/" folder of MediaWiki - read more in documentation.

It's preferable to use whole words with the PLURAL, GENDER, and GRAMMAR magic words. 例如， 优于. 它使搜索更容易.

切换消息...

 *  See also . 

Parameters values at times influence the exact wording, or grammatical variations in messages. We don't resort to ugly constructs like "$1 (sub)page(s) of his/her userpage", because these are poor for users and we can do better. Instead, we make switches that are parsed according to values that will be known at run time. The static message text then supplies each of the possible choices in a list, preceded by the name of the switch, and a reference to the value that makes a difference.

This resembles the way are called in MediaWiki. 有几种类型的切换可供选择. ''' These only work if you do full parsing, or -transformation, for the messages. '''

…on numbers via PLURAL

 *  See also . 

MediaWiki supports plurals, which makes for a nicer-looking product. 例如：

If there is an explicit plural form to be given for a specific number, it is possible with the following syntax

Be aware of PLURAL use on all numbers

 * 参见： Plural

When a number has to be inserted into a message text, be aware that some languages will have to use PLURAL on it even if always larger than 1. The reason is that PLURAL in languages other than English can make very different and complex distinctions, comparable to English 1st, 2nd, 3rd, 4th, … 11th, 12th, 13th, … 21st, 22nd, 23rd, … etc.

Do not try to supply three different messages for cases like "no items counted", "one item counted", "more items counted". Rather, let one message take them all, and leave it to translators and PLURAL to properly treat any possible differences of presentation for them in their respective languages.

如果可能，始终将数字作为参数包括在内. Always add  syntax to the source messages if possible, even if it makes no sense in English. 语法指导翻译者.

Fractional numbers are supported, but the plural rules may not be complete.

Pass the number of list items as parameters to messages talking about lists
不要以为只有单数和复数. Many languages have more than two forms, which depend on the actual number used and they have to use grammar varying with the number of list items when expressing what is listed in a list visible to readers. Thus, whenever your code computes a list, include  as parameter to headlines, lead-ins, footers and other messages about the list, even if the count is not used in English. There is a neutral way to talk about invisible lists, so you can have links to lists on extra pages without having to count items in advance.

…on user names via GENDER

 *  See also . 

If you refer to a user in a message, pass the user name as parameter to the message and add a mention in the message documentation that gender is supported. If it is likely that GENDER will be used in translations for languages with gender inflections, add it explicitly in the English language source message.

If you directly address the currently logged-in user, leave the user name as parameter empty:

If you include the user name into the message (e.g. ""), consider passing it through  first, to ensure that characters like   or   are not interpreted.

用户有语法性别

 * 参见 Gender

When a message talks about a user, or relates to a user, or addresses a user directly, the user name should be passed to the message as a parameter. Thus languages having to, or wanting to, use proper gender dependent grammar, can do so. This should be done even when the user name is not intended to appear in the message, such as in "inform the user on his/her talk page", which is better made "inform the user on talk page" in English as well.

This does not mean that you are encouraged to "sexualise" messages' language: please use gender-neutral language whenever this can be done with clarity and precision.

…on use context inside sentences via GRAMMAR

 *  See also . 

Grammatical transformations for agglutinative languages is also available. For example for Finnish, where it was an absolute necessity to make language files site-independent, i.e. to remove the Wikipedia references. 在芬兰语中，"about Wikipedia"变成了"Tietoja Wikipediasta"，"you can upload it to Wikipedia"变成了"Voit tallentaa tiedoston Wikipediaan". 添加后缀取决于单词的使用方式，以及对基础的微小修改. 有一长串的例外情况，但由于只需要翻译几个字，例如网站名称，我们不需要包含它.

MediaWiki具有超过20种语言的语法转换功能. Some of these are just dictionaries for Wikimedia site names, but others have simple algorithms which will fail for all but the most common cases.

Even before MediaWiki had arbitrary grammatical transformation, it had a nominative/genitive distinction for month names. 如果您希望将月份名称替换为句子，则这种区别对于某些语言是必要的.

过滤参数和消息中的特殊字符
The other (much simpler) issue with parameter substitution is HTML escaping. 尽管简单得多，但MediaWiki的工作却相当糟糕.

信息文档
There is a pseudo-language code  for message documentation. It is one of the ISO 639 codes reserved for private use. There, we do not keep translations of each message, but collect English sentences about each message: telling us where it is used, giving hints about how to translate it, and enumerating and describing its parameters, link to related messages, and so on. In translatewiki.net, these hints are shown to translators when they edit messages.

Programmers must document each and every message. Message documentation is an essential resource – not just for translators, but for all the maintainers of the module. Whenever a message is added to the software, a corresponding  entry must be added as well; revisions which don't do so are marked " " until the documentation is added.

Documentation in  files should be edited directly only when adding new messages or when changing an existing English message in a way that requires a documentation change, for example adding or removing parameters. In other cases, documentation should usually be edited in translatewiki. Each documentation string is accessible at https://translatewiki.net/wiki/MediaWiki: message-key /qqq, as if it were a translation. These edits will be exported to the source repositories along with the translations.

Useful information that should be in the documentation includes:


 * 1) Message handling (parsing, escaping, plain text).
 * 1) Type of parameters with example values.
 * 1) Where the message is used (pages, locations in the user interface).
 * 1) How the message is used where it is used (a page title, button text, etc.).
 * 1) What other messages are used together with this message, or which other messages this message refers to.
 * 1) Anything else that could be understood when the message is seen on the context, but not when the message is displayed alone (which is the case when it is being translated).
 * 1) If applicable, notes about grammar. For example, "open" in English can be both a verb and an adjective. In many other languages the words are different and it's impossible to guess how to translate them without documentation.
 * 1) Adjectives that describe things, such as "disabled", "open" or "blocked", must always say what are they describing. In many languages adjectives must have the gender of the noun that they describe. It may also happen that different kinds of things need different adjectives.
 * 1) If the message has special properties, for example, if it is a page name, or if it should not be a direct translation, but adapted to the culture or the project.
 * 1) Whether the message appears near other message, for example in a list or a menu. The wording or the grammatical features of the words should probably be similar to the messages nearby. Also, items in a list may have to be properly related to the heading of the list.
 * 1) Parts of the message that must not be translated, such as generic namespace names, URLs or tags.
 * 1) Explanations of potentially unclear words, for example abbreviations, like "CTA", or specific jargon, like "template", "suppress" or "stub". (Note that it's best to avoid such words in the first place!)
 * 1) Screenshots are very helpful. Don't crop – an image of the full screen in which the message appears gives complete context and can be reused in several messages.

A few other hints:
 * Remember that very, very often translators translate the messages without actually using the software.
 * Most usually, translators do not have any context information, neither of your module, nor of other messages in it.
 * A rephrased message alone is useless in most circumstances.
 * Don't use designers' jargon like "nav" or "comps".
 * Consider writing a glossary of the technical terms that are used in your module. If you do it, link to it from the messages.

You can link to other messages by using. Please do this if parts of the messages come from other messages (if this cannot be avoided), or if some messages are shown together or in same context.

translatewiki.net provides some default templates for documentation:
 * for  messages
 * for  messages
 * for messages around user groups (, ,  ,   and  )
 * for  messages

Have a look at the template pages for more information.

国际化提示
Besides documentation, translators ask to consider some hints so as to make their work easier and more efficient and to allow an actual and good localisation for all languages. Even if only adding or editing messages in English, one should be aware of the needs of all languages. Each message is translated into more than 300 languages and this should be done in the best possible way. Correct implementation of these hints will very often help you write better messages in English, too.

These are the main places where you can find the assistance of experienced and knowledgeable people regarding i18n:


 * The support page of translatewiki.net.
 * The #mediawiki-i18n IRC channel on https://freenode.net.

Please do ask there!

正确使用消息参数和切换
That's a prerequisite of a correct wording for your messages.

避免重复使用消息
翻译人员不鼓励重复使用消息. This may seem counter-intuitive, because copying and duplicating code is usually a bad practice, but in system messages it is often needed. 虽然两个概念可以用英语用同一个词来表达，但这并不一定意味着它们可以用每种语言中的同一个词来表达. "OK" is a good example: in English this is used for a generic button label, but in some languages they prefer to use a button label related to the operation which will be performed by the button. Another example is practically any adjective: a word like "multiple" changes according to gender in many languages, so you cannot reuse it to describe several different things, and you must create several separate messages.

如果要添加多个相同的消息，请添加消息文档以描述其上下文中的差异. 不要担心翻译人员的额外工作. Translation memory helps a lot in these while keeping the flexibility to have different translations if needed.

避免碎片或'拼凑'的消息
语言有不同的单词顺序，复杂的语法和句法规则. It's very hard to translate "lego" messages, that is messages formed by multiple pieces of text, possibly with some indirection (also called "string concatenation").

最好将每条消息都写成完整的短语. Several sentences can usually be combined much more easily into a text block, if needed. When you want to combine several strings in one message, pass them in as parameters, as translators can order them correctly for their language when translating.

互相引用的消息
An exception from the rule may be messages referring to one another: 'Enter the original author's name in the field labelled " " and click "  " when done'. This makes the message consistent when a software developer or wiki operator alters the messages "name" or "proceed" later. Without the int-hack, developers and operators would have to be aware of all related messages needing adjustment, when they alter one.

Don't use terms and templates that are specific to particular projects
MediaWiki is used by very diverse people, within the Wikimedia movement and outside of it. Even though it was originally built for an encyclopedia, it is now used for various kinds of content. Therefore, use general terms. For example, avoid terms like "article", and use "page" instead, unless you are absolutely sure that the feature you are developing will only be used on a site where pages are called "articles". Don't use "village pump", which is the name of an English Wikipedia community page, and use a generic term, such as "community discussion page", instead.

Don't assume that a certain template exists on all wikis. Templates are local to wikis. This applies to both the source messages and to their translations. If messages use templates, they will only work if a template is created on each wiki where the feature is deployed. It's best to avoid using templates in messages completely. If you really have to use them, you must document this clearly in the message documentation and in the extension installation instructions.

与句子中的日期分开的时间
Some languages have to insert something between a date and a time which grammatically depends on other words in a sentence. Thus, they will not be able to use date/time combined. Others may find the combination convenient, thus it is usually the best choice to supply three parameter values (date/time, date, time) in such cases, and in each translation leave either the first one or last two unused as needed.

避免消息中的
has several disadvantages. It can be anything (acronym, word, short phrase, etc.) and, depending on language, may need the use of  on each occurrence. No matter what, each message having  will need review in most wiki languages for each new wiki on which your code is installed. In the majority of cases, when there is not a general  configuration for a language, wiki operators will have to add or amend PHP code so as to get   for   working. This requires both more skills, and more understanding, than otherwise. It is more convenient to have generic references like "this wiki". This does not keep installations from locally altering these messages to use, but at least they don't have to, and they can postpone message adaption until the wiki is already running and used.

避免引用视觉布局和位置
What is rendered where depends on skins. Most often screen layouts of languages written from left-to-right are mirrored compared to those used for languages written from right-to-left, but not always, and for some languages and wikis, not entirely. Handheld devices, narrow windows, and so on may show blocks underneath each other, that would appear side-by-side on larger displays. Since site- and user-written JavaScript scripts and gadgets can, and do, hide parts, or move things around in unpredictable ways, there is no reliable way of knowing the actual layout.

It is wrong to tie layout information to content languages, since the user interface language may not be the page's content language, and layout may be a mixture of the two depending on circumstances. Non-visual user agents like acoustic screen readers and other auxiliary devices do not even have a concept of visual layout. Thus, you should not refer to visual layout positions in the majority of cases, though semantic layout terms may still be used ("previous steps in the form", etc.).

MediaWiki does not support showing different messages or message fragments based on the current directionality of the interface (see T30997).

The upcoming browser and MediaWiki support for East and North Asian top-down writing will make screen layouts even more unpredictable, with at least eight possible layouts (left/right starting position, top/bottom starting position, and which happens first).

避免引用屏幕颜色
The colour in which something is rendered depends on many factors, including skins, site- and user-written JavaScript scripts and gadgets, and local user agent over-rides for reasons of accessibility or technological limitations. Non-visual user agents like acoustic screen readers and other auxiliary devices do not even have a concept of colour. Thus, you should not refer to screen colours. (You should also not rely on colour alone as a mechanism for informing the user of state, for the same reason.)

在每个输入字段之前和之后都有消息元素

 *  This is a suggested guideline, has not become standard in MediaWiki development 

While English allows efficient use of prompting in the form item–colon–space–input-field, many other languages don't. Even in English, you often want to use "Distance: ___ metres" rather than "Distance (in metres): ___". Leaving  elements aside, you should think of each and every input field following the "Distance: ___ metres" pattern. So:


 * give it two messages, even if the 2nd one is empty in English and some other languages, or
 * allow the placement of inputs via  parameters.

避免在消息中使用未翻译的HTML标记
HTML markup not requiring translation, such as enclosing s, rulers above or below, and similar, should usually not be part of messages. They unnecessarily burden translators, increase message file size, and pose the risk to accidentally being altered or skipped in the translation process. In general, avoid raw HTML in messages if you can.

消息通常比你想象的要长！
Skimming foreign language message files, you find messages almost never shorter than Chinese ones, rarely shorter than English ones, and most usually much longer than English ones.

Especially in forms, in front of input fields, English messages tend to be terse, and short. That is often not kept in translations. Languages may lack the technical vocabulary present in English, and may require multiple words or even complete sentences to explain some concepts. For example, the brief English message "TSV file:" may have to be translated in a language as literally: " Please type a name here which denotes a collection of computer data that is comprised of a sequentially organised series of typewritten lines which themselves are organised as a series of informational fields each, where said fields of information are fenced, and the fences between them are single signs of the kind that slips a typewriter carriage forward to the next predefined position each. Here we go: _____ (thank you) " This is, admittedly, an extreme example, but you get the trait. Imagine this sentence in a column in a form where each word occupies a line of its own, and the input field is vertically centered in the next column. :-(

Avoid using very close, similar, or identical words to denote different things, or concepts
For example, pages may have older revisions (of a specific date, time, and edit), comprising past versions of said page. The words revision, and version can be used interchangeably. A problem arises, when versioned pages are revised, and the revision, i.e. the process of revising them, is being mentioned, too. This may not pose a serious problem when the two synonyms of "revision" have different translations. Do not rely on that, however. It is better to avoid the use of "revision" aka "version" altogether, then, so as to avoid it being mis-interpreted.

Basic words may have unforeseen connotations, or not exist at all
There are some words that are hard to translate because of their very specific use in MediaWiki. 有些可能根本没有被翻译. For example, there is no word "user" relating to "someone who uses something" in several languages. Similarly, in Kölsch the English words "namespace" and "apartment" translate the same word. Sticking to Kölsch, they say "corroborator and participant" in one word since any reference to "use" would too strongly imply "abuse" as well. The term "wiki farm" is translated as "stable full of wikis", since a single-crop farm would be a contradiction in terms in the language, and not understood, etc..

预期不翻译的词语

 *  This is a suggested guideline, has not yet become standard in MediaWiki development 

It is not uncommon that proper names, tag names, etc. and computerese in English are not translated, and instead taken as loan-words, or foreign words. In the latter case, some particularly-fastidious translators may mark such words as belonging to another language with HTML markup, such as  ….

You may want to consider ensuring that your message output handler passes such markup along unmolested, despite the obvious security risks.

允许解释内联标记

 *  This is a suggested guideline, has not yet become standard in MediaWiki development 

Sometimes there are abbreviations, technical terms, or generally ambiguous words in target languages that may not be immediately understood by newcomers, but are obvious to experienced computer users. So as to avoid screen clutter of lengthy explanations without leaving newcomers stranded, translators may choose to add explanations as annotations, shown by browsers when you move the mouse over them.

For example, the MediaWiki core message  about image rotation, which in English is simply " ", in Moroccan Arabic is translated as:



giving:


 * mḍwwer 90° ĜĜS

explaining the abbreviation for "counter clockwise" when needed.

You may want to consider ensuring that your message output handler passes such markup along unmolested, even if the original message does not use them.

Use, , and tags where needed
When talking about technical parameters, values, or keyboard inputs, mark them appropriately as such using the HTML tags,  , or. Thus they are typographically set off form the normal text. That clarifies their sense to readers, avoiding confusion, errors and mis-representations. Ensure that your message handler allows such markup.

Symbols, colons, brackets, etc. are parts of messages
Many symbols are localisable, too. Some scripts have other kinds of brackets than the Latin script has. A colon may not be appropriate after a label or input prompt in some languages. Having those symbols included in messages helps to make better and less Anglo-centric translations, and also reduces code clutter.

For example, there are different quotation mark conventions used in «Norwegian», »Swedish», »Danish«, „German“, and 「Japanese」.

If you need to wrap some text in localized parentheses, brackets, or quotation marks, you can use the   or    or    messages like so:

Do not expect symbols and punctuation to survive translation
Languages written from right to left (as opposed to English) usually swap arrow symbols being presented with "next" and "previous" links, and their placement relative to a message text may, or may not, be inverted as well. Ellipsis may be translated to "etc.", or to words. Question marks, exclamation marks, colons will be placed other than at the end of a sentence, not at all, or twice. As a consequence, always include all of those in the text of your messages, and never try to insert them programmatically.

使用句号
Do terminate normal sentences with full stops. This is often the only indicator for a translator to know that they are not headlines or list items, which may need to be translated differently.

链接的维基文本
Link anchors can be put into messages in several technical ways:


 * 1) via wikitext: …   …,
 * 1) via wikitext: …  …, or
 * 1) the anchor text is a message in the MediaWiki namespace. Avoid it!

The latter is often hard or impossible to handle for translators, avoid fragmented or 'patchwork' messages here, too. Make sure that " " does not contain spaces.

Use meaningful link anchors
Take care with your wording. Link anchors play an important role in search engine assessment of pages – both the words linked, and the target anchor. Make sure that the anchor describes the target page well. Always avoid commonplace and generic words. For example, "Click here" is an absolute no-go, since target pages are almost never about "click here". Do not put that in sentences around links either, because "here" was not the place to click. Instead, Use precise action words telling what a user will get to when following the link, such as "You can upload a file if you wish."

See also Help users predict where they are going, and mystery meat navigation, and The main reasons why we shouldn't use click here as link text.

避免使用行话和俚语
Avoid developer and power user jargon in messages. Try to use a simple language whenever possible. Avoid saying "success", "successfully", "fail", "error occurred while", etc., when you want to notify the user that something happened or didn't happen. This comes from developers' seeing everything as true or false, but users usually just want to know what actually happened or didn't, and what they should do about it (if at all). So:


 * "The file was successfully renamed" -> "The file was renamed"
 * "File renaming failed" -> "There is a file with this name already. Please choose a different name."

每行一句

 *  This is a suggested guideline, has not yet become standard in MediaWiki development 

Try to have one sentence or similar block in one line. This helps to compare the messages in different languages, and may be used as an hint for segmentation and alignment in translation memories.

注意空格和换行符
MediaWiki's localised messages usually get edited within the wiki, either by wiki operations on live wikis, or by the translators on translatewiki.net. You should be aware of how whitespace, especially at the beginning or end of your message, will affect editors:


 * Spaces and line breaks (new lines) at the end of the message are always automatically removed by the wikitext editor. Your message must not end with a space or line break, as it will be lost when it's edited on the wiki.
 * Spaces and line breaks at the beginning are not automatically removed, but they are likely to be removed by accident during editing, and should be avoided.

Start and end your message with active text; if you need a newline or paragraph break around it, your surrounding code should deal with adding it to the returned text.

There are some messages which require a space at the end, such as 'word-separator' (which consists of just a space character in most languages). To support such use cases, the following HTML entities are allowed in messages and transformed to the actual characters, even if the message otherwise doesn't allow wikitext or HTML formatting:


 * – space
 * or  – non-breaking space
 * – soft hyphen

On a related note, any other syntax elements affected by pre-save transforms also must not be used in messages, as they will be transformed when the message is edited on the wiki.

使用标准大写
Capitalisation gives hints to translators as to what they are translating, such as single words, list or menu items, phrases, or full sentences. Correct (standard) capitalisation may also play a role in search engines' assessment of your pages. MediaWiki uses sentence case (The quick brown fox jumps over the lazy dog) in interface messages.

Always remember that many writing systems don't have capital letters at all, and some of those that do have them, use them differently from English. Therefore, don't use ALL-CAPS for emphasis. Use CSS, or HTML or  per below:

Emphasis
In normal text, emphasis like boldface or italics and similar should be part of message texts. Local conventions on emphasis often vary, especially some Asian scripts have their own. Translators must be able to adjust emphasis to their target languages and areas. Try to use "" and "" in your user interface to allow mark-up on a per language or per script basis.

In modern screen layouts of English and European styles, emphasis becomes less used. Do convey it in your message documentation still, as it may give valuable hints as to how to translate. Emphasis can and should be used in other cultural contexts as appropriate, provided that translators know about it.

本地化的更新
As mentioned above, translation happens on translatewiki.net and other systems are discouraged. Here's a high level overview of the localisation update workflow:


 * Developers.
 * Users translate the new or changed system messages on translatewiki.net.
 * Automated tools export these messages, build new versions of the message files, incorporating the added or updated messages, for both core and extensions, and commit them to git.
 * The wikis then can pull in the updated system messages from the git repository.

Wikimedia projects and any other wikis can benefit immediately and automatically from localisation work thanks to the extension. This compares the latest English messages to the English messages in production. If they are not the same, the production translations are updated and made available to users.

Once translations are in the version control system, the Wikimedia Foundation has a daily job that updates a checkout or clone of the extension repository. This was first established in September 2009.

Because changes on translatewiki.net are pushed to the code daily as well, this means that each change to a message can potentially be applied to all existing MediaWiki installations in a couple days without any manual intervention or traumatic code update.

As you can see this is a multi-step process. Over time, we have found out that many things can go wrong. If you think the process is broken, please make sure to report it on our Support page, or create a new bug in Phabricator. Always be sure to describe a precise observation.

处理支持请求

 *  Main page: translatewiki:Translating:Localisation for developers. 

Translators may have questions about some of the messages you create. Translatewiki.net provides a support request system that allows translators the ability to ask you, the project owner, questions regarding messages so that they can be better translated. This short tutorial guides you through the workflow of handling translatewiki.net support requests.

消息来源
Code looks up from these sources:


 * MediaWiki名字空间. This allows wikis to adopt, or override, all of their messages, when standard messages do not fit or are not desired (see #Old local translation system).
 * MediaWiki:Message-key is the default message,
 * MediaWiki:Message-key/language-code is the message to be used when a user has selected a language other than the wiki's default language.
 * From message files:
 * Core MediaWiki itself and most currently maintained extensions use a file per language, named, where zyx is the language code for the language.
 * Some older extensions use a combined message file holding all messages in all languages, usually named.
 * Many Wikimedia Foundation wikis access some messages from the extension, allowing them to standardise messages across WMF wikis without imposing them on every MediaWiki installation.
 * A few extensions use other techniques.

缓存
System messages are one of the more significant components of MediaWiki, primarily because it is used in every web request. The PHP message files are large, since they store thousands of message keys and values. Loading this file (and possibly multiple files, if the user's language is different from the content language) has a large memory and performance cost. An aggressive, layered caching system is used to reduce this performance impact.

MediaWiki has lots of caching mechanisms built in, which make the code somewhat more difficult to understand. Since 1.16 there is a new caching system, which caches messages either in. files or in the database. 自定义消息缓存在文件系统中，并以（或其它可替代的）缓存，具体取决于配置.

下表概述了所涉及的设置：

In MediaWiki 1.27.0 and 1.27.1, the autodetection was changed to favor the file backend. In case  (the default), the file backend is used with the path from. If this value is not set (which is the default), a temporary directory determined by the operating system is used. If a temporary directory cannot be detected, the database backend is used as a fallback. This was reverted from 1.27.2 and 1.28.0 because of conflict of files on shared hosts and security issues (see T127127 and T161453).

Function backtrace
To better visually depict the layers of caching, here is a function backtrace of what methods are called when retrieving a message. See the below sections for an explanation of each layer.



MessageCache
The  class is the top level of caching for messages. It is called from the Message class and returns the final raw contents of a message. This layer handles the following logic:


 * Checking for message overrides in the database
 * Caching over-ridden messages in, or whatever is set to
 * Resolving the remainder of the sequence

The last bullet is important. allow MediaWiki to fall back on another language if the original does not have a message being asked for. As mentioned in the next section, most of the language fallback resolution occurs at a lower level. However, only the  layer checks the database for overridden messages. Thus integrating overridden messages from the database into the fallback chain is done here. If not using the database, this entire layer can be disabled.

LocalisationCache
参见

LCStore
The  class is merely a back-end implementation used by the LocalisationCache class for actually caching and retrieving messages. Like the  class, which is used for general caching in MediaWiki, there are a number of different cache types (configured using ):
 * "db" (default) - Caches messages in the database
 * "file" (default if  is set) - Uses CDB to cache messages in a local file
 * "accel" - Uses APC or another opcode cache to store the data

The "file" option is used by the Wikimedia Foundation, and is recommended because it is faster than going to the database and more reliable than the APC cache, especially since APC is incompatible with PHP versions 5.5 or later.

许可
Any edits made to the language must be licensed under the terms of the GNU General Public License to be included in the MediaWiki software. Other extensions may be under different licences.

旧的本地翻译系统
With MediaWiki 1.3.0, a new system was set up for localising MediaWiki. Instead of editing the language file and asking developers to apply the change, users could edit the interface strings directly from their wikis. This is the system in use as of August 2005. People can find the message they want to translate in Special:AllMessages and then edit the relevant string in the  namespace. Once edited, these changes are live. There was no more need to request an update, and wait for developers to check and update the file.

The system is great for Wikipedia projects; however a side effect is that the MediaWiki language files shipped with the software are no longer quite up-to-date, and it is harder for developers to keep the files on meta in sync with the real language files.

As the default language files do not provide enough translated material, we face two problems:

This is especially unfortunate for the smaller languages which don't have many translators.
 * 1) New Wikimedia projects created in a language which has not been updated for a long time, need a total re-translation of the interface.
 * 1) Other users of MediaWiki (including Wikimedia projects in the same language) are left with untranslated interfaces.

This is not such a big issue anymore, because translatewiki.net is advertised prominently and used by almost all translations. Local translations still do happen sometimes but they're strongly discouraged. Local messages mostly have to be deleted, moving the relevant translations to translatewiki.net and leaving on the wiki only the site-specific customisation; there's a huge backlog especially in older projects, [//toolserver.org/~robin/?tool=cleanuplocalmsgs this tool] helps with cleanup.

保持消息集中和同步
英语消息很少与代码不同步. 经验表明，将所有英文消息放在同一个地方很方便. 修改英文文本可以在不参考代码的情况下完成，就像翻译一样. 程序员有时会对默认文本做出不尽人意的选择.

什么可以本地化
So many things are localisable on MediaWiki that not all of them are directly available on translatewiki.net: see translatewiki:Translating:MediaWiki. If something requires a developer intervention on the code, you can request it on Phabricator, or ask at Support if you don't know what to do exactly.


 * Namespaces (both core and extensions', plus gender-dependent user namespaces)
 * 工作日（和缩写）
 * 月份 (和缩写)
 * Special:BookSources的書店
 * 皮肤名称
 * 数学名称
 * (for compatibility with old MediaWiki databases)
 * 覆盖默认用户选项
 * 语言名称
 * 国家名称（通过）
 * 货币名称（通过）
 * 时区
 * Character encoding conversion via
 * UpperLowerCase first (needs casemaps for some)
 * UpperLowerCase
 * Uppercase words
 * Uppercase word breaks
 * Case folding
 * Strip punctuation for MySQL search (search optimisation)
 * Get first character
 * Alternate encoding
 * Recoding for edit (and then recode input)



By default the link trail is "a-z"; you may want to add the accentuated or non-Latin letters used by your language to the list. Avoid deprecated, grandfathered and private-use codes: look at what they mean in standard ISO 639, and avoid codes assigned to collections/families of languages in ISO 639-5, and ISO 639 codes which were not imported in the IANA database for BCP 47)
 * Fallback languages (that is, other more closely related language(s) to use when a translation is not available, instead of the default fallback, which is English)
 * Directionality (left to right or right to left, RTL)
 * Direction mark character depending on RTL
 * Arrow depending on RTL
 * 不能使用斜体的语言
 * Number formatting (comma-ify, i.e. adding or not digits separators; transform digits; transform separators)
 * Truncate (multibyte)
 * Grammar conversions for inflected languages
 * Plural transformations
 * Formatting expiry times
 * Segmenting for diffs (Chinese)
 * Convert to variants of language (between different orthographies, or scripts)
 * Language specific user preference options
 * and link prefix, e.g.:  These are letters that can be glued after/before the closing/opening brackets of a wiki link, but appear rendered on the screen as if part of the link (that is, clickable and in the same colour).
 * Language code (preferably used according to the latest RFC in standard BCP 47, currently RFC 5646, with its associated IANA database.
 * 强调的类型
 * The extension has a special page file per language,   for language code.

Neat functionality:


 * I18N
 * 罗马数字格式

名字空间别名
Namespace name aliases are additional names which can be used to address existing namespaces. They are rarely needed, but not having them when they are, usually creates havoc in existing wikis.

You need namespace name aliases:

Variants are selectable in the user preferences. Users always see their selected variant, except in wikitext, but when editing or searching, an arbitrary variant can be used. 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.
 * 1) When a language has variants, and these variants spell some namespaces differently, and you want editors to be able to use the variant spellings.
 * 1) When an existing wiki's language, fall back language(s), or localisation is changed, with it are changed some namespace names.

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.

区域设置
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.

时间和日期格式
时间和日期显示在特殊页面等地方. 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. 匿名用户也可以看到默认格式. 注册用户可以在其参数设置中选择其他格式.

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. 如果你不理解上一句话，那没关系. You can provide a list of examples for.

Old edit window toolbar buttons

 * Not to be confused with the much more common 's "advanced toolbar", which has similar features.

When a wiki page is being edited, and a user has allowed it in their Special:Preferences, a set of icons is displayed above the text area where one can edit. The toolbar buttons can be set but there are no messages for it. What we need is a set of properly sized  files. Plenty of samples can be found in commons:Category:ButtonToolbar, and there is an empty button image to start off from.

Missing
''' This section is missing about the changes in the i18n system related to extensions. The format was standardised and messages are automatically loaded. '''

See #Message sources.

External tools internationalization
To facilitate the internalization and localization of external tools, such as those located in, you can use the Banana library. It allows you to use some magic words:



参见

 * 資源
 * translatewiki.net – MediaWiki本地化站点
 * How to i18n your code - a presentation about i18n, l10n and m17n in general and about doing it in MediaWiki in particular.
 * (overview) and (how to use messages, for developers)
 * 统计和问题
 * MediaWiki bug reports for Internationalisation
 * 其它
 * How to start a new Wikipedia? Translate the interface
 * - installation and configuration of a small wiki-family (for administrators)
 * Do’s and Don’ts in software development before product localization – 12 brief points
 * Debian's Introduction to i18n
 * Unicode Technical Reports (also specifications by topic)
 * - installation and configuration of a small wiki-family (for administrators)
 * Do’s and Don’ts in software development before product localization – 12 brief points
 * Debian's Introduction to i18n
 * Unicode Technical Reports (also specifications by topic)
 * Unicode Technical Reports (also specifications by topic)