ruby-on-rails-3 - रेल 3 पर रूबी में एक यूआरएल के साथ भाषा स्विच करें





url internationalization locale (5)


मेरा मानना ​​है कि इस तरह से यह क्लीनर बनाता है तो यहाँ यह जाता है:

config / application.rb

I18n.available_locales = [:en, :pt, :es, :de]

प्रत्येक के लिए एक .yml फ़ाइल बनाएँ: config / locales / पर locale : locale.yml

प्रत्येक लोकेल.आईएमएल फाइलों में इसे जोड़ने के लिए मत भूलना, इस तरह से स्थानों के बीच में परिवर्तन करते समय link_to link_to t(lang) का अनुवाद किया जाता है

en:
  en: "English"
  pt: "Portuguese"
  es: "Spanish"
  de: "German"

अपने एचटीएमएल में लोकेल की सूची जोड़ें:

<a class="dropdown-toggle" data-toggle="dropdown" href="#">
    <%= t(I18n.locale) %> # Current selected locales
    <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
    <li class="header">Select a language</li>
        <% I18n.available_locales.each do |lang| %> # Array of available locales
        <li>
        <%= link_to t(lang), change_locale_path(lang) %> # Each locale URL param and name
        </li>
        <% end %>
</ul>

तो अब आप config / application.rb में जोड़े गए सभी लोकेल देख सकते हैं

config / routes.rb :

match 'lang/:locale', to: 'index#change_locale', as: :change_locale, via: [:get]

एप्लिकेशन / नियंत्रक / index_controller.rb

def change_locale
    l = params[:locale].to_s.strip.to_sym
    l = I18n.default_locale unless I18n.available_locales.include?(l)
    cookies.permanent[:my_locale] = l
    redirect_to request.referer || root_url
end

एप्लिकेशन / नियंत्रक / application_controller.rb

before_action :set_locale

def set_locale
      if cookies[:my_locale] && I18n.available_locales.include?(cookies[:grolla_locale].to_sym)
        l = cookies[:my_locale].to_sym
      else
        l = I18n.default_locale
        cookies.permanent[:my_locale] = l
      end
      I18n.locale = l
    end

मेरे पास फ्रांसीसी और अंग्रेजी दोनों में एक साइट है मैं चाहता हूं कि यूजर को मक्खी पर भाषा बदल सकें, जब वे शीर्ष लेख में एक लिंक पर क्लिक करेंगे। बहुत सीधा।

मैंने Rails 3 गाइड पर रूबी का पालन किया है, और मेरे पास यह है:

class ApplicationController < ActionController::Base
before_filter :set_locale
def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
end

protect_from_forgery

  def default_url_options(options={})
  logger.debug "default_url_options is passed options: #{options.inspect}\n"
  { :locale => I18n.locale }
   end
end

मेरे मार्ग इस तरह दिखते हैं:

scope "(:locale)", :locale => /en|fr/ do

match 'home' => 'home#index'
match 'home/ajax_twitter' => 'home#ajax_twitter'
match 'equipe' => 'equipe#index'
match 'equipe/sylvain' => 'equipe#sylvain'
match 'equipe/benoit' => 'equipe#benoit'
match 'equipe/stephane' => 'equipe#stephane'
match 'equipe/suemarie' => 'equipe#suemarie'
match 'equipe/regis' => 'equipe#regis'
match 'equipe/fred' => 'equipe#fred'

match 'equipe/callback' => 'equipe#callback'
match 'equipe/auth' => 'equipe#auth'
match 'equipe/ajax_contact' => 'equipe#ajax_contact'

match 'linkedinauth/callback' => 'linkedinAuth#callback'
match 'linkedinauth/init_auth' => 'linkedinAuth#init_auth'

match 'mission' => 'mission#index'
match 'service' => 'service#index'
match 'developmen' => 'developmen#index'

match 'contact' => 'contact#index'

match 'mandats' => 'mandats#index'
end

match '/:locale' => "home#index"

और मेरे विचार में मैं ऐसा करता हूं:

<% if I18n.locale == I18n.default_locale %>
  <%= link_to "English", '/en'%>

<% else %>
  <%= link_to "Français", '/fr'%>

<%end%>

सभी होम पेज में अच्छी तरह से काम करते हैं, लेकिन अगर मैं एक विशिष्ट नियंत्रक में हूं, तो मैं भाषा को स्विच करने की कोशिश करता / करती हूं, तो मुझे मुख पृष्ठ पर लौटा मिलता है। मैंने इसे जोड़ने का प्रयास किया:

<% if I18n.locale == I18n.default_locale %>
  <%= link_to "English", '/en/' + params[:controller]%>

<% else %>
  <%= link_to "Français", '/fr/' + params[:controller]%>

<%end%>

यह नियंत्रक को ठीक करता है, लेकिन अगर हम एक विशेष कार्रवाई में हैं और भाषा फिर से स्विच करते हैं, तो मैं इस नियंत्रक के 'सूचकांक' पर वापस आ जाता हूं।

मेरा प्रश्न: इस से निपटने का सबसे अच्छा तरीका क्या है?

मुझे लगता है कि मैं नियंत्रक / एक्शन / आईडी पास कर रहा हूं और इसे लोकेल के साथ जोड़कर जांचने के लिए ApplicationController (फ़िल्टर) में कुछ भी लागू कर सकता हूं या मैं यह मार्गों में कर सकता हूँ। आरबी?




यदि आपके पास इस तरह का कार्यक्षेत्र है जिसमें सभी स्थानीयकृत मार्ग शामिल हैं:

scope "/:locale" do
  ...
end

यदि आप उस स्कॉप्ड मार्ग के अंदर किसी पृष्ठ में हैं जैसे '/ en / ...' आप अपनी मौजूदा साइट स्थान को इस तरह से बदल दिए बिना स्थान को बदलने के लिए लिंक बना सकते हैं:

<%= link_to "Français", params.merge({:locale => :fr}) %>
<%= link_to "English", params.merge({:locale => :en}) %>



कहो कि आप सभी भाषाओं के लिए एक चयनकर्ता चाहते हैं। उदाहरण आप en लोकेल में हैं और आपके पास fr और es लोकेल भी हैं

Application_helper.rb में (या किसी अन्य सहायक में / ऐप / सहायकों /)

def alternate_locales
  I18n.available_locales.map{|l|
    yield(l)
  }.join.html_safe
end

अब कहीं भी दृश्य में:

<% alternate_locales do |l| %>
   <li class="language <%= l %>"><%= link_to(l,locale: l) %></li>
<% end %>

अगर उपयोगकर्ता लोकेल अंग्रेजी है, तो एक वर्तमान यूआरएल www.example.com/en/path/ यह उत्पन्न करेगा:

<li class="language fr"><a href="www.example.com/fr/path/">fr</a></li>
<li class="language es"><a href="www.example.com/es/path/">es</a></li>
<li class="language en"><a href="www.example.com/en/path/">en</a></li>

इसके अलावा, अगर आप शीर्ष पर है [rel = "alternate"] लिंक लिंक करना चाहते हैं:

<% alternate_locales do |l| %>
  <link rel="alternate" hreflang="<%= l %>" href="<%= url_for(locale: l) %>">
<% end %> 

वह उत्पन्न करेगा:

<link rel="alternate" hreflang="fr" href="www.example.com/fr/path/">
<link rel="alternate" hreflang="es" href="www.example.com/es/path/">
<link rel="alternate" hreflang="en" href="www.example.com/en/path/">



ओह ठीक है, अंत में मुझे पसंद आया एक रास्ता मिल गया ...

<% if I18n.locale == I18n.default_locale %>
  <%= link_to "English", { :locale=>'en' } %>

<% else %>
  <%= link_to "Français", { :locale=>'fr' } %>

<%end%>

इस रूप में सरल!

रेल पर Vive रूबी!




(url_for(:only_path => false) == "/" )? root_url : url_for(:only_path => false)






ruby-on-rails-3 url internationalization locale