Skip to content

Instantly share code, notes, and snippets.

@k3rni
Created August 2, 2011 11:52
Show Gist options
  • Save k3rni/1120051 to your computer and use it in GitHub Desktop.
Save k3rni/1120051 to your computer and use it in GitHub Desktop.
Quick script to translate an yml locale file
#! /usr/bin/env ruby
# encoding: utf-8
require 'rubygems'
require 'thor'
require 'restclient'
require 'json'
require 'active_support/core_ext/hash'
require 'yaml'
require 'ya2yaml'
class Translator < Thor
desc "translate YMLFILE SRCLANG DSTLANG", "Translates a YAML file, writes to stdout or given filename"
method_option :output, :type => :string, :required => false, :desc => "output filename", :aliases => "-o"
def translate yml_file, src, dest
data = YAML.load_file(yml_file)
if ENV['GOOGLE_API_KEY'].nil?
STDERR.puts "Please setup GOOGLE_API_KEY in your environment"
return
end
data = data[src]
if data.nil?
STDERR.puts "#{yml_file} doesn't nest under #{src}"
return
end
data.stringify_keys!
do_translate data, src, dest
if options[:output]
outfile = File.new(options[:output], 'w')
else
outfile = STDOUT
end
outfile.puts({dest => data}.ya2yaml)
end
end
def do_translate data, srclang, destlang
data.each do |key, value|
if value.is_a? Hash
do_translate value, srclang, destlang
elsif value.is_a? Array
data[key] = data[key].map { |v| query_translate v, srclang, destlang }
else
data[key] = query_translate(value, srclang, destlang)
end
end
end
def query_translate str, src, dst
key = ENV['GOOGLE_API_KEY']
text = nil
RestClient.post("https://www.googleapis.com/language/translate/v2?key=#{key}",
{:source => src, :target => dst, :q => parametrize(str), :format => :html},
'X-HTTP-Method-Override' => 'GET') do |resp, req, result|
tr = JSON.parse(resp)
begin
text = tr['data']['translations'].first['translatedText']
rescue
puts resp
raise
end
end
#puts "#{str} [#{src} → #{dst}] = #{text}"
unparametrize text
end
def parametrize text
# mask interpolation strings like %{foo}
text.gsub /%\{(\w+)\}/, '<p id=\1>'
end
def unparametrize text
# and unmask them later
text.gsub /<p id=(\w+)>/, '%{\1}'
end
Translator.start
@k3rni
Copy link
Author

k3rni commented Aug 2, 2011

Note: relies on deprecated Google Translate API, thus probably won't work after Dec 2011. Useful for quickly starting i18n work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment