Created
July 1, 2013 12:06
-
-
Save matthutchinson/5900272 to your computer and use it in GitHub Desktop.
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
# 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