Ruby on Railsでロケールを自動的に設定する方法は?たとえば、Webページがスペインで開かれている場合はlocale = es、同様に英国にある場合はlocale = enなどですか?
私を助けてください。
Ruby on Railsでロケールを自動的に設定する方法は?たとえば、Webページがスペインで開かれている場合はlocale = es、同様に英国にある場合はlocale = enなどですか?
私を助けてください。
あなたはあなたの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
gem geocoder
とi18n_datagemを使用してみて、次のようなメソッドにbefore_filterを設定します。
def checklocale
I18n.locale = I18nData.country_code(request.location.country)
end
これを含めるApplicationController
かBaseController
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
詳細はこちら同様の質問。
私があなたの意味を理解した場合、あなたはジオロケーションを操作し、彼のIPに基づいてユーザーの場所を取得し、それに基づいてロケールを設定する必要がありますが、何も取得できない場合に備えて、デフォルトを設定することを忘れてはなりませんユーザーのIPの。
申し訳ありませんが、私はまだルビーのジオロケーションを扱っていませんでした。私はrubygemsについて迅速な調査を行いましたが、作業を簡素化するための宝石を見つけることができませんでした。=(
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など)を取り除き、それに基づいてロケールを設定します。サポートされていないロケールからユーザーが来た場合、特に設定されていない限り、デフォルトのロケールである英語に戻ります。