#本地化 #字符串 #语言 #消息 #查找 #生成

已废弃 crowbook-localize

该crate已重命名为crowbook-intl。请从现在开始使用这个版本。

9个版本

使用旧的Rust 2015

0.1.0 2016年11月18日
0.0.9 2016年10月26日

221 in #国际化

MPL-2.0 许可证

34KB
613

crowbook-intl

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

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

使用方法

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

build = "build.rs"

[build-dependencies]
crowbook-localize = "0.0.9"

[dependencies]
lazy_static = "0.2" # the generated file needs `lazy_static!`

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

extern crate crowbook_localize;
use crowbook_localize::{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);
    localizer.write_macro_file(concat!(env!("CARGO_MANIFEST_DIR"), "/src/lib/localize_macros.rs")).unwrap();
}

这样,在构建时,会在 src/lib 目录中创建一个 localize_macros.rs 文件。要使用它,最后一步是修改你的 src/lib/lib.rs 文件

#[macro_use] extern crate lazy_static;
#[macro_use] mod localize_macros;

完成这些后,你可以开始用 lformat! 调用替换 format! 调用。

为了获得翻译,你实际上需要将字符串翻译到单独的文件中,并将你的 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();
localizer.write_macro_file(concat!(env!("OUT_DIR"), "/localize_macros.rs")).unwrap();

你还需要将此构建脚本的结果包含到 localize_macros.rs 文件中

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

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

use localize_macros::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 命令来更新你的翻译。虽然不能保证格式严格相同,但它应该可以工作。(也就是说,如果它不能工作,那将是一个错误;但在这个阶段,这个库绝对不能保证没有错误。)

警告

如果操作的复杂性没有让你却步,我应该提醒你,这个库目前处于高度实验性。

文档

请参阅docs.rs上的文档

变更日志

请参阅变更日志文件

作者

Élisabeth Henry [email protected]

许可证

这是自由软件,根据Mozilla公共许可证,版本2.0发布。

依赖项

~3.5MB
~77K SLoC