Ruby on Rails i18n面包屑

时间:2012-05-29 19:10:32

标签: ruby-on-rails ruby internationalization locale breadcrumbs

我正在使用默认的Rails i18n并且遇到了i18ing breadcrumb的问题。我使用名为“breadcrumbs_on_rails”的gem来渲染面包屑,所以我在控制器中添加了痕迹 - 链接,如下所示:

add_breadcrumb I18n.t('interface.home'), :root_path

问题是,该控制器似乎不知道当前的语言环境,并且总是使用默认语言。

如何告诉i18n使用所选语言环境,而不是默认语言?

更新 控制器了解当前的区域设置。但问题出现在奇怪的情况下。我在一个方法的两个不同的地方使用相同的代码,并发现,i18n不能在 6 行上工作,并且在以下示例代码的 10 行上工作:< / p>

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

Locale在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

网址如下所示:http://localhost:3000/de/devices/3/events

1 个答案:

答案 0 :(得分: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