Skip to main content

Rails i18n: Ruby on Rails अंतरराष्ट्रीयकरण की संपूर्ण गाइड

पहली लोकेल फ़ाइल से प्रोडक्शन तक: Rails I18n कॉन्फ़िगर करें, t() हेल्पर का उपयोग करें, CLDR बहुवचन संभालें, आम समस्याएँ ठीक करें और बेहतर लोकेल फ़ॉलबैक चेन जोड़ें।

1

Rails I18n आर्किटेक्चर को समझें

Rails में I18n gem पहले से शामिल होता है। अनुवाद फ़ाइलें config/locales/ में YAML (डिफ़ॉल्ट) या Ruby फ़ाइलों के रूप में रहती हैं। फ़्रेमवर्क व्यू, कंट्रोलर, मॉडल और मेलर में t() हेल्पर (I18n.translate का उपनाम) उपलब्ध कराता है। Rails I18n को जानबूझकर सरल रखा गया है—यह बिना किसी अतिरिक्त सेटअप के बुनियादी अनुवाद, इंटरपोलेशन और बहुवचन संभालता है।

config/application.rb
# Rails includes i18n out of the box via the i18n gem
# config/application.rb
module MyApp
  class Application < Rails::Application
    # Default locale
    config.i18n.default_locale = :en

    # Available locales
    config.i18n.available_locales = [:en, :de, :ja, :es, :fr, :'pt-BR']

    # Fallback to default locale when translation is missing
    config.i18n.fallbacks = true

    # Load translations from nested directories
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
  end
end
config/routes.rb
# config/routes.rb
Rails.application.routes.draw do
  scope "/:locale", locale: /en|de|ja|es|fr|pt-BR/ do
    root "home#index"
    resources :products
  end

  root "home#index"
end

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  around_action :switch_locale

  private

  def switch_locale(&action)
    locale = params[:locale] || I18n.default_locale
    I18n.with_locale(locale, &action)
  end

  def default_url_options
    { locale: I18n.locale }
  end
end
Rails config/locales/ की सभी .yml और .rb फ़ाइलें अपने-आप लोड करता है। आप उन्हें अपनी पसंद के अनुसार व्यवस्थित कर सकते हैं—भाषा के आधार पर (en.yml, de.yml), सुविधा के आधार पर (en/users.yml, en/orders.yml) या दोनों आधारों पर (en/users.yml, de/users.yml)। Rails बूट के समय सभी फ़ाइलों को मर्ज कर देता है।
2

लोकेल सेटिंग्स कॉन्फ़िगर करें

config/application.rb या किसी इनिशियलाइज़र में default_locale, available_locales और फ़ॉलबैक व्यवहार सेट करें। URL, सेशन, कुकी या Accept-Language हेडर से लोकेल सेट करने के लिए before_action का उपयोग करके अपने ApplicationController में लोकेल की पहचान कॉन्फ़िगर करें।

config/locales/en.yml
# config/locales/en.yml
en:
  nav:
    home: "Home"
    about: "About"
    settings: "Settings"
  greeting: "Hello, %{name}!"
  cart:
    item_count:
      one: "%{count} item"
      other: "%{count} items"

# config/locales/de.yml
de:
  nav:
    home: "Startseite"
    about: "Über uns"
    settings: "Einstellungen"
  greeting: "Hallo, %{name}!"
  cart:
    item_count:
      one: "%{count} Artikel"
      other: "%{count} Artikel"
before_action में I18n.locale सेट करना हर अनुरोध के लिए सुरक्षित है, लेकिन रनटाइम पर I18n.default_locale सेट करना ग्लोबल होता है और सभी थ्रेडों को प्रभावित करता है। अनुरोध के दायरे में लोकेल बदलने के लिए हमेशा I18n.locale (थ्रेड-लोकल) का उपयोग करें, I18n.default_locale का कभी नहीं।
3

t() हेल्पर का उपयोग करें

t() हेल्पर Rails में हर जगह उपलब्ध है—व्यू, कंट्रोलर, मॉडल, मेलर और जॉब में। यह एक कुंजी, वैकल्पिक इंटरपोलेशन वेरिएबल और डिफ़ॉल्ट मान तथा स्कोप जैसे विकल्प स्वीकार करता है। व्यू में Rails लेज़ी लुकअप का समर्थन करता है, जो कुंजियों का स्कोप अपने-आप मौजूदा कंट्रोलर और एक्शन के अनुसार तय करता है।

app/views/example.html.erb
# In views (ERB)
<h1><%= t('nav.home') %></h1>
<p><%= t('greeting', name: @user.name) %></p>

# In controllers
flash[:notice] = t('flash.product_created')

# In models
validates :name, presence: { message: I18n.t('errors.blank') }

# With HTML (safe)
<%= t('terms_html', link: link_to(t('terms_link'), '/terms')) %>
4

बहुवचन संभालें

Rails I18n इन CLDR बहुवचन श्रेणियों का उपयोग करता है: zero, one, two, few, many, other। अंग्रेज़ी में केवल one और other की आवश्यकता होती है, लेकिन अन्य भाषाओं में अधिक रूपों की आवश्यकता होती है। अपनी लक्षित भाषाओं के लिए आवश्यक count श्रेणियों के अंतर्गत बहुवचन अनुवादों को नेस्ट की गई YAML कुंजियों के रूप में परिभाषित करें।

Plural forms
# In YAML:
en:
  cart:
    item_count:
      zero: "No items"
      one: "%{count} item"
      other: "%{count} items"

# Arabic (6 forms):
ar:
  cart:
    item_count:
      zero: "لا عناصر"
      one: "عنصر واحد"
      two: "عنصران"
      few: "%{count} عناصر"
      many: "%{count} عنصرًا"
      other: "%{count} عنصر"

# Usage in views:
<%= t('cart.item_count', count: @cart.items.size) %>
सक्रिय लोकेल के लिए कोई आवश्यक बहुवचन श्रेणी न होने पर Rails, I18n::InvalidPluralizationData त्रुटि देता है। यदि आपके रूसी लोकेल में केवल one और other परिभाषित हैं (अंग्रेज़ी से कॉपी किए गए), तो 2, 3, 4 जैसी संख्याओं पर ऐप क्रैश हो जाएगा, क्योंकि रूसी में few श्रेणी आवश्यक है। हर भाषा के लिए हमेशा सभी CLDR श्रेणियाँ परिभाषित करें।
5

लोकेल फ़ॉलबैक चेन जोड़ें

Rails में अंतर्निहित I18n.fallbacks क्षेत्रीय लोकेल से डिफ़ॉल्ट लोकेल तक केवल बुनियादी फ़ॉलबैक देता है। किसी कुंजी के न होने पर pt-BR यूज़र को pt-PT के बजाय अंग्रेज़ी दिखाई देती है। rails-locale-chain कॉन्फ़िगर की जा सकने वाली डीप-मर्ज चेन जोड़ता है, जिससे क्षेत्रीय यूज़र को हमेशा निकटतम उपलब्ध अनुवाद दिखाई देता है।

Lazy lookups
# Lazy lookups use the controller/action as scope
# app/views/products/index.html.erb
# Instead of t('products.index.title'), just use:
<h1><%= t('.title') %></h1>
<p><%= t('.description') %></p>

# Rails looks up: products.index.title and products.index.description

# config/locales/en.yml
en:
  products:
    index:
      title: "All Products"
      description: "Browse our catalog"
rails-locale-chain में 11 भाषा परिवारों को कवर करने वाली 75+ अंतर्निहित फ़ॉलबैक चेन शामिल हैं। इसे अपने Gemfile में जोड़ें और किसी इनिशियलाइज़र में कॉन्फ़िगर करें; क्षेत्रीय यूज़र को अंग्रेज़ी में रिक्तियाँ दिखने के बजाय तुरंत मूल लोकेल के अनुवाद दिखाई देने लगेंगे।
6

अनुवादों को ऑटोमेट करें

Rails I18n का सेटअप पूरा होने के बाद AI का उपयोग करके अपनी YAML लोकेल फ़ाइलों का अनुवाद करें। i18n Agent, YAML का मूल रूप से समर्थन करता है—इसे अपनी स्रोत लोकेल फ़ाइल दें और यह नेस्ट की गई कुंजियों, इंटरपोलेशन वेरिएबल और बहुवचन रूपों को सुरक्षित रखते हुए सभी लक्षित भाषाएँ जनरेट कर देगा।

config/initializers/locale_chain.rb
# Gemfile
gem 'rails-locale-chain'

# config/initializers/locale_chain.rb
Rails.application.config.i18n.fallbacks = {
  'pt-BR': ['pt', 'en'],
  'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
  'es-419': ['es', 'en'],
}

# The gem deep-merges translations across the chain
# pt-BR -> pt -> en
# Missing keys in pt-BR are filled from pt, then en
अनुवाद चरणबद्ध तरीके से करें—नई कुंजियाँ जोड़ने पर केवल अंतर का अनुवाद करें। इससे मौजूदा अनुवाद सुरक्षित रहते हैं और अपरिवर्तित स्ट्रिंग दोबारा जनरेट नहीं होतीं।

आम समस्याएँ

InvalidPluralizationData त्रुटियाँ

कोई आवश्यक CLDR बहुवचन श्रेणी न होने पर Rails, I18n::InvalidPluralizationData के साथ क्रैश हो जाता है। ऐसा अधिकतर तब होता है, जब अंग्रेज़ी के बहुवचन रूपों (one/other) को उन भाषाओं में कॉपी कर दिया जाता है जिन्हें अधिक श्रेणियों की आवश्यकता होती है (रूसी में few तथा अरबी में zero/two/few/many आवश्यक हैं)। सही CLDR नियमों के लिए rails-i18n इंस्टॉल करें और सभी श्रेणियाँ परिभाषित करें।

व्यू के बाहर लेज़ी लुकअप

लेज़ी लुकअप (t('.key')) केवल उन व्यू में काम करते हैं जहाँ Rails को कंट्रोलर और एक्शन की जानकारी होती है। किसी मॉडल, मेलर या सर्विस ऑब्जेक्ट में t('.key') का उपयोग करने पर अनुवाद न मिलने की त्रुटि लौटती है। व्यू के बाहर पूरी कुंजियों (t('users.show.key')) का उपयोग करें।

YAML सिंटैक्स की त्रुटियाँ सभी अनुवादों को रोक देती हैं

YAML सिंटैक्स की एक त्रुटि (गलत इंडेंटेशन, उद्धरण चिह्नों के बिना विशेष वर्ण या स्पेस के बजाय टैब) पूरी लोकेल फ़ाइल को लोड होने से रोक देती है। उस फ़ाइल के सभी अनुवादों के लिए कुंजी न मिलने की त्रुटियाँ आती हैं। किसी लिंटर से CI में YAML फ़ाइलों को वैलिडेट करें और कोलन, ब्रैकेट या शुरुआत में विशेष वर्ण वाली स्ट्रिंग को उद्धरण चिह्नों में रखें।

i18n Agent अभी आज़माएँ

अपनी अनुवाद फ़ाइल यहाँ छोड़ें

JSON, YAML, PO, XML, CSV, Markdown, Properties

या ब्राउज़ करने के लिए क्लिक करें

लक्षित भाषाएँ

साइन अप की ज़रूरत नहींतुरंत अनुमान

Rails i18n के बारे में अक्सर पूछे जाने वाले प्रश्न