11 个版本 (6 个破坏性更新)

使用旧的 Rust 2015

0.7.0 2021 年 4 月 25 日
0.6.0 2021 年 3 月 3 日
0.5.0 2020 年 9 月 1 日
0.4.4 2019 年 9 月 22 日
0.3.0 2016 年 2 月 4 日

#26 in 国际化(i18n)

Download history 17397/week @ 2024-03-14 19671/week @ 2024-03-21 17222/week @ 2024-03-28 13904/week @ 2024-04-04 15145/week @ 2024-04-11 14884/week @ 2024-04-18 13363/week @ 2024-04-25 18402/week @ 2024-05-02 17474/week @ 2024-05-09 16032/week @ 2024-05-16 15348/week @ 2024-05-23 14773/week @ 2024-05-30 16728/week @ 2024-06-06 18747/week @ 2024-06-13 16541/week @ 2024-06-20 13218/week @ 2024-06-27

67,328 每月下载量
用于 26 个 crate(12 个直接使用)

MIT 许可证

6.5MB
1K SLoC

gettext-rs

为 gettext 提供安全绑定。请参阅文档以获取详细信息。

许可

此 crate 依赖于 gettext-sys,在平台没有本地 gettext 实现的情况下编译 GNU gettext。GNU gettext 在 LGPL 许可下发布,并且是静态链接的,这意味着 你必须遵守 LGPL。如果你不想或不能这样做,有两种解决方案

  1. 如果你使用 glibc 或 musl libc,启用 gettext-system 功能(见下文);
  2. 通过其他方式(如包管理器)动态链接到由你获得的 GNU gettext 库。有关详细信息,请参阅 gettext-sys 文档中的环境变量。

用法

(如果你知道如何使用 gettext 并且只想了解此 crate 的 API 精华,请 跳到下一节)。

要使用 gettext 国际化你的程序,你必须做四件事

  1. 将可翻译的字符串包装成适当的 gettext 函数调用;
  2. 使用工具将那些字符串提取到所谓的“PO 模板文件”中;
  3. 翻译模板中的字符串,得到所谓的“消息目录”作为结果;
  4. 将消息目录从纯文本、可读的 PO 格式编译为二进制 MO 格式,并将它们安装到已知位置,如 /usr/local/share/locale

此 crate 仅涵盖第一步,即标记。要提取消息,请使用 xtrcargo install xtr)。要翻译,您可以使用桌面工具,如 Poedit,或类似 Crowdin 的网站,或任何文本编辑器。要从 PO 编译到 MO,请使用 gettext-tools 中的 msgfmt 工具。文件安装方式高度依赖于您的分发方法,因此这里也不涉及。

关于 gettext 的最佳资源是 GNU gettext 手册。此 crate 有相同的 API,因此您应该能够轻松地将手册中的建议转移到此 crate。在介绍中,您还可以浏览此 crate 封装的 C 函数的手册页。

完整的 API 示例

use gettextrs::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Specify the name of the .mo file to use.
    textdomain("hellorust")?;
    // Ask gettext for UTF-8 strings. THIS CRATE CAN'T HANDLE NON-UTF-8 DATA!
    bind_textdomain_codeset("hellorust", "UTF-8")?;

    // You could also use `TextDomain` builder which calls `textdomain` and
    // other functions for you:
    //
    // TextDomain::new("hellorust").init()?;

    // `gettext()` simultaneously marks a string for translation and translates
    // it at runtime.
    println!("Translated: {}", gettext("Hello, world!"));

    // gettext supports plurals, i.e. you can have different messages depending
    // on the number of items the message mentions. This even works for
    // languages that have more than one plural form, like Russian or Czech.
    println!("Singular: {}", ngettext("One thing", "Multiple things", 1));
    println!("Plural: {}", ngettext("One thing", "Multiple things", 2));

    // gettext de-duplicates strings, i.e. the same string used multiple times
    // will have a single entry in the PO and MO files. However, the same words
    // might have different meaning depending on the context. To distinguish
    // between different contexts, gettext accepts an additional string:
    println!("With context: {}", pgettext("This is the context", "Hello, world!"));
    println!(
        "Plural with context: {}",
        npgettext("This is the context", "One thing", "Multiple things", 2));

    Ok(())
}

功能

  • gettext-system:如果启用,请求crate使用glibc或musl libc中的gettext实现。这仅在以下情况下有效:

    • Linux使用glibc或musl libc;

    • Windows + GNU(例如MSYS2)并安装了gettext-devel,例如使用

      pacman --noconfirm -S base-devel mingw-w64-x86_64-gcc libxml2-devel tar
      

    如果上述任何条件都不成立,crate将开始构建并静态链接它自己的GNU gettext副本!

    这启用了底层crate的gettext-sysgettext-system功能。

环境变量

这个crate不使用任何环境变量。也请参阅底层crate的gettext-sys的文档。

依赖项