#本地化 #字符串 #国际化 #运行时 #翻译 # #语言

crowbook-intl

一个用于本地化字符串的国际化库,根据运行时选项进行翻译,使用宏

3个不稳定版本

使用旧的Rust 2015

0.2.1 2017年3月4日
0.2.0 2016年12月23日
0.1.0 2016年11月18日

#1980Rust模式

Download history 38/week @ 2024-03-11 56/week @ 2024-03-18 37/week @ 2024-03-25 98/week @ 2024-04-01 63/week @ 2024-04-08 47/week @ 2024-04-15 68/week @ 2024-04-22 87/week @ 2024-04-29 42/week @ 2024-05-06 114/week @ 2024-05-13 47/week @ 2024-05-20 57/week @ 2024-05-27 40/week @ 2024-06-03 57/week @ 2024-06-10 56/week @ 2024-06-17 62/week @ 2024-06-24

229 每月下载量
2 crates 中使用

MPL-2.0 许可证

35KB
616

crowbook-intl

一个用于本地化字符串,根据运行时选项进行翻译的库。

基本上,这个库允许你的项目生成一个 lformat! 宏,其行为类似于 format!,除了消息字符串(第一个参数)可能会被翻译(如果你能找到适合该语言的正确字符串)。

用法

首先,你需要在你的 Cargo.toml 文件中添加以下内容

build = "build.rs"

[build-dependencies]
crowbook-intl = "0.1.0"

[dependencies]
crowbook-intl-runtime = "0.1.0"

然后,你需要创建一个 build.rs 文件,它可能看起来像这样

extern crate crowbook_intl;
use crowbook_intl::{Localizer, Extractor};

fn main() {
    // Generate a `lang/default.pot` containing strings used to call `lformat!`
    let mut extractor = Extractor::new();
    extractor.add_messages_from_dir(concat!(env!("CARGO_MANIFEST_DIR"), "/src")).unwrap();
    extractor.write_pot_file(concat!(env!("CARGO_MANIFEST_DIR"), "/lang/default.pot")).unwrap();

    // Generate the `localize_macros.rs` file
    let mut localizer = Localizer::new(&extractor);
    // Use env::var instead of env! to avoid problems when cross-compiling
    let dest_path = Path::new(&env::var("OUT_DIR").unwrap())
       .join("localize_macros.rs");
    localizer.write_macro_file(dest_path).unwrap();
}

这将会在 OUT_DIR 中的某个位置创建一个 localize_macros.rs 文件,其中包含 lformat! 宏。要实际使用此宏,你必须创建一个 src/localize_macros.rs 文件并将其包含在内

include!(concat!(env!("OUT_DIR"), "/localize_macros.rs"));

要使用它,最后的步骤是修改你的 src/lib/lib.rs 文件

extern crate crowbook_intl_runtime;
#[macro_use] mod localize_macros;

完成此操作后,你可以开始将你的 format! 调用替换为 lformat! 调用。

为了获取翻译,你实际上需要将字符串翻译到单独的文件中,并在 build.rs 中加载它们。

例如,如果你有以下代码

println!("{}", lformat!("Hello, world!"));

并且你希望将其翻译成法语,你必须从 lang/default.pot 文件创建一个 lang/fr.po 文件,其中包含

msgid "Hello, world!";
msgstr "Bonjour le monde !";

并在你的 build.rs 文件中加载它

let mut localizer = Localizer::new();
localizer.add_lang("fr", include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/lang/fr.mp"))).unwrap();
(...)

完成 一步后,你可以使用 localize_macros::set_lang 函数在运行时切换语言

use crowbook_intl_runtime::set_lang;
set_lang("en");
println!("{}", lformat!("Hello, world!")); // prints "Hello, world!"
set_lang("fr");
println!("{}", lformat!("Hello, world!")); // prints "Bonjour le monde !"

更新你的翻译

当您添加需要翻译的新字符串(通过多次调用lformat!)或更改现有字符串的内容时,您可以使用Gettext的msgmergemsgcmp命令来更新您的翻译。虽然不能保证格式完全相同,但它应该可以工作。(即,如果它不工作,那就是一个错误;但在这个阶段,这个库绝对不能保证没有错误。)

已知限制和错误

  • 目前,crowbook-intl无法正确处理lformat!中的原始字符串字面量(它们不会被正确翻译)。
  • 对同一字符串的多次调用,但格式不同(例如,在换行符前使用反斜杠来分隔多行的字符串)也会引起问题。

警告

如果您没有被操作的复杂性吓倒,我应该警告您,这个库目前高度实验性。

许可证

这是一个免费软件,根据Mozilla公共许可证,版本2.0发布。

文档

请参阅docs.rs上的文档

变更日志

请参阅变更日志文件

作者

Élisabeth Henry [email protected]

依赖关系

~3.5MB
~74K SLoC