通过阅读本文,你将了解如何在 Rust 实现 i18n 方案。
好的图形界面程序往往提供多种语言给用户使用。然后用户就可以更加快速方便的操作程序。本文将以 Rust 编程语言为例,探索如何实现 i18n 方案。
一、基于宏实现的 i18n 方案
基于宏实现的 i18n 方案是最直观的,你只需要一个宏例如 t! 或者 tr! 便可以实现翻译,类似于这样:
t!("Hello")
使用这种方案可以直接将翻译文字内嵌在二进制文件中,使用成本较低。
1.1 rust_i18n
rust_i18n 是一款简单高效的 i18n 类库,虽然它提供的接口不多,但是很直观易于使用。使用时,需要指定某个文件夹来存放和读取翻译文件。默认情况是在项目根目录下的「locales」文件夹,翻译文件命名为「语言代码.yml」,例如中文就是「zh-CN.yml」。
1.1.1 翻译文件的内容
翻译文件可以使用 yaml 格式存储,也可以使用 json 和 toml 格式存储。翻译文件的内容由由原始语言到翻译语言的键值对构成。以 yaml 格式为例,左边是原始语言,右边是应翻译语言。
hello: 你好
1.1.2 简单的使用示例
use rust_i18n::t;
// 在本仓库内初始化翻译文件信息(内嵌操作在这里面完成)
rust_i18n::i18n!("locales");
fn main() {
// 通过 set_locale 设置当前语言
rust_i18n::set_locale("zh-CN");
println!("{}", t!("hello"));
}
1.1.3 使用翻译模板
我们可能会遇到句子中存在变量的情况,这时就不好将句子拆成两段来翻译。于是,我们可以使用模板,例如:
message:
hello: Hello, %{name}
message:
hello: 您好,%{name}
在 Rust 中可以这样使用:
t!("messages.hello", name = "Felix");
1.1.4 配合 fl2rust_macro 使用
在默认情况下 fl2rust_macro 的 i18n 方案使用的是 tr! 宏,对应 gettext 系的类库。在不需要模板的情况下,tr! 和 t! 可以呼唤。于是,我们可以使用 use rust_i18n::t as tr; 来对接使用。下面的代码可以正常运行:
mod ui {
use rust_i18n::t as tr;
fl2rust_macro::include_ui!("src/ui.fl");
}