Как I18n устанавливает локаль, если заголовок http поддерживает несколько языков - PullRequest
1 голос
/ 24 октября 2019

, если accept_language в заголовке http прост и понятен, как:

'en' или 'en-us', Настройка языка I18n проста, например:

I18n.locale = request.env['HTTP_ACCEPT_LANGUAGE']

Но что еслиЗаголовок http сложен как:

Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5

Как установить локали I18n сейчас ???

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Зачем изобретать велосипед? : D http_accept_language gem делает это очень просто (и даже работает как промежуточное ПО Rack).

0 голосов
/ 24 октября 2019

В приведенном вами примере языки уже отсортированы, поэтому на основе этого должно быть довольно легко определить, какую локаль использовать. Я не ожидал бы, что они будут отсортированы, кроме как по убыванию.

header = 'fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5'
langs = header.scan(/([a-z]{2};q=\d.\d)/).flatten
langs.sort_by!{|l| l.split('=').last.to_f}.reverse! # insure sorted by weight may not need this.
available_locals = I18n.available_locales.select{|locale| langs.any?{|l| l.match(locale.to_s)}}
#[;en, :fr, :de] for example

use_language = langs.find{|l| available_locals.include?(l[0..1])}.try(:first, 2)

Теперь, если use_locale равно нулю, вам нужно будет вернуться к чему-то. Если вы читаете спецификации для целей заголовка, вероятно, есть лучшие способы получить предпочитаемый язык ваших пользователей.

...