11

Ruby on Railsでロケールを自動的に設定する方法は?たとえば、Webページがスペインで開かれている場合はlocale = es、同様に英国にある場合はlocale = enなどですか?

私を助けてください。

4

5 に答える 5

27

あなたはあなたのApplicationController:にこのようにそれを実装することができます

class ApplicationController < ActionController::Base
  before_filter :set_locale

  def set_locale
    I18n.locale = extract_locale_from_headers
  end

  private

  def extract_locale_from_headers
    request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first.presence || 'en'
  end
end

受信したリクエストを「検査」し、クライアントのブラウザの言語を見つけて、I18nロケールとして設定します。

詳細な手順については、I18nに関するRubyOnRailsガイドを参照してください。


サポートされているロケールのセットを用意し、デフォルトのロケールにフォールバックすることを強くお勧めします。このようなもの:

ALLOWED_LOCALES = %w( fr en es ).freeze
DEFAULT_LOCALE = 'en'.freeze

def extract_locale_from_headers
  browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
  if ALLOWED_LOCALES.include?(browser_locale)
    browser_locale
  else
    DEFAULT_LOCALE
  end
end
于 2012-11-09T15:27:22.960 に答える
9

gem geocoderi18n_datagemを使用してみて、次のようなメソッドにbefore_filterを設定します。

def checklocale
  I18n.locale =  I18nData.country_code(request.location.country) 
end
于 2012-11-09T15:40:15.390 に答える
4

これを含めるApplicationControllerBaseController

before_filter :set_locale

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

これはlocale、デフォルトに設定するか、リクエストからロケールを使用し、リクエストで送信されたものを優先することを意味します。これをユーザー、セッション、リクエストに拡張したい場合は、これを行うことができます。

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

詳細はこちら同様の質問。

于 2012-11-09T15:32:15.193 に答える
1

私があなたの意味を理解した場合、あなたはジオロケーションを操作し、彼のIPに基づいてユーザーの場所を取得し、それに基づいてロケールを設定する必要がありますが、何も取得できない場合に備えて、デフォルトを設定することを忘れてはなりませんユーザーのIPの。

申し訳ありませんが、私はまだルビーのジオロケーションを扱っていませんでした。私はrubygemsについて迅速な調査を行いましたが、作業を簡素化するための宝石を見つけることができませんでした。=(

于 2012-11-09T15:32:57.487 に答える
0

Railsガイドから、このコードをApplicationControllerに含めます

before_action :set_locale

def set_locale
  I18n.locale = extract_locale_from_tld || I18n.default_locale
end

# Get locale from top-level domain or return nil if such locale is not available
# You have to put something like:
#   127.0.0.1 application.com
#   127.0.0.1 application.it
#   127.0.0.1 application.pl
# in your /etc/hosts file to try this out locally
def extract_locale_from_tld
  parsed_locale = request.host.split('.').last
  I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
end

基本的に、これはapplication.co.idやexample.comなどのURLから最終的な識別子(.en、.idなど)を取り除き、それに基づいてロケールを設定します。サポートされていないロケールからユーザーが来た場合、特に設定されていない限り、デフォルトのロケールである英語に戻ります。

于 2015-09-24T10:34:02.850 に答える