রেইলসের i18n লাইব্রেরি এর চেহারার চেয়ে বেশি পাওয়ারফুল। আপনাকে শুধু ট্রান্সলেশনের জন্য এটি ব্যবহার করতে হবে না। i18n লাইব্রেরি সব জায়গায় উপযোগী যেখানে আপনি ডিসপ্লে করা টেক্সটকে ডিসপ্লে করার জায়গা থেকে ডিকাপল করতে চান।
Avvo-তে থাকার সময়, আমরা i18n ব্যবহার করে কিছু চমৎকার জিনিস করেছি। আমি কিছু সেটি শেয়ার করব যা আমরা শিখেছি এবং যা খুব কাজে আসেছে, সাথে সাথে লাইব্রেরির একটি ক্রেজি অপব্যবহার যা আমাদের জন্য অবিশ্বাস্যভাবে ভালো কাজ করেছিল।
অটোমেটিক HTML এস্কেপিং
আপনার কি এমন লাইন আছে যা দেখতে:
<%= raw(t('form.required_field_header')) %>
আপনার ভিউতে? আপনাকে সেই raw দরকার নেই, কারণ যদি আপনার ট্রান্সলেশন কী _html দিয়ে শেষ হয়, তবে আপনি ফ্রিতে এস্কেপিং পাবেন:
<%= t('form.required_field_header_html') %>
সিম্পল, এবং আপনার অন্যান্য t() কলগুলোর সাথে আরও কনসিস্টেন্ট।
লোকেলগুলো আরও সুবিধাজনকভাবে অ্যাক্সেস করা
যখন আপনি আপনার লোকেল ফাইলগুলো বিল্ড করবেন, তবে আপনার কিছু কী একই প্যারেন্টের অধীনে গ্রুপ করা থাকবে:
en:
bugs:
index:
new_label: "File a new bug"
edit_label: "edit"
delete_label: "delete"
এইগুলোকে একসাথে রেফারেন্স করার জন্য, আপনি পেরে তাদের ফুল কী দিয়ে রেফারেন্স করতে পারেন:
<%= t('bugs.index.edit_label') %> | <%= t('bugs.index.delete_label') %>
এটা বেশ বিরক্তিকর এবং রিপিটেটিভ। কিন্তু t() সহায়কভাবে একটি স্কোপ নেয়, তাই আপনি কীগুলো আরও সুবিধাজনকভাবে রেফারেন্স করতে পারেন:
<% bugs_scope = 'bugs.index' -%>
<%= t('edit_label', scope: bugs_scope) %> | <%= t('delete_label', scope: bugs_scope) %>
আপনি যদি আপনার পারশিয়ালগুলো ভালোভাবে নাম দেন, তবে আপনাকে স্কোপ স্পেসিফাই করার প্রয়োজনও নেই:
<%= t('.edit_label') %> | <%= t('.delete_label') %>
অর্থাৎ, .edit_label রেফারেন্স করে bugs.index.edit_label-কে, কারণ আপনি bugs/index.html.erb-তে আছেন।
ActiveRecord ব্যাকএন্ড
কখনও কখনও, YAML ফাইলে স্ট্যাটিক ট্রান্সলেশন আপনার প্রোজেক্টের জন্য কাজ করবে না। আপনি যদি ActiveRecord i18n ব্যাকএন্ড ব্যবহার করেন:
require 'i18n/backend/active_record'
I18n.backend = I18n::Backend::ActiveRecord.new
আপনি আপনার ডেটাবেসে একটি translations টেবিলে ট্রান্সলেশন লুকআপ করতে পারেন। এইভাবে, আপনাকে আপনার সকল ট্রান্সলেশন আগে থেকে ডিফাইন করতে হবে না। বরং, আপনি নতুন ট্রান্সলেশন অন দ ফ্লাই যোগ করতে পারেন।
translations টেবিল সেট আপ করার জন্য একটি স্পেসিফিক মাইগ্রেশন দরকার। i18n-active_record রিপোর README-তে এটি কাজ করানোর সব ইনফরমেশন আছে।
অবজেক্ট টাইপের মধ্যে পারশিয়াল শেয়ার করা
Avvo-তে, আমাদের একটি লイヤার ডিরেক্টরি, অ্যাটর্নি রিভিউ, এবং লিগ্যাল অ্যাডভাইস আছে। কিন্তু কিছু বছর আগে, আমাদের সাইটে শুধু লイヤারই নয় ছিল। ডাক্তার এবং ডেন্টিস্টও ছিল!
আমাদের UI-এর অনেকাংশ এই প্রফেশনগুলোর মাঝপথে একই ছিল। কিন্তু যথেষ্ট ভিন্নতা ছিল (উদাহরণস্বরূপ, লイヤাররা যাকে "প্র্যাকটিস এরিয়া" বলে, ডাক্তাররা সেটাকে "স্পেশ্যালিটি" বলে), যে পারশিয়াল বা ভিউ শেয়ার করা কঠিন হবে কিছু খারাপ কোড ছাড়া।
শেষে, আমরা চিন্তা করলাম i18n সিস্টেমে এভিব করব। আফতব, ইংরেজি লイヤারিজ একটু ইংরেজির একটি ডায়ালেক্ট, এবং ডাক্তারিজও একইভাবে। আমরা অন্য ল্যাঙ্গুয়েজ ব্যবহার থেকে আপনাদের ব্লক করতে চাইনি, তাই আমরা দুইটি নতুন লোকেল তৈরি করলাম: en_jd এবং en_md।
এটি একটি কাস্টম i18n ব্যাকএন্ড হিসেবে সেট আপ করা সহজ ছিল:
class AvvoI18nStore < I18n::Backend::Simple
def translate(locale, key, options = {})
begin
default = options.delete(:default)
super(locale, key, options)
rescue I18n::MissingTranslationData => e
# "en_jd" ইত্যাদির নিচে কিছু না পেলে "en"-এ ফলব্যাক
fallback_locale = locale.to_s.split("_").first
super(fallback_locale, key, options.merge(:default => default))
end
end
end
I18n.backend = AvvoI18nStore.new
এবং ট্রান্সলেশন ডিফাইন করা ছিল একইভাবে সহজ:
en_jd:
practice_area: "practice area"
en_md:
practice_area: "specialty"
এটি পুরো পারশিয়াল ট্রান্সলেট করার জন্যও খুব ভালো কাজ করেছিল (ফাইলনেমে লক্ষ্য করুন):
এবং এটি en লোকেলেও ফলব্যাক করতো, শেয়ার করা ট্রান্সলেশনের জন্য:
en:
leaderboard:
title: "Leaderboard"
যখন আপনি সাইটের "Doctors" সেকশনে থাকবেন, আমরা ডিফল্ট লোকেলকে :en_md এ চেঞ্জ করতাম, এবং بالعکس:
I18n.locale = :en_md
এবং সবকিছু জাদুয়ের মত কাজ করত!
আমি নিশ্চিত নই আমি এটিকে রিকমেন্ড করব। এটি একটু পাগলামি, ভিন্ন প্রফেশনকে ভিন্ন ল্যাঙ্গুয়েজ ভাবা। কিন্তু যতক্ষণ আমরা করতাম, অবিশ্বাস্যভাবে ভালো কাজ করত। এবং এটি প্রকাশ করে যে i18n এর মত সিম্পল টুলগুলোর কতটা শক্তি থাকতে পারে।
আপনি এই জিনিসগুলো কোথা থেকে শিখেন?
গত সপ্তাহ, আমি ספেসিফিক টেকনোলজিতে डीপ ডাইভ নেওয়া বIgInnEr থেকে এক্সপার্ট হওয়ার একটি উপায় হিসেবে আলোচনা করেছিলাম। এটি সেটির আরেকটি উদাহরণ: i18n সম্পর্কে আমরা যা শিখলাম তার অধিকাংশ রেইলস গাইড এবং API ডক্স পড়ে।
তাই, সেই একস্ট্রা স্টেপ নিন। আপনি যেসব টুলের ওপর নির্ভর করেন সেগুলো ভালোভাবে শিখুন। আপনি দেখবেন যে আপনি কনভেনিয়েন্স এবং ট্রিক পাবেন যা আপনাকে শুধু অধিক প্রোডাক্টিভ করবেন না, বরং 브্যান্ড নিউ সলিউশন ক্যাটাগরির দরওজা খুলে দেবে যা আপনি কখনো চিন্তা করতেন না।