Module: Bp3::ActionDispatch::RequestLocale

Defined in:
lib/bp3/action_dispatch/request_locale.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#locale_fromObject (readonly)

Returns the value of attribute locale_from.



6
7
8
# File 'lib/bp3/action_dispatch/request_locale.rb', line 6

def locale_from
  @locale_from
end

Instance Method Details

#default_localeObject (private)



67
68
69
70
71
# File 'lib/bp3/action_dispatch/request_locale.rb', line 67

def default_locale
  locale = I18n.default_locale
  @locale_from = 'default' if locale
  locale
end

#extract_localeObject (private)



14
15
16
17
18
19
20
21
# File 'lib/bp3/action_dispatch/request_locale.rb', line 14

def extract_locale
  extract_locale_from_path ||
    extract_locale_from_params ||
    extract_locale_from_host ||
    extract_locale_from_header ||
    extract_locale_from_setting ||
    default_locale
end

#extract_locale_from_headerObject (private)



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/bp3/action_dispatch/request_locale.rb', line 45

def extract_locale_from_header
  header = env['HTTP_ACCEPT_LANGUAGE']
  return if header.nil? || header == ''

  languages = parse_header(header)
  sorted = languages.sort_by { |_l, q| q }.reverse
  locales = sorted.map(&:first)
  symbolized = locales.map { |l| locale_to_sym(l) }
  available = symbolized.select { |l| I18n.available_locales.include?(l) }
  locale = available.first
  @locale_from = 'header' if locale
  locale
end

#extract_locale_from_hostObject (private)



39
40
41
42
43
# File 'lib/bp3/action_dispatch/request_locale.rb', line 39

def extract_locale_from_host
  locale = locale_if_exists(host.split('.').last)
  @locale_from = 'host' if locale
  locale
end

#extract_locale_from_paramsObject (private)



30
31
32
33
34
35
36
37
# File 'lib/bp3/action_dispatch/request_locale.rb', line 30

def extract_locale_from_params
  return nil if params[:locale].nil? || params[:locale] == ''

  locale = params[:locale]
  locale = locale_if_exists(locale)
  @locale_from = 'params' if locale
  locale
end

#extract_locale_from_pathObject (private)



23
24
25
26
27
28
# File 'lib/bp3/action_dispatch/request_locale.rb', line 23

def extract_locale_from_path
  locale = original_fullpath.split('/').reject { |e| e.nil? || e == '' }.first
  locale = locale_if_exists(locale)
  @locale_from = 'path' if locale
  locale
end

#extract_locale_from_settingObject (private)



59
60
61
62
63
64
65
# File 'lib/bp3/action_dispatch/request_locale.rb', line 59

def extract_locale_from_setting
  return if request_site&.config.nil?

  locale = locale_if_exists(request_site.configs.locale.presence)
  @locale_from = 'setting' if locale
  locale
end

#locale_if_exists(locale) ⇒ Object (private)



83
84
85
86
# File 'lib/bp3/action_dispatch/request_locale.rb', line 83

def locale_if_exists(locale)
  locale = locale_to_sym(locale)
  I18n.available_locales.include?(locale) ? locale : nil
end

#locale_to_sym(locale) ⇒ Object (private)



88
89
90
91
92
93
94
95
96
# File 'lib/bp3/action_dispatch/request_locale.rb', line 88

def locale_to_sym(locale)
  return nil if locale.nil?
  return locale.to_sym if locale.length == 2

  locale, region = locale.split('-')
  return locale.to_sym if region.nil?

  :"#{locale}-#{region.upcase}"
end

#parse_header(header) ⇒ Object (private)

example format: 'en;q=0.1,nl'



74
75
76
77
78
79
80
81
# File 'lib/bp3/action_dispatch/request_locale.rb', line 74

def parse_header(header)
  languages = header.split(',').map(&:strip)
  languages.map do |language|
    locale, quality = language.split(/\s*;\s*q\s*=\s*/i)
    quality = quality.nil? || quality == '' ? 1.0 : quality.to_f
    [locale, quality]
  end
end

#request_localeObject



8
9
10
# File 'lib/bp3/action_dispatch/request_locale.rb', line 8

def request_locale
  @request_locale ||= extract_locale
end