Internationalisation (i18n) en Rust : aperçu des bibliothèques et outils
\n\nL'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.
1. Bibliothèque gettext (crate gettext-rs)
\ngettext est le standard de facto de la localisation Unix. Le wrapper Rust gettext-rs fournit un accès complet aux fonctions de GNU gettext.
Installation
\n[dependencies]\ngettext-rs = "0.7"\n\nExemple d'utilisation
\nuse 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\nAvantages : 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.
2. Bibliothèque rust-i18n
\nImplémentation purement Rust sans dépendances externes. Utilise des fichiers YAML pour stocker les traductions et des macros pour extraire les chaînes.
\n\nInstallation
\n[dependencies]\nrust-i18n = "3.0"\n\nStructure du projet
\nlocales/\n├── en.yml\n└── ru.yml\n\nExemple de locales/ru.yml :
hello: "Привет, мир!"\napples: \n zero: "Нет яблок"\n one: "{} яблоко"\n few: "{} яблока"\n many: "{} яблок"\n\nUtilisation dans le code
\nuse 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\nAvantages : 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.
3. Bibliothèque fluent-rs
\nDéveloppée par Mozilla pour Firefox. Utilise sa propre syntaxe FTL (Fluent Translation List).
\n\nInstallation
\n[dependencies]\nfluent = "0.16"\nfluent-bundle = "0.15"\nfluent-resmgr = "0.4"\n\nExemple de fichier FTL (locales/ru/main.ftl)
\nhello = Привет, мир!\napples = \n { $count ->\n [0] Нет яблок\n [one] { $count } яблоко\n [few] { $count } яблока\n *[many] { $count } яблок\n }\n\nUtilisation en Rust
\nuse 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 Aussi dans la bibliothèque
Surveillance des applications Rust : la bibliothèque `tracing`
Travailler avec Excel en TypeScript : bibliothèques, outils et exemples de code
Travailler avec YAML en JavaScript (Node.js) : parsing, génération et validation