खोज…


वाक्य - विन्यास

  • I18n.t ( "कुंजी")
  • I18n.translate ("की") # I18n.t("key") बराबर I18n.t("key")
  • I18n.t ("कुंजी", गणना: 4)
  • I18n.t ("कुंजी", param1: "समथिंग", param2: "एल्स")
  • I18n.t ("doesnt_exist", default: "key") # यदि कुंजी गुम है तो एक डिफॉल्ट निर्दिष्ट करें
  • I18n.locale # =>: en
  • I18n.locale =: en
  • I18n.default_locale # =>: en
  • I18n.default_locale =: en
  • टी ( "। कुंजी") के रूप में ही # I18n.t("key") , लेकिन कार्रवाई / टेम्पलेट से कहा जाता है के दायरे वाला

विचारों में I18n का उपयोग करें

मान लें कि आपके पास यह YAML लोकेल फाइल है:

# config/locales/en.yml
en:
  header:
    title: "My header title"

और आप अपना शीर्षक स्ट्रिंग प्रदर्शित करना चाहते हैं, आप ऐसा कर सकते हैं

# in ERB files
<%= t('header.title') %>

# in SLIM files
= t('header.title')

I18n तर्कों के साथ

आप I18n t विधि में पैरामीटर पास कर सकते हैं:

# Example config/locales/en.yml
en:
  page:
    users: "%{users_count} users currently online"

# In models, controller, etc...
I18n.t('page.users', users_count: 12)

# In views

# ERB
<%= t('page.users', users_count: 12) %>

#SLIM
= t('page.users', users_count: 12)

# Shortcut in views - DRY!
# Use only the dot notation
# Important: Consider you have the following controller and view page#users

# ERB Example app/views/page/users.html.erb
<%= t('.users', users_count: 12) %>

और निम्न आउटपुट प्राप्त करें:

"12 users currently online"

Pluralization

आप I18n को आपके लिए बहुवचन को संभालने दे सकते हैं, बस count तर्क का उपयोग करें।

आपको अपनी लोकेल फाइल को इस तरह सेट करना होगा:

# config/locales/en.yml
en:
  online_users:
    one: "1 user is online"
    other: "%{count} users are online"

और फिर आपके द्वारा I18n.t हेल्पर के लिए count तर्क पास करके बनाई गई कुंजी का उपयोग करें:

I18n.t("online_users", count: 1)
#=> "1 user is online"

I18n.t("online_users", count: 4)
#=> "4 users are online"

अनुरोध के माध्यम से स्थानीय सेट करें

ज्यादातर मामलों में, आप I18n लोकेल सेट करना चाह सकते हैं। एक वर्तमान सत्र के लिए स्थान, वर्तमान उपयोगकर्ता, या किसी URL पर आधारित सेट करना चाहें पैरामीटर यह आसानी से एक को लागू करने से प्राप्त है before_action अपने नियंत्रकों में से एक, या में में ApplicationController अपने नियंत्रकों के सभी में यह है।

class ApplicationController < ActionController::Base
  before_action :set_locale

  protected

  def set_locale
    # Remove inappropriate/unnecessary ones
    I18n.locale = params[:locale] ||    # Request parameter
      session[:locale] ||               # Current session
      (current_user.preferred_locale if user_signed_in?) ||  # Model saved configuration
      extract_locale_from_accept_language_header ||          # Language header - browser config
      I18n.default_locale               # Set in your config files, english by super-default
  end

  # Extract language from request header
  def extract_locale_from_accept_language_header
    if request.env['HTTP_ACCEPT_LANGUAGE']
      lg = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.to_sym
      lg.in?([:en, YOUR_AVAILABLE_LANGUAGES]) ? lg : nil
    end
  end

URL आधारित

locale परम इस तरह एक यूआरएल से आ सकता है

http://yourapplication.com/products?locale=en

या

http://yourapplication.com/en/products

उत्तरार्द्ध को प्राप्त करने के लिए, आपको एक scope जोड़ते हुए, अपने routes को संपादित करने की आवश्यकता है:

# config/routes.rb
scope "(:locale)", locale: /en|fr/ do
  resources :products
end

ऐसा करने से, http://yourapplication.com/en/products जाकर आपका लोकेल सेट करेगा :en । इसके बजाय, http://yourapplication.com/fr/products जाकर इसे सेट करेंगे :fr । इसके अलावा, आपको अनुपलब्ध त्रुटि नहीं मिलेगी :locale लापता :locale परम, http://yourapplication.com/products जाकर डिफ़ॉल्ट I18n लोकेल को लोड करेगा।

सत्र-आधारित या दृढ़ता-आधारित

यह मानता है कि उपयोगकर्ता भाषा बदलने के लिए एक बटन / भाषा ध्वज पर क्लिक कर सकता है। कार्रवाई एक नियंत्रक को मार्ग कर सकती है जो सत्र को वर्तमान भाषा में सेट करता है (और अंततः डेटाबेस में परिवर्तन को जारी रखता है यदि उपयोगकर्ता जुड़ा हुआ है)

class SetLanguageController < ApplicationController
  skip_before_filter :authenticate_user!
  after_action :set_preferred_locale

  # Generic version to handle a large list of languages
  def change_locale
    I18n.locale = sanitize_language_param
    set_session_and_redirect
  end

आपको उपलब्ध भाषाओं की अपनी सूची के साथ sanitize_language_param को परिभाषित करना होगा, और अंततः भाषा के मौजूद न होने की स्थिति में त्रुटियों को संभालना होगा।

यदि आपके पास बहुत कम भाषाएं हैं, तो इसके बजाय उन्हें इस तरह परिभाषित करने के लायक हो सकता है:

def fr
  I18n.locale = :fr
  set_session_and_redirect
end

def en
  I18n.locale = :en
  set_session_and_redirect
end

private

  def set_session_and_redirect
    session[:locale] = I18n.locale
    redirect_to :back
  end

  def set_preferred_locale
    if user_signed_in?
      current_user.preferred_locale = I18n.locale.to_s
      current_user.save if current_user.changed?
    end
  end
end

नोट: अपने change_language क्रियाओं में कुछ मार्गों को जोड़ना न भूलें

डिफ़ॉल्ट लोकेल

याद रखें कि आपको अपना एप्लिकेशन डिफ़ॉल्ट लोकेल सेट करना होगा। आप इसे या तो config/application.rb में सेट करके कर सकते हैं:

config.i18n.default_locale = :de

या config/initializers फ़ोल्डर में एक initializer बनाकर:

# config/initializers/locale.rb
I18n.default_locale = :it

HTTP अनुरोध से स्थान प्राप्त करें

कभी-कभी यह अनुरोध आईपी के आधार पर आपके एप्लिकेशन लोकेल को सेट करने के लिए उपयोगी हो सकता है। आप आसानी से Geocoder का उपयोग करके इसे प्राप्त कर सकते हैं। Geocoder कई चीजों में से एक request का location भी बता सकता है।

पहले, जोड़े Geocoder अपने को Gemfile

# Gemfile
gem 'geocoder'

Geocoder कहते location और safe_location मानक के तरीकों Rack::Request ताकि आप आसानी से आईपी पते द्वारा किसी भी HTTP अनुरोध के स्थान देख सकते हैं वस्तु। आप इस तरीके का उपयोग अपने ApplicationController before_action में कर सकते हैं:

class ApplicationController < ActionController::Base
  before_action :set_locale_from_request

  def set_locale_from_request
    country_code = request.location.data["country_code"] #=> "US"
    country_sym = country_code.underscore.to_sym #=> :us

    # If request locale is available use it, otherwise use I18n default locale
    if I18n.available_locales.include? country_sym
      I18n.locale = country_sym
    end
end

खबरदार कि यह development और test वातावरण में काम नहीं करेगा, क्योंकि 0.0.0.0 और localhost जैसी चीजें वैध इंटरनेट आईपी पते हैं।


सीमाएँ और विकल्प

Geocoder बहुत शक्तिशाली और लचीला है, लेकिन जियोकोडिंग सेवा ( अधिक विवरण देखें ) के साथ काम करने के लिए कॉन्फ़िगर करने की आवश्यकता है; जिनमें से कई उपयोग की सीमाएं रखते हैं। यह भी ध्यान देने योग्य है कि हर अनुरोध पर बाहरी सेवा को कॉल करने से प्रदर्शन प्रभावित हो सकता है।

इन्हें संबोधित करने के लिए, यह विचार करने लायक भी हो सकता है:

1. एक ऑफ़लाइन समाधान

GeoIP जैसे रत्न का उपयोग करना ( यहां देखें) लुकअप को स्थानीय डेटाफ़ाइल के विरुद्ध होने देता है। सटीकता की दृष्टि से एक व्यापार बंद हो सकता है, क्योंकि इन डेटाफ़ाइल्स को अद्यतित रखने की आवश्यकता होती है।

2. CloudFlare का उपयोग करें

CloudFlare के माध्यम से दिए गए पृष्ठों में पारदर्शी रूप से जियोकोडेड होने का विकल्प होता है, जिसमें देश कोड हेडर ( HTTP_CF_IPCOUNTRY ) में जोड़ा जाता है। अधिक विवरण यहां पाया जा सकता है

ActiveRecord मॉडल विशेषताओं का अनुवाद करना

globalize रत्न अपने ActiveRecord मॉडल में अनुवाद जोड़ने का एक शानदार उपाय है। आप इसे अपने Gemfile जोड़ सकते हैं:

gem 'globalize', '~> 5.0.0'

यदि आप Rails 5 का उपयोग कर रहे हैं, तो आपको activemodel-serializers-xml भी जोड़ना होगा

gem 'activemodel-serializers-xml'

मॉडल अनुवाद आपको अपने मॉडल के गुण मानों का अनुवाद करने की अनुमति देते हैं, उदाहरण के लिए:

class Post < ActiveRecord::Base
  translates :title, :text
end

I18n.locale = :en
post.title # => Globalize rocks!

I18n.locale = :he
post.title # => גלובאלייז2 שולט!

आपके द्वारा अपनी मॉडल विशेषताओं को परिभाषित करने के बाद, जिसका अनुवाद करने की आवश्यकता है, आपको एक माइग्रेशन के माध्यम से, अनुवाद तालिका बनानी होगी। globalize create_translation_table! प्रदान करता है create_translation_table! और drop_translation_table!

इस माइग्रेशन के लिए आपको up और down का उपयोग up , न कि change । साथ ही, इस माइग्रेशन को सफलतापूर्वक चलाने के लिए, आपको पहले अपने मॉडल में अनुवादित विशेषताओं को परिभाषित करना होगा, जैसे ऊपर दिखाया गया है। पिछले Post मॉडल के लिए एक उचित प्रवासन यह है:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string, text: :text
  end

  def down
    Post.drop_translation_table!
  end
end

आप विशिष्ट विकल्पों के लिए विकल्प भी पास कर सकते हैं, जैसे:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string,
      text: { type: :text, null: false, default: "Default text" }
  end

  def down
    Post.drop_translation_table!
  end
end

यदि आपके पास पहले से ही आपके ज़रूरत के अनुवाद स्तंभों में कोई मौजूदा डेटा है, तो आप आसानी से इसे अपनी तालिका में समायोजित करके अनुवाद तालिका में स्थानांतरित कर सकते हैं:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

सुनिश्चित करें कि आपके सभी डेटा सुरक्षित रूप से माइग्रेट होने के बाद आप मूल तालिका से अनुवादित स्तंभों को छोड़ देते हैं। डेटा माइग्रेशन के बाद मूल तालिका से अनुवादित कॉलमों को स्वचालित रूप से हटाने के लिए, माइग्रेशन में remove_source_columns का विकल्प जोड़ें:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true,
      remove_source_columns: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

आप पहले से बनाई गई अनुवाद तालिका में नए फ़ील्ड भी जोड़ सकते हैं:

class Post < ActiveRecord::Base
  # Remember to add your attribute here too.
  translates :title, :text, :author
end

class AddAuthorToPost < ActiveRecord::Migration
  def up
    Post.add_translation_fields! author: :text
  end

  def down
    remove_column :post_translations, :author
  end
end

HTML टैग और सिंबल के साथ I18n का उपयोग करें

# config/locales/en.yml
en:
  stackoverflow:
    header:
      title_html: "Use <strong>I18n</strong> with Tags &amp; Symbols"

नाम title बाद अतिरिक्त _html के अलावा पर ध्यान दें।

और दृश्य में,

# ERB
<h2><%= t(:title_html, scope: [:stackoverflow, :header]) %></h2>


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow