Skip to content

Instantly share code, notes, and snippets.

@ANNotunzdY
Created February 21, 2019 02:53
Show Gist options
  • Save ANNotunzdY/06082e2f14bb1dc51f29b71f7c03a51f to your computer and use it in GitHub Desktop.
Save ANNotunzdY/06082e2f14bb1dc51f29b71f7c03a51f to your computer and use it in GitHub Desktop.
"Microsoft Translator on Azure" sample code written with Swift
//
// AzureMicrosoftTranslator.swift
// feather
//
// Created by mironal on 2016/12/09.
// Copyright © 2016年 covelline. All rights reserved.
//
import Foundation
private func getToken(key: String, completion block: @escaping (Data?, URLResponse?, Error?) -> Void) {
var request = URLRequest(url: NSURL(string: "https://api.cognitive.microsoft.com/sts/v1.0/issueToken")! as URL)
request.httpMethod = "POST"
request.addValue(key, forHTTPHeaderField: "Ocp-Apim-Subscription-Key")
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: block)
task.resume()
}
private func msTranslate(token: String, translate text: String, toLang lang: String, completion block: @escaping (Data?, URLResponse?, Error?) -> Void) {
let c = NSURLComponents(string: "http://api.microsofttranslator.com/v2/Http.svc/Translate")
c?.queryItems = [
NSURLQueryItem(name: "text", value: text),
NSURLQueryItem(name: "to", value: lang)
] as [URLQueryItem]
guard let url = c?.url else {
return
}
var request = URLRequest(url: url)
request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: block)
task.resume()
}
private func extract(text: NSString) -> String? {
guard let regex = try? NSRegularExpression(pattern: "^<string[^>]*>(.*?)</string>$", options: .dotMatchesLineSeparators) else {
return nil
}
return regex.stringByReplacingMatches(in: text as String, options: [], range: NSRange(location: 0, length: text.length), withTemplate: "$1")
}
enum AzureMicrosoftTranslatorError: Error {
case TokenParseError
case TextParseError
case APIKeyIsNotInitialized
}
class AzureMicrosoftTranslator: NSObject {
static let sharedTranslator = AzureMicrosoftTranslator()
// Please remember to initialize
var key: String?
func translate(text: String, toLang lang: String, completion block: @escaping (String?, URLResponse?, NSError?) -> Void) {
guard let key = key else {
block(nil, nil, AzureMicrosoftTranslatorError.APIKeyIsNotInitialized as NSError)
return
}
getToken(key: key) { (data, response, error) in
if let error = error {
block(nil, response, error as NSError)
return
}
guard let data = data, let token = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as String? else {
block(nil, response, AzureMicrosoftTranslatorError.TokenParseError as NSError)
return
}
msTranslate(token: token, translate: text, toLang: lang) { (data, response, error) in
if let error = error {
block(nil, response, error as NSError)
return
}
guard let data = data,
let xml = NSString(data: data, encoding: String.Encoding.utf8.rawValue),
let result = extract(text: xml) else {
block(nil, response, AzureMicrosoftTranslatorError.TextParseError as NSError)
return
}
block(result, response, nil)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment