我正在使用默认的 Rails i18n,并且遇到了 i18ing 面包屑的问题。我使用名为“breadcrumbs_on_rails”的 gem 来渲染面包屑,所以我在控制器中添加面包屑链接,如下所示:
add_breadcrumb I18n.t('interface.home'), :root_path
问题是,该控制器似乎不知道当前的语言环境并且总是使用默认语言。
如何告诉 i18n 使用选定的区域设置,而不是默认设置?
更新: 控制器知道当前的语言环境。但问题出现在奇怪的情况下。我以一种方法在两个不同的地方使用了相同的代码,发现 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