Rails' 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
# fall back to "en" if we can't find anything under "en_jd", etc.
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"
এটি সম্পূর্ণ আংশিক অনুবাদ করার জন্যও দুর্দান্ত কাজ করেছে (ফাইলের নামটি নোট করুন):
<!-- Lawyer badge HTML -->
<!-- Doctor badge HTML -->
এমনকি এটি আবার en
-এ পড়ে লোকেল, শেয়ার করা অনুবাদের জন্য:
en:
leaderboard:
title: "Leaderboard"
আপনি যখন সাইটের "ডাক্তার" বিভাগে ছিলেন, আমরা ডিফল্ট লোকেল পরিবর্তন করে :en_md
করেছি , এবং তদ্বিপরীত:
I18n.locale = :en_md
এবং সবকিছুই কাজ করেছে!
আমি নিশ্চিত নই যে আমি এটি সুপারিশ করব। এটি একটি সামান্য বাদাম, বিভিন্ন পেশার বিভিন্ন ভাষা নিয়ে চিন্তা করা। কিন্তু আমরা এটি করার সময় এটি আশ্চর্যজনকভাবে ভাল কাজ করেছে। এবং এটি প্রকাশ করে যে i18n-এর মতো সাধারণ সরঞ্জামগুলিতে কতটা শক্তি থাকতে পারে৷৷
আপনি এই জিনিসটি কোথা থেকে তুলেছেন?
গত সপ্তাহে, আমি একজন শিক্ষানবিস থেকে একজন বিশেষজ্ঞের কাছে যাওয়ার উপায় হিসেবে নির্দিষ্ট প্রযুক্তির গভীরে ডুব দেওয়ার কথা বলেছিলাম। এটি তার আরেকটি উদাহরণ:i18n সম্পর্কে আমরা যা শিখেছি তার বেশিরভাগই আমরা রেল গাইড এবং API ডক্স পড়ে শিখেছি।
সুতরাং, সেই অতিরিক্ত পদক্ষেপ নিন। আপনি ভালভাবে নির্ভরশীল টুল শিখুন. আপনি দেখতে পাবেন যে আপনি এমন সুবিধা এবং কৌশলগুলির মধ্যে চলে যাবেন যা আপনাকে কেবল আরও বেশি উত্পাদনশীল করে তুলবে না, তবে এমন নতুন বিভাগগুলি আনলক করতে পারে যা আপনি অন্যথায় কখনও ভাবেননি।