私はフランス語と英語の両方のサイトを持っています。ユーザーがヘッダー内のリンクをクリックしたときに、その場で言語を切り替えられるようにしたいと思います。かなり簡単です。
私はRuby on 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(フィルター)に何かを実装して、コントローラー/アクション/ IDが渡されているかどうかを確認し、ロケールに追加できると思います。または、routes.rbでこれを行うことはできますか?
まあ、ついに私が好きな方法を見つけました...
<% if I18n.locale == I18n.default_locale %>
<%= link_to "English", { :locale=>'en' } %>
<% else %>
<%= link_to "Français", { :locale=>'fr' } %>
<%end%>
これと同じくらい簡単です!
Vive Ruby on Rails!
ローカライズされたすべてのルートをカバーするこのようなスコープルートがある場合:
scope "/:locale" do
...
end
そのスコープルート内のページにいる場合(例: '/ en/...'次のように、現在のサイトの場所を変更せずにロケールを変更するためのリンクを作成できます。
<%= link_to "Français", params.merge({:locale => :fr}) %>
<%= link_to "English", params.merge({:locale => :en}) %>
この方法できれいになると思います。だからここに行く:
config/application.rb
_I18n.available_locales = [:en, :pt, :es, :de]
_
config/locales /:locale.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/routers.rb:
_match 'lang/:locale', to: 'index#change_locale', as: :change_locale, via: [:get]
_
app/controllers/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
_
app/controllers/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
_
すべての言語のセレクターが必要だとします。例えば。 en
ロケールにあり、fr
およびes
ロケールもあります
application_helper.rb
(または/ app/helpers /内の他のヘルパー)
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>
さらに、ヘッダーにlink [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/">