16: def determine_locale(request)
17: source = nil
18: lang = case
19: when !request.params['lang'].blank?
20: source = "'lang' request variable"
21: request.cookies['lang'] = request.params['lang']
22: request.params['lang']
23: when !request.cookies['lang'].blank?
24: source = "'lang' cookie"
25: request.cookies['lang']
26: when !request.env['HTTP_ACCEPT_LANGUAGE'].blank?
27: source = "'HTTP_ACCEPT_LANGUAGE' header"
28: lang = request.env['HTTP_ACCEPT_LANGUAGE']
29: when !request.env['HTTP_USER_AGENT'].blank? && request.env['HTTP_USER_AGENT'] =~ /[^a-z]([a-z]{2}(-[a-z]{2})?)[^a-z]/i
30: source = "'HTTP_USER_AGENT' header"
31: $~[1]
32:
33:
34:
35: else
36: source = "default"
37: "en"
38: end
39:
40: $LOG.debug "Detected locale is #{lang.inspect} (from #{source})"
41:
42: lang.gsub!('_','-')
43:
44:
45:
46: if lang =~ /[,;\|]/
47: langs = lang.split(/[,;\|]/)
48: else
49: langs = [lang]
50: end
51:
52:
53:
54:
55:
56:
57:
58: available = available_locales
59:
60: if available.length == 1
61: $LOG.warn "Only the #{available.first.inspect} localization is available. You should run `rake localization:mo` to compile support for additional languages!"
62: elsif available.length == 0
63: $LOG.error "No localizations available! Run `rake localization:mo` to compile support for additional languages."
64: end
65:
66:
67:
68:
69:
70: chosen_lang = nil
71: langs.each do |l|
72: a = available.find{ |a| a =~ Regexp.new("\\A#{l}\\Z", 'i') ||
73: a =~ Regexp.new("#{l}-\w*", 'i') }
74: if a
75: chosen_lang = a
76: break
77: end
78: end
79:
80: chosen_lang = "en" if chosen_lang.blank?
81:
82: $LOG.debug "Chosen locale is #{chosen_lang.inspect}"
83:
84: return chosen_lang
85: end