কনটেন্টে যান

সম্পূর্ণ বার্তা অনুবাদ করুন
Python t-strings দিয়ে

gettext-tstrings Python 3.14+ t-strings-কে প্রমিত gettext ক্যাটালগ আর Babel টুলিংয়ের সঙ্গে জুড়ে দেয়। মান ও ফরম্যাটিং থেকে যায় অ্যাপ্লিকেশন কোডেই; অনুবাদকেরা কাজ করেন সম্পূর্ণ বার্তা আর সরল {name} placeholder নিয়ে:

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}-এর জায়গা বদলাতে বা তাকে পুনরাবৃত্তি করতে পারে। কিন্তু সে যদি placeholder-টি বাদ দেয়, তার নাম বদলে দেয় বা তাতে ফরম্যাটিং জুড়ে দেয়, তবে ক্যাটালগ যাচাই সেই ত্রুটি জানিয়ে দেয়। তবুও ভাঙা কোনও এন্ট্রি প্রোডাকশনে পৌঁছে গেলে লাইব্রেরি সতর্কবার্তা লগ করে আর ক্র্যাশ না করে উৎস বার্তাটিই রেন্ডার করে।

পাঁচ মিনিটের টিউটোরিয়াল শুরু করুন বিকল্পগুলির তুলনা দেখুন

Alpha · Python 3.14+ · প্রমিত PO/MO ক্যাটালগ · রানটাইমে কোনও থার্ড-পার্টি নির্ভরতা নেই

এই সাইট যা শেখায়, নিজেই তা মেনে চলে: প্রতিটি ভাষা সংস্করণ — নেভিগেশন, লেবেল এবং বহুবচন-সচেতন বিল্ড রিপোর্ট — PO ক্যাটালগ থেকে gettext-tstrings নিজেই রেন্ডার করে।

এটি কি আপনার জন্য?

আজই মানানসই, যদি আপনার অ্যাপ্লিকেশন Python 3.14 বা নতুনতরে চলে; আপনি আগে থেকেই gettext ও Babel ব্যবহার করেন, বা তাদের PO/MO ওয়ার্কফ্লো গ্রহণ করতে চান; আর আপনি চান নাম-যুক্ত placeholder-সহ t-string সিনট্যাক্স, যেগুলি রেন্ডার হওয়ার আগেই যাচাই হয়ে যায়।

এখনও মানানসই নয়, যদি আপনার Python 3.13 বা তার পুরনো দরকার হয়; আপনার একটি স্থিতিশীল Python API লাগে — এটি একটি alpha, আর তার মধ্যে স্পেসিফিকেশন-ই থিতু হওয়া অংশ; কিংবা আপনার প্রায় সমস্ত অনুবাদযোগ্য টেক্সট Python সোর্সে নয়, কোনও টেমপ্লেট ভাষায় থাকে।

আগে থেকেই ক্যাটালগ আছে? সেগুলি কাজ করতেই থাকবে। _("Hello {name}").format(name=name) আর tr(t"Hello {name}") একই msgid তৈরি করে, তাই বদলের পরেও বিদ্যমান অনুবাদ টিকে যায় — মাইগ্রেশন গোটা পথটিই দেখিয়ে দেয়।

ক্যাটালগ কী বলতে পারে

কোনও অনুবাদ সে যে বার্তাটি অনুবাদ করছে তার কাঠামো বদলাতে পারে না। প্রতিশ্রুতিটি এইটুকুই, আর এই সাইটের বাকি সবটুকুই তা থেকেই আসে। কোনও অনুবাদ {name}-এর ক্রম বদলাতে বা তাকে পুনরাবৃত্তি করতে পারে, আর তার চারপাশের প্রতিটি শব্দ নতুন করে লিখতে পারে। কিন্তু সে placeholder-টি বাদ দিতে পারে না, নতুন একটি বানাতে পারে না, তার ভিতর দিয়ে আপনার অবজেক্টে হাত বাড়াতে পারে না, নিজের ফরম্যাটিংও জুড়তে পারে না।

লাইব্রেরি তা যাচাই করে ঢোকার পথে — যখন ক্যাটালগ কম্পাইল হয় — আর আবার রেন্ডারের সময়ে; পর্যালোচনায় ধরা পড়া ভুল আর ব্যবহারকারীর হাতে ধরা পড়া ভুলের পার্থক্যটা এখানেই।

gettext নতুন লাগছে? গোটা ওয়ার্কফ্লো চার বাক্যে

gettext হল সফটওয়্যার অনুবাদের প্রমিত পদ্ধতি, Python-এ এবং তার অনেক বাইরেও। আপনার কোড অনুবাদযোগ্য বার্তাগুলি চিহ্নিত করে; একটি এক্সট্র্যাক্টর সেগুলি একটি টেমপ্লেট ফাইলে (.pot) জড়ো করে; একজন অনুবাদক — সচরাচর যিনি প্রোগ্রামার নন — প্রতি ভাষায় একটি করে ক্যাটালগ ফাইল (.po) পূরণ করেন, যা কম্পাইল হয়ে বাইনারি .mo হয় এবং আপনার অ্যাপ্লিকেশন রানটাইমে সেটি লোড করে। অনুবাদ ফাংশনের প্রচলিত নাম _, তাই _(t"Hello {name}") পড়া যায় "এই বার্তাটি অনুবাদ করো" হিসেবে। টিউটোরিয়াল গোটা পথটাই — চিহ্নিত করা, এক্সট্র্যাক্ট, অনুবাদ, কম্পাইল, রান — প্রায় পাঁচ মিনিটে পার করিয়ে দেয়।

এটি যে সমস্যার সমাধান করে

কোনও লাইব্রেরি একটি f-string দেখার আগেই সেটি ইন্টারপোলেট হয়ে গেছে — f"Hello {name}" ততক্ষণে "Hello Ada" হয়ে গেছে, আর একটি মানের চারপাশের টুকরোগুলি অনুবাদ করলে বেশিরভাগ ভাষার ব্যাকরণ ভেঙে পড়ে। একটি t-string (PEP 750) স্থির টেক্সট, মূল্যায়িত মান, উৎস এক্সপ্রেশন, কনভার্শন ও ফরম্যাট স্পেক — সব আলাদা রাখে, আর একটি বার্তা ক্যাটালগের ঠিক এই বিভাজনটিই দরকার। %(name)s, .format()$-strings-এর তুলনায় এতে কী বদলায়

তবে t-string থেকে বার্তা কীভাবে তৈরি হবে, gettext বা Babel কোথাও তা বলে না। এই লাইব্রেরি সেই সিদ্ধান্তটি নেয়, তা একটি সংস্করণযুক্ত স্পেসিফিকেশন হিসেবে লিখে রাখে, এবং তা যাচাই করার জন্য কনফরম্যান্স সুইট সরবরাহ করে।

নকশার নিয়মগুলি

  • সম্পূর্ণ বার্তার অনুবাদ, কখনও বাক্যের টুকরোর নয়।
  • কেবল {name}-এর মতো সরল ভেরিয়েবল নাম গ্রহণযোগ্য।
  • !r:.2f অ্যাপ্লিকেশনের নিয়ন্ত্রণে থাকে, ক্যাটালগের বাইরে।
  • অনুবাদ পরিচিত placeholder-এর ক্রম বদলাতে ও পুনরাবৃত্তি করতে পারে, অথচ অ্যাট্রিবিউটে হাত বাড়ানো বা ফরম্যাটিং যোগ করা তার পক্ষে সম্ভব নয়।
  • সাধারণ POT, PO ও MO ফাইল এবং সেগুলি যে টুল আগে থেকেই পড়ে, সবই যেমন আছে তেমনই পুনর্ব্যবহৃত হয়।

আর সে ইচ্ছাকৃতভাবে যা ছুঁয়ে দেখে না, তার মিলিয়ে দেখা তালিকাটি: সে সংখ্যা, মুদ্রা বা তারিখ স্থানীয়করণ করে না — সেগুলি আগে ফরম্যাট করে নিন Babel দিয়ে; সে রেন্ডার করা আউটপুটকে HTML, শেল বা টার্মিনালের জন্য escape করে না; আর কোনও অনুবাদ সঠিক কি না সে তা বিচার করতে পারে না, কেবল তার placeholder অক্ষত আছে কি না তা-ই পারে।

ইনস্টল

python -m pip install gettext-tstrings

Python 3.14 বা নতুনতর দরকার। রেন্ডারিংয়ের কোনও নির্ভরতা নেই — এটি স্ট্যান্ডার্ড লাইব্রেরির gettext ব্যবহার করে, আর কিছুই নয়।

এক্সট্র্যাকশন ও ক্যাটালগ যাচাই Babel-এর মাধ্যমে চলে, তাই সেই extra সেখানেই ইনস্টল করুন যেখানে pybabel চলে — সচরাচর ডেভেলপমেন্ট বা CI পরিবেশ, প্রোডাকশন ইমেজ নয়:

python -m pip install "gettext-tstrings[babel]"

এরপর কোথায় যাবেন

এখান থেকে শুরু করুন — gettext-এর কোনও অভিজ্ঞতা ধরে নেওয়া হয়নি:

  • টিউটোরিয়াল — একটি খালি ডিরেক্টরি থেকে চলমান জাপানি অনুবাদ পর্যন্ত পাঁচ ধাপে, প্রতিটি কমান্ড তার আউটপুটসহ।
  • t-strings কেন — একই বার্তা চারভাবে লেখা, এবং %(name)s, .format()$-strings ক্যাটালগের হাতে কী তুলে দেয়।

ব্যবহার করুন — কাজ চালানোর রেফারেন্স:

  • গাইড — রানটাইম API: কোন এন্ট্রি পয়েন্ট ব্যবহার করবেন, বহুবচন, প্রতি-request ভাষা, deferred স্ট্রিং, আর ক্যাটালগ ভুল হলে কী ঘটে।
  • এক্সট্র্যাকশনpybabel রেফারেন্স: কনফিগারেশন, নিজস্ব ফাংশন নাম, আর প্রচলিত টুলগুলি বিনামূল্যেই এই ক্যাটালগ কীভাবে যাচাই করে।
  • প্রোডাকশনে — একটি দল যেভাবে লুপটি চালায়: আপডেট চক্র, fuzzy এন্ট্রি, CI গেট, অনুবাদ প্ল্যাটফর্ম, আর শিপিং।
  • মাইগ্রেশন — আগে থেকেই ক্যাটালগ আছে এমন প্রকল্পে এটি গ্রহণ করা, একবারে একটি কল-সাইট ধরে।
  • অনুবাদকদের জন্য — যিনি .po ফাইল সম্পাদনা করেন, তাঁর হাতে তুলে দেওয়ার মতো একটিমাত্র পৃষ্ঠা।

বুঝে নিন — ইতিহাস থেকে বাস্তবায়ন পর্যন্ত:

  • পটভূমি — এই লাইব্রেরি কেন আছে: gettext-এর ত্রিশ বছর, দুটি PEP, আর stdlib-এর সেই আলোচনা যা উত্তর ছাড়াই বন্ধ হয়েছিল।
  • সমস্যা ও ফাঁদ — এই সাইটকে পঁয়ত্রিশটি ভাষায় অনুবাদ করতে গিয়ে সত্যিই কী কী ভেঙেছিল, আর তার কতটুকু কোনও টুল ধরতে পারে।
  • এটি কীভাবে কাজ করে — PEP 750-এর টেমপ্লেট অবজেক্ট থেকে রেন্ডার করা স্ট্রিং পর্যন্ত, আর যে ক্যাশগুলি যাচাইকে সস্তা করে তোলে।

রেফারেন্স — চুক্তিগুলি:

  • API — প্যাকেজ যা কিছু এক্সপোর্ট করে, সব এক পৃষ্ঠায়।
  • স্পেসিফিকেশন — t-string ↔ msgid রীতিটি একটি স্থিতিশীল, সংস্করণযুক্ত চুক্তি হিসেবে, মেশিন-পাঠযোগ্য কনফরম্যান্স সুইটসহ।

অবস্থা

প্যাকেজ সংস্করণ 0.1.0a8
API স্থিতিশীলতা alpha — Python API এখনও বদলাতে পারে
স্পেসিফিকেশন v1, সঙ্গে একটি কনফরম্যান্স সুইট
Python 3.14 ও নতুনতর; 3.14, 3.14t (free-threaded) ও 3.15-এ পরীক্ষিত
Babel 2.18 বা নতুনতর, এবং কেবল সেখানেই যেখানে pybabel চলে
রানটাইম নির্ভরতা কোনওটিই নয় — স্ট্যান্ডার্ড লাইব্রেরির gettext
ক্যাটালগ ফরম্যাট সাধারণ POT, PO ও MO
পরিবর্তন CHANGELOG

এটি একটি alpha। চুক্তিটি ইচ্ছে করেই ছোট রাখা হয়েছে এবং স্পেসিফিকেশন তার স্থিতিশীল অংশ; Python API এখনও বদলাতে পারে। স্থিতিশীল রিলিজের আগে এর দরকার আরও বেশি ভাষার fixtures, ধারাবাহিক পারফরম্যান্স ট্র্যাকিং, যাঁরা gettext ও Babel সত্যিকারের কাজে ব্যবহার করেন তাঁদের কাছ থেকে API পর্যালোচনা, এবং সমর্থিত প্রতিটি Python ও Babel রিলিজে সামঞ্জস্য পরীক্ষা।

Issues ও pull requests স্বাগত — alpha-ই তো সেই সময় যখন ইন্টারফেস নিয়ে তর্ক করা এখনও সার্থক।

সম্প্রদায়ে যোগ দিন

  • সীমিত পরিসরের অবদানের জন্য একটি good first issue বেছে নিন।
  • ব্যবহার সংক্রান্ত প্রশ্ন করুন Q&A Discussions-এ।
  • প্রোডাকশনের gettext ওয়ার্কফ্লো আর API নিয়ে ভাবনা আনুন Ideas Discussions-এ।
  • Pull request খোলার আগে অবদানের গাইড পড়ে নিন।