通过阅读本文,你将了解如何在 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");
}
最后修改:2024 年 03 月 02 日
如果觉得我的文章对你有用,请随意赞赏