1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
# frozen_string_literal: true
module I18nData
module FileDataProvider
require 'fileutils'
DATA_SEPARATOR = ";;"
extend self
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 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
private
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_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
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
end
end
|