maomi
介绍
入门
文档

i18n 国际化支持

激活 i18n 国际化支持

maomi 可以为不同语言生成不同的编译结果,即国际化支持。

默认情况下,国际化支持未启用。指定 MAOMI_I18N_LOCALE 环境变量就可以启用它。

MAOMI_I18N_LOCALE=en_US

如果这个环境变量经常变化,建议在 build.rs 中指定:

fn main() {
println!("cargo:rerun-if-env-changed=MAOMI_I18N_LOCALE");
}

翻译文件

启用国际化支持后, maomi 要求所有文本节点内容必须被翻译过。

未被翻译的文本字符串都将被标记为编译错误。

#[component(Backend = DomBackend)]
struct MyWebsite {
template: template! {
<div> "My Website" </div>
}
}

翻译字符串时,先创建一个 i18n/[LOCALE].toml 文件。以 i18n/zh_CN.toml 为例:

[translation]
"My Website" = "我的网站"

当编译 MAOMI_I18N_LOCALE=zh_CN 版本时,字符串将依据这个文件的内容来替换。

动态字符串翻译

如果文本是一个表达式,它的值类型必须是 LocaleString 或者 LocaleStaticStr ,不能是普通字符串。

#[component(Backend = DomBackend)]
struct MyWebsite {
template: template! {
<div> { "My Website" } </div>
}
}

如果字符串是静态的、可以被翻译文件翻译,则可以通过 i18n! 宏来翻译它。

#[component(Backend = DomBackend)]
struct MyWebsite {
template: template! {
<div> { i18n!("My Website") } </div>
}
}

如果字符串内容是动态的、不需要被翻译,可以把它直接标记为已翻译的。

use maomi::locale_string::LocaleString;
#[component(Backend = DomBackend)]
struct MyWebsite {
template: template! {
<div> { LocaleString::translated("My Website") } </div>
}
}

翻译组

[translation] 是翻译文件中被默认使用的组。也可以改用其他组。

#[component(Backend = DomBackend, Translation = my_group)]
struct MyWebsite {
template: template! {
<div> "My Website" </div>
}
}

在翻译文件中:

[my_group]
"My Website" = "我的网站"

对于动态字符串翻译,可以使用 i18n_group! 来获得这个组。

i18n_group!(my_group as trans);
#[component(Backend = DomBackend)]
struct MyWebsite {
template: template! {
<div> { trans!("My Website") } </div>
}
}

翻译文件的格式化工具

maomi-tools crate 提供了一个 maomi-i18n-format 工具,用来搜集所有未翻译的字符串并格式化翻译文件。

cargo install maomi-tools

设置 MAOMI_I18N_LOCALE 和 MAOMI_I18N_FORMAT_METADATA 来搜集翻译所需的信息。

MAOMI_I18N_LOCALE=zh_CN MAOMI_I18N_FORMAT_METADATA=on cargo check

然后格式化:

MAOMI_I18N_LOCALE=zh_CN maomi-i18n-format