1 个不稳定版本
0.0.1 | 2023 年 5 月 21 日 |
---|
#181 在 #翻译
37KB
575 行
Rust I18n
Rust I18n 是一个用于从一组 YAML 映射文件中加载本地化文本的包。映射在编译时被转换为 Rust 程序可读的数据,然后可以通过简单地调用提供的 format_t!
宏来加载本地化文本。
此包的 API 受 ruby-i18n 和 Rails 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 中加载本地化字符串
将此包中的 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: ./]
调试 Codegen 进程
可以使用环境变量 RUST_I18N_DEBUG
在编译时生成代码时打印一些调试信息。
$ RUST_I18N_DEBUG=1 cargo build
示例
可以使用 i18n-again 的最小示例可以在 这里 找到。
许可证
MIT
依赖项
~8–17MB
~229K SLoC