本文档描述了 TypeScript 中的国际化 (i18n) 系统,重点介绍了诊断消息如何为不同语言进行本地化。国际化系统使 TypeScript 能够为全球用户以各种语言显示编译器错误、警告和信息性消息。
TypeScript 国际化系统主要关注诊断消息的本地化。这些是 TypeScript 编译器和语言服务向用户显示的错误消息、警告和信息性消息。该系统使用基于资源的方法,其中消息以英语定义,然后通过本地化文件翻译成其他语言。
TypeScript 中的国际化系统遵循一种简单的架构,侧重于使核心代码语言无关,同时支持本地化消息输出给用户。
来源
来源
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 文件,该文件遵循标准格式。
来源
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)。
来源
诊断消息是 TypeScript 国际化系统的核心。它们为用户提供有关错误、警告和其他信息的反馈。
每个诊断消息都由一个唯一的代码标识,该代码通常是一个数值。这些代码用于在运行时检索相应的消息文本。
诊断消息代码及其描述的示例
| 代码 | 消息标识符 | 描述 |
|---|---|---|
| 1006 | A_file_cannot_have_a_reference_to_itself | 文件不能有对自身的引用 |
| 1105 | A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement | break 语句只能在包含的迭代或 switch 语句中使用 |
| 1116 | A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement | break 语句只能跳转到包含语句的标签 |
| 1182 | A_destructuring_declaration_must_have_an_initializer | 解构声明必须有初始化器 |
| 2463 | A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature | 绑定模式参数在实现签名中不能是可选的 |
| 6917 | ALL_COMPILER_OPTIONS | 编译器选项标题 |
来源
诊断消息通常包含占位符,这些占位符会在运行时替换为特定值。例如,像这样的消息
A '{0}' modifier cannot be used with an import declaration.
包含一个占位符 {0},当显示错误时,它将被实际的修饰符名称填充。
来源
TypeScript 团队遵循特定流程来本地化诊断消息
来源
当 TypeScript 生成诊断消息时,它会遵循以下步骤
如果用户的区域设置没有可用的本地化,TypeScript 将回退到英语消息。
在为 TypeScript 添加新的诊断消息时,开发人员应遵循以下最佳实践
{0}、{1} 等)来表示消息的可变部分为 TypeScript 添加新语言支持需要
TypeScript 的国际化系统提供了一个强大的框架,用于向全球用户交付本地化的诊断消息。通过将消息定义与其翻译分开并使用基于资源的方法,TypeScript 维护了干净的代码库,同时支持多种语言。