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)
67,328 每月下载量
用于 26 个 crate(12 个直接使用)
6.5MB
1K SLoC
gettext-rs
为 gettext 提供安全绑定。请参阅文档以获取详细信息。
许可
此 crate 依赖于 gettext-sys
,在平台没有本地 gettext 实现的情况下编译 GNU gettext。GNU gettext 在 LGPL 许可下发布,并且是静态链接的,这意味着 你必须遵守 LGPL。如果你不想或不能这样做,有两种解决方案
- 如果你使用 glibc 或 musl libc,启用
gettext-system
功能(见下文); - 通过其他方式(如包管理器)动态链接到由你获得的 GNU gettext 库。有关详细信息,请参阅
gettext-sys
文档中的环境变量。
用法
(如果你知道如何使用 gettext 并且只想了解此 crate 的 API 精华,请 跳到下一节)。
要使用 gettext 国际化你的程序,你必须做四件事
- 将可翻译的字符串包装成适当的 gettext 函数调用;
- 使用工具将那些字符串提取到所谓的“PO 模板文件”中;
- 翻译模板中的字符串,得到所谓的“消息目录”作为结果;
- 将消息目录从纯文本、可读的 PO 格式编译为二进制 MO 格式,并将它们安装到已知位置,如 /usr/local/share/locale。
此 crate 仅涵盖第一步,即标记。要提取消息,请使用 xtr
(cargo 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-sys
的gettext-system
功能。 -
环境变量
这个crate不使用任何环境变量。也请参阅底层crate的gettext-sys
的文档。