Internationalisierung (i18n) in Rust: Überblick über Bibliotheken und Werkzeuge
\n\nInternationalisierung (abgekürzt i18n – von 18 Buchstaben zwischen 'i' und 'n') ist der Prozess der Anwendungsentwicklung, der es ermöglicht, die Anwendung an verschiedene Sprachen und regionale Standards anzupassen, ohne den Quellcode zu ändern. Im Rust-Ökosystem gibt es mehrere ausgereifte Bibliotheken zur Implementierung von i18n. In diesem Artikel betrachten wir drei Hauptansätze: das klassische gettext, das makroorientierte rust-i18n und das moderne fluent-rs von Mozilla.
1. Bibliothek gettext (Crate gettext-rs)
\ngettext ist der De-facto-Standard für Unix-Lokalisierung. Der Rust-Wrapper gettext-rs bietet vollen Zugriff auf die Funktionen von GNU gettext.
Installation
\n[dependencies]\ngettext-rs = "0.7"\n\nAnwendungsbeispiel
\nuse gettextrs::*;\nuse std::env;\n\nfn main() {\n // Gebietsschema und Domäne festlegen\n setlocale(LocaleCategory::LcAll, "ru_RU.UTF-8");\n bindtextdomain("myapp", "/usr/share/locale").unwrap();\n textdomain("myapp");\n\n // Zeichenkette übersetzen\n println!("{}", gettext("Hello, world!"));\n \n // Pluralisierung (Mehrzahl)\n let n = 5;\n println!("{}", ngettext("{} apple", "{} apples", n, n));\n}\n\nVorteile: Ausgereiftheit, Unterstützung für Pluralisierung, kontextbezogene Übersetzungen (pgettext), Integration mit Poedit und Transifex.
\nNachteile: Erfordert die Installation von systemweitem gettext, nicht ideale Unicode-Unterstützung unter Windows.
2. Bibliothek rust-i18n
\nReine Rust-Implementierung ohne externe Abhängigkeiten. Verwendet YAML-Dateien zum Speichern von Übersetzungen und Makros zum Extrahieren von Zeichenketten.
\n\nInstallation
\n[dependencies]\nrust-i18n = "3.0"\n\nProjektstruktur
\nlocales/\n├── en.yml\n└── ru.yml\n\nBeispiel locales/ru.yml:
hello: "Привет, мир!"\napples: \n zero: "Нет яблок"\n one: "{} яблоко"\n few: "{} яблока"\n many: "{} яблок"\n\nVerwendung im Code
\nuse rust_i18n::t;\n\nrust_i18n::i18n!("locales");\n\nfn main() {\n // Einfache Übersetzung\n println!("{}", t!("hello"));\n\n // Pluralisierung unter Berücksichtigung russischer Regeln\n let n = 3;\n println!("{}", t!("apples", count = n, n));\n}\n\nVorteile: Einfachheit, automatische Erkennung des Gebietsschemas, Unterstützung für Platzhalter und Pluralisierung für komplexe Sprachen (Russisch, Arabisch).
\nNachteile: Weniger flexibel als gettext, keine Unterstützung für Kontexte.
3. Bibliothek fluent-rs
\nEntwickelt von Mozilla für Firefox. Verwendet eine eigene Syntax FTL (Fluent Translation List).
\n\nInstallation
\n[dependencies]\nfluent = "0.16"\nfluent-bundle = "0.15"\nfluent-resmgr = "0.4"\n\nBeispiel einer FTL-Datei (locales/ru/main.ftl)
\nhello = Привет, мир!\napples = \n { $count ->\n [0] Нет яблок\n [one] { $count } яблоко\n [few] { $count } яблока\n *[many] { $count } яблок\n }\n\nVerwendung in 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 // Pluralisierung\n let mut args = fluent_bundle::FluentArgs::new();\n Auch in der Bibliothek
Arbeit mit Kafka in C# (.NET): Bibliothek Confluent.Kafka
nock TypeScript: Komplettanleitung mit Beispielen
charm/bubbletea Go: Komplettleitfaden mit Beispielen
Überwachung von Java-Anwendungen: Tools und Bibliotheken zur Metrikenerfassung
Integration von Prometheus-Metriken in Java-Anwendungen: Bibliothek simpleclient