Created
February 21, 2019 02:53
-
-
Save ANNotunzdY/06082e2f14bb1dc51f29b71f7c03a51f to your computer and use it in GitHub Desktop.
"Microsoft Translator on Azure" sample code written with Swift
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
// | |
// 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