Last active
February 8, 2023 12:57
-
-
Save mironal/e907fa31c76adbd0b3868870a1422cc6 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 © 2019年 covelline. All rights reserved. | |
// | |
import Foundation | |
// make public if you needed. | |
private typealias LanguageCode = String | |
private struct Language { | |
let language: LanguageCode | |
let score: Float | |
} | |
extension Language: Codable {} | |
private struct Translation { | |
let text: String | |
let to: LanguageCode | |
} | |
extension Translation: Codable {} | |
private struct TranslateResult { | |
let detectedLanguage: Language? | |
let translations: [Translation] | |
} | |
extension TranslateResult: Codable {} | |
// https://docs.microsoft.com/en-us/azure/cognitive-services/translator/reference/v3-0-translate?tabs=curl | |
private func getToken(_ key: String, completion block: @escaping (Data?, URLResponse?, Error?) -> Void) { | |
var request = URLRequest(url: URL(string: "https://api.cognitive.microsoft.com/sts/v1.0/issueToken")!) | |
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) { | |
var c = URLComponents(string: "https://api.cognitive.microsofttranslator.com/translate") | |
c?.queryItems = [ | |
URLQueryItem(name: "api-version", value: "3.0"), | |
URLQueryItem(name: "to", value: lang) | |
] | |
guard let url = c?.url else { | |
return | |
} | |
var request = URLRequest(url: url) | |
request.httpMethod = "POST" | |
request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization") | |
request.addValue("application/json", forHTTPHeaderField: "Content-Type") | |
request.httpBody = """ | |
[{"Text":"\(text)"}] | |
""".data(using: .utf8) | |
let session = URLSession.shared | |
let task = session.dataTask(with: request, completionHandler: block) | |
task.resume() | |
} | |
private func extract(_ json: Data) throws -> String? { | |
let results = try JSONDecoder().decode([TranslateResult].self, from: json) | |
return results.first?.translations.first?.text | |
} | |
enum AzureMicrosoftTranslatorError: Error { | |
case tokenParseError | |
case textParseError | |
case apiKeyIsNotInitialized | |
} | |
@objcMembers | |
class AzureMicrosoftTranslator: NSObject { | |
static let sharedTranslator = AzureMicrosoftTranslator() | |
var key: String? | |
func translate(_ text: String, toLang lang: String, completion block: @escaping (String?, URLResponse?, Error?) -> Void) { | |
guard let key = key else { | |
block(nil, nil, AzureMicrosoftTranslatorError.apiKeyIsNotInitialized as NSError) | |
return | |
} | |
getToken(key) { (data, response, error) in | |
if let error = error { | |
block(nil, response, error) | |
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, translate: text, toLang: lang) { (data, response, error) in | |
if let error = error { | |
block(nil, response, error) | |
return | |
} | |
guard let data = data, | |
let result = try? extract(data) 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
support API v3 .
https://docs.microsoft.com/en-us/azure/cognitive-services/translator/reference/v3-0-translate?tabs=curl