Python کی t-string کے ساتھ
مکمل پیغامات کا ترجمہ¶
gettext-tstrings Python 3.14+ کی t-string کو معیاری gettext کیٹلاگوں اور
Babel کے اوزاروں سے جوڑ دیتی ہے۔ قدریں اور فارمیٹنگ ایپلی کیشن کے کوڈ میں
رہتی ہیں؛ مترجمین مکمل پیغامات اور سادہ {name} پلیس ہولڈرز کے ساتھ کام
کرتے ہیں:
import gettext
from gettext_tstrings import Translator
_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}")) # with a Japanese catalog: こんにちは Ada
کیٹلاگ میں Hello {name} ہوتا ہے۔ ترجمہ {name} کو دوسری جگہ لے جا سکتا ہے
یا اسے دہرا سکتا ہے۔ اگر وہ پلیس ہولڈر حذف کر دے، اس کا نام بدل دے، یا اس کی
صورت بدل دے، تو کیٹلاگ کی توثیق اس غلطی کی اطلاع دیتی ہے۔ اگر کوئی غلط اندراج
پھر بھی پروڈکشن تک پہنچ جائے، تو لائبریری ایک وارننگ لاگ کرتی ہے اور ایپلی
کیشن گرانے کے بجائے ماخذ پیغام رینڈر کر دیتی ہے۔
پانچ منٹ کا ٹیوٹوریل شروع کیجیے متبادلات کا موازنہ کیجیے
الفا · Python 3.14+ · معیاری PO/MO کیٹلاگ · فریقِ ثالث کا کوئی رن ٹائم انحصار نہیں
یہ سائٹ جس چیز کی دستاویز بناتی ہے اسی پر عمل بھی کرتی ہے: ہر زبان کا
ایڈیشن — نیویگیشن، لیبل، اور جمع سے واقف بلڈ رپورٹ — PO کیٹلاگوں سے
خود gettext-tstrings
رینڈر کرتی ہے۔
کیا یہ آپ کے لیے ہے؟¶
آج موزوں ہے جب آپ کی ایپلی کیشن Python 3.14 یا اس سے نئے پر چلتی ہو؛ آپ پہلے ہی gettext اور Babel استعمال کرتے ہوں، یا ان کا PO/MO ورک فلو اپنانا چاہتے ہوں؛ اور آپ نامزد پلیس ہولڈرز والی t-string نحو چاہتے ہوں جو رینڈر ہونے سے پہلے جانچ لی جائے۔
ابھی موزوں نہیں جب آپ کو Python 3.13 یا اس سے پرانا درکار ہو؛ آپ کو مستحکم Python API چاہیے ہو — یہ ایک الفا ہے، اور اس کا جو حصہ ٹھہر چکا ہے وہ تصریح ہے؛ یا آپ کا تقریباً سارا قابلِ ترجمہ متن Python ماخذ کے بجائے کسی ٹیمپلیٹ زبان میں ہو۔
پہلے سے کیٹلاگ موجود ہیں؟ وہ چلتے رہیں گے۔ _("Hello {name}").format(name=name)
اور tr(t"Hello {name}") ایک ہی msgid پیدا کرتے ہیں، لہٰذا موجودہ ترجمے اس
تبدیلی سے بچ نکلتے ہیں — منتقلی پورا سفر طے کراتی ہے۔
کیٹلاگ کیا کہہ سکتا ہے¶
کوئی ترجمہ اُس پیغام کی ساخت نہیں بدل سکتا جس کا وہ ترجمہ کر رہا ہے۔ یہی
پورا وعدہ ہے، اور اس سائٹ کی باقی ساری باتیں اسی سے نکلتی ہیں۔ ترجمہ {name}
کو دوسری جگہ لے جا سکتا ہے یا دہرا سکتا ہے، اور اس کے اردگرد کا ہر لفظ نئے سرے
سے لکھ سکتا ہے۔ وہ پلیس ہولڈر حذف نہیں کر سکتا، نیا ایجاد نہیں کر سکتا، اس کے
راستے آپ کے آبجیکٹس تک نہیں پہنچ سکتا، اور اپنی طرف سے کوئی فارمیٹنگ نہیں جوڑ
سکتا۔
لائبریری اسے اندر آتے وقت جانچتی ہے — جب کیٹلاگ کمپائل ہوتے ہیں — اور رینڈر کے وقت دوبارہ، اور یہی وہ فرق ہے جو جائزے میں پکڑی جانے والی غلطی اور کسی صارف کے ہاتھ لگنے والی غلطی کے درمیان ہے۔
gettext سے واقف نہیں؟ پورا ورک فلو چار جملوں میں
gettext سافٹ ویئر کے ترجمے کا معیاری طریقہ ہے، Python میں بھی اور
اس سے کہیں آگے بھی۔ آپ کا کوڈ قابلِ ترجمہ پیغامات کو نشان زد کرتا ہے؛ ایک
استخراج کار انہیں ایک ٹیمپلیٹ فائل (.pot) میں جمع کرتا ہے؛ ایک
مترجم — جو عموماً پروگرامر نہیں ہوتا — ہر زبان کے لیے ایک کیٹلاگ فائل
(.po) بھرتا ہے، جسے ایک بائنری .mo میں کمپائل کیا جاتا ہے اور آپ کی
ایپلی کیشن اسے رن ٹائم پر لوڈ کرتی ہے۔ ترجمہ کرنے والے فنکشن کا روایتی
نام _ ہے، چنانچہ _(t"Hello {name}") کا مطلب ہے "اس پیغام کا ترجمہ
کرو"۔ ٹیوٹوریل پورا راستہ — نشان زد کرنا، نکالنا،
ترجمہ کرنا، کمپائل کرنا، چلانا — تقریباً پانچ منٹ میں طے کرا دیتا ہے۔
یہ کون سا مسئلہ حل کرتی ہے¶
f-string اُس وقت تک انٹرپولیٹ ہو چکی ہوتی ہے جب کوئی لائبریری اسے دیکھتی
بھی ہے — f"Hello {name}" "Hello Ada" بن چکی ہوتی ہے، اور کسی قدر کے
اردگرد کے ٹکڑوں کا ترجمہ زیادہ تر زبانوں کی گرامر توڑ دیتا ہے۔ t-string
(PEP 750) ثابت متن، ارزیابی شدہ قدروں، ماخذ اظہاریوں، کنورژنوں اور فارمیٹ
اسپیک کو الگ الگ رکھتی ہے — اور یہ بالکل وہی تقسیم ہے جو ایک پیغام کیٹلاگ
کو درکار ہے۔ %(name)s، .format() اور $-سٹرنگز کے مقابلے میں
اس سے کیا فرق پڑتا ہے۔
تاہم gettext یا Babel میں کہیں یہ نہیں لکھا کہ t-string پیغام کیسے بنے۔ یہ لائبریری وہ فیصلہ کرتی ہے، اسے ایک ورژن والی تصریح کی صورت میں لکھ دیتی ہے، اور اس کی جانچ کے لیے مطابقت سویٹ بھی فراہم کرتی ہے۔
ڈیزائن کے قواعد¶
- مکمل پیغامات کا ترجمہ، جملے کے ٹکڑوں کا کبھی نہیں۔
- صرف سادہ متغیر نام قبول کرنا، جیسے
{name}۔ !rاور:.2fکو ایپلی کیشن کے قابو میں، کیٹلاگ سے باہر رکھنا۔- ترجموں کو معلوم پلیس ہولڈرز کی ترتیب بدلنے اور انہیں دہرانے کی اجازت دینا، جبکہ انہیں خصوصیات تک پہنچنے یا فارمیٹنگ جوڑنے سے روکنا۔
- عام POT، PO اور MO فائلوں کا، اور ان اوزاروں کا جو انہیں پہلے ہی پڑھتے ہیں، دوبارہ استعمال۔
اور اس کے مقابل وہ فہرست جسے یہ جان بوجھ کر چھوڑ دیتی ہے: یہ اعداد، کرنسیوں یا تاریخوں کو مقامی نہیں بناتی — انہیں پہلے Babel سے فارمیٹ کر لیجیے؛ یہ رینڈر شدہ آؤٹ پٹ کو HTML، شیل یا ٹرمینل کے لیے ایسکیپ نہیں کرتی؛ اور یہ فیصلہ نہیں کر سکتی کہ کوئی ترجمہ درست ہے یا نہیں، صرف یہ کہ اس کے پلیس ہولڈر سالم ہیں یا نہیں۔
تنصیب¶
Python 3.14 یا اس سے نیا۔ رینڈرنگ کا کوئی انحصار نہیں — یہ صرف معیاری
لائبریری کے gettext کو استعمال کرتی ہے اور بس۔
استخراج اور کیٹلاگ کی توثیق Babel کے ذریعے چلتی ہے، لہٰذا وہ اضافی جزو
وہاں نصب کیجیے جہاں pybabel چلتا ہے — جو عموماً ڈویلپمنٹ یا CI کا ماحول
ہوتا ہے، نہ کہ پروڈکشن امیج:
آگے کہاں جائیں¶
یہاں سے شروع کیجیے — gettext کا کوئی تجربہ فرض نہیں کیا گیا:
- ٹیوٹوریل — ایک خالی ڈائریکٹری سے چلتے ہوئے جاپانی ترجمے تک پانچ مرحلوں میں، ہر کمانڈ اپنے آؤٹ پٹ سمیت۔
- t-string کیوں — وہی پیغام چار طریقوں سے لکھا ہوا، اور
یہ کہ
%(name)s،.format()اور$-سٹرنگز میں سے ہر ایک کیٹلاگ کو کیا تھما دیتا ہے۔
استعمال کیجیے — کام کے حوالہ جات:
- رہنما — رن ٹائم API: کون سا داخلی راستہ استعمال کرنا ہے، جمع کی صورتیں، فی درخواست زبان، مؤخر سٹرنگز، اور کیٹلاگ غلط ہو تو کیا ہوتا ہے۔
- استخراج —
pybabelکا حوالہ: تشکیل، اپنے فنکشن نام، اور یہ کہ موجودہ اوزار ان کیٹلاگوں کی توثیق مفت میں کیسے کر دیتے ہیں۔ - پروڈکشن میں — وہ چکر جیسے کوئی ٹیم اسے چلاتی ہے: اپ ڈیٹ کا دور، fuzzy اندراجات، CI گیٹ، ترجمے کے پلیٹ فارم، اور بھیجنا۔
- منتقلی — اسے ایسے پروجیکٹ میں اپنانا جس کے پاس پہلے ہی کیٹلاگ ہیں، ایک وقت میں ایک کال کی جگہ۔
- مترجمین کے لیے — وہ ایک صفحہ جو اُس شخص کو دینا ہے جو
.poفائلوں میں ترمیم کرتا ہے۔
سمجھیے — تاریخ سے نفاذ تک:
- پس منظر — یہ لائبریری کیوں وجود رکھتی ہے: gettext کے تیس برس، دو PEP، اور معیاری لائبریری کی وہ بحث جو بغیر جواب کے بند ہو گئی۔
- عام لغزشیں — اس سائٹ کا پینتیس زبانوں میں ترجمہ کرنے سے اصل میں کیا کیا ٹوٹا، اور اس میں سے آدھا کون سا اوزار پکڑ سکتا ہے۔
- یہ کیسے کام کرتی ہے — PEP 750 کے ٹیمپلیٹ آبجیکٹ سے رینڈر شدہ سٹرنگ تک، اور وہ کیش جو جانچ کو سستا بنا دیتے ہیں۔
حوالہ — معاہدے:
حالت¶
| پیکیج ورژن | 0.1.0a8 |
| API کی استحکام | الفا — Python API میں اب بھی تبدیلی ہو سکتی ہے |
| تصریح | v1، مع مطابقت سویٹ کے |
| Python | 3.14 یا اس سے نیا؛ 3.14، 3.14t (free-threaded) اور 3.15 پر جانچا گیا |
| Babel | 2.18 یا اس سے نیا، اور صرف وہاں جہاں pybabel چلتا ہے |
| رن ٹائم انحصار | کوئی نہیں — معیاری لائبریری کا gettext |
| کیٹلاگ کی صورت | عام POT، PO اور MO |
| تبدیلیاں | CHANGELOG |
ایک الفا۔ معاہدہ جان بوجھ کر چھوٹا رکھا گیا ہے اور تصریح اس کا مستحکم حصہ ہے؛ Python API میں اب بھی تبدیلی ہو سکتی ہے۔ مستحکم ریلیز سے پہلے اسے وسیع تر زبانی فکسچرز، کارکردگی کی مسلسل نگرانی، ان لوگوں کی طرف سے API کا جائزہ جو gettext اور Babel کو سنجیدگی سے برتتے ہیں، اور ہر معاون Python اور Babel ریلیز کے ساتھ مطابقت کی جانچ درکار ہے۔
ایشوز اور پل ریکویسٹ خوش آمدید — الفا ہی وہ وقت ہے جب انٹرفیس پر بحث کرنا اب بھی سود مند ہے۔
کمیونٹی میں شامل ہوں¶
- محدود دائرے کے تعاون کے لیے کوئی good first issue چن لیجیے۔
- استعمال سے متعلق سوالات Q&A Discussions میں پوچھیے۔
- پروڈکشن کے gettext ورک فلو اور API کے خیالات Ideas Discussions میں لائیے۔
- پل ریکویسٹ کھولنے سے پہلے تعاون کا رہنما پڑھ لیجیے۔