Internationalisierung (i18n) in Rust: Die Bibliotheken gettext-rs und fluent-rs

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Internationalisierung (i18n) in Rust: gettext-rs und fluent-rs



Internationalisierung (i18n) ist ein zentraler Aspekt der Entwicklung moderner Anwendungen, der es ermöglicht, Software für Benutzer aus verschiedenen Ländern und Kulturen anzupassen. Im Rust-Ökosystem gibt es mehrere leistungsstarke Bibliotheken zur Implementierung von i18n. In diesem Artikel betrachten wir die beiden beliebtesten: gettext-rs (der klassische Ansatz basierend auf gettext) und fluent-rs (das moderne Lokalisierungssystem von Mozilla).



1. Die Bibliothek gettext-rs



gettext-rs ist ein Rust-Wrapper um das klassische GNU-gettext-System. Es ist ideal für Projekte, die bereits gettext verwenden, oder für diejenigen, die bewährte Lösungen bevorzugen.



Installation und Einrichtung



Fügen Sie die Abhängigkeit in Cargo.toml hinzu:



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


Basisbeispiel zur Verwendung



use gettextrs::*;

fn main() { // Locale und Übersetzungsdomäne festlegen setlocale(LocaleCategory::LcAll, "ru_RU.UTF-8"); bindtextdomain("myapp", "/usr/share/locale").unwrap(); textdomain("myapp").unwrap();

// Übersetzung verwenden let greeting = gettext("Hello, world!"); println!("{}", greeting);

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


Arbeit mit Kontext



Um identische Zeichenfolgen in verschiedenen Kontexten zu unterscheiden, verwenden Sie pgettext:



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


2. Die Bibliothek fluent-rs



fluent-rs ist ein modernes, flexibles und leistungsstarkes Lokalisierungssystem, das von Mozilla entwickelt wurde. Es unterstützt komplexe grammatikalische Konstruktionen, Pluralformen und kontextbezogene Übersetzungen.



Installation



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


Erstellung von Übersetzungsdateien (FTL)



Fluent verwendet ein eigenes Dateiformat .ftl. Beispiel für die russische Sprache (ru.ftl):



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


Beispiel zur Verwendung von fluent-rs



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

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

// Bundle für die russische Sprache erstellen let lang_ru = langid!("ru"); let mut bundle = FluentBundle::new(&[lang_ru]); bundle.add_resource(&resource).unwrap();

// Übersetzung mit Parametern abrufen 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);

// Pluralformen 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. Vergleich von gettext-rs und fluent-rs



Empfehlungen