2013-05-29 54 views
1

这种方法提取浏览器语言,并且在语言有2个字母,es, en, de等时工作正常。提取浏览器语言轨3

def extract_locale_from_accept_language_header 
    browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z]{2}/).try(:first).try(:to_sym) 
    if I18n.available_locales.include? browser_locale 
     browser_locale 
    else 
     I18n.default_locale 
    end 
    end 

但是不工作时,浏览器语言有4个字母:

en 
en-us 
en-gb 
en-au 
en-ca 
zh-TW 
zh-cn 

怎样才能解决这个问题呢?

感谢

回答

1

你的正则表达式只想找两个字母试试这个:

browser_locale = request.env['HTTP_ACCEPT_LANGUAGE'].try(:scan, /^[a-z-]{2,5}/).try(:first).try(:to_sym) 

这将二到五个字符代码工作与小写字母或破折号。

这只是一个开始,您可能需要更多地细化此正则表达式。

+0

谢谢你这个正则表达式工作正常。谢谢! – hyperrjas

0

这里是一个ruby gem这不正是你想要什么:

languages = HTTP::Accept::Language.parse("da, en-gb;q=0.8, en;q=0.7") 

expect(languages[0].locale).to be == "da" 
expect(languages[1].locale).to be == "en-gb" 
expect(languages[2].locale).to be == "en" 

它有广泛的投入100%的测试覆盖率。