module I18nData::FileDataProvider

def cache_file_for(type, language_code)

def cache_file_for(type, language_code)
  file = "#{type}-#{language_code.sub('-', '_').upcase}"
  File.join(File.dirname(__FILE__), '..', '..', 'cache', 'file_data_provider', "#{file}.txt")
end

def codes(type, language_code)

def codes(type, language_code)
  unless (data = read_from_file(cache_file_for(type, language_code)))
    raise NoTranslationAvailable, "#{type}-#{language_code}"
  end
  data
end

def read_from_file(file)

def read_from_file(file)
  return nil unless File.exist?(file)
  data = {}
  File.readlines(file, encoding: 'utf-8').each do |line|
    code, translation = line.strip.split(DATA_SEPARATOR, 2)
    data[code] = translation
  end
  data
end

def write_cache(provider)

def write_cache(provider)
  languages = provider.codes(
    :languages,
    'EN'
  ).keys + ['zh_CN', 'zh_TW', 'zh_HK', 'bn_IN', 'pt_BR', 'sr@latin', 'nb_NO']
  languages.map do |language_code|
    [:languages, :countries].each do |type|
      data = provider.send(:codes, type, language_code)
      write_to_file(data, cache_file_for(type, language_code))
    rescue NoTranslationAvailable
      warn "No translation available for #{type} #{language_code}" if $DEBUG
    rescue AccessDenied
      warn "Access denied for #{type} #{language_code}"
    end
  end
end

def write_to_file(data, file)

def write_to_file(data, file)
  return if data.empty?
  FileUtils.mkdir_p File.dirname(file)
  File.write(file, data.map { |code, translation| "#{code}#{DATA_SEPARATOR}#{translation}" } * "\n")
end