i18n_langid_codegen
Function-like proc macro for internationalization
Generates structs and functions from a set of YAML files with support for
the unic-langid
crate.
Inspired by i18n_codegen
crate.
Disclaimer
This is my first macro, could contain bugs. Feel free to suggest improvements.
Your YAML files:
```yaml
hello: Hello World!
hello: Hallo Welt! ```
Your Rust code:
```rust mod i18n { i18nlangidcodegen::i18n!("locales"); }
fn main() { // Get single key asserteq!("Hello World!", i18n::I18n::en().hello); asserteq!("Hallo Welt!", i18n::I18n::de().hello);
// Get the right struct instance by language identifier
let id = unic_langid::langid!("de");
let de = I18n::from_lang_id(id).unwrap_or_default();
assert_eq!("Hallo Welt!", de.hello);
} ```
shell
cargo add unic_langid --features macros
cargo add i18n_langid_codegen
rust
mod i18n {
i18n_langid_codegen::i18n!("locales");
}
Consider the following file tree.
├── ...
├── Cargo.toml
├── locales
│ ├── de.yml
│ └── en.default.yml
├── src
│ └── ...
└── ...
Content of locales/en.default.yml
:
yaml
hello: Hello World!
login_form:
email: Email
password: Password
button: Log In
Content of locales/de.yml
:
yaml
hello: Hallo Welt!
login_form:
password: Passwort
button: Anmelden
Note that login_form.email
is not included in the German translation. In this case the value from the file ending
in .default.yml
is used.
i18n
macro generates```rust
pub struct I18n { pub langid: uniclangid::LanguageIdentifier, pub hello: &'static str, pub login_form: LoginForm, }
pub struct LoginForm { pub email: &'static str, pub password: &'static str, pub button: &'static str, }
impl I18n {
pub fn fromlangid(
langid: &uniclangid::LanguageIdentifier,
) -> Option
pub fn en() -> Self {
Self {
lang_id: unic_langid::LanguageIdentifier::from_str("en").unwrap(),
hello: "Hello World!",
login_form: LoginForm {
email: "Email",
password: "Password",
button: "Log In",
},
}
}
pub fn de() -> Self {
Self {
lang_id: unic_langid::LanguageIdentifier::from_str("de").unwrap(),
hello: "Hallo Welt!",
login_form: LoginForm {
email: "Email",
password: "Passwort",
button: "Anmelden",
},
}
}
}
impl Default for I18n { fn default() -> Self { Self::en() } } ```