1 个不稳定版本
0.1.0 | 2024 年 6 月 13 日 |
---|
#86 在 国际化 (i18n)
17KB
437 行
I18nError for Rust
此库提供了一种方便的方法,在 Rust 中定义和管理支持国际化的错误消息。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
i18n_error = "0.1"
rust-i18n = "3"
然后,运行 cargo build 来安装依赖项。
示例
use i18n_error::{I18nError, LanguageCode, ToI18nString};
#[macro_use]
extern crate rust_i18n;
rust_i18n::i18n!("locales");
#[derive(I18nError)]
#[i18n_language_codes(En, Fr)]
enum UseCaseError {
#[i18n_key("error.UseCaseError.AuthorizationError")]
Authorization,
#[i18n_delegate]
Domain(DomainError),
}
#[derive(I18nError)]
#[i18n_language_codes(En, Fr)]
enum DomainError {
#[i18n_key("error.DomainError.ResourceNotFound")]
ResourceNotFound,
}
fn main() {
let error = UseCaseError::Authorization;
assert_eq!(error.to_i18n_string(LanguageCode::En), "You do not have permission.".to_string());
assert_eq!(error.to_i18n_string(LanguageCode::Fr), "Vous n'avez pas la permission.".to_string());
let error = UseCaseError::Domain(DomainError::ResourceNotFound);
assert_eq!(error.to_i18n_string(LanguageCode::En), "Resource not found.".to_string());
assert_eq!(error.to_i18n_string(LanguageCode::Fr), "Ressource non trouvée.".to_string());
}
- i18n 准备
- 在
/locales
目录中创建区域文件。有关详细信息,请参阅 rust-i18n。 - 在
lib.rs
或main.rs
文件中加载rust-i18n
。
- 在
- 定义错误结构或枚举
- 使用
#[derive(I18nError)]
来派生必要的特质。
- 使用
- 设置语言代码
- 使用
#[i18n_language_codes(En, Fr)]
指定支持的语言。 - 基于 ISO 639-1 的
LanguageCode
。有关详细信息,请参阅 rust-i18n/LanguageCode。
- 使用
- 定义错误变体
- 使用
#[i18n_key("{key of message in locale file}")]
将错误变体映射到区域文件中的消息。 - 这允许从区域文件生成错误消息。
- 使用
- 委托错误消息生成
- 如果您想将错误消息的生成委托给内部错误,请使用
#[i18n_delegate]
。 - 内部错误也必须使用
#[derive(I18nError)]
定义。 - 这允许从内部错误生成错误信息。
- 如果您想将错误消息的生成委托给内部错误,请使用
详细信息
准备区域文件
I18nError
依赖于rust-i18n
。您需要准备符合rust-i18n
标准的区域文件。有关更多详细信息,请参阅rust-i18n文档。
在I18nError
中,区域文件必须使用小写的ISO 639-1代码命名。要支持英语和法语,您需要创建/locales/en.toml
和/locales/fr.toml
。
生成错误信息
通过i18n_key
指定的字符串对应于区域文件中的YAML路径。例如,如果键是error.UseCaseError.AuthorizationError
,区域文件的结构应如下所示
"error":
"UseCaseError":
"AuthorizationError": "You do not have permission."
如果区域文件中不存在相应的键,将返回字符串{LanguageCode in lowercase}.}{key}
。
委托信息生成
如果一个枚举变体包含一个错误对象,您可以通过使用#[i18n_delegate]
属性将信息生成委托给内部错误对象。例如,在UseCaseError::Domain
变体中,信息生成被委托给DomainError
,因为指定了i18n_delegate。
#[derive(I18nError)]
#[i18n_language_codes(En, Fr)]
enum UseCaseError {
#[i18n_delegate]
Domain(DomainError),
}
在这种情况下,DomainError
必须派生自I18nError
。
#[derive(I18nError)]
#[i18n_language_codes(En, Fr)]
enum DomainError {
#[i18n_key("error.DomainError.ResourceNotFound")]
ResourceNotFound,
}
如果DomainError
没有派生自I18nError
,则会出现编译错误。
enum DomainError {
ResourceNotFound,
}
error[E0599]: no method named `to_i18n_string` found for reference `&DomainError` in the current scope
--> src/lib.rs:28:14
|
28 | #[derive(I18nError)]
| ^^^^^^^^^ method not found in `&DomainError`
|
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `to_i18n_string`, perhaps you need to implement it:
candidate #1: `ToI18nString`
= note: this error originates in the derive macro `I18nError` (in Nightly builds, run with -Z macro-backtrace for more info)
rustcE0599
许可证
本项目使用MIT许可证。
有关许可证的更多信息,请参阅许可证。
依赖关系
~300–770KB
~18K SLoC