module I18nData::LiveDataProvider

fetches data online from debian git

Constants

CLONE_DEST
JSON_CODES
REPO
TRANSLATIONS

Public Instance Methods

clear_cache() click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 31
def clear_cache
  `rm -rf #{CLONE_DEST}`
  raise unless $?.success?
end
codes(type, language_code) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 20
def codes(type, language_code)
  ensure_checkout

  language_code = language_code.upcase
  if language_code == 'EN'
    send("english_#{type}")
  else
    translated(type, language_code)
  end
end

Private Instance Methods

english_countries() click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 92
def english_countries
  @english_countries ||= begin
    codes = {}
    json(:countries)['3166-1'].each do |entry|
      name = (entry['common_name'] || entry['name']).to_s
      code = entry['alpha_2'].to_s.upcase
      codes[code] = name
    end
    codes
  end
end
english_languages() click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 79
def english_languages
  @english_languages ||= begin
    codes = {}
    json(:languages)['639-2'].each do |entry|
      name = entry['name'].to_s
      code = entry['alpha_2'].to_s.upcase
      next if code.empty? or name.empty?
      codes[code] = name
    end
    codes
  end
end
ensure_checkout() click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 38
def ensure_checkout
  unless File.exist?(CLONE_DEST)
    `git clone #{REPO} #{CLONE_DEST}`
    raise unless $?.success?
  end
end
get(url) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 113
def get(url)
  File.read("#{CLONE_DEST}/#{url}")
end
json(type) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 117
def json(type)
  JSON.parse(get(JSON_CODES[type]))
end
po_to_hash(data) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 104
def po_to_hash(data)
  names = data.select{|l| l =~ /^msgid/ }.map{|line| line.match(/^msgid "(.*?)"/)[1] }
  translations = data.select{|l| l =~ /^msgstr/ }.map{|line| line.match(/^msgstr "(.*?)"/)[1] }

  Hash[names.each_with_index.map do |name,index|
    [name, translations[index]]
  end]
end
translate(type, language, to_language_code) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 45
def translate(type, language, to_language_code)
  translated = translations(type, to_language_code)[language]
  translated.to_s.empty? ? nil : translated
end
translated(type, language_code) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 50
def translated(type, language_code)
  @translated ||= {}
  @translated["#{type}_#{language_code}"] ||= begin
    Hash[send("english_#{type}").map do |code, name|
      [code, translate(type, name, language_code) || name]
    end]
  end
end
translations(type, language_code) click to toggle source
# File lib/i18n_data/live_data_provider.rb, line 59
def translations(type, language_code)
  @translations ||= {}
  @translations["#{type}_#{language_code}"] ||= begin
    code = language_code.split("_")
    code[0].downcase!
    code = code.join("_")

    url = TRANSLATIONS[type]+"#{code}.po"
    begin
      data = get(url)
    rescue Errno::ENOENT
      raise NoTranslationAvailable, "for #{type} and language code = #{code} (#{$!})"
    end

    data = data.force_encoding('utf-8') if data.respond_to?(:force_encoding) # 1.9
    data = data.split("\n")
    po_to_hash data
  end
end