#yaml #compile-time #internationalization #translation #macro #format-t #locale

i18n-again-support

一个编译时国际化库,使用宏 format_t! 在编译时完成所有工作。翻译文件与 rust-i18n 兼容。

2 个版本

0.0.1 2023 年 5 月 21 日
0.0.0 2023 年 5 月 12 日

#66 in #locale


用于 2 crates

MIT 许可证

18KB
265

Rust I18n

CI Docs Crates.io

Rust I18n 是一个用于从一组 YAML 映射文件中加载本地化文本的 crate。映射在编译时转换为 Rust 程序可读的数据,然后可以通过调用提供的宏 format_t! 来加载本地化文本。

该 crate 的 API 受 ruby-i18nRails I18n 启发。

功能

  • 编译时代码生成,将翻译包含到二进制中。
  • 全局宏 format_t! 用于在所有地方加载本地化文本。
  • 使用 YAML 进行本地化文本映射,并支持多个 YAML 文件合并。
  • cargo i18n 命令行工具用于检查和提取未翻译的文本到 YAML 文件中。

安装

Rust I18n 还提供了一个 cargo i18n 命令行工具,帮助您处理翻译。

$ cargo install i18n-again

使用方法

在 Cargo.toml 中添加 crate 依赖项并设置 I18n 配置

[dependencies]
once_cell = "1.10.0"
i18n-again = "0"

[package.metadata.i18n]
# The available locales for your application, default: ["en"].
# available-locales = ["en", "zh-CN"]

# The default locale, default: "en".
# default-locale = "en"

# Path for your translations YAML file, default: "locales".
# load-path = "locales"

lib.rs 中加载宏和初始化翻译

// Load I18n macro, for allow you use `format_t!` macro in anywhere.
#[macro_use]
extern crate i18n_again;

// Init translations for current crate.
i18n!("locales");

或者您可以直接导入使用

// You must import in each files when you wants use `format_t!` macro.
use i18n_again::format_t;

i18n_again::i18n!("locales");

fn main() {
    println!("{}", format_t!("hello"));
}

确保所有 YAML 文件(包含本地化映射)都位于项目根目录的 locales/ 文件夹中

.
├── Cargo.lock
├── Cargo.toml
├── locales
│   ├── en.yml
│   ├── zh-CN.yml
│   └── zh-HK.yml
└── src
    └── main.rs

在 YAML 文件中,指定本地化键及其对应值,例如,在 en.yml

en: # The language code of this mapping file
  hello: Hello world # A simple key -> value mapping
  messages:
    hello: Hello, %{name} # A nested key.sub_key -> value mapping, in this case "messages.hello" maps to "Hello, %{name}"

以下是一个 zh-CN.yml 的示例

zh-CN:
  hello: 你好世界
  messages:
    hello: 你好, %{name}

在 Rust 中加载本地化字符串

从该 crate 导入宏 format_t! 到当前作用域

use i18n_again::format_t;

然后,只需在需要本地化字符串的地方使用它即可

format_t!("hello");
// => "Hello world"

format_t!("hello", locale = "zh-CN");
// => "你好世界"

format_t!("messages.hello", name = "world");
// => "Hello, world"

format_t!("messages.hello", locale = "zh-CN", name = "Jason");
// => "你好, Jason"

设置和获取全局区域设置

您可以使用 i18n_again::set_locale 在运行时设置全局区域设置,这样您就不必在每个 format_t! 调用中指定区域设置。

i18n_again::set_locale("zh-CN");

let locale = i18n_again::locale();
assert_eq!(locale, "zh-CN");

提取未翻译的文本

Rust I18n 提供了一个 i18n 二进制文件,帮助你从源代码中提取未翻译的文本,并将其写入 YAML 文件。

$ cargo install i18n-again
# Now you have `cargo i18n` command

之后,未翻译的文本将被提取并保存到 locales/TODO.en.yml 文件中。

你也可以通过使用 --locale 选项来指定特定的区域设置。

$ cd your_project_root_directory
$ cargo i18n

Checking [en] and generating untranslated texts...
Found 1 new texts need to translate.
----------------------------------------
Writing to TODO.en.yml

Checking [fr] and generating untranslated texts...
Found 11 new texts need to translate.
----------------------------------------
Writing to TODO.fr.yml

Checking [zh-CN] and generating untranslated texts...
All thing done.

Checking [zh-HK] and generating untranslated texts...
Found 11 new texts need to translate.
----------------------------------------
Writing to TODO.zh-HK.yml

运行 cargo i18n -h 来查看详细信息。

$ cargo i18n -h
cargo-i18n 0.5.0
---------------------------------------
Rust I18n command for help you simply to extract all untranslated texts from soruce code.

It will iter all Rust files in and extract all untranslated texts that used `format_t!` macro.
And then generate a YAML file and merge for existing texts.

https://github.com/drahnr/i18n-again

USAGE:
    cargo i18n [OPTIONS] [--] [source]

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

ARGS:
    <source>    Path of your Rust crate root [default: ./]

调试代码生成过程

可以使用环境变量 RUST_I18N_DEBUG 在编译时生成代码时打印一些调试信息。

$ RUST_I18N_DEBUG=1 cargo build

示例

使用 i18n-again 的最小示例可以在 这里 找到。

许可协议

MIT

依赖关系

~2.8–4MB
~80K SLoC