Created
August 2, 2011 11:52
-
-
Save k3rni/1120051 to your computer and use it in GitHub Desktop.
Quick script to translate an yml locale file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Note: relies on deprecated Google Translate API, thus probably won't work after Dec 2011. Useful for quickly starting i18n work.