2011-12-05 5 views
19

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

मैं पर रूबी 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%> 

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

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

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

उत्तर

52

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

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

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

<%end%> 

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

रेल पर विवे रूबी!

14

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

scope "/:locale" do 
    ... 
end 

आप एक पृष्ठ में हैं अंदर कि scoped तो मार्ग उदा '/ En/...' आप इस तरह अपने वर्तमान साइट स्थान बदले बिना स्थान बदलना लिंक बना सकते हैं:

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

किसी कारण का उपयोग कर प्रतीकों के लिए (जैसे। ': en') का कारण है 'एक्शन कंट्रोलर :: रूटिंग एरर (कोई रूट मैचों {...}) ** ** ** ** क्लिक (रेल 3.2.12 में परीक्षण) पर। तारों का उपयोग करने से समस्या हल हो जाती है (': locale => 'en'')। – user569825

+0

यह एक और सहायक उत्तर है क्योंकि यह मौजूदा संदर्भ, यानी पैराम्स से संबंधित है। और उन्हें लोकेल के साथ विलय कर रहा है, जो मेटा-स्तरीय परम है ... – Jerome

3

है कि आप सभी भाषाओं के लिए एक चयनकर्ता चाहते हैं। जैसेआप 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 %> 

यदि उपयोगकर्ता लोकेल अंग्रेजी है, तो वर्तमान URL 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_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/"> 
3

मेरा मानना ​​है कि इस तरह से यह स्वच्छ बनाता है। तो यहाँ यह जाता है: पर config/स्थानों/स्थानीय:

config/application.rb

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

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

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

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

अपने html में स्थान सूची जोड़ें:

<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/मार्गों को जोड़ा गया देख सकते हैं । आरबी:

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 
संबंधित मुद्दे