1

デフォルトの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

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 に答える