Skip to content

Instantly share code, notes, and snippets.

@matthutchinson
Created July 1, 2013 12:06
Show Gist options
  • Save matthutchinson/5900272 to your computer and use it in GitHub Desktop.
Save matthutchinson/5900272 to your computer and use it in GitHub Desktop.
# encoding: UTF-8
#!/usr/bin/ruby
require 'net/http'
require 'net/https'
require 'uri'
require 'json'
class GoogleTranslate
class TranslationError < StandardError; end
BASE_URL = 'https://www.googleapis.com/language/translate/v2'
LANGUAGES = {
"af"=>"Afrikaans",
"sq"=>"Albanian",
"ar"=>"Arabic",
"az"=>"Azerbaijani",
"eu"=>"Basque",
"bn"=>"Bengali",
"be"=>"Belarusian",
"bg"=>"Bulgarian",
"ca"=>"Catalan",
"zh"=>"Chinese Simplified",
"zh-TW"=>"Chinese Traditional",
"hr"=>"Croatian",
"cs"=>"Czech",
"da"=>"Danish",
"nl"=>"Dutch",
"en"=>"English",
"eo"=>"Esperanto",
"et"=>"Estonian",
"tl"=>"Filipino",
"fi"=>"Finnish",
"fr"=>"French",
"gl"=>"Galician",
"ka"=>"Georgian",
"de"=>"German",
"el"=>"Greek",
"gu"=>"Gujarati",
"ht"=>"Haitian Creole",
"iw"=>"Hebrew",
"hi"=>"Hindi",
"hu"=>"Hungarian",
"is"=>"Icelandic",
"id"=>"Indonesian",
"ga"=>"Irish",
"it"=>"Italian",
"ja"=>"Japanese",
"kn"=>"Kannada",
"ko"=>"Korean",
"la"=>"Latin",
"lv"=>"Latvian",
"lt"=>"Lithuanian",
"mk"=>"Macedonian",
"ms"=>"Malay",
"mt"=>"Maltese",
"no"=>"Norwegian",
"fa"=>"Persian",
"pl"=>"Polish",
"pt"=>"Portuguese",
"ro"=>"Romanian",
"ru"=>"Russian",
"sr"=>"Serbian",
"sk"=>"Slovak",
"sl"=>"Slovenian",
"es"=>"Spanish",
"sw"=>"Swahili",
"sv"=>"Swedish",
"ta"=>"Tamil",
"te"=>"Telugu",
"th"=>"Thai",
"tr"=>"Turkish",
"uk"=>"Ukrainian",
"ur"=>"Urdu",
"vi"=>"Vietnamese",
"cy"=>"Welsh",
"yi"=>"Yiddish"
}
attr_accessor :key
attr_accessor :source
attr_accessor :target
def self.api_key
(config_yaml[Rails.env] || config_yaml['default'])[:server_api_key]
end
def self.config_yaml
YAML.load(File.read 'config/google_api_keys.yml')
end
def initialize(options = {})
@key = GoogleTranslate.api_key
@source = options[:source]
@target = options[:target]
end
def translate(string, options = {})
params = {
:q => string,
:source => options[:source] || @source,
:target => options[:target] || @target
}
response = fetch(BASE_URL, params)
translation_from_response(response)
end
def detect_language(string)
url = "#{BASE_URL}/detect"
params = { :q => string }
response = fetch(url, params)
raise TranslationError, 'Detection data not present' unless response['data'].andand['detections']
response['data']['detections'].first.first['language']
end
private
def fetch(url, params)
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, 443)
http.use_ssl = true
params[:key] = @key
params.delete_if { |k, v| v.nil? }
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data(params)
request['X-HTTP-Method-Override'] = 'GET'
response = http.request(request).body
body = JSON.parse(response)
raise TranslationError, "Invalid response" unless body.kind_of?(Hash)
if body['error']
message = "Translate API returned an error: %d (%s)" %
[ body['error']['code'], body['error']['message'] ]
raise TranslationError, message
end
raise TranslationError, "Translation data not present!" unless body["data"]
body
end
def translation_from_response(response)
raise TranslationError, "Translation data not present!" unless response["data"].andand['translations']
response["data"]["translations"].map do |translation_data|
{
:translation => translation_data["translatedText"],
:detected_source => translation_data["detectedSourceLanguage"]
}
end
end
def self.supports?(locale)
LANGUAGES.has_key?(locale)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment