私はURLパラメータを使ってロケールを渡すことでRailsアプリケーションにI18Nを追加しています。私のURLは次のようになります。http://example.com/en/ユーザーそしてhttp://example.com/ar/users(それぞれ英語およびアラビア語のロケールの場合)。
ルート ファイルでは、:path_prefix オプションを使用してルートを定義しました。
map.resources :users, :path_prefix => '/:locale'
ロケールはApplicationControllerで定義されたbefore_filterを使用して設定されています
def set_locale
I18n.locale = params[:locale]
end
また、アプリケーションによって生成されるすべての URL にロケールを追加するために、ApplicationController#default_url_options も定義しました。
def default_url_options(options={})
{:locale => I18n.locale}
end
私が望んでいるのは、レイアウト ヘッダー (すべてのページに表示される) に、同じページだが別のロケールのページにリンクするリンクを追加することです。
たとえば、アラビア語のロケールを閲覧している場合、ヘッダーに「英語」リンクを配置して、現在のページにリダイレクトし、ロケールを英語に設定する必要があります。これを Rails で実行する方法はありますか?
ベストアンサー1
これを見つけるのに少し時間がかかりましたが、これが私の解決策です:
link_to 'English', url_for( :locale => 'en' )
link_to 'Deutch', url_for( :locale => 'de' )
こちらのドキュメントから:http://api.rubyonrails.org/classes/ActionController/Base.html#M000649
新しい URL を生成するときに、欠落している値は現在のリクエストのパラメータから入力される場合があります。たとえば、url_for :action => 'some_action' は、予想どおり現在のコントローラを保持します。この動作は、:controller、:id、およびルートのパスに配置されるその他のパラメータを含む他のパラメータにも適用されます。
したがって、url_for を使用すると、現在のリクエストのパラメータがデフォルトになります。コード内で必要なものを変更するだけです。この場合、変更したのは :locale だけなので、他のすべては同じままです。
これは「hidden」:parameters でも機能することに注意してください。つまり、次のようになります:
map.my_map ':locale/my_map', :controller => 'home', :action => 'my_map'
上記の url_for をページ /en/my_map で使用すると、URL に 'home' が含まれなくなります (つまり、/en/home/my_map)。ボーナスです。