diff --git a/Polyglot/Polyglot.swift b/Polyglot/Polyglot.swift
index 159f1a1..828d3c5 100644
--- a/Polyglot/Polyglot.swift
+++ b/Polyglot/Polyglot.swift
@@ -117,15 +117,15 @@ public enum Language: String {
/**
Responsible for translating text.
*/
-public class Polyglot {
+open class Polyglot {
let session: Session
/// The language to be translated from. It will automatically detect the language if you do not set this.
- public var fromLanguage: Language?
+ open var fromLanguage: Language?
/// The language to translate to.
- public var toLanguage: Language
+ open var toLanguage: Language
/**
@@ -143,7 +143,7 @@ public class Polyglot {
- parameter text: The text to translate.
- parameter callback: The code to be executed once the translation has completed.
*/
- public func translate(text: String, callback: ((translation: String) -> (Void))) {
+ open func translate(_ text: String, callback: @escaping ((_ translation: String) -> (Void))) {
session.getAccessToken { token in
if self.fromLanguage == nil {
self.fromLanguage = text.language
@@ -152,15 +152,15 @@ public class Polyglot {
let fromLanguageComponent = (self.fromLanguage != nil) ? "&from=\(self.fromLanguage!.rawValue.urlEncoded!)" : ""
let urlString = "http://api.microsofttranslator.com/v2/Http.svc/Translate?text=\(text.urlEncoded!)\(toLanguageComponent)\(fromLanguageComponent)"
- let request = NSMutableURLRequest(URL: NSURL(string: urlString)!)
- request.HTTPMethod = "GET"
+ var request = URLRequest(url: URL(string: urlString)!)
+ request.httpMethod = "GET"
request.setValue("Bearer " + token, forHTTPHeaderField: "Authorization")
- let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, error) in
+ let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) in
let translation: String
guard
let data = data,
- let xmlString = NSString(data: data, encoding: NSUTF8StringEncoding) as? String
+ let xmlString = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as? String
else {
translation = ""
return
@@ -169,17 +169,17 @@ public class Polyglot {
translation = self.translationFromXML(xmlString)
defer {
- dispatch_async(dispatch_get_main_queue()) {
- callback(translation: translation)
+ DispatchQueue.main.async {
+ callback(translation)
}
}
- }
+ })
task.resume()
}
}
- private func translationFromXML(XML: String) -> String {
- let translation = XML.stringByReplacingOccurrencesOfString("", withString: "")
- return translation.stringByReplacingOccurrencesOfString("", withString: "")
+ fileprivate func translationFromXML(_ XML: String) -> String {
+ let translation = XML.replacingOccurrences(of: "", with: "")
+ return translation.replacingOccurrences(of: "", with: "")
}
}
diff --git a/Polyglot/Session.swift b/Polyglot/Session.swift
index d54b45a..01a1fd6 100644
--- a/Polyglot/Session.swift
+++ b/Polyglot/Session.swift
@@ -28,47 +28,47 @@ class Session {
let clientSecret: String
var accessToken: String?
- var expirationTime: NSDate?
+ var expirationTime: Date?
init(clientId: String, clientSecret: String) {
self.clientId = clientId
self.clientSecret = clientSecret
}
- func getAccessToken(callback: ((token: String) -> (Void))) {
+ func getAccessToken(_ callback: @escaping ((_ token: String) -> (Void))) {
if (accessToken == nil || isExpired) {
- let url = NSURL(string: "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13")
+ let url = URL(string: "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13")
- let request = NSMutableURLRequest(URL: url!)
- request.HTTPMethod = "POST"
+ var request = URLRequest(url: url!)
+ request.httpMethod = "POST"
let bodyString = "client_id=\(clientId.urlEncoded!)&client_secret=\(clientSecret.urlEncoded!)&scope=http://api.microsofttranslator.com&grant_type=client_credentials"
- request.HTTPBody = bodyString.dataUsingEncoding(NSUTF8StringEncoding)
+ request.httpBody = bodyString.data(using: String.Encoding.utf8)
- let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {(data, response, error) in
+ let task = URLSession.shared.dataTask(with: request, completionHandler: {(data, response, error) in
guard
let data = data,
- let resultsDict = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers),
- let expiresIn = resultsDict["expires_in"] as? NSString
+ let resultsDict = try? JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String: Any],
+ let expiresIn = resultsDict?["expires_in"] as? NSString
else {
- callback(token: "")
+ callback("")
return
}
- self.expirationTime = NSDate(timeIntervalSinceNow: expiresIn.doubleValue)
+ self.expirationTime = Date(timeIntervalSinceNow: expiresIn.doubleValue)
- let token = resultsDict["access_token"] as! String
+ let token = resultsDict?["access_token"] as! String
self.accessToken = token
- callback(token: token)
- }
+ callback(token)
+ })
task.resume()
} else {
- callback(token: accessToken!)
+ callback(accessToken!)
}
}
- private var isExpired: Bool {
- return expirationTime?.earlierDate(NSDate()) == self.expirationTime
+ fileprivate var isExpired: Bool {
+ return (expirationTime as NSDate?)?.earlierDate(Date()) == self.expirationTime
}
}
diff --git a/Polyglot/StringExtension.swift b/Polyglot/StringExtension.swift
index bfe1830..fbd6424 100644
--- a/Polyglot/StringExtension.swift
+++ b/Polyglot/StringExtension.swift
@@ -25,16 +25,16 @@ import Foundation
extension String {
public var urlEncoded: String? {
- let urlQueryAllowedCharacterSet: NSMutableCharacterSet = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet
- urlQueryAllowedCharacterSet.removeCharactersInString("&=?+")
- return self.stringByAddingPercentEncodingWithAllowedCharacters(urlQueryAllowedCharacterSet)
+ let urlQueryAllowedCharacterSet: NSMutableCharacterSet = (CharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as! NSMutableCharacterSet
+ urlQueryAllowedCharacterSet.removeCharacters(in: "&=?+")
+ return self.addingPercentEncoding(withAllowedCharacters: urlQueryAllowedCharacterSet as CharacterSet)
}
public var language: Language? {
if characters.count > 0 { // Prevent Index Out of Bounds in NSLinguisticTagger
let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagSchemeLanguage], options: 0)
tagger.string = self
- if let result = tagger.tagAtIndex(0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil) {
+ if let result = tagger.tag(at: 0, scheme: NSLinguisticTagSchemeLanguage, tokenRange: nil, sentenceRange: nil) {
return Language(rawValue: result)
}
}
diff --git a/PolyglotTests/StringExtensionTests.swift b/PolyglotTests/StringExtensionTests.swift
index 3616a46..a77892e 100644
--- a/PolyglotTests/StringExtensionTests.swift
+++ b/PolyglotTests/StringExtensionTests.swift
@@ -39,7 +39,7 @@ class StringExtensionTests: XCTestCase {
XCTAssertNil("".language?.rawValue, "Empty strings should return nil.")
}
- func AssertEqualOptional(@autoclosure optional: () -> T?, @autoclosure _ expected: () -> T, file: String = __FILE__, line: UInt = __LINE__) {
+ func AssertEqualOptional(@autoclosure optional: () -> T?, @autoclosure _ expected: () -> T, file: String = #file, line: UInt = #line) {
if let nonOptional = optional() {
if nonOptional != expected() {
self.recordFailureWithDescription("Optional (\(nonOptional)) is not equal to (\(expected()))", inFile: file, atLine: line, expected: true)