class ZendeskAppsTools::Translate

Constants

LOCALE_ENDPOINT

Public Class Methods

source_root() click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 93
def self.source_root
  File.expand_path(File.join(File.dirname(__FILE__), '../..'))
end

Public Instance Methods

array_to_nested_hash(array) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 147
def array_to_nested_hash(array)
  array.inject({}) do |result, item|
    keys = item['key'].split('.')
    current = result
    keys[0..-2].each do |key|
      current = (current[key] ||= {})
    end
    current[keys[-1]] = { 'title' => item['title'], 'value' => item['value'] }
    result
  end
end
build_pseudotranslation(translations_hash, package_name) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 159
def build_pseudotranslation(translations_hash, package_name)
  titles       = to_flattened_namespaced_hash(translations_hash, I18N_TITLE_KEY)
  values       = to_flattened_namespaced_hash(translations_hash, I18N_VALUE_KEY)
  translations = titles.each { |k, v| titles[k] = { 'title' => v, 'value' => "[日本#{values[k]}éñđ]" } }
  translations['app.package'] = package_name # don't pseudo translate the package name
  nest_translations_hash(translations, '')
end
escape_special_characters(v) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 143
def escape_special_characters(v)
  v.gsub('"', '\"')
end
fetch_locale_async(locale, app_package) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 98
def fetch_locale_async(locale, app_package)
  Thread.new do
    say("Fetching #{locale['locale']}")
    json = Faraday.get("#{locale['url']}?include=translations&packages=app_#{app_package}").body
    JSON.parse(json)['locale']
  end
end
nest_translations_hash(translations_hash, key_prefix) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 114
def nest_translations_hash(translations_hash, key_prefix)
  result = {}

  translations_hash.each do |full_key, value|
    parts       = full_key.gsub(key_prefix, '').split('.')
    parts_count = parts.size - 1
    context     = result

    parts.each_with_index do |part, i|
      if parts_count == i
        context[part] = value
      else
        context = context[part] ||= {}
      end
    end
  end

  result
end
pseudotranslate() click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 81
def pseudotranslate
  setup_path(options[:path]) if options[:path]

  en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)

  package = en_json['app']['package']
  say_error_and_exit('No package defined inside en.json! Abort.') unless package

  pseudo = build_pseudotranslation(en_json, package)
  write_json("translations/fr.json", pseudo)
end
setup_path(path) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 106
def setup_path(path)
  @destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
end
to_json() click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 39
def to_json
  setup_path(options[:path]) if options[:path]
  en_yml = YAML.load_file("#{destination_root}/translations/en.yml")
  package = /^txt.apps.([^\.]+)/.match(en_yml['parts'][0]['translation']['key'])[1]
  translations = en_yml['parts'].map { |part| part['translation'] }
  en_json = array_to_nested_hash(translations)['txt']['apps'][package]
  en_json['app']['package'] = package

  write_json('translations/en.json', en_json)
end
to_yml() click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 19
def to_yml
  setup_path(options[:path]) if options[:path]
  manifest = JSON.parse(File.open("#{destination_root}/manifest.json").read)
  app_name = manifest['name']

  unless app_name
    app_name = get_value_from_stdin('What is the name of this app?', error_msg: 'Invalid name, try again:')
  end

  en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)

  package = en_json['app']['package']
  say_error_and_exit('No package defined inside en.json! Abort.') unless package
  en_json['app'].delete('package')

  write_yml(en_json, app_name, package)
end
update() click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 52
def update()
  setup_path(options[:path]) if options[:path]
  app_package = get_value_from_stdin('What is the package name for this app? (without app_)', valid_regex: /^[a-z_]+$/, error_msg: 'Invalid package name, try again:')

  key_prefix = "txt.apps.#{app_package}."

  say('Fetching translations...')
  locale_response = Faraday.get(LOCALE_ENDPOINT)

  if locale_response.status == 200
    locales = JSON.parse(locale_response.body)['locales']

    locales = locales.map { |locale| fetch_locale_async locale, app_package}.map(&:value)

    locales.each do |locale|
      translations    = locale['translations']

      locale_name = ZendeskAppsTools::LocaleIdentifier.new(locale['locale']).locale_id
      write_json("#{destination_root}/translations/#{locale_name}.json", nest_translations_hash(translations, key_prefix))
    end
    say('Translations updated', :green)

  elsif locale_response.status == 401
    say('Authentication failed', :red)
  end
end
write_json(filename, translations_hash) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 110
def write_json(filename, translations_hash)
  create_file(filename, JSON.pretty_generate(translations_hash) + "\n")
end
write_yml(en_json, app_name, package_name) click to toggle source
# File lib/zendesk_apps_tools/translate.rb, line 134
def write_yml(en_json, app_name, package_name)
  titles        = to_flattened_namespaced_hash(en_json, I18N_TITLE_KEY)
  values        = to_flattened_namespaced_hash(en_json, I18N_VALUE_KEY)
  @translations = titles.each { |k, v| titles[k] = { 'title' => v, 'value' => escape_special_characters(values[k]) } }
  @app_name     = app_name
  @package_name = package_name
  template(File.join(Translate.source_root, 'templates/translation.erb.tt'), 'translations/en.yml')
end