18 个版本
0.7.0 | 2023年10月11日 |
---|---|
0.6.0 | 2023年2月1日 |
0.5.3 | 2022年8月16日 |
0.5.2 | 2022年6月20日 |
0.0.2 |
|
#72 在 国际化(i18n)
123 每月下载量
26KB
488 行
twine
使用 Twine 文件格式的国际化库。
用法
-
您需要在
[build-dependencies]
中的Cargo.toml
添加 twine。 -
创建(或编辑)您的
build.rs
文件
fn main() {
println!("cargo:rerun-if-changed=build.rs");
twine::build_translations(&["translations.ini"], "i18n.rs");
}
- 您需要一个包含您翻译的 INI 文件。例如,使用
translations.ini
[app_ruin_the_band]
en = Ruin a band name by translating it in French
fr = Ruiner le nom d'un groupe en le traduisant en français
[band_tool]
en = Tool
fr = Outil
[band_the_doors]
en = The Doors
fr = Les portes
[band_rage_against_the_machine]
en = Rage Against the Machine
en-gb = Wrath Against the Machine
fr = Colère contre la machine
[band_the_jackson_5]
en = The Jackson 5
fr = Les 5 fils de Jack
[format_string]
en = %s, %@!
fr = %s, %@ !
[format_percentage]
en = %.0f%
fr = %.0f %
[format_hexadecimal]
en = %x
fr = %#X
- 现在在您的项目中,您可以使用宏
t!
来翻译任何内容
// you need to include the generated file somewhere
include!(concat!(env!("OUT_DIR"), "/i18n.rs"));
fn main() {
// use "" if there is no localization
let lang = Lang::Fr("be");
// will output "Ruiner le nom d'un groupe en le traduisant en français"
t!(app_ruin_the_band => lang);
// using formatted arguments, this will output "73 %"
t!(format_percentage, 73.02f32 => lang);
}
- 禁用错误的编译器 lint
macro_expanded_macro_exports_accessed_by_absolute_paths
这个 rustc lint 不会正常工作,通常会给出错误的正例。您可以通过在 lib.rs
或 main.rs
的开头添加以下内容来在 crate 级别禁用它
#![allow(macro_expanded_macro_exports_accessed_by_absolute_paths)]
实现说明
所有翻译键必须包含所有键的所有语言。例如,如果所有键都有 en
和 fr
的翻译,如果一个键只有 en
,则编译会失败。
可以提供本地化翻译,如果可用,则将使用它。否则,将回退到该语言的默认翻译。
键中的任何拼写错误都会使编译失败。缺少格式参数也会使编译失败。
特性
serde
:当此特性被激活时,您需要将serde
添加到您的依赖项中,并且生成的Lang
枚举实现了Serialize
和Deserialize
。
许可证
本作品采用 Apache 2.0 和 MIT 双许可。如果您使用此作品,可以选择其中之一。
许可证:MIT OR Apache-2.0
依赖项
~2.2–3.5MB
~55K SLoC