#error-message #error #message

i18n_error

i18n_error 提供了一种方便的方法来定义和管理支持国际化的错误消息

1 个不稳定版本

0.1.0 2024 年 6 月 13 日

#86国际化 (i18n)

MIT 许可证

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());
}
  1. i18n 准备
    1. /locales 目录中创建区域文件。有关详细信息,请参阅 rust-i18n
    2. lib.rsmain.rs 文件中加载 rust-i18n
  2. 定义错误结构或枚举
    1. 使用 #[derive(I18nError)] 来派生必要的特质。
  3. 设置语言代码
    1. 使用 #[i18n_language_codes(En, Fr)] 指定支持的语言。
    2. 基于 ISO 639-1 的 LanguageCode。有关详细信息,请参阅 rust-i18n/LanguageCode
  4. 定义错误变体
    1. 使用 #[i18n_key("{key of message in locale file}")] 将错误变体映射到区域文件中的消息。
    2. 这允许从区域文件生成错误消息。
  5. 委托错误消息生成
    1. 如果您想将错误消息的生成委托给内部错误,请使用 #[i18n_delegate]
    2. 内部错误也必须使用 #[derive(I18nError)] 定义。
    3. 这允许从内部错误生成错误信息。

详细信息

准备区域文件

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