অনুবাদকদের জন্য¶
এই পৃষ্ঠাটি যিনি ক্যাটালগ সম্পাদনা করছেন তাঁর জন্য, যিনি কোড লিখছেন তাঁর জন্য নয়। এটি ইচ্ছে করেই ছোট, আর একে কোনও প্রকল্পের নিজস্ব অনুবাদক-নির্দেশিকায় লিঙ্ক করা বা কপি করে নেওয়ার জন্যই ভাবা হয়েছে।
এখানকার কিছুর জন্যই আপনাকে Python পড়তে হবে না। এখানকার সবটাই একটিমাত্র জিনিস নিয়ে: বাঁকা বন্ধনীর ভিতরে থাকা বার্তার টুকরোগুলি।
Placeholder জিনিসটি কী¶
ক্যাটালগের একটি বার্তায় বাঁকা বন্ধনীর ভিতরে নাম থাকতে পারে:
{name} হল একটি placeholder। প্রোগ্রাম যখন এই বার্তাটি দেখায়, সে {name}-এর
জায়গায় নিজের দেওয়া একটি মান বসায় — কারও নাম, কোনও ফাইলের নাম, একটি সংখ্যা।
Placeholder অনুবাদ করার মতো কোনও শব্দ নয়; সে একটি খোপ।
আপনার অনুবাদ যায় msgstr-এ, আর তাকে ওই খোপটি ধরে রাখতেই হবে:
কী বদলাতে পারেন, আর কী পারেন না¶
আপনি পারেন:
- লক্ষ্য ভাষার ব্যাকরণ যেখানে চায় সেখানেই placeholder সরাতে, বার্তার একেবারে শুরুতে নিয়ে আসাসহ।
- ভাষার যদি মানটি দুবার লাগে, তবে placeholder পুনরাবৃত্তি করতে।
- বাকি প্রতিটি শব্দ নতুন করে লিখতে, যতিচিহ্ন, ফাঁক ও বাক্যের ক্রমসহ।
আপনি পারেন না:
- বন্ধনীর ভিতরের নামটি অনুবাদ করতে।
{name}{name}-ই থাকে, এমন ভাষাতেও যা আর কিছুই লাতিন হরফে লেখে না। - বন্ধনী সরিয়ে ফেলতে, বা নামটিকে বন্ধনী ছাড়া লিখতে।
- ASCII বন্ধনী
{}-এর বদলে পূর্ণ-প্রস্থ{}বসাতে। বহু input method পূর্ণ-প্রস্থ রূপগুলিই তৈরি করে; দেখতে প্রায় একরকম, আর কাজ করে না। - ফরম্যাটিং যোগ করতে, যেমন
{name!r}বা{amount:.2f}। একটি মান কীভাবে দেখানো হবে তা ঠিক হয় প্রোগ্রামে, ক্যাটালগে নয়। msgid-এ নেই এমন placeholder বানিয়ে নিতে।
কোনও বার্তায় যদি এমন একটি মান দরকার হয় যা মূলটি দেয় না, তবে সেটি এমন একটি বার্তা যা ডেভেলপারকেই বদলাতে হবে। ঘুরপথ না খুঁজে সেটাই জানান।
বহুবচনের রূপ¶
গণনা-নির্ভর একটি বার্তা আপনার ভাষার প্রতিটি বহুবচন রূপের জন্য একটি করে
msgstr খোপ নিয়ে আসে, আর সে সংখ্যাটি কত তা আপনার ভাষাই ঠিক করে — জাপানিতে
একটি, জার্মানে দুটি, রুশে তিনটি, আরবিতে ছয়টি। ক্যাটালগ আপনাকে যতগুলি খোপ দেয়,
প্রতিটিই ভরাট করুন।
দুটি নিয়ম যাতে লোকে হোঁচট খায়:
- খোপগুলি "একবচন, বহুবচন, আরও বহুবচন" নয়। প্রতিটি সূচক ঠিক ততটুকুই বোঝায় যতটা আপনার ভাষার বহুবচন নিয়ম বলে। লাতভিয়ানের তৃতীয় রূপটি কেবল শূন্যের জন্য; স্লোভেনের দ্বিতীয়টি ঠিক দুইয়ের জন্য; ওয়েলশ সাধারণ ক্ষেত্রটিকে রাখে সূচক 0-তে আর একবচনকে সূচক 1-এ।
- দুটি খোপে বৈধভাবেই একই টেক্সট থাকতে পারে। তুর্কি, হাঙ্গেরীয়, ফারসি ও বাংলায় সংখ্যাবাচক শব্দের পরে বিশেষ্য একবচনেই থাকে, তাই গণনা-নির্ভর বার্তার দুটি রূপই একই স্ট্রিং। এটি সঠিক, কপি-পেস্টের ভুল নয়।
উপরের placeholder-নিয়মগুলি প্রতিটি রূপের ক্ষেত্রে আলাদা আলাদাভাবে প্রযোজ্য।
Fuzzy এন্ট্রি¶
fuzzy চিহ্ন দেওয়া একটি এন্ট্রি হল যন্ত্রের একটি আন্দাজ: ডেভেলপার মূল
বার্তাটি বদলেছেন, আর টুলিং নতুন টেক্সটটিকে আপনার পুরনো অনুবাদের সঙ্গে জোড়া
বেঁধে দিয়েছে যাতে আপনার শুরু করার একটা জায়গা থাকে।
একটি fuzzy এন্ট্রি প্রোগ্রাম ব্যবহার করে না — সে বদলে অনূদিত হয়নি এমন
মূলটিই দেখায় — যতক্ষণ না কেউ টেক্সটটি সংশোধন করে fuzzy চিহ্নটি সরিয়ে দেন।
বেশিরভাগ PO এডিটরে ঠিক এই কাজটির জন্য একটি বোতাম থাকে।
একটি ব্যর্থতা-বার্তা পড়া¶
ক্যাটালগ কম্পাইল হওয়ার সময় টুলিং placeholder যাচাই করে, আর বার্তাটি লেখা
হয়েছে আপনার জন্য, কোনও প্রোগ্রামারের জন্য নয়। আপনি যখন ওই অক্ষরগুলি নিজের
চোখের সামনেই দেখতে পাচ্ছেন, তখন কেবল {name} অনুপস্থিত বলাটা অন্ধগলি, তাই
যেখানে placeholder উপস্থিত বলে মনে হয় অথচ নয়, সেখানে বার্তাটি কারণটাও বলে।
মূল Hello {name}-এর বিপরীতে এদের প্রতিটি রিপোর্ট হয়
translation does not match the source placeholders:-এর অধীনে
| আপনার অনুবাদে যা আছে | সে যে কারণ দেয় |
|---|---|
こんにちは {name} |
{name} অনুপস্থিত (তাকে ঘিরে থাকা বন্ধনী ASCII { ও } নয়) |
こんにちは {{name}} |
{name} অনুপস্থিত (লেখা হয়েছে {{name}}, যেভাবে আক্ষরিক বন্ধনী escape করা হয়) |
こんにちは name |
{name} অনুপস্থিত (নামটি আছে, কিন্তু বন্ধনীর ভিতরে নয়) |
こんにちは {名前} |
{name} অনুপস্থিত; {名前} উৎস বার্তায় নেই |
যেসব অক্ষর দেখা যায় না, তারা আলাদা ব্যবহার পায়। বন্ধনীর ভিতরে একটি no-break space হল এমন জিনিস যা কোনও input method তৈরি করে আর কোনও এডিটর দেখায় না, তাই বার্তাটি আপনি কখনও খুঁজে পাবেন না এমন একটি অক্ষরের নাম বলার বদলে তাকে code point হিসেবে ছাপে:
যে নামের অক্ষরগুলি একাধিক লিখনপদ্ধতি মিশিয়ে ফেলে — homoglyph-এর ক্ষেত্র,
যেখানে একটি সিরিলিক а লাতিন a থেকে আলাদা করা যায় না — তাকে দুবার দেখানো
হয়, একবার পাঠযোগ্যভাবে আর একবার escape করে, কারণ কেবল সেই রূপটিই দুটিকে
আলাদা করে চেনায়:
translation does not match the source placeholders: {name} is missing;
{nаme} (n\u0430me) is not in the source message
একটি গ্রিক বা সিরিলিক নাম পুরোপুরি এক লিপিতে লেখা হয়েও কোনও ASCII উৎস-নামের
সঙ্গে সংঘাতে এলে একই অস্পষ্টতা-নিরসন প্রযোজ্য, এক-অক্ষরের লাতিন a /
সিরিলিক а-র ক্ষেত্রটিসহ।
এদের একটির মুখোমুখি হয়ে সমাধানটি স্পষ্ট না হলে নিরাপদ পদক্ষেপ হল আপনি যে
placeholder-টি টাইপ করেছেন তা মুছে দিয়ে msgid থেকে সেটিকে কপি করে আনা।
যাচাইগুলি যা পারে না¶
টুলিং যাচাই করে আপনার placeholder অক্ষত আছে কি না। অনুবাদটি নির্ভুল, স্বাভাবিক বা প্রসঙ্গের সঙ্গে মানানসই কি না তা সে বলতে পারে না — সেটুকু পুরোপুরি আপনারই থাকে।
যেকোনও যাচাইয়ের চেয়ে দুটি জিনিস বেশি কাজে দেয়:
- অনুবাদকের জন্য লেখা মন্তব্যটি পড়ুন। বার্তার উপরে
#.দিয়ে শুরু হওয়া একটি লাইন হল ডেভেলপারের বলা কথা — বার্তাটি কোথায় দেখা যায় আর তার মানে কী। msgctxtনিয়ে জিজ্ঞেস করুন। একই শব্দ যখন ভিন্ন context-সহ দুবার আসে, তার কারণ দুটিকে ভিন্নভাবে অনুবাদ করতে হবে — যেমন বোতাম হিসেবে "Open" আর অবস্থা হিসেবে "Open"।