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
- gettext-rs :
-
Aussi dans la bibliothèque
Recommendations
Travail avec les dates en C++ : aperçu des meilleures bibliothèques pour la manipulation du temps
Envoi d'email en Go (Golang) : bibliothèques et exemples de code
Files d'attente de tâches en Kotlin : Coroutines, Flow et bibliothèques pour le traitement en arrière-plan
Travailler avec Kafka en JavaScript (Node.js) : la bibliothèque node-rdkafka
-