デフォルトのRailsi18nを使用していますが、i18ingブレッドクラムに問題があります。「breadcrumbs_on_rails」というgemを使用してブレッドクラムをレンダリングするので、次のようなコントローラーにブレッドクラムリンクを追加します。
add_breadcrumb I18n.t('interface.home'), :root_path
問題は、コントローラーが現在のロケールを認識していないようで、常にデフォルトの言語を使用していることです。
デフォルトではなく、選択したロケールを使用するようにi18nに指示するにはどうすればよいですか?
更新: コントローラーは現在のロケールを認識しています。しかし、問題は奇妙な状況で現れます。1つのメソッドの2つの異なる場所で同じコードを使用したところ、i18nは6行目では機能せず、次のサンプルコードの10行目で機能することがわかりました。
def index
@device = Device.find_by_id(params[:device_id])
if @device != nil
if current_user?(User.find(@device))
logger.debug I18n.locale # Outputs en - wrong
add_breadcrumb t('interface.all_events'), device_events_path(@device) # Does not work
logger.debug I18n.locale # Outputs de - correct
add_breadcrumb @device.title, device_path(@device)
logger.debug I18n.locale # Outputs de - correct
add_breadcrumb t('interface.all_events'), device_events_path(@device) # Works perfect
@events = @device.events.paginate(page: params[:page], per_page: 30)
else
redirect_to :root
end
else
redirect_to :root
end
end
ロケールは、チュートリアルでアドバイスされたようにapplication_controller.rbで設定されますが、検出にはhttp_accept_languageを使用します。
class ApplicationController < ActionController::Base
protect_from_forgery
include SessionsHelper
def default_url_options(options={})
I18n.locale = get_accepted_language
{ :locale => get_accepted_language }
end
def get_accepted_language
available_locales = %w{en de}
request.user_preferred_languages
request.preferred_language_from(available_locales)
end
end
URLは次のようになります。http://localhost:3000/de/devices/3/events