renuo/ngx-renuo-upload

View on GitHub
bin/generate-i18n

Summary

Maintainability
Test Coverage
#!/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