Internationalisation (i18n) en Rust : bibliothèques gettext-rs et fluent-rs

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 : gettext-rs et fluent-rs



L'internationalisation (i18n) est un aspect clé du développement d'applications modernes, permettant d'adapter les logiciels aux utilisateurs de différents pays et cultures. Dans l'écosystème Rust, il existe plusieurs bibliothèques puissantes pour implémenter l'i18n. Dans cet article, nous examinerons les deux plus populaires : gettext-rs (approche classique basée sur gettext) et fluent-rs (système de localisation moderne de Mozilla).



1. Bibliothèque gettext-rs



gettext-rs est un wrapper Rust autour du système classique GNU gettext. Il est idéal pour les projets où gettext est déjà utilisé, ou pour ceux qui préfèrent des solutions éprouvées.



Installation et configuration



Ajoutez la dépendance dans Cargo.toml :



[dependencies]gettext-rs = "0.7"gettext-sys = "0.21"


Exemple d'utilisation de base



use gettextrs::*;

fn main() { // Définir la locale et le domaine de traduction setlocale(LocaleCategory::LcAll, "ru_RU.UTF-8"); bindtextdomain("myapp", "/usr/share/locale").unwrap(); textdomain("myapp").unwrap();

// Utiliser la traduction let greeting = gettext("Hello, world!"); println!("{}", greeting);

// Formes plurielles let items = 5; let message = ngettext("{} item", "{} items", items); println!("{}", message.replace("{}", &items.to_string()));}


Travailler avec le contexte



Pour distinguer des chaînes identiques dans différents contextes, utilisez pgettext :



let menu_item = pgettext("menu", "File");let dialog_title = pgettext("dialog", "File");


2. Bibliothèque fluent-rs



fluent-rs est un système de localisation moderne, flexible et puissant développé par Mozilla. Il prend en charge les constructions grammaticales complexes, les formes plurielles et les traductions contextuelles.



Installation



[dependencies]fluent = "0.16"fluent-bundle = "0.15"fluent-resmgr = "0.5"fluent-langneg = "0.4"unic-langid = "0.9"


Création de fichiers de traduction (FTL)



Fluent utilise son propre format de fichier .ftl. Exemple pour le russe (ru.ftl) :



hello-world = Привет, мир!greeting = Здравствуйте, {$name}!items-count = { $count ->    [one] {$count} элемент    [few] {$count} элемента    [many] {$count} элементов    *[other] {$count} элементов}


Exemple d'utilisation de fluent-rs



use fluent_bundle::{FluentBundle, FluentResource};use unic_langid::langid;use std::fs;

fn main() { // Charger le fichier de traduction let ftl_string = fs::read_to_string("locales/ru.ftl") .expect("Не удалось прочитать файл локализации"); let resource = FluentResource::try_new(ftl_string) .expect("Ошибка парсинга FTL");

// Créer un bundle pour la langue russe let lang_ru = langid!("ru"); let mut bundle = FluentBundle::new(&[lang_ru]); bundle.add_resource(&resource).unwrap();

// Obtenir la traduction avec des paramètres let mut errors = vec![]; let msg = bundle.get_message("greeting").unwrap(); let mut args = fluent_bundle::FluentArgs::new(); args.set("name", "Алексей"); let pattern = msg.value().unwrap(); let value = bundle.format_pattern(pattern, Some(&args), &mut errors); println!("{}", value);

// Formes plurielles let msg = bundle.get_message("items-count").unwrap(); let mut args = fluent_bundle::FluentArgs::new(); args.set("count", 3); let pattern = msg.value().unwrap(); let value = bundle.format_pattern(pattern, Some(&args), &mut errors); println!("{}", value);}


3. Comparaison de gettext-rs et fluent-rs



Recommendations