Ruby on Rails
I18n - अंतर्राष्ट्रीयकरण
खोज…
वाक्य - विन्यास
- 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 & Symbols"
नाम title
बाद अतिरिक्त _html
के अलावा पर ध्यान दें।
और दृश्य में,
# ERB
<h2><%= t(:title_html, scope: [:stackoverflow, :header]) %></h2>