bin/generate-i18n
#!/usr/bin/env ruby
require 'json'
require 'fileutils'
require 'active_support/inflector/methods'
def run
puts '> I18n'
puts 'Generating I18n'
FileUtils.mkpath('src/app/i18n/generated')
File.write('src/app/i18n/generated/i18n-translations.ts', render_translations_template(extract_translations))
File.write('src/app/i18n/generated/i18n-interface.ts', render_interface_template(extract_interface))
puts 'I18n generated'
puts
end
def extract_interface
contents = JSON.parse(File.read('src/public/i18n/de.json'))
contents.map { |k, v| render_interface_part(k, v) }.join("\n")
end
def render_interface_part(k, v)
" #{k}: {\n#{render_child(k, v, 2, false, '')}\n };"
end
def render_child(parent_k, v, indent_level, render_v, comma)
unless v.is_a? Hash
return "#{' ' * (indent_level - 1)}#{parent_k}: #{render_v ? render_string(v) : 'string'}#{comma}"
end
indent = ' ' * indent_level
count = 0
v.map do |k, vv|
count += 1
comma_loop = count == v.size ? '' : ','
[
(vv.is_a?(Hash) ? "#{indent}#{k}: {" : nil),
"#{render_child(k, vv, indent_level + 1, render_v, comma_loop)}",
(vv.is_a?(Hash) ? "#{indent}}#{comma_loop}" : nil)
].compact.join("\n")
end.join("\n")
end
def render_string(string)
# crazy stuff here - you don't want to know...
"'#{string.gsub("'", "\\\\\\\\'")}'"
end
def extract_translations
all = {}
Dir.glob('src/public/i18n/*.json').each do |filename|
lang = File.basename(filename, '.json')
contents = JSON.parse(File.read(filename))
all[lang] = convert_translation(contents)
end
render_child(nil, all, 1, true, '')
end
def convert_translation(v)
return v unless v.is_a? Hash
hash = {}
v.each { |kk, vv| hash[kk] = convert_translation(vv) }
hash
end
def render_translations_template(replacement)
template = File.read(File.join(__dir__, 'i18n-translations-template.ts.template'))
rendered = template.gsub(' // {{AllRenuoUploadTranslations}}', replacement)
"#{warning}\n#{rendered}"
end
def render_interface_template(replacement)
template = File.read(File.join(__dir__, 'i18n-interface-template.ts.template'))
rendered = template.gsub(' // {{RenuoUploadTranslationsInterface}}', replacement)
"#{warning}\n#{rendered}"
end
def warning
'// Warning: this file has been generated by bin/generate-i18n. Do not change or commit it!'
end
run