1

我正在使用默认的 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

4

1 回答 1

2

获取和设置当前语言环境:

I18n.locale

获取默认语言环境:

I18n.default_locale

这就是你所需要的:http: //guides.rubyonrails.org/i18n.html


尝试使用官方指南中的方法。您可以使用以下方式设置语言环境before_filter

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper

  before_filter :set_locale

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end

  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
于 2012-05-29T19:26:49.933 回答