В приведенном вами примере языки уже отсортированы, поэтому на основе этого должно быть довольно легко определить, какую локаль использовать. Я не ожидал бы, что они будут отсортированы, кроме как по убыванию.
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
равно нулю, вам нужно будет вернуться к чему-то. Если вы читаете спецификации для целей заголовка, вероятно, есть лучшие способы получить предпочитаемый язык ваших пользователей.