Internationalisation (i18n) en Rust : meilleures bibliothèques et pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Internationalisation (i18n) en Rust : aperçu des bibliothèques et outils

\n\n

L'internationalisation (abrégée i18n — des 18 lettres entre 'i' et 'n') est le processus de conception d'une application permettant de l'adapter à différentes langues et normes régionales sans modifier le code source. Dans l'écosystème Rust, il existe plusieurs bibliothèques matures pour implémenter l'i18n. Dans cet article, nous examinerons trois approches principales : la classique gettext, la bibliothèque orientée macros rust-i18n et la moderne fluent-rs de Mozilla.

\n\n

1. Bibliothèque gettext (crate gettext-rs)

\n

gettext est le standard de facto de la localisation Unix. Le wrapper Rust gettext-rs fournit un accès complet aux fonctions de GNU gettext.

\n\n

Installation

\n
[dependencies]\ngettext-rs = "0.7"
\n\n

Exemple d'utilisation

\n
use gettextrs::*;\nuse std::env;\n\nfn main() {\n    // Définir la locale et le domaine\n    setlocale(LocaleCategory::LcAll, "ru_RU.UTF-8");\n    bindtextdomain("myapp", "/usr/share/locale").unwrap();\n    textdomain("myapp");\n\n    // Traduction de chaîne\n    println!("{}", gettext("Hello, world!"));\n    \n    // Pluralisation (nombre pluriel)\n    let n = 5;\n    println!("{}", ngettext("{} apple", "{} apples", n, n));\n}
\n\n

Avantages : maturité, support de la pluralisation, des traductions contextuelles (pgettext), intégration avec Poedit et Transifex.
\nInconvénients : nécessite l'installation de gettext système, support Unicode imparfait sur Windows.

\n\n

2. Bibliothèque rust-i18n

\n

Implémentation purement Rust sans dépendances externes. Utilise des fichiers YAML pour stocker les traductions et des macros pour extraire les chaînes.

\n\n

Installation

\n
[dependencies]\nrust-i18n = "3.0"
\n\n

Structure du projet

\n
locales/\n├── en.yml\n└── ru.yml
\n\n

Exemple de locales/ru.yml :

\n
hello: "Привет, мир!"\napples: \n  zero: "Нет яблок"\n  one: "{} яблоко"\n  few: "{} яблока"\n  many: "{} яблок"
\n\n

Utilisation dans le code

\n
use rust_i18n::t;\n\nrust_i18n::i18n!("locales");\n\nfn main() {\n    // Traduction simple\n    println!("{}", t!("hello"));\n\n    // Pluralisation avec prise en compte des règles russes\n    let n = 3;\n    println!("{}", t!("apples", count = n, n));\n}
\n\n

Avantages : simplicité, détection automatique de la locale, support des espaces réservés et de la pluralisation pour les langues complexes (russe, arabe).
\nInconvénients : moins flexible que gettext, pas de support des contextes.

\n\n

3. Bibliothèque fluent-rs

\n

Développée par Mozilla pour Firefox. Utilise sa propre syntaxe FTL (Fluent Translation List).

\n\n

Installation

\n
[dependencies]\nfluent = "0.16"\nfluent-bundle = "0.15"\nfluent-resmgr = "0.4"
\n\n

Exemple de fichier FTL (locales/ru/main.ftl)

\n
hello = Привет, мир!\napples = \n    { $count ->\n        [0] Нет яблок\n        [one] { $count } яблоко\n        [few] { $count } яблока\n       *[many] { $count } яблок\n    }
\n\n

Utilisation en Rust

\n
use fluent_bundle::{FluentBundle, FluentResource};\nuse fluent_resmgr::ResourceManager;\nuse unic_langid::langid;\n\nfn main() {\n    let langid = langid!("ru");\n    let res_mgr = ResourceManager::new("./locales/".into());\n    \n    let mut bundle = FluentBundle::new(&[langid]);\n    let ftl_string = res_mgr.load("ru/main.ftl").unwrap();\n    let resource = FluentResource::try_new(ftl_string).unwrap();\n    bundle.add_resource(resource).unwrap();\n\n    let mut errors = vec![];\n    let msg = bundle.format_pattern(\n        bundle.get_message("hello").unwrap().value().unwrap(),\n        None,\n        &mut errors\n    );\n    println!("{}", msg);\n\n    // Pluralisation\n    let mut args = fluent_bundle::FluentArgs::new();\n                    

Recommendations