Module: HaveAPI::Client::I18n

Defined in:
lib/haveapi/client/i18n.rb

Constant Summary collapse

DEFAULT_LOCALE =
:en
DEFAULT_LANGUAGE_HEADER =
'Accept-Language'.freeze
HEADER_NAME =
/\A[A-Za-z0-9!#$%&'*+\-.^_`|~]+\z/
HEADER_VALUE_UNSAFE =
/[\x00\r\n]/

Class Method Summary collapse

Class Method Details

.assert_header_name!(header) ⇒ Object

Raises:

  • (ArgumentError)


37
38
39
40
41
# File 'lib/haveapi/client/i18n.rb', line 37

def assert_header_name!(header)
  return if header.is_a?(String) && header.match?(HEADER_NAME)

  raise ArgumentError, "invalid language HTTP header name: #{header.inspect}"
end

.assert_header_value!(value) ⇒ Object

Raises:

  • (ArgumentError)


43
44
45
46
47
# File 'lib/haveapi/client/i18n.rb', line 43

def assert_header_value!(value)
  return if value.is_a?(String) && !value.match?(HEADER_VALUE_UNSAFE)

  raise ArgumentError, "invalid language HTTP header value: #{value.inspect}"
end

.locale_for(language) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/haveapi/client/i18n.rb', line 26

def locale_for(language)
  return DEFAULT_LOCALE if language.nil? || language.to_s.empty?

  parse_accept_language(language).each do |tag|
    normalized = normalize_locale(tag)
    return normalized if normalized && messages.has_key?(normalized)
  end

  DEFAULT_LOCALE
end

.request_headers(language, language_header = DEFAULT_LANGUAGE_HEADER) ⇒ Object



17
18
19
20
21
22
23
24
# File 'lib/haveapi/client/i18n.rb', line 17

def request_headers(language, language_header = DEFAULT_LANGUAGE_HEADER)
  return {} if language.nil? || language.to_s.empty?

  assert_header_name!(language_header)
  assert_header_value!(language)

  { language_header => language.to_s }
end

.t(language, key, values = {}) ⇒ Object



11
12
13
14
15
# File 'lib/haveapi/client/i18n.rb', line 11

def t(language, key, values = {})
  message = lookup(locale_for(language), key) || lookup(DEFAULT_LOCALE, key) || key.to_s

  interpolate(message, values)
end