Module: GettextSetup

Defined in:
lib/gettext-setup/gettext_setup.rb

Constant Summary collapse

@@config =
nil

Class Method Summary collapse

Class Method Details

.config ⇒ Object



41
42
43
# File 'lib/gettext-setup/gettext_setup.rb', line 41

def self.config
  @@config
end

.default_locale ⇒ Object



45
46
47
# File 'lib/gettext-setup/gettext_setup.rb', line 45

def self.default_locale
  config['default_locale'] || "en"
end

.initialize(locales_path, options = {}) ⇒ Object

locales_path should include:

  • config.yaml
  • a .pot file for the project
  • i18n directories for languages, each with a .po file
  • if using .mo files, an LC_MESSAGES dir in each language dir, with the .mo file in it valid options fields: :file_format - one of the supported backends for fast_gettext (e.g. :po, :mo, :yaml, etc.)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/gettext-setup/gettext_setup.rb', line 15

def self.initialize(locales_path, options = {})
  config_path = File.absolute_path('config.yaml', locales_path)
  @@config = YAML.load_file(config_path)['gettext']
  @@locales_path = locales_path

  # Make the translation methods available everywhere
  Object.send(:include, FastGettext::Translation)

  # Define our text domain, and set the path into our root.  I would prefer to
  # have something smarter, but we really want this up earlier even than our
  # config loading happens so that errors there can be translated.
  FastGettext.add_text_domain(config['project_name'],
                              :path => locales_path,
                              :type => options[:file_format] || :po,
                              :ignore_fuzzy => false)
  FastGettext.default_text_domain = config['project_name']

  # Likewise, be explicit in our default language choice.
  FastGettext.default_locale = default_locale
  FastGettext.default_available_locales = locales
end

.locales ⇒ Object



49
50
51
52
53
54
# File 'lib/gettext-setup/gettext_setup.rb', line 49

def self.locales
  explicit = Dir.glob(File::absolute_path('*/*.po', locales_path)).map do |x|
    File::basename(File::dirname(x))
  end
  (explicit + [ default_locale]).uniq
end

.locales_path ⇒ Object



37
38
39
# File 'lib/gettext-setup/gettext_setup.rb', line 37

def self.locales_path
  @@locales_path
end

.negotiate_locale(accept_header) ⇒ Object

Given an HTTP Accept-Language header return the locale with the highest priority from it for which we have a locale available. If none exists, return the default locale



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/gettext-setup/gettext_setup.rb', line 59

def self.negotiate_locale(accept_header)
  unless @@config
    raise ArgumentError, "No config.yaml found! Use `GettextSetup.initialize(locales_path)` to locate your config.yaml"
  end
  return FastGettext.default_locale if accept_header.nil?
  available_locales = accept_header.split(",").map do |locale|
    pair = locale.strip.split(';q=')
    pair << '1.0' unless pair.size == 2
    pair[0] = FastGettext.default_locale if pair[0] == '*'
    pair
  end.sort_by do |(locale,qvalue)|
    qvalue.to_f
  end.select do |(locale,_)|
    FastGettext.available_locales.include?(locale)
  end
  if available_locales and available_locales.last
    available_locales.last.first
  else
    # We can't satisfy the request preference. Just use the default locale.
    default_locale
  end
end