Rust में अंतर्राष्ट्रीयकरण (i18n): लाइब्रेरी और टूल्स का अवलोकन
अंतर्राष्ट्रीयकरण (i18n — 'i' और 'n' के बीच 18 अक्षर) एक एप्लिकेशन को डिज़ाइन करने की प्रक्रिया है जो स्रोत कोड में बदलाव किए बिना विभिन्न भाषाओं और क्षेत्रीय मानकों के अनुकूल बनाती है। Rust इकोसिस्टम में i18n लागू करने के लिए कई परिपक्व लाइब्रेरी मौजूद हैं। इस लेख में हम तीन मुख्य दृष्टिकोणों पर चर्चा करेंगे: क्लासिक gettext, मैक्रो-आधारित rust-i18n, और Mozilla का आधुनिक fluent-rs।
1. gettext लाइब्रेरी (crate gettext-rs)
gettext Unix लोकलाइज़ेशन का डी-फैक्टो मानक है। Rust रैपर gettext-rs GNU gettext के सभी फंक्शन तक पूर्ण पहुँच प्रदान करता है।
इंस्टॉलेशन
[dependencies]
gettext-rs = "0.7"
उपयोग का उदाहरण
use gettextrs::*;
use std::env;
fn main() {
// लोकेल और डोमेन सेट करें
setlocale(LocaleCategory::LcAll, "hi_IN.UTF-8");
bindtextdomain("myapp", "/usr/share/locale").unwrap();
textdomain("myapp");
// स्ट्रिंग का अनुवाद
println!("{}", gettext("Hello, world!"));
// प्लूरलाइज़ेशन (बहुवचन)
let n = 5;
println!("{}", ngettext("{} apple", "{} apples", n, n));
}
लाभ: परिपक्वता, प्लूरलाइज़ेशन सपोर्ट, कॉन्टेक्स्ट अनुवाद (pgettext), Poedit और Transifex के साथ इंटीग्रेशन।
कमियाँ: सिस्टम gettext की आवश्यकता, Windows पर Unicode सपोर्ट आदर्श नहीं।
2. rust-i18n लाइब्रेरी
बिना बाहरी डिपेंडेंसी के शुद्ध Rust कार्यान्वयन। अनुवाद संग्रहीत करने के लिए YAML फ़ाइलों और स्ट्रिंग निकालने के लिए मैक्रो का उपयोग करता है।
इंस्टॉलेशन
[dependencies]
rust-i18n = "3.0"
प्रोजेक्ट संरचना
locales/
├── en.yml
└── hi.yml
locales/hi.yml का उदाहरण:
hello: "नमस्ते दुनिया!"
apples:
zero: "कोई सेब नहीं"
one: "{} सेब"
many: "{} सेब"
कोड में उपयोग
use rust_i18n::t;
rust_i18n::i18n!("locales");
fn main() {
// सरल अनुवाद
println!("{}", t!("hello"));
// हिंदी नियमों के अनुसार प्लूरलाइज़ेशन
let n = 3;
println!("{}", t!("apples", count = n, n));
}
लाभ: सरलता, स्वचालित लोकेल पहचान, जटिल भाषाओं (हिंदी, अरबी) के लिए प्लेसहोल्डर और प्लूरलाइज़ेशन सपोर्ट।
कमियाँ: gettext से कम लचीला, कॉन्टेक्स्ट सपोर्ट नहीं।
3. fluent-rs लाइब्रेरी
Mozilla द्वारा Firefox के लिए विकसित। अपने स्वयं के FTL (Fluent Translation List) सिंटैक्स का उपयोग करता है।
इंस्टॉलेशन
[dependencies]
fluent = "0.16"
fluent-bundle = "0.15"
fluent-resmgr = "0.4"
FTL फ़ाइल का उदाहरण (locales/hi/main.ftl)
hello = नमस्ते दुनिया!
apples =
{ $count ->
[0] कोई सेब नहीं
[one] { $count } सेब
*[many] { $count } सेब
}
Rust में उपयोग
use fluent_bundle::{FluentBundle, FluentResource};
use fluent_resmgr::ResourceManager;
use unic_langid::langid;
fn main() {
let langid = langid!("hi");
let res_mgr = ResourceManager::new("./locales/".into());
let mut bundle = FluentBundle::new(&[langid]);
let ftl_string = res_mgr.load("hi/main.ftl").unwrap();
let resource = FluentResource::try_new(ftl_string).unwrap();
bundle.add_resource(resource).unwrap();
let mut errors = vec![];
let msg = bundle.format_pattern(
bundle.get_message("hello").unwrap().value().unwrap(),
None,
&mut errors
);
println!("{}", msg);
// प्लूरलाइज़ेशन
let mut args = fluent_bundle::FluentArgs::new();
args.set("count", 3);
let