菜单

国际化

相关源文件

本文档描述了 TypeScript 中的国际化 (i18n) 系统,重点介绍了诊断消息如何为不同语言进行本地化。国际化系统使 TypeScript 能够为全球用户以各种语言显示编译器错误、警告和信息性消息。

概述

TypeScript 国际化系统主要关注诊断消息的本地化。这些是 TypeScript 编译器和语言服务向用户显示的错误消息、警告和信息性消息。该系统使用基于资源的方法,其中消息以英语定义,然后通过本地化文件翻译成其他语言。

关键组件

  • 诊断消息定义:以英语定义并带有唯一标识符的消息
  • 本地化 (LCL) 文件:包含支持语言翻译的基于 XML 的文件
  • 诊断消息工厂:用于检索相应本地化消息的运行时系统

架构

TypeScript 中的国际化系统遵循一种简单的架构,侧重于使核心代码语言无关,同时支持本地化消息输出给用户。

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl
  • src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl

诊断消息流

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl
  • src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl

本地化文件结构

TypeScript 中的本地化文件遵循一种称为 LCX (Localization Exchange) 的特定基于 XML 的格式。每种受支持的语言都有自己的 LCL 文件,其中包含英语诊断消息的翻译。

文件组织

本地化文件存储在 src/loc/lcl/ 目录中,按语言代码组织

  • chs:简体中文
  • cht:繁体中文
  • plk:波兰语
  • ptb:巴西葡萄牙语
  • esn:西班牙语
  • csy:捷克语
  • rus:俄语
  • fra:法语
  • trk:土耳其语
  • deu:德语
  • ita:意大利语
  • kor:韩语

每个语言目录都包含一个 diagnosticMessages/diagnosticMessages.generated.json.lcl 文件,该文件遵循标准格式。

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl
  • src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl
  • src/loc/lcl/plk/diagnosticMessages/diagnosticMessages.generated.json.lcl

LCL 文件结构

LCL 文件遵循基于 XML 的结构,包含以下关键元素

<?xml version="1.0" encoding="utf-8"?>
<LCX SchemaVersion="6.0" Name="..." PsrId="306" FileType="1" SrcCul="en-US" TgtCul="[target-language]">
  <Props>
    <!-- Metadata properties -->
  </Props>
  <OwnedComments>
    <!-- Comment types -->
  </OwnedComments>
  <Settings Name="@vsLocTools@\current\default.lss" Type="LSS" />
  <Item ItemId=";String Table" ItemType="0" PsrId="306" Leaf="false">
    <Disp Icon="Expand" Expand="true" Disp="true" LocTbl="false" />
    <Item ItemId=";Strings" ItemType="0" PsrId="306" Leaf="false">
      <Disp Icon="Str" Disp="true" LocTbl="false" />
      <Item ItemId=";[diagnostic_code]" ItemType="0" PsrId="306" Leaf="true">
        <Str Cat="Text">
          <Val><![CDATA[English message text]]></Val>
          <Tgt Cat="Text" Stat="Loc" Orig="New">
            <Val><![CDATA[Translated message text]]></Val>
          </Tgt>
        </Str>
        <Disp Icon="Str" />
      </Item>
      <!-- More diagnostic messages -->
    </Item>
  </Item>
</LCX>

每个诊断消息都有一个唯一的标识符(通常是描述性名称后跟一个数字代码),并且同时包含原始英语文本(Val)和翻译文本(Tgt)。

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:1-40

诊断消息系统

诊断消息是 TypeScript 国际化系统的核心。它们为用户提供有关错误、警告和其他信息的反馈。

诊断消息标识符

每个诊断消息都由一个唯一的代码标识,该代码通常是一个数值。这些代码用于在运行时检索相应的消息文本。

诊断消息代码及其描述的示例

代码消息标识符描述
1006A_file_cannot_have_a_reference_to_itself文件不能有对自身的引用
1105A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statementbreak 语句只能在包含的迭代或 switch 语句中使用
1116A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statementbreak 语句只能跳转到包含语句的标签
1182A_destructuring_declaration_must_have_an_initializer解构声明必须有初始化器
2463A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature绑定模式参数在实现签名中不能是可选的
6917ALL_COMPILER_OPTIONS编译器选项标题

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:24-27
  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:105-113
  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:114-121
  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:399-406
  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:96-104

消息格式化

诊断消息通常包含占位符,这些占位符会在运行时替换为特定值。例如,像这样的消息

A '{0}' modifier cannot be used with an import declaration.

包含一个占位符 {0},当显示错误时,它将被实际的修饰符名称填充。

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl:33-40

本地化过程

TypeScript 团队遵循特定流程来本地化诊断消息

来源

  • src/loc/lcl/chs/diagnosticMessages/diagnosticMessages.generated.json.lcl
  • src/loc/lcl/cht/diagnosticMessages/diagnosticMessages.generated.json.lcl

使用本地化消息

当 TypeScript 生成诊断消息时,它会遵循以下步骤

  1. 确定问题的相应诊断代码
  2. 从环境中确定用户的区域设置
  3. 查找该区域设置本地化资源中的消息模板
  4. 使用特定参数格式化消息
  5. 将本地化消息显示给用户

如果用户的区域设置没有可用的本地化,TypeScript 将回退到英语消息。

国际化最佳实践

在为 TypeScript 添加新的诊断消息时,开发人员应遵循以下最佳实践

  1. 对源消息使用清晰、简洁的英语文本
  2. 使用编号占位符{0}{1} 等)来表示消息的可变部分
  3. 提供关于消息何处以及如何使用的上下文
  4. 避免可能难以翻译的文化特定引用或习语
  5. 使用与现有诊断消息一致的术语

添加新语言

为 TypeScript 添加新语言支持需要

  1. 为该语言创建新的 LCL 文件
  2. 翻译所有诊断消息
  3. 更新构建过程以包含新语言
  4. 测试本地化消息

结论

TypeScript 的国际化系统提供了一个强大的框架,用于向全球用户交付本地化的诊断消息。通过将消息定义与其翻译分开并使用基于资源的方法,TypeScript 维护了干净的代码库,同时支持多种语言。