3个不稳定版本
使用旧的Rust 2015
0.2.1 | 2017年3月4日 |
---|---|
0.2.0 | 2016年12月23日 |
0.1.0 | 2016年11月18日 |
#1980 在 Rust模式
229 每月下载量
在 2 crates 中使用
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的msgmerge
和msgcmp
命令来更新您的翻译。虽然不能保证格式完全相同,但它应该可以工作。(即,如果它不工作,那就是一个错误;但在这个阶段,这个库绝对不能保证没有错误。)
已知限制和错误
- 目前,
crowbook-intl
无法正确处理lformat!
中的原始字符串字面量(它们不会被正确翻译)。 - 对同一字符串的多次调用,但格式不同(例如,在换行符前使用反斜杠来分隔多行的字符串)也会引起问题。
警告
如果您没有被操作的复杂性吓倒,我应该警告您,这个库目前高度实验性。
许可证
这是一个免费软件,根据Mozilla公共许可证,版本2.0发布。
文档
请参阅docs.rs上的文档。
变更日志
请参阅变更日志文件。
作者
依赖关系
~3.5MB
~74K SLoC