本地化文件是可以在文本编辑器(如记事本或TextEdit)或程序员使用的各种增强文本编辑工具中打开和编辑的文本文件。这些文件通常遵循键值原则。这意味着它们包含与唯一ID(键)关联的文本片段(字符串)列表。因此,每个字符串都是一个值的键(这个简单的例子是Java编程中使用的本地化文件格式):
-
key1 = value1
-
key2 = value2
-
...
-
keyN = valueN
本地化文件的创建
本地化文件是具有简单结构的纯文本文件。它们可以手动创建,但通常由可用于不同开发环境的国际化工具或脚本自动生成。本地化文件的自动创建确保文件结构有效。
要创建本地化文件,所有可显示文本都在代码文件中被唯一ID替换。然后,文本字符串与其ID一起添加到本地化文件中。
本地化文件的使用
现在,代码中只包含键,而不是实际的文本字符串。当软件为用户生成视图时,这些键用于在本地化文件中查找关联的字符串。
如果应用程序设置为使用英语和西班牙语,则所有英语文本可能保存在名为English.txt的文件中,并且是默认文本位置。如果用户未选择语言,则所有文本将从此文件中提取以生成任何显示。如果用户选择西班牙语,则软件将重定向到Spanish.txt。许多语言可以与这样的系统一起使用。
优点是显示语言的选择不会影响代码。如果软件需要显示登录按钮,它可能需要与键 login_button 相关联的字符串,并且只需要知道在哪个文件中查找以检索给定语言的适当字符串。
字符串管理
作为一个基于键的翻译平台,Phrase 支持多种不同的资源文件类型。在 文件已上传 后,键 及其相关的字符串值被提取。然后将键和字符串以标准化格式呈现给译员。译员专注于他们的任务,而无需担心本地化文件的确切格式。他们可以检查键,因为键本身可以提供重要的上下文,并指导他们做出正确的单词选择。
当所有字符串都被翻译后,文件将被下载。在此过程中,创建所需的本地化文件格式,以匹配原始源文件。
资源 文件格式
支持四种广泛类型的资源,所有这些资源本质上都是基于文本的,可以在文本编辑器中打开和检查。
电子表格
.XLSX 和 .CSV 文件被支持。这些格式在本地化方面是等效的,并包含键值对的行。键在一行中,而相应的值在相邻的行中。具体使用哪个列取决于应用程序,地方化人员需要配置 Phrase 以正确解释列。 ZenDesk .CSV 文件具有固定结构,因此此文件类型不需要进一步调整:
"标题","默认语言","默认文本","英语文本","变体状态" "simple_key","German","Einfacher Schlüssel.","Simple key.","Current"
XML
XML是一种以<tags>形式提供元信息的格式。标签结构用于确定键及其对应值的位置,如下所示来自一个Android XML文件:
<string name="simple_key">只是一个带有消息的键。</string>
两种标准的XML翻译格式是.TMX和.XLIFF。这些不仅在一种语言中保存键和值,还将源语言的值对与目标语言的对应值关联。这样的文件通常是双语的,如这个Symfony Xliff文件中的翻译单元所示:
<trans-unit id="simple_key" resname="simple_key"> <source xml:lang="de-DE">Nur ein einfacher Schlüssel mit einer einfachen Nachricht.</source <target xml:lang="en-GB">只是一个带有简单消息的简单键。</target> </trans-unit>
QT程序使用的资源文件结构与这些标准化格式非常相似,但由于历史原因布局不同。
普通的键值列表
有一些资源文件仅包含简单的键值列表,如这个来自Ruby on Rails YAML的片段所示:
simple_key: 只是一个带有简单消息的简单键。
许多不同的编程语言或平台使用这样的格式,布局上有轻微的差异。
由于这些是单语文件,本地化程序需要维护这些文件的平行版本——一个用于源语言,其他用于目标语言。
Gettext生成包含附加信息的键值文件,例如描述性注释或复数变体:
# 这是这个键的惊人描述! msgid "key_with_description" msgid_plural "" msgstr[0] "看看这个!这个键有一个描述!(至少在某些格式中)" 看看这个!这个键有 %s 个描述!(至少在某些格式中)"
有一些功能和布局相似的竞争格式,它们在相对轻微的方面有所不同。
关联数组
虽然其他格式需要自定义代码(解析器)来读取,但有些格式对开发者和本地化人员来说更容易。基于 .JSON(JavaScript)和 .PHP 数组的格式可以直接读取并映射到易于操作的常见代码结构(数组)中。数组可以很复杂,不同的应用程序生成自定义数组结构。
例如,go-i18n JSON 将键称为 id:
{
"id": "simple_key",
"translation": "简单的键,简单的信息,太简单了。"
}
Angular 将键本身作为其数组中的键:
"simple_key": "我是一把简单的键,带有简单的信息。"。
由于这些轻微但至关重要的差异,广泛使用的 .JSON 和 .PHP 数组结构得到了支持。