消息翻译
Fuchsia 本地化功能提供的第一个功能是消息翻译。从概念上讲,这让程序能够以用户选择的语言显示面向用户的消息。这是通过对语言区域敏感的格式设置进行打印实现的。该程序需要保留存储用户本地化偏好设置的“本地化上下文”。当程序执行过程中需要在屏幕上以用户的母语(例如,西班牙语会编码为“es”,欧洲西班牙语为“es”,美洲西班牙语为“es-419”)显示消息“Hello world!”时,程序可以通过向抽象 [Lookup]
服务提供原始消息和所需的翻译来查找翻译。从概念上讲,这相当于代码中的一行
符合以下常规模式:
[Lookup].String({locale-ids=["es-419"]}, MSG_Hello_World) ⇒ (yields the translation)
在上述示例中,[Lookup]
可以是任何类型的可调用端点:它可以是库公开的函数,也可以是通过网络提取转换的 RPC 桩的接口点。此处将“提取经过翻译的消息”的抽象操作称为 String
,以将其与对类型化数据的其他可能调用(例如 StringArray
或其他调用)区分开来。
请注意,消息可能要比这复杂得多,这就是我们 通常不希望程序作者直接处理它们,而是 通过邮件 ID 发送。
还有两点需要注意:
- 语言标识符指定为 Unicode 语言区域 ID(因此示例中使用了命名参数
locale-ids
),并且可以一次提供多个此类语言区域 ID。这是因为用户可能有多个 首选语言,并且可以按偏好设置语言层次结构。 这样,本地化系统就可以选择最佳的可用消息, 可能会以多种语言提供 - 消息未在代码中指定为字符串表示法。而是通过唯一的消息标识符来引用。在上面的示例中,此变量被任意命名为
MSG_Hello_World
。虽然 对于字符串是内化还是外化, 我们选择了后者主要原因是保留了源代码 没有语言问题,这使得翻译工具链 更易于维护,而且大规模翻译也更容易 管理。
上述示例涉及两个主要问题:
[Lookup]
服务的具体接口是什么样的 所选程序员的语言?此外,- 我的程序如何才能提供翻译 该怎么办?
我们会在介绍 Lookup API 时依次回答这些问题。