9 个版本 (5 个破坏性更新)
0.6.1 | 2022年2月26日 |
---|---|
0.6.0 | 2020年7月24日 |
0.5.2 | 2019年8月29日 |
0.5.1 | 2019年6月15日 |
0.4.0 | 2019年3月5日 |
#428 in 过程宏
每月158次下载
30KB
543 行
Gettext宏
一些过程宏,帮助您国际化Rust应用程序。
它底层使用gettext。想法是通过在宏中包装字符串,将它们添加到翻译文件模板(.pot
文件)。然后,为每种语言生成实际的翻译文件(.po
),您可以上传到Weblate/Crowdin/POedit等平台进行翻译。最后,它们被转换为二进制翻译文件(.mo
),您可以将其嵌入到您的应用程序中。
它是如何工作的?
有五个主要宏
init_i18n
,应该首先调用。它告诉当前crate使用的域和受支持的区域设置。compile_i18n
,应该在main.rs
的末尾调用。它更新翻译文件并将它们编译。include_i18n
,将翻译嵌入到您的二进制文件中,使其更容易分发。应该在compile_i18n
之后调用以正确工作。i18n
,翻译给定的消息。t
,类似于i18n
,但实际上不翻译消息,只是将其添加到待翻译字符串列表中。
这些宏的优势在于,它们允许您与多个翻译域(例如,每个工作空间的crate一个)一起工作,并且自动为这些域生成一个.pot文件。
示例
main.rs
use gettext_macros::*;
// The translations for this crate are stored in the "my_app" domain.
// Translations for all the listed languages will be available.
init_i18n!("my_app", ar, de, en, fr, it, ja, ru);
fn main() {
let catalog = cat();
println!("{}", i18n!(catalog, "Hello, world!"));
let name = "Jane";
println!("{}", i18n!(catalog, "Hello, {}!"; name));
let message_count = 42;
println!("{}", i18n!(catalog, "You have one new message", "You have {0} new messages"; message_count));
}
fn cat() -> gettext::Catalog {
// include_i18n! embeds translations in your binary.
// It gives a Vec<(&'static str, Catalog)> (list of catalogs with their associated language).
let catalog = include_i18n!()[0]
}
// Generate or update .po from .pot, and compile them to .mo
compile_i18n!();
宏的顺序
这些宏应该按特定顺序调用才能正常工作。这个顺序不依赖于程序流程,而依赖于Rust解析器的流程。Rust会按照您在代码中编写的顺序执行宏。例如
i_am_expanded_first!();
then_i_am_expanded!()
或者,对于有模块的项目
// In main.rs
first_macro!();
mod a;
third_macro!();
// In a.rs
second_macro!();
因此,对于此crate提供的宏,应遵循的顺序是
init_i18n!
i18n!
和t!
,根据需要多次调用compile_i18n!
include_i18n!
因为这些宏中的某些需要依赖前一个宏生成的文件才能正常工作。
依赖项
~4MB
~69K SLoC