#translation #proc-macro #internationalization #applications #gettext #help #language

gettext-macros

几个过程宏,帮助国际化Rust应用程序

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 过程宏

Download history 18/week @ 2024-04-08 24/week @ 2024-04-15 18/week @ 2024-04-22 16/week @ 2024-04-29 27/week @ 2024-05-06 23/week @ 2024-05-13 21/week @ 2024-05-20 12/week @ 2024-05-27 15/week @ 2024-06-03 49/week @ 2024-06-10 48/week @ 2024-06-17 16/week @ 2024-06-24 22/week @ 2024-07-01 32/week @ 2024-07-08 27/week @ 2024-07-15 75/week @ 2024-07-22

每月158次下载

GPL-3.0 许可证

30KB
543

Gettext宏 Crates.io Docs.rs

一些过程宏,帮助您国际化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提供的宏,应遵循的顺序是

  1. init_i18n!
  2. i18n!t!,根据需要多次调用
  3. compile_i18n!
  4. include_i18n!

因为这些宏中的某些需要依赖前一个宏生成的文件才能正常工作。

依赖项

~4MB
~69K SLoC