براہِ راست مواد پر جائیں

عام لغزشیں

یہ سائٹ پینتیس زبانوں میں ترجمہ ہوئی ہے، اور ان میں سے ہر ایڈیشن اُسی چکر کو چلا کر تیار ہوا جو یہ دستاویز سکھاتی ہے۔ صنعتی پیمانوں کے لحاظ سے یہ ایک چھوٹا سا ذخیرہ ہے، پھر بھی وہ زیادہ تر پھندے سامنے لانے کو کافی رہا جو i18n کو نظر آنے سے زیادہ مشکل بنا دیتے ہیں۔

نیچے کا ہر حصہ کوئی ایسی چیز ہے جو یہاں واقعی غلط ہوئی، اُس وقت وہ کیسی دکھائی دی، اور وہ لکیر کہاں پڑتی ہے جو لائبریری کی جانچ اور آپ کے اپنے فیصلے کو الگ کرتی ہے۔

متغیر کا نام بدلنا پورے جملے کا ترجمہ دوبارہ کرا دیتا ہے

msgid ہی کیٹلاگ کی کلید ہے، اور انٹرپولیٹ ہونے والا نام اُس کے اندر ہوتا ہے۔ ایک مستقل کو ماڈیول کے دائرے میں منتقل کر کے Python کے اسلوب کے تقاضے کے مطابق بڑے حروف میں لکھنا — author سے AUTHOR — نے Copyright © 2026 {author} · MIT License کو ایسا پیغام بنا دیا جو کسی کیٹلاگ نے کبھی دیکھا ہی نہ تھا۔ اُس ایک سطر کا ہر ترجمہ، ہر زبان میں، دوبارہ fuzzy کے چکر سے گزرتا — ایسے نام بدلنے کے لیے جس سے قاری کو نظر آنے والی کوئی چیز نہیں بدلی۔

لائبریری آپ کو نہیں روکے گی: دونوں ہجے درست پلیس ہولڈر نام ہیں۔ وہ جو کرتی ہے یہ ہے کہ نام کو حفاظت کے قابل بنا دیتی ہے — انٹرپولیشن کا سادہ نام ہونا لازم ہے، چنانچہ کیٹلاگ کی کلید میں جو چیز پڑی ہے وہ ایسا لفظ ہے جسے مترجم پڑھ سکتا ہے، کوئی اظہاریہ نہیں۔

اس کی اُلٹی صورت بناوٹ ہی سے محفوظ ہے۔ کنورژن اور فارمیٹ اسپیک msgid کا حصہ نہیں، لہٰذا {amount:,.2f} کو {amount:,.0f} تک تنگ کرنا نہ کوئی کلید بدلتا ہے، نہ کہیں کوئی ترجمہ باطل کرتا ہے۔

nplurals=2 کا مطلب دو مختلف سٹرنگز نہیں

ترکی، ہنگیرین، فارسی اور بنگالی — چاروں دو جمع صورتیں اعلان کرتی ہیں، اور چاروں میں کسی گنی ہوئی بات کی دونوں صورتیں بجا طور پر ایک ہی سٹرنگ ہوتی ہیں — اسم عدد کے بعد واحد ہی رہتا ہے، لہٰذا {n} sayfa ایک صفحے کے لیے بھی درست ہے اور دس کے لیے بھی۔ جو جائزہ کار اس تکرار کو "درست" کر دے، وہ ترجمہ خراب کر دیتا ہے۔

اُلٹی غلطی بھی اتنی ہی آسان ہے۔ لاتویائی کی تیسری صورت صرف صفر کے لیے ہے؛ سلووینیائی کی دوسری تثنیہ ہے، بالکل دو کے لیے؛ رومانیائی کی آخری صورت اُس لفظ de کا تقاضا کرتی ہے جو اُس کی پہلی دو صورتوں میں ہونا ہی نہیں چاہیے۔ اِن خانوں کو واحد اور جمع سے بھر دینا ایسا کیٹلاگ پیدا کرتا ہے جو صرف اُن گنتیوں پر غلط ہے جنہیں کوئی نہیں آزماتا۔

اس سے بھی بُری بات یہ کہ خانوں کی ترتیب معنوی نہیں۔ ویلش اپنی پانچ صورتوں کو یوں فہرست کرتی ہے کہ msgstr[0] عام صورت ہے اور msgstr[1] واحد۔ انہیں ظاہری ترتیب سے بھرنا واحد کو وہیں رکھ دیتا ہے جہاں ہر بغیر گنتی والا پیغام اسے پا لے گا۔

لائبریری اس میں سے کچھ بھی اپنے ذمے نہیں لیتی، اور یہی مقصود ہے: ہدف زبان کا جمع کا قاعدہ اُسی کے اپنے کیٹلاگ کی ہیڈر میں رہتا ہے، اور اتحاد/اشتراک کا قاعدہ ترجمے کو ماخذ سے زیادہ صورتیں رکھنے دیتا ہے یا کم۔ وہ جو جانچتی ہے، وہ واحد چیز ہے جسے زبان جانے بغیر جانچا جا سکتا ہے — کہ ہر صورت اپنے مطلوبہ پلیس ہولڈرز برقرار رکھے۔

دو صورتیں کسی وجہ سے یکساں بھی ہو سکتی ہیں

آئرش کی پانچ جمع صورتیں ہیں، اور اس سائٹ کی بلڈ رپورٹ میں اُن میں سے کئی ایک ہی طرح لکھی جاتی ہیں۔ یہ نقل و چسپاں کی پھسلن نہیں: leathanach کا آغاز l سے ہوتا ہے، اور آئرش کے اعداد جو دو ابتدائی تبدیلیاں لاتے ہیں اُن میں سے کوئی بھی l پر لکھی نہیں جاتی۔ صورتیں پھر بھی اصل کام کرتی ہیں — تنا leathanach اور leathanaigh کے درمیان بدلتا ہے، اور دس سے اوپر کی گنتیاں واحد کی طرف لوٹ جاتی ہیں — مگر "صفحہ" کے معنی والا کوئی اسم یہ فرق دکھا ہی نہ پاتا۔

جو بھی جانچ دہری صورتوں کو مشکوک ٹھہرائے گی، وہ درست آئرش پر بھی جھنڈا لگا دے گی۔ اس کے لیے واحد جائزہ کار وہ انسان ہے جو یہ زبان جانتا ہے۔

پیغام صرف ایک ہی گنتی سے مطابقت کر سکتا ہے

اس سائٹ کی بلڈ رپورٹ بتاتی ہے کہ کتنے صفحے رینڈر ہوئے اور اس میں کتنا وقت لگا۔ اسے "Rendered {n} pages in {seconds} seconds" لکھنا بے ضرر لگتا ہے اور قابلِ ترجمہ نہیں: gettext ایک گنتی سے ایک صورت چنتا ہے، اور وہ گنتی n ہے۔ لفظ seconds کو ایسے عدد سے مطابقت کرنی پڑتی جسے جمع کی مشینری کبھی دیکھتی ہی نہیں۔

علاج یہ ہے کہ دوسری مقدار کو لفظ کے بجائے اکائی کی علامت بنا دیا جائے، اور اکائی کی علامتیں خود بھی مقامی ہوتی ہیں: اس سائٹ کے کیٹلاگ s، с، ث، שנ׳ اور mp اٹھائے ہوئے ہیں، اور فرانسیسی، ہسپانوی اور سویڈش طباعت علامت سے پہلے وہ جگہ چاہتی ہے جو انگریزی نہیں چاہتی۔ ان میں سے کوئی چیز لائبریری کا معاملہ نہیں — مگر یہ بھانپ لینا کہ ایک پیغام کو دو مطابقتیں درکار ہیں، ناگزیر ہے، اور اس کا واحد اوزار پیغام کو کسی اور طرح لکھنا ہے۔

انگریزی جملے کی ترمیم اجنبی گرامر کی ترمیم ہے

صفحۂ اول پر پہلے "all ten language editions" لکھا ہوتا تھا۔ عدد کا ہٹانا — انگریزی میں ایک لفظ کی ترمیم، جو اس لیے کی گئی کہ عدد بار بار پرانا پڑ جاتا تھا — جمع کے فاعل کو واحد کر گیا۔ ہسپانوی، اطالوی، پرتگالی، روسی، یوکرینی، یونانی، ولندیزی اور عبرانی سب کو فعل کی مطابقت دوبارہ کرنی پڑی؛ کئی میں اسم مفعول بھی بدلنا پڑا۔

ماخذ کی جو ترمیم انگریزی میں معمولی پڑھی جاتی ہے، وہ آگے چل کر معمولی نہیں رہتی۔ اسے fuzzy نشان زد کرنا، جو pybabel update کرتا ہے، وہی طریقہ ہے جو ہر مترجم کو غور کرنے کا موقع دیتا ہے۔

نظر نہ آنے والے فرق ہر نقل و چسپاں سے بچ نکلتے ہیں

رہنما ایک ایسا تشخیصی پیغام نقل کرتا ہے جس میں (nаme) آتا ہے — یہ جان بوجھ کر کیا گیا اسکیپ ہے، کیونکہ جس حرف کا وہ نام لیتا ہے وہ سیریلک а ہے جسے کوئی قاری لاطینی سے الگ نہیں پہچان سکتا۔ اس سائٹ کے مترجموں نے اُس اسکیپ کو پانچ الگ الگ مواقع پر، پانچ مختلف زبانوں میں، اصل حرف میں بدل ڈالا، اور ہر بار ایسا صفحہ بنایا جو درست دکھتا تھا اور تھا غلط۔

یہ چیز لائبریری واقعی پکڑ لیتی ہے، اور یہی سبب ہے کہ تشخیصی پیغام اسی شکل میں ڈھالے گئے ہیں: جس پلیس ہولڈر کے حروف میں رسم الخط آپس میں مل جائیں وہ دو بار بتایا جاتا ہے، ایک بار پڑھنے کے قابل صورت میں اور ایک بار اسکیپ شدہ، کیونکہ اسکیپ شدہ صورت ہی واحد ہجے ہے جو دونوں میں فرق کرتا ہے۔ بریسز کے اندر آنے والی بغیر وقفے کی جگہ اسی وجہ سے کوڈ پوائنٹ کے ساتھ چھاپی جاتی ہے۔ کیٹلاگ کا چیکر پیغام کو شائع ہونے سے پہلے ہی رد کر دیتا ہے۔

غیر خالی ہونا ترجمہ ہونا نہیں

وہ کیٹلاگ جس کے msgid نقل کر کے msgstr میں ڈال کر ڈھانچہ کھڑا کیا گیا ہو، ہر سادہ لوح جانچ پاس کر جاتا ہے: کچھ خالی نہیں، کچھ fuzzy نہیں، پیغاموں کا مجموعہ ہو بہو میل کھاتا ہے۔ اس سائٹ کا ایک ایڈیشن کئی گھنٹے اسی حال میں شائع رہا۔ اور ایسا ہی ایک دوسرے ایڈیشن کے آٹھ صفحوں کے ساتھ ہوا جو انگریزی ماخذ کی بائٹ در بائٹ نقل تھے — اور وہ کوڈ بلاکس کا آپس میں موازنہ کرنے والی جانچ بھی پاس کر جاتے ہیں، کیونکہ وہ ایک ہی فائل ہیں۔

ان میں سے کوئی بھی ایسی چیز نہیں جسے ترجمے کی کوئی لائبریری دیکھ سکے۔ اور دونوں کی جانچ سستی ہے، مگر ہر اندراج سے ماخذ سے مختلف ہونے کا تقاضا کر کے نہیں: OK، مصنوعات کے نام، اشخاص کے نام، مخففات اور کوڈ کے شناخت کنندہ سب اپنے ہی جیسے ترجمہ ہوتے ہیں، اور جو جانچ اس کی ممانعت کرے وہ ہمیشہ جھوٹے انتباہ دیتی رہے گی۔

اس کے بجائے پورے کیٹلاگ یا پورے صفحے پر شرح ناپیے، اور جو اس سے باہر نکلیں انہیں کسی انسان کے پاس بھیجیے۔ اس سائٹ کی اپنی جانچ بالکل یہی کرتی ہے — یہ ہر ایڈیشن کی نثری سطروں کا انگریزی ماخذ سے موازنہ کرتی ہے اور 25% سے زیادہ یکساں ہونے پر ناکام ہو جاتی ہے۔ جعلی ایڈیشن 87% پر تھا؛ ہر اصلی ترجمہ 4% اور 8% کے درمیان رہتا ہے، یعنی وہ چھوٹی سی دم جو جائز طور پر میل کھا جاتی ہے، جیسے URL اور اقتباس شدہ پروگرام آؤٹ پٹ۔ دونوں گروہ اتنے دور ہیں کہ حد کو باریک ہونے کی ضرورت نہیں۔

کیٹلاگ ہی واحد ترجمہ شدہ چیز نہیں

یہاں کی دو ناکامیوں کا gettext سے کوئی تعلق ہی نہیں تھا۔

عنوان کا ترجمہ اُس سے بننے والا اینکر بدل دیتا ہے، چنانچہ اُس حصے کی طرف جانے والی ہر بین الصفحاتی کڑی ٹوٹ جاتی ہے — خاموشی سے، اور صرف اُسی زبان میں۔ یہی وجہ ہے کہ یہ سائٹ ہر عنوان پر انگریزی اینکر جڑ دیتی ہے، اور ایک ٹیسٹ متوقع فہرست انگریزی صفحے سے اخذ کرتا ہے۔

اور سائٹ جنریٹر اڑسٹھ زبانوں کے لیے انٹرفیس کے ترجمے ساتھ لاتا ہے، جن میں سواحیلی اور آئرش شامل نہیں۔ ان کے بغیر بلڈ انگریزی کی طرف نہیں لوٹتا؛ ٹیمپلیٹ کا include ناکام ہو جاتا ہے اور وہ ایڈیشن سرے سے بن ہی نہیں سکتا۔ اسی خلا کو پُر کرنے کے لیے خود اس ریپازٹری کی دو فائلیں موجود ہیں۔

آپ کے اوزاروں میں بھی بگ ہوتے ہیں

باسی کیٹلاگ پکڑنے کے لیے یہ دستاویز جس CI مرحلے کی سفارش کرتی ہے، یعنی pybabel update --check، وہ یہ کام کسی بھی ایسے پروجیکٹ کے لیے نہیں کر سکتا جو pgettext یا npgettext استعمال کرتا ہو۔ Babel 2.18.0 پر وہ ہر اُس کیٹلاگ کو، جس میں msgctxt ہو، ہر بار پرانا بتاتا ہے۔ موازنہ Catalog.is_identical سے ہو کر گزرتا ہے، جو ہر پیغام کو اُسی کلید سے تلاش کرتا ہے جس کے تحت وہ محفوظ ہے — اور سیاقی پیغام کے لیے وہ کلید (id, context) کا جوڑا ہے، جسے Catalog.get قبول ہی نہیں کرتا۔ تلاش کچھ نہیں لوٹاتی، اور کیٹلاگ کبھی برابر نہیں ٹھہرتے:

>>> from babel.messages.catalog import Catalog
>>> c = Catalog(locale="ja")
>>> c.add("Guide", "ガイド", context="navigation")
<Message 'Guide' (flags: [])>
>>> c.is_identical(c)
False

یہ یہیں اسے برتنے کی کوشش میں دریافت ہوا، بالائی دھارے میں رپورٹ ہوا، اور اس کی جگہ لینے والی جانچ پروڈکشن کے صفحے پر ہے۔

عمومی سبق وہی تکلیف دہ سبق ہے: ہمیشہ سرخ رہنے والا گیٹ کسی گیٹ نہ ہونے سے بدتر ہے، کیونکہ ٹیم اسے بند کر دیتی ہے۔ اپنی CI جانچ پر ناکام کرنے کا بھروسا کرنے سے پہلے تصدیق کر لیجیے کہ وہ واقعی کامیاب بھی ہو سکتی ہے۔

یہ لائبریری کس لیے ہے، ایک سطر میں

اس صفحے کا بیشتر حصہ ایسا فیصلہ ہے جو کوئی اوزار آپ کی جگہ نہیں کر سکتا۔ اوزار جو کر سکتا ہے وہ یہ ضمانت ہے کہ ترجمہ اُس جملے کی ساخت نہیں بدل سکتا جس کا وہ ترجمہ ہے — نہ کوئی قدر گرا سکتا ہے، نہ نئی ایجاد کر سکتا ہے، نہ کسی کو دوبارہ فارمیٹ کر سکتا ہے، نہ آپ کے آبجیکٹس تک ہاتھ بڑھا سکتا ہے — اور یہ بات ایسے جملے میں کہہ سکتا ہے جس پر وہ شخص عمل کر سکے جسے خرابی درست کرنی ہے۔ یہ لائبریری بس اتنا ہی وعدہ کرتی ہے، اور اس سائٹ کا باقی سب کچھ یہ ہے کہ وہ اسے نبھاتی کیسے ہے۔