使应用可本地化

本地化的应用是一种可针对其他市场、语言或区域进行本地化的应用,无需发现应用中的任何功能缺陷。 可本地化应用的最基本属性是其可执行代码已与其可本地化资源完全分离。 因此,应确定需要本地化哪些应用的资源。 询问你的应用是否要针对其他市场进行本地化,需要更改哪些内容。

我们还建议你熟悉 全球化准则。

将字符串放入资源文件(.resw)

不要在命令性代码、XAML 标记和应用包清单中硬编码字符串文本。 请将字符串放入资源文件(.resw)中,以便可以独立于应用的已生成二进制文件适配不同的本地市场。 有关详细信息,请参阅 在 UI 和应用包清单中本地化字符串

本主题还演示如何向默认资源文件(.resw)添加注释。 例如,如果你采用非正式的声音或语气,请确保在评论中解释这一点。 此外,若要尽量减少费用,请确认仅向翻译人员提供需要翻译的字符串。

在应用包清单源文件(Package.appxmanifest 文件)中适当设置应用的默认语言。 默认语言确定当用户的首选语言与应用的任何受支持语言不匹配时使用的语言。 使用其语言(甚至默认语言(例如 \Assets\en-us\Logo.png)标记所有资源,以便系统可以判断资源位于哪个语言以及在特定情况下如何使用它。

为语言定制图像和其他文件资源

理想情况下,你将能够将图像全球化,也就是说,使它们与区域性无关。 对于任何无法实现的图像和其他文件资源,请根据需要创建任意不同的变体,并将相应的语言限定符放入其文件或文件夹名称中。 若要了解更多信息,请参阅 定制您的资源以适应语言、缩放、高对比度和其他限定符

为了最大程度地降低本地化成本,请勿在一开始就将文本或文化敏感材料放入图像中。 适合自己文化的图像可能在其他文化中被认为冒犯或解读错误。 避免使用文化特定的图像,例如信箱,因为这些图片在世界各地并不普遍。 避免宗教符号、动物、政治或性别特定的图像。 肉体、身体部位或手势的显示也可能是一个敏感的主题。 如果无法避免所有这些内容,则需要对图像进行深思熟虑的本地化。 如果要将内容本地化为与您自己的阅读方向不同的语言,使用对称的图像和效果可以更轻松地实现镜像支持。

同时避免在图像中使用文本,以及音频/视频文件中的语音。

应用中的颜色用法

使用颜色时请注意。 使用与国旗或政治运动关联的颜色组合可能会有问题。 文化专家可能需要审查颜色选择。 使用颜色也存在辅助功能问题。 如果使用颜色来传达含义,则还应通过一些其他方式(如大小、形状或标签)传达相同的信息。

考虑将字符串分解为句子

使用适当大小的字符串。 短字符串更易于翻译,它们支持翻译回收(这可以节省费用,因为同一字符串不会多次发送到本地化程序)。 此外,本地化工具可能不支持极长字符串。

但与本指南相矛盾的是,重新在不同上下文中使用字符串存在风险。 即使是简单的单词(如“on”和“off”)也可能以不同的方式翻译,具体取决于上下文。 在英语中,“on”和“off”可用于切换飞行模式、蓝牙和设备。 在意大利语中,翻译取决于打开和关闭的内容所处的语境。 需要为每个上下文创建一对字符串。 如果两个上下文相同,则可以重复使用字符串。 例如,可以重复使用声音效果音量和音乐音量的字符串“Volume”,因为两者都指的是声音的强度。 在引用硬盘卷时,不应重复使用同一字符串,因为上下文和含义不同,并且该单词可能以不同的方式翻译。

此外,字符串(如“text”或“fax”)可用作英语中的动词和名词,这可能会混淆翻译过程。 而是为谓词和名词格式创建单独的字符串。 如果不确定上下文是否相同,请谨慎行事,并使用不同的字符串。

简言之,请将字符串分解为适用于所有上下文的片段。 在某些情况下,字符串需要是整个句子。

请考虑以下字符串:“{0} 无法同步。”

各种词语可以替换 {0},例如“约会”、“任务”或“文档”。 虽然本示例适用于英语,但它在所有情况下都不适用于相应的句子,例如德语。 请注意,在以下德语句子中,模板字符串(“Der”、“Die”、“Das”)中的一些单词需要匹配参数化单词:

英语 德语
无法同步预约。 Der Termin konnte nicht synchronisiert werden.
无法同步任务。 Die Aufgabe konnte nicht synchronisiert werden.
无法同步文档。 Das Dokument konnte nicht synchronisiert werden.

作为另一个示例,请考虑句子“在 {0} 分钟提醒我”。使用“minute(s)”适用于英语,但其他语言可能使用不同的术语。 例如,根据上下文,波兰语言使用“minuta”、“minuty”或“minut”。

若要解决此问题,请本地化整个句子,而不是单个单词。 这样做可能看起来像是额外的工作,并且是一个不够优雅的解决方案,但它是最佳解决方案,因为:

  • 将为所有语言显示语法正确的消息。
  • 翻译器无需询问将替换哪些字符串。
  • 在应用完成后出现类似这样的问题时,无需实现成本高昂的代码修复。

字符串的其他注意事项

避免使用默认语言创作的字符串中的口语和隐喻。 特定于人口统计组的语言(如文化和年龄)可能很难理解或翻译,因为只有该人口统计组中的人使用该语言。 同样,比喻对一个人来说可能有意义,但对别人毫无意义。 例如,“蓝鸟”在滑雪文化中有特定含义,但那些不属于该文化的人不了解其内涵。

不要使用技术行话、缩写或首字母缩略词。 技术语言不太可能被来自其他文化或地区的非技术受众或人员理解,而且很难翻译。 人们不会在日常对话中使用这类字词。 技术语言通常出现在错误消息中,以识别硬件和软件问题,但只有当用户需要该级别的信息时,才应将字符串字符串设置为技术 ,并且可以执行操作或查找能够的人员。

在字符串中使用非正式语音或语气是一个有效的选择。 可以使用默认资源文件中的注释(.resw)来指示该意向。

伪本地化

伪本地化您的应用程序,以发现所有本地化问题。 伪本地化是一种本地化试运行或披露测试。 生成了一组未真正翻译的资源,这些资源只是看起来像被翻译过一样。 你的字符串比默认语言大约长 40%,并且它们包含分隔符,以便你一目了然地查看它们是否已在 UI 中截断。

部署注意事项

当你安装包含本地化语言数据的应用时,你可能会发现,即使最初包含多种语言的资源,应用也只能使用默认语言。 这是因为安装过程经过优化,仅安装与设备当前语言和区域性匹配的语言资源。 因此,如果您的设备配置为 en-US,应用程序将仅安装 en-US 的语言资源。

注释

在初始安装后,无法为应用安装其他语言支持。 如果在安装应用后更改默认语言,应用将继续仅使用原始语言资源。

如果要确保在安装后所有语言资源都可用,请为应用包创建配置文件,指定安装期间需要某些资源(包括语言资源)。 在打包过程中生成应用程序的 .appxbundle 时,会自动启用此优化的安装功能。 有关详细信息,请参阅 ,确保无论设备是否需要,都要在设备上安装资源

(可选)若要确保所有资源都已安装(而不仅仅是子集),可以在打包应用时禁用 .appxbundle 生成。 但不建议这样做,因为它可能会增加应用的安装时间。

通过将“生成应用捆绑包”属性设置为“never”,禁用 .appxbundle 的自动生成:

  1. 在 Visual Studio 中,右键单击项目名称
  2. 选择 应用商店 ->创建应用包...
  3. “创建包” 对话框中,选择 我想使用新的应用名称 将包上传到 Microsoft Store,然后单击 “下一步”
  4. 在“选择应用名称 对话框中,选择/创建包的应用名称。
  5. “选择和配置包”对话框中,将 生成应用捆绑包 设置为“永不”。

地缘政治意识

避免在绘制地图或提及地区时引发政治冒犯。 地图可能包括有争议的地区或国家边界,它们是政治犯罪的频繁来源。 请注意,用于选择国家/地区的任何 UI 都将其称为“国家/地区”。 在标记为“国家/地区”的列表中列出争议领土(如地址表单中)可能会冒犯某些用户。

语言和区域更改事件

订阅系统的语言和区域设置发生更改时引发的事件。 执行此操作,以便可以根据需要重新加载资源。 有关详细信息,请参阅 更新字符串以响应限定符值更改事件更新图像以响应限定符值更改事件

在设置字符串格式时确保正确的参数顺序

不要假定所有语言都按相同顺序表达参数。 例如,请考虑此格式。

    string.Format("Every {0} {1}", monthName, dayNumber); // For example, "Every April 1".

此示例中的格式字符串适用于英语(美国)。 但它不适用于德国(德国),例如,日和月以相反的顺序显示。 确保翻译人员知道每个参数的意图,以便他们可以根据目标语言反转格式字符串(例如,“{1}{0}”)格式项的顺序。

不要过度本地化

仅向翻译人员提交自然语言;不是编程语言,也不是标记。 <link> 标记不是自然语言。 请考虑这些示例。

请勿本地化 将此项进行本地化
<链接>使用条款</link> 使用条款
< >隐私策略链接</link> 隐私策略

在 Resources 文件(.resw)中包括 <link> 标记意味着它也可能被翻译。 这会使标记无效。 如果有长字符串需要包含标记才能维护上下文并确保排序,请在注释中明确说明不翻译的内容。

选择适当的翻译方法

将字符串分隔为资源文件后,可以转换它们。 转换字符串的理想时间是在项目中的字符串最终完成之后,通常发生在项目末尾。 可以通过多种方式处理翻译过程。 这可能取决于要翻译的字符串量、要翻译的语言数以及翻译方式(例如内部与雇佣外部供应商)。

请考虑这些选项。

  • 可以通过直接在项目中打开资源文件来翻译它们。 此方法适用于需要翻译成两三种语言的少量字符串的项目。 它适用于开发人员讲多种语言且愿意处理翻译过程的情况。 这种方法具有快速的优势,不需要任何工具,并最大限度地减少误译的风险。 但它不可缩放。 具体而言,不同语言的资源很容易失同步,从而导致用户体验不佳和维护问题。
  • 字符串资源文件采用 XML 或 ResJSON 文本格式,因此可以使用任何文本编辑器进行翻译。 然后将翻译的文件复制回项目中。 此方法有翻译人员意外编辑 XML 标记的风险,但它允许翻译工作在 Microsoft visual Studio 项目之外进行。 此方法适用于需要翻译成少量语言的项目。 XLIFF 格式是一种 XML 格式,专用于本地化,应得到某些本地化供应商或本地化工具的支持。 可以使用 多语言应用工具包 从其他资源文件(如 .resw 或 .resjson)生成 XLIFF 文件。

注释

其他资产(包括图像和音频文件)可能还需要本地化。

还应考虑以下事项:

  • 本地化工具 许多本地化工具可用于分析资源文件,并允许翻译人员仅编辑可翻译的字符串。 此方法可降低翻译人员意外编辑 XML 标记的风险。 但它有向本地化过程引入新工具和流程的缺点。 本地化工具适用于包含大量字符串但少量语言的项目。 若要了解详细信息,请参阅 如何使用多语言应用工具包
  • 本地化供应商 如果应用程序包含需要翻译成大量语言的大量字符串,请考虑使用本地化供应商。 本地化供应商可以提供有关工具和流程以及翻译资源文件的建议。 这是一个理想的解决方案,但也是最昂贵的选择,并可能会增加翻译内容的周转时间。

使访问密钥和标签保持一致

在辅助功能中同步使用的访问密钥与本地化访问键的显示是一项挑战,因为这两个字符串资源被分为两个单独的部分。 请务必为标签字符串提供注释,例如:Make sure that the emphasized shortcut key is synchronized with the access key.

支持可排序的日语字符串的 furigana

日语汉字字符具有多个阅读(发音)的属性,具体取决于所使用的单词。 当你尝试对日语命名对象(如应用程序名称、文件、歌曲等)进行排序时,这会导致问题。 日本汉字过去通常按计算机可理解的顺序排序,称为 XJIS。 不幸的是,由于这种排序顺序不是拼音,所以对人类来说并不十分有用。

Furigana 允许用户或创建者为正在使用的字符指定拼音来解决此问题。 如果使用以下过程将 furigana 添加到应用名称,则可以确保它在应用列表中的正确位置排序。 如果你的应用名称包含汉字字符,并且在用户的 UI 语言或排序顺序设置为日语时未提供假名标注,那么 Windows 会尽力生成适当的发音。 但是,应用名称可能包含罕见或独特的读音,它们可能会被归入更常见的读音之下进行排序。 因此,日语应用程序的最佳做法(尤其是名称中包含汉字字符的应用程序)是在应用名称中提供拼音版本,作为日语本地化过程的一部分。

  1. 添加“ms-resource:Appname”作为包显示名称和应用程序显示名称。

  2. 在字符串下创建 ja-JP 文件夹,并添加两个资源文件,如下所示:

    strings\
        en-us\
        ja-jp\
            Resources.altform-msft-phonetic.resw
            Resources.resw
    
  3. 在 Resources.resw 中,常规 ja-JP:为 “Appname”“希蒼” 添加字符串资源

  4. 在 Resources.altform-msft-phonetic.resw 中,为日语假名资源中的 AppName 添加假名值“のあ”。

用户可以使用富里加纳值“のあ”(noa)和拼音值(使用 )搜索应用名称“希蒼” 来自输入法编辑器(IME)的 GetPhonetic 函数“まれあお”(mare-ao)。

排序遵循 区域控制面板 格式:

  • 在日语用户环境下,
    • 如果已启用 furigana,则“希蒼”在“の”下排序。
    • 如果缺少 furigana,则“希蒼”在“ま”下排序。
  • 在非日语用户区域设置下,
    • 如果已启用 furigana,则“希蒼”在“の”下排序。
    • 如果缺少 furigana,则“希蒼”将排序在“汉字”下。

示例