【问题标题】:Ruby on Rails i18n breadcumbsRuby on Rails i18n 面包屑
【发布时间】:2012-05-29 19:10:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我已经在 application_controller 中设置了区域设置。 I18n.t 在视图中没有问题,仅在控制器中。我发现了新的细节,请稍后观看问题更新。
    • 当然,现在再次测试:在第 7 行有效,在第 5 行无效,即使使用 I18n.t
    • 看起来很奇怪。尝试在第 5 行和第 7 行之前放置标志 p I18n.locale,以调试并获取此时的当前语言环境。
    • 感谢您的建议!输出很有趣:en(错误)在第 5 行之前,de(正确)在第 5 行和第 6 行之间,de(正确)在第 6 和 7 行之间。
    • 谢谢! before_filter 是解决方案! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多