10个版本
0.1.10 | 2024年8月11日 |
---|---|
0.1.9 | 2023年6月12日 |
0.1.8 | 2023年5月16日 |
0.1.6 | 2021年2月14日 |
0.1.0 | 2018年11月25日 |
108 在 国际化(i18n)
144 每月下载量
66KB
1K SLoC
Rust应用程序本地化
该存储库尝试实现Rust应用程序的本地化。有两个包
-
tr
是一个运行时库,包装了 gettext(目前),为了提供一种方便的方式对应用程序进行本地化。 -
xtr
是一个类似GNU的xgettext
的二进制文件,可以从Rust包中提取字符串。它可以使用来自此兄弟包的tr
宏或其他基于 gettext 的本地化包(如gettext-rs
、gettext
、rocket_i18n
)提取包中的字符串。
如何翻译Rust应用程序
-
使用写入宏/函数注释您的源代码中的字符串。您可以使用
- 此
tr
包中的tr!
宏(仍在开发中),或 gettext
或gettext-rs
包中的 gettext 函数
- 此
-
在您的包上运行
xtr
程序,将字符串提取到 .pot 文件中 -
使用GNU gettext工具合并、翻译并生成 .mo 文件
关于 tr!
- 该名称来自Qt的
tr()
函数。它是一个简短的名称,因为它将放置在大多数字符串字面量上。 - 该宏可以进行Rust样式格式化。这使得在翻译中重新排列参数成为可能。
Hello {}
或Hello {0}
或 HelloHello {name}
都可以工作。- 目前,默认后端使用
gettext-rs
包,但将来可能会更改为gettext
。 - 复数处理由gettext完成,支持多种语言的复数形式。
未来计划
- 原始文档或翻译的格式有效性尚未完成,但将来可能会完成。
- 更高级的格式化,允许处理性别或格,可以作为格式化规则的扩展来实现。由于宏直接取参数,因此可以使用脚本系统或类似ICU MessageFormat的东西来扩展格式化引擎。
- 以本地化方式格式化日期/数字。
示例
#[macro_use]
extern crate tr;
fn main() {
// use the tr_init macro to tell gettext where to look for translations
tr_init!("/usr/share/locale/");
let folder = if let Some(folder) = std::env::args().nth(1) {
folder
} else {
println!("{}", tr!("Please give folder name"));
return;
};
match std::fs::read_dir(&folder) {
Err(e) => {
println!("{}", tr!("Could not read directory '{}'\nError: {}",
folder, e));
}
Ok(r) => {
// Singlular/plural formating
println!("{}", tr!(
"The directory {} has one file" | "The directory {} has {n} files" % r.count(),
folder
));
}
}
}
关于 xtr
xtr
是一个从Rust crate源代码中提取翻译字符串的工具。该工具应与任何基于gettext的函数兼容。但已经添加了对tr!宏的特殊语法的支持。
用法
xtr src/main.rs -o example.pot
这将从crate的所有模块中提取字符串,并创建一个文件 example.pot
。现在您可以使用gettext工具来翻译此文件。
与 xgettext
的区别
xtr
基本上是用于替换Rust代码中的xgettext
。目前xgettext
不支持Rust语言。我们可以使用C语言得到相当好的结果,但是
xgettext
如果代码包含与Rust规则不兼容的注释或字符串转义,将无法正常工作。(注释或字符串转义的规则在Rust和C中不同。考虑原始文本、嵌入注释、生命周期等)xtr
使用来自proc_macro2
crate的词法分析器来解析Rust代码。xgettext
不能指示提取宏中的字符串,而xtr
会忽略!
标记。因此gettext(...)
或gettext!(...)
将工作。xgettext
无法处理字符串字面量中的Rust规则。xtr
不会对Rust的原始文本或转义序列有问题。xtr
还可以解析mod
关键字,并轻松解析crate中的所有文件。- 最后,
xtr
还可以解析tr!
宏中的更高级语法。
许可
-
tr
crate在MIT许可下发布。 -
xtr
程序是一个仅用于开发的二进制文件,受GNU Affero General Public License (AGPL)许可。
贡献
欢迎贡献。除非您明确说明,否则您提交的任何贡献,如果有意包含在此crate中,应受MIT许可。
反馈请求
请在问题中填写您的建议。或者通过在https://github.com/woboq/tr/issues/1上评论来帮助。
依赖关系
~11–18MB
~118K SLoC