国际化

我们是一个拥有众多全球用户的应用程序。为了帮助他们以自己的语言使用 Metabase,我们所有的字符串都标记为 i18n。

快速指南

如果您需要添加新字符串(请谨慎添加文本),请执行以下操作:

  1. 在前端使用 tjt ES6 模板字面量标记字符串(详见 https://ttag.js.org/)
const someString = t`Hello ${name}!`;
const someJSX = <div>{jt`Hello ${name}`}</div>;

在后端使用 trs(使用站点语言)或 tru(使用当前用户的语言)

(trs "Hello {0}!" name)

翻译错误或缺失字符串

如果您发现语言的字符串不正确或缺失,请访问我们的 Crowdin 项目并在那里提交您的修复。

后端翻译指南

Metabase 支持多种语言的翻译。权威列表可在 resources/locales.clj 中找到。

Metabase 方面

Metabase 关注两种不同的本地化:翻译为服务器的语言环境和翻译为用户的语言环境。区别主要在于:这会记录在服务器上还是通过网络发送回用户。

要为服务器翻译字符串,请使用 metabase.util.i18n/trs;要为用户的语言环境翻译,请使用类似的 metabase.util.i18n/tru。可以理解为 tr-servertr-user

工作原理

从高层次看,要翻译的字符串被视为源字符串到本地化字符串映射的查找键。这个翻译后的字符串像这样使用:


;; from source of `translate` in `metabase.util.i18n`

(.format (MessageFormat. looked-up-string) (to-array args))

其余的主要是记录。这使用 java.text.MessageFormat 类来拼接格式参数。

函数 trstru 分别创建 SiteLocalizedStringUserLocalizedString 两个记录的实例,并重写了 toString 方法。此方法将查找当前语言环境(用户或站点,视情况而定),查找要翻译的字符串到相关的翻译字符串,然后调用 MessageFormat 上的 .format 方法。

从源字符串到翻译字符串的映射

我们构建过程中的一个步骤会为我们支持的每种语言环境创建源字符串到翻译字符串的 edn 文件。这些文件位于 resources/i18n。如果您没有这些文件,可以运行 bin/build-translation-resources 来生成它们。

我们有许多贡献者帮助我们维护大量不同语言的翻译字符串语料库。我们使用 Crowdin 来维护权威列表。我们从中导出 .po 文件,它本质上是一个从源字符串到翻译字符串的字典。作为我们构建过程的一部分,我们为每个语言环境将这些文件格式化为 edn 文件,即从源字符串到翻译字符串的映射。

格式参数

除了字符串字面量,我们还希望翻译包含参数拼接在中间的字符串。我们使用前面提到的 java.text.MessageFormat 类的语法。这些是零索引参数,形式为 {0}{1}

例如,

(trs "{0} accepted their {1} invite" (:common_name new-user) (app-name-trs))
(tru "{0}th percentile of {1}" p (aggregation-arg-display-name inner-query arg))
(tru "{0} driver does not support foreign keys." driver/*driver*)

转义

每种字符串语言都需要一个转义字符。由于 {0} 是一个要拼接的参数,那么如何在字符串中放入字面量“{0}”呢?撇号(apostrophe)充当此角色,并在 MessageFormat javadocs 中进行了描述。

然而,这有一个不幸的副作用。由于撇号在口语中非常常见(尤其是在法语中),我们经常会遇到将转义字符用作字符串的常规部分而非转义字符的情况。格式字符串需要使用双撇号,如 (deferred-tru "SAML attribute for the user''s email address") 来转义撇号。

法语中有很多翻译字符串错误地使用了单撇号(例如“l’URL”而不是“l’‘URL”)。我们在 bin/i18n/src/i18n/create_artifacts/backend.clj 中对此进行了手动修复,我们尝试识别这些不是转义字符的撇号并将其替换为双引号。

阅读其他版本的 Metabase 的文档。

这有帮助吗?

感谢您的反馈!
想改进这些文档吗?提出修改建议。
© . This site is unofficial and not affiliated with Metabase, Inc.