কখনো কখনো সেরা ব্লগ পোস্ট নিজের খুঁজে বের করার থেকে আসে। এবং আজকের ব্লগ পোস্ট তার একটি উদাহরণ!
আপনি নিশ্চিতই Devise জানেন—রেইলস অ্যাপ্লিকেশনের জনপ্রিয় অথেন্টিকেশন সমাধান। Devise-এর সাথে কাজ করার সময়, আমি দেখলাম একটি অনুবাদ চালু করা আমার অনুমানের চেয়ে বেশি জটিল। অতীতের আমি চেয়েছিলাম একটি চেকলিস্ট থাকে যা প্রসেস 내내 গাইড করবে।
তাহলে এখানে আছেন—ভবিষ্যতের আমার এবং আপনার জন্য—Devise ইন্টারন্যাশনালাইজেশন চেকলিস্ট!
devise-i18n জেম কখন ব্যবহার করবেন (এবং কখন নয়)?
Devise-এর পলিসি হল Devise ভিউতে স্ট্রিংগুলো অনুবাদযোগ্য করা নয়। সকল স্ট্রিং হার্ডকোডেড। devise-i18n জেমের সৃষ্টিকর্তাদের কুডোস, যা সকল Devise টেমপ্লেটকে অনুবাদযোগ্য করে এবং কমিউনিটি-সোর্সড অনুবাদও প্রদান করে। বহুভাষিক অ্যাপের জন্য, যেখানে আপনার মাল্টি-ল্যাঙ্গুয়েজ সাপোর্ট দরকার, devise-i18n জেম সবচেয়ে সহজ সমাধান।
তবে, devise-i18n জেম স্পষ্টভাবে Devise টেক্সট যতটা সম্ভব নিকট অনুসরণ করতে বেছে নেয়। কিন্তু Devise যা টেক্সট প্রদান করে সেটি খুব কনসিস্টেন্ট নয়। এবং যেহেতু শाब্দিক অনুবাদ কখনো ফ্লুয়েন্ট ল্যাঙ্গুয়েজ জেনারেট করে না, আমি باستمرار অনুবাদ টিউন করি (এবং প্রজেক্টের মাঝপথে ফাইল কপি করি)। এটি একটি চলমান সংগ্রাম কারণ একটা স্ট্রিং বা একটা ভিউ দেখে সব অনুবাদ কনসিস্টেন্ট রাখতে কঠিন।
ফলস্বরূপ, i18n-devise জেমের অনুবাদের গুণগত মান আমার মনোলিংগুয়াল, ডাচ-ওনلی প্রজেক্টের জন্য প্রয়োজনীয় স্ট্যান্ডার্ড পৌঁছাতে পারেনি।
কাস্টমাইজড ভিউ সহ জেম ব্যবহার করার আরেকটি ডিসঅ্যাডভান্টেজ। যদি শুধু স্টাইলিংয়ের সাথে সম্পর্কিত হয়, তবুও devise-i18n জেমের যেকোনো আপডেট যা Devise ভিউতে পরিবর্তন এনেছে, অর্থাৎ আপনাকে জিনিসগুলো ফিক্স করতে হবে। আপনাকে হয় ভিউগুলো রি-জেনারেট করে কাস্টমাইজেশন অ্যাপ্লাই করতে হবে অথবা আপনাকে আপনার ভিউতে পরিবর্তনগুলো কপি/পেস্ট করতে হবে। এই সমস্যা নিচের চেকলিস্টের পদ্ধতিতে সমাধান হয়নি, বটে জেম ছাড়া এটি আরো কঠিনও নয়। 🤷♀
🇳🇱 একটি ডাচ ট്രീট
আমি Devise-এর জন্য একটি সুন্দর ডাচ অনুবাদ ফাইল তৈরি করলাম, এবং আর কখনো এই बाबতে চিন্তা করতে হবে না। শুনতে ট്രീট মনে হয়? আপনি নতুন এবং উন্নত অনুবাদ ফাইলটি GitHub-এ পাবেন। চেকলিস্টের স্টেপ ৩ দেখুন। প্রতিটি অনুবাদ সিদ্ধান্তের যুক্তি ফাইলে ব্যাখ্যা করা আছে।
চূড়ান্ত চেকলিস্ট
এখন যেহেতু আমরা :nl অনুবাদে সোলো উড়ছি, চলুন সব ডিটেইলস দিয়ে শুরু করি এবং বক্সগুলো টিক করি।
নোট করুন এটি অনুমান করে যে আপনার একটি অ্যাপ রেডি, Devise অ্যাড এবং ইনস্টল করা User মডেলসহ, এবং Devise ভিউগুলো জেনারেট করা। আপনি যদি কোডিং করছেন: এটি স্টার্টিং পয়েন্ট। এবং নোট করুন nl in *.nl.yml আপনার পছন্দের ভাষায় রিপ্লেস করা যাবে, এবং User এবং :user আপনি Devise-এ যে মডেল নাম ব্যবহার করেন সেটি দিয়ে রিপ্লেস করা যাবে।
স্টেপ এক: লোকেল সেট করুন
:nl আভেইলেবল লোকেলগুলোর সাথে যোগ করুন (আপনার যদি স্ট্রং অপিনিয়ন না থাকে, তবে এখন application.rb-এ রাখুন)। এখন এটি ডিফল্ট হিসেবে সেট করুন।
# application.rb config.i18n.available_locales = [:nl, :en] config.i18n.default_locale = :nl
লোকেল সেট করার আরও ভালো, সম্ভবত ক্লিনার অপশন আছে application.rb-এ যোগ করার চেয়ে। এই পোস্ট পড়ার পর রেইলস i18n গাইড চেক করুন আপনার জন্য উপযুক্ত অপশন বেছে নেওয়ার জন্য।
স্টেপ দুই: রেইলস অনুবাদ যোগ করুন
রেইলস :nl অনুবাদ ফাইলটি যোগ করুন যাতে ইন্টারফেসে যেসব স্ট্রিং Devise-স্পেসিফিক নয় সেগুলো হ্যান্ডেল হয় (বিশেষ করে রেইলস ভ্যালিডেশন এরর মেসেজ)।
স্টেপ তিন: Devise কীগুলো
Devise কীগুলোকে :nl-এ অনুবাদ করুন: নতুন এবং উন্নত ডাচ অনুবাদ যোগ করুন! (উপর লিংক 🇳🇱)
স্টেপ চার: views.*.yml ফাইল তৈরি করুন
ভিউগুলো için ডাচ এবং ইংরেজি .yml ফাইল যোগ করুন, views.*.yml। রিপোতে একটি ফিনিশড views.nl.yml ফাইলের উদাহরণ আছে, যা স্টেপ ৪, ৬ এবং ৭ রিফ্লেক্ট করে।
#example views.nl.yml nl: devise: #Devise স্কোপস দিয়ে পরে পূরণ করুন: # registrations: # new: # forget_password: Wachtwoord vergeten?
স্টেপ পাঁচ: Active Record অ্যাট্রিবিউটগুলো
এখন, Active Record অ্যাট্রিবিউটের লেবেলগুলোর জন্য অনুবাদ যোগ করুন, যেমন ইমেইল এবং পাসওয়ার্ড। শুধু যেসবকে ইউজার এবং অ্যাডমিন ইউজার দেখে, প্রতিটি মডিউল যা আপনি ইমপ্লিমেন্ট করেছেন তার জন্য অনুবাদ করুন। টোকেন নাম এবং এগুলোর অনুবাদ করার প্রয়োজন নেই (যেমন i18n জেম করে)। এখানে আমি যা útil মনে করি 'ট্রান্সলেটেবলস':
# In: active_record.nl.yml # User অ্যাট্রিবিউটের সাথে ম্যাপ করা লেবেল অনুবাদ nl: activerecord: attributes: user: current_password: Huidig wachtwoord email: e-mailadres password: wachtwoord password_confirmation: Wachtwoord bevestigen remember_me: Ingelogd blijven? models: user: Gebruiker
লক্ষ্য করুন :email এবং :password ভ্যালুগুলো ডাউনকেস। এটা স্টেপ ৭-এ রেইলস এরর মেসেজে টুইকস করার কারণে।
এখনলাগে, কীগুলো active_record.*.yml-এ রাখুন।
স্টেপ ছয়: প্রতিটি Devise ভিউ চেক করুন
পরবর্তী, সকল Devise-স্পেসিফিক টেমপ্লেট এবং স্ট্রিংগুলো সংশ্লিষ্ট অনুবাদ সহ i18n-এড হতে হবে। নিজে করা একটি অৎপত্যকর কাজ। আপনি ডুবে যাওয়ার আগে, দেখুন এই শর্টকাটগুলো আপনার জন্য কাজ করে কিনা:
আপনি ভিউগুলো için 118n-devise জেম ব্যবহার করতে পারেন, কিন্তু আপনাকে জেমের
.ymlফাইল থেকে কীগুলো আপনার প্রজেক্টের.ymlফাইলগুলোতে কপি করতে হবে। জেম সেগুলোdevise.*.yml-এ ইন্টারলিভ করে, কিন্তু আমরা আমাদের সুন্দর নতুন ডাচ অনুবাদ আওয়াররাইট করতে চাই না। এবং আপনি যদি Devise ভিউ স্টাইল করে থাকেন, তবে স্টাইলিংও কপি করতে হবে। Yugh।আপনার যদি ইতিমধ্যে i18n-এড প্রজেক্ট থাকে, তবে ভিউ ফাইলগুলো কপি করতে পারেন। (পূর্বের অপশনের মতো একই ডিসঅ্যাডভান্টেজ।)
রিপোতে আমার লেটেস্ট প্রজেক্টে ব্যবহার করা কিছু ভিউর উদাহরণের জন্য ব্যবহার করুন।
অথবা একবারই সমাধান করুন: মাথা নিচে নামিয়ে, এমন একটি ফাইল সেট তৈরি করুন যা আপনি আজ থেকে ব্যবহার করতে পারেন, ঠিক যেমন আপনি চান। পূর্বের স্টেপের উদাহরণগুলো আমার প্রথম ভার্সন; সেগুলো আপনাকে আপনার নিজের কিক-স্টার্ট করতে সাহায্য করতে পারে। নিচের মিনি-চেকলিস্ট চেক আউট করুন সকল রিকোয়ারমেন্টের জন্য।
Devise ফর্মের জন্য মিনি চেকলিস্ট
- Active Record স্ট্রিং নয় এমন স্ট্রিংগুলো i18n-এড হতে হবে এবং (প্রোপারলি স্কোপড) কী ও অনুবাদ থাকবে (যেমন একটি
views.*.ymlফাইলে—উদাহরণ দেখুন)।
<লি>নিশ্চিত করুন যে ডাচ অনুবাদগুলো, আপনি আপনার দিয়ে যواء আড করলে, নতুন - ডাউনকেসড লেবেলগুলো উপেক্ষা করুন; সেগুলো স্টেপ ৭-এ প্রপারলি ক্যাপিটালাইজ হবে।
- আপনার যদি ইতিমধ্যে মেইলারগুলো i18n-এড থাকে, তাহলে ঠিক আছে। না থাকলে, আপনি সেগুলো স্টেপ ৮ পর্যন্ত উপেক্ষা করতে পারেন।
- নিচের Devise ভিউগুলো راয়লস ট্রান্সলেট (
t) হেল্পার দিয়ে অনুবাদযোগ্য করতে হবে:devise/views/shared/_linksপার্শিয়াল: সব লিংক নাম;devise/views/shared/_errorsপার্শিয়াল (Devise 4.6 স Từ)- আপনার ব্যবহৃত প্রতিটি মডিউলের Devise ফর্মে: Active Record অ্যাট্রিবিউটের জন্য লেবেল নয় এমন সকল স্ট্রিং।
devise.nl.yml-এর সাথে কনসিস্টেন্ট।
স্টেপ সাত: Active Record এরর মেসেজ
পরবর্তী, আমাদের Devise ফাংশনালিটির সাথে সম্পর্কিত Active Record এরর মেসেজগুলে টুইক করতে হবে। যেমন "password can't be blank", এবং অন্যান্য ভ্যালিডেশন।
বাতা হল, যেহেতু আমরা Devise অনুবাদগুলো আপগ্রেড করেছি, Active Record মেসেজগুলোকেও টুইক করতে হবে কারণ স্টাইলে ইনকনসিস্টেন্সি খুব এক্সপোজ होছে। তাই আমি সেগুলোকেও একই নিয়মে টুইক করলাম Devise অনুবাদের জন্য, এবং নিশ্চিত করলাম সেগুলো কনসিস্টেন্ট।
আপনি দেখবেন মেসেজের ফরম্যাট পরিবর্তন হয়েছে: "%{attribute} %{message}" থেকে "%{message}"। এখন আমরা অ্যাট্রিবিউটকে অনুবাদিত স্ট্রিংয়ের ভিতরে রেফারেন্স করছি শুরুর সাথে ফোর্স করার বদলে, এতে ডাচ মেসেজগুলো প্রেটিফাই করা অনেক সহজ হয়েছে। আমি ডুপ্লিকেশন চেয়ে অদ্ভুত মেসেজ সহ্য করা পছন্দ করি।
নতুন মেসেজ ফরম্যাটই কারণ স্টেপ ৫-এ email এবং password অ্যাট্রিবিউট ডাউনকেস করতে হয়েছিল: এরর মেসেজে সেগুলো সেন্টেন্সের যেকোনো জায়গায় আসতে পারে।
আমি :taken মেসেজও রিপ্লেস করলাম। Devise পলিসি হল ইমেইল অ্যাড্রেস 'নট ফাউন্ড' বা 'ইনভেলিড' রিভিল করা নয়। আমি সেই পলিসি রেইলস-এর taken মেসেজেও প্রসারিত করলাম।
এই ফাইলটি দেখুন আপনি যদি নতুন মেসেজ স্টাইল ফলো করতে চান। তারপর মূল nl.yml ফাইলে রেইলস error: messages: কী스의 সংশ্লিষ্ট অংশ রিপ্লেস করুন। একটা ক্যাভিয়েট: আপনি যখন Devise-রিলেটেড নয় এমন ইনপুটের জন্য ভ্যালিডেশন অ্যাড করছেন, দয়া করে ডাবল চেক করুন এরর মেসেজগুলো এখনো মেনে চলে কিনা। (আমি আরও ইনভেস্টিগেট করতে পারি; আমি শুধু Devise-রিলেটেডগুলো চেক করলাম।)
স্টেপ আট: আমরা যা লেবেল ভাঙলাম সেটি ফিক্স করুন
স্টেপ ৫-এ, আমরা ইমেইল এবং পাসওয়ার্ড অনুবাদ ডাউনকেস করলাম নতুন এরর মেসেজে ব্যবহারের জন্য। এখন আমাদের লেবেল-এ তাদের আপিয়ারেন্স ফিক্স করতে হবে। একাধিক অপশন আছে, কিন্তু যে একটা আমি সবচেয়ে পছন্দ করি সেটি আলাদা 'label' কী যোগ করা।
এটি ইউজার কীগুলোতে কিছু ডুপ্লিকেশন যোগ করে, কিন্তু ফর্মে লেবেলগুলো ক্লিন রাখে।
# in active_record.nl.yml add the label helper keys: nl: activerecord: attributes: user: current_password: Huidig wachtwoord email: e-mailadres password: wachtwoord password_confirmation: Herhaal het wachtwoord remember_me: Wil je ingelogd blijven? models: user: Gebruiker helpers: label: user: email: Emailadres password: Wachtwoord
লক্ষ্য করুন মূল nl.yml-এ ইতিমধ্যে একটি :helpers স্কোপ আছে। সাধারণত, একটি স্কোপের কীগুলো একসাথে রাখা ভালো আইডিয়া, সহজ লুকআপের জন্য (মানুষের দ্বারা)।
আমাদের যে অন্যান্য পরিবর্তন করতে হবে সেগুলো সহজ। আর বড় সারপ্রাইজ পপ আপ করবে না এখান থেকে। 🎉.
স্টেপ নয়: নেভিগেশন লিংক আপডেট করুন
Devise-এ পয়েন্ট করে এমন সব লিংক খুঁজুন (নেভিগেশন ভাবুন) এবং রেইলস t হেল্পার দিয়ে i18n করুন।
আমি সেগুলো .yml-এ Devise স্কোপের কোথাও রাখতে পছন্দ করি। উদাহরণস্বরূপ, আমি t("devise.sign_out") অ্যাড করব যাতে :sign_out একই স্কোপে থাকে :sign_up এবং :sign_in এর সাথে (উদাহরণ ফাইলগুলো দেখুন)।
স্টেপ দশ: মেইলার অনুবাদ করুন।
মেইলার ভিউগুলো অনুবাদ করুন। কিছু অপশন আছে:
আপনি অন্য ভিউগুলোর মতো স্ট্রিং ও লিংক নাম সব i18n করতে পারেন (স্টেপ ৬-এ जैसा করলাম)। আপনি আলাদা
mailer.*.ymlযোগ করতে পারেন।অথবা আপনি প্রতিটি লোকেলের জন্য আলাদা মেইলার ভিউ যোগ করতে পারেন:
devise/mailer/reset_password.nl.html.erbএবংdevise/mailer/reset_password.en.html.erb। প্রতিটির নিজস্ব টেক্সট। রেইলস সেটি পিক করবে যা লোকেল সেট করা আছে।
বازی! এখন সকল Devise স্ট্রিং প্রপারলি অনুবাদ করা হয়েছে। ইয়ে!
অফ্টার কেয়ার: ডিক্লাটার (Declutter)
আমার ভিউ উদাহরণে, আমি শেয়ারড কীগুলো (যেমন :forgot_password) এক্সট্রাক্ট করলাম এবং সেগুলো জেনারেল devise স্কোপে কালেক্ট করলাম। এতে সেগুলো পরিবর্তন করা সহজ হয়, কিন্তু রেইলস সেগুলো অটোমেটিক্যালি খুঁজে পায় না, তাই আমাদের ভার্বোস সিনট্যাক্স (t("devise.forgot_password")) দরকার, কারণ ডট সিনট্যাক্স (t(".new_confirmation_mail")) কাজ করবে না।
আপনি যদি active_record.*.yml নিয়ে যান, তবে এক্টিভ রেকর্ড স্কোপের সকল কী সেই ফাইলে কালেক্ট করা মেনে চলে। রেইলস *.yml ফাইল থেকে Active Record কীগুলো সংশ্লিষ্ট active_record.*.yml-এ সরিয়ে দিন।
আমাদের দুটি জোড়া *.yml ফাইল আছে যা devise: স্কোপ ডুপ্লিকেট করে। Devise ভিউয়ের কীগুলো devise.*.yml ভিউতে মিক্স করার কথা ভাবুন। Devise-i18n জেম এটি করে, এবং আমি এটা পছন্দ করি। আপনি এভাবে করবেন:
# ভিউ স্কোপগুলো devise.nl.yml-এ মিক্স করা nl: devise: confirmations: ... registrations: ... edit: ... new: ...
কিছু টুইক এবং টিপস
- এরর মেসেজের হেডার আমি ফ্যান নই ('x errors prohibited this user from being saved'), তাই সেটি
errorsপার্শিয়াল থেকে রিমুভ করলাম। - আপনি যদি
default_localeকে:nlসেট করেন, তবে রেইলস কীগুলো 'হিউমানাইজ' করবে যদি অনুবাদ খুঁজে না পায়। তাই,t(:some_untranslated_key)ভিউতেSome Untranslated Keyহিসেবে দেখাবে। - I18n-tasks জেম দিয়ে আপনি আনইউজড কী ক্লিন আপ করতে পারেন এবং মিসিং কী অ্যাড করতে পারেন। এটি একটি চমৎকার টুল! কিন্তু আমার IDE-তে চমৎকার i18n সাপোর্ট আছে এবং আমার জন্য সেটি জেমের চেয়ে কুইক ওয়ার্কফ্লো সাবিট হয়েছে।
বिछুরণ এত মিষ্টি দুঃখ
একটি চূড়ান্ত কথা যাওয়ার আগে। যখন আমি এই যাত্রা শুরু করেছিলাম, আমি আশা করিনি এটি এতটুকু কাজ হবে। আমি খুব খুশি যে এখন আমি জানি কমপ্লেক্সিটি কোথা থেকে আসে। এবং ভবিষ্যতের আমি এবং আপনার কাছে এখন আছে সকল পরিবর্তনের একটি তালিকা। উয়হু!
তবুও এই চেকলিস্ট হাতে থাকলে, কাজ করার আগে ভাবুন: হয়তো কিছুক্ষণ কম অপ্টিমাল অনুবাদ সহ জীવিত থাকা উচিত…