#本地化 #gettext #xgettext

app xtr

从Rust包中提取字符串以使用gettext进行翻译

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)

Download history 1/week @ 2024-05-20 2/week @ 2024-06-10 9/week @ 2024-07-29 82/week @ 2024-08-05 53/week @ 2024-08-12

144 每月下载量

AGPL-3.0

66KB
1K SLoC

Rust应用程序本地化

Travis Build Status

该存储库尝试实现Rust应用程序的本地化。有两个包

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

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

如何翻译Rust应用程序

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

    • 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基本上是用于替换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! 宏中的更高级语法。

许可

贡献

欢迎贡献。除非您明确说明,否则您提交的任何贡献,如果有意包含在此crate中,应受MIT许可。

反馈请求

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

依赖关系

~11–18MB
~118K SLoC