8 个版本

0.1.10 2024年8月11日
0.1.7 2023年4月21日
0.1.6 2021年2月14日
0.1.3 2019年8月22日
0.0.0 2018年11月7日

#21 in 国际化 (i18n)

Download history 4034/week @ 2024-05-03 4059/week @ 2024-05-10 4335/week @ 2024-05-17 4254/week @ 2024-05-24 4109/week @ 2024-05-31 4008/week @ 2024-06-07 4116/week @ 2024-06-14 4127/week @ 2024-06-21 3952/week @ 2024-06-28 3950/week @ 2024-07-05 3984/week @ 2024-07-12 4056/week @ 2024-07-19 4021/week @ 2024-07-26 4246/week @ 2024-08-02 4239/week @ 2024-08-09 3868/week @ 2024-08-16

每月16,953次下载
用于 12 个软件包

MIT 许可证

27KB
338

Rust 应用程序的本地化

Travis Build Status

此仓库旨在实现 Rust 应用程序的本地化。有两个软件包

  • tr 是一个运行时库,包装了 gettext(目前),以便提供本地化应用程序的便捷方式。

  • xtr 是一个类似于 GNU 的 xgettext 的二进制文件,可以从 Rust 软件包中提取字符串。它可以使用此兄弟软件包中的 tr 宏或使用其他基于 gettext 的本地化软件包,如 gettext-rsgettextrocket_i18n

如何翻译 Rust 应用程序

  1. 使用 write 宏/函数注释您的源代码中的字符串。您可以使用

    • tr 软件包中的 tr! 宏(仍在开发中),或
    • gettextgettext-rs 软件包中的 gettext 函数
  2. 运行 xtr 程序处理您的软件包,以在 .pot 文件中提取字符串

  3. 使用 GNU gettext 工具合并、翻译并生成 .mo 文件

关于 tr!

  • 该名称来自 Qt 的 tr() 函数。它是一个简短的名称,因为它将被放置在大多数字符串字面量上。
  • 该宏可以进行 Rust 风格的格式化。这使得可以在翻译中重新排列参数的顺序。
  • Hello {}Hello {0}Hello Hello {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基本上可以用来替换xgettext用于Rust代码。目前xgettext不支持Rust语言。我们可以使用C语言获得相当好的结果,但是

  • xgettext如果代码包含与Rust规则不兼容的注释或字符串转义将无法正常工作。(注释或字符串转义的规则在Rust和C中不同。考虑原始字面量、嵌入注释、生命周期等...)xtr使用来自proc_macro2 crate的词法分析器,因此它可以解析Rust代码。
  • xgettext无法提取宏中的字符串,而xtr将忽略!标记。因此,gettext(...)gettext!(...)将工作。
  • xgettext无法处理字符串字面量内的Rust规则。xtr对Rust的原始字面量或Rust的转义序列没有任何问题。
  • xtr还可以解析mod关键字,并轻松解析crate中的所有文件。
  • 最后,xtr还可以解析tr!宏内的更高级语法。

许可

贡献

欢迎贡献。除非您明确表示,否则您有意向提交的任何贡献,都应该以MIT许可证授权。

反馈请求

请以问题形式填写您的建议。或者通过在https://github.com/woboq/tr/issues/1上评论来帮助。

依赖项

~11MB
~65K SLoC