简体中文| English
i18nify 是一款基于代码生成的 Rust
国际化库。
原仓库 https://github.com/davidpdrsn/i18n_codegen 是 David Pedersen 实现的。然而它有一些老旧的依赖,并且已经长达 5 年不维护。
通过利用代码生成,我们能够防止代码中的拼写错误、缺少插值或各语言环境之间各种错误的常见问题。
cargo add i18nify #default features=['json']
or add Cargo.toml
:
i18nify = { version = "0.3", features = ["json"] } #json
i18nify = { version = "0.3", features = ["toml"] } #toml
它需要一个目录(目录基于CARGO_MANIFEST_DIR
),其中每个语言环境有一个 JSON 文件。以下是一个包含英语和汉语翻译的例子:
// tests/doc_locales/en.json
{
"hello_world": "Hello, World!",
"greeting": "Hello {name}"
}
// tests/doc_locales/da.json
{
"hello_world": "你好,世界!",
"greeting": "你好, {name}"
}
在 Rust
中:
use demo::Internationalize;
mod demo {
use i18nify::I18N;
#[derive(I18N)]
#[i18n(folder = "tests/locales")]
pub struct DocLocale;
}
fn main() {
// 基于 Locale 枚举类型获取国际化文本
let hello = demo::Locale::En.hello();
assert_eq!("Hello, World!",hello);
println!("{}",hello);
// 基于 `DocLocale` 实现的`Internationalize` trait 获取国际化文本
let hello = demo::DocLocale.da().hello();
println!("{}",hello);
}
folder
路径可以使用环境变量,比如:
use demo::Internationalize;
mod demo {
use i18nify::I18N;
#[derive(I18N)]
#[i18n(folder = "$CARGO_MANIFEST_DIR/tests/doc_locales")]
pub struct DocLocale;
}
先定义一个 Internationalization
trait 实现
use i18nify::{Internationalization, I18N};
#[derive(I18N,Clone)]
#[i18n(folder = "$CARGO_MANIFEST_DIR/tests/zh_locales")]
pub struct DocLocale;
impl Internationalization for DocLocale {
type Item = Locale;
fn i(&self,lang:&str)->Self::Item {
match lang.to_lowercase().as_str() {
"en"=> Locale::En,
"zh-cn"=> Locale::ZhCn,
_=> Locale::En,
}
}
}
然后添加中间件I18nifyLayer
:
let app = Router::new()
.route("/", get(root))
.layer(I18nifyLayer::new(DocLocale, "en"));
最后在 handler 中就可以使用 Locale
获取国际化文本
async fn root(Extension(locale):Extension<Locale>) -> impl IntoResponse {
locale.greeting() // 你好,世界
}
你可以在 <文档> 获取更多细节。