From 97b93a933fc545f890acdab14e69cc01e5e2ea92 Mon Sep 17 00:00:00 2001 From: Benjamin Erhart Date: Thu, 1 Jun 2017 17:39:36 +0200 Subject: [PATCH 1/3] Replaced "Languages" enum with String containing standard locale identifiers, because it just breaks localization for languages, the original author didn't think of and for languages with region codes. (e.g. ar-* which doesn't have a non-region-code-version) --- .../xcshareddata/xcschemes/Example.xcscheme | 2 +- Example/Example/AppDelegate.swift | 8 +-- Localize.xcodeproj/project.pbxproj | 10 +-- .../xcshareddata/xcschemes/Localize.xcscheme | 2 +- .../xcschemes/LocalizeTests.xcscheme | 2 +- Source/Languages.swift | 72 ------------------- Source/Localize.swift | 11 +-- Source/LocalizeCommonProtocol.swift | 26 +++---- Source/LocalizeJson.swift | 15 ++-- Source/LocalizeProtocol.swift | 11 ++- Source/LocalizeStatic.swift | 11 +-- Source/LocalizeStrings.swift | 4 +- Tests/BaseTest.swift | 2 +- Tests/BaseTestInSpanish.swift | 2 +- Tests/JsonChanginFileName.swift | 2 +- Tests/OtherLangTest.swift | 2 +- Tests/ReadingOtherFiles.swift | 6 +- Tests/StringBaseTest.swift | 2 +- Tests/StringBaseTestInSpanish.swift | 2 +- Tests/StringsChanginDefaultFileName.swift | 2 +- 20 files changed, 47 insertions(+), 147 deletions(-) delete mode 100644 Source/Languages.swift diff --git a/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme index 5ab4f47..bbb24aa 100644 --- a/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme +++ b/Example/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme @@ -1,6 +1,6 @@ Void { + /// Update default language, this stores a language key which can be retrieved the next time + public func update(language: String) -> Void { self.provider.update(language: language) } - /// Update default languaje, this store a language key and retrive the next time - public func update(language string:String) -> Void { - self.provider.update(language: string) - } - /// Update base file name, searched in path. public func update(fileName:String) { self.provider.update(fileName: fileName) @@ -127,7 +122,7 @@ public class Localize: NSObject { } /// Update default language - public func update(defaultLanguage: Languages) { + public func update(defaultLanguage: String) { self.provider.update(defaultLanguage: defaultLanguage) } diff --git a/Source/LocalizeCommonProtocol.swift b/Source/LocalizeCommonProtocol.swift index e4b2183..3176889 100644 --- a/Source/LocalizeCommonProtocol.swift +++ b/Source/LocalizeCommonProtocol.swift @@ -22,15 +22,15 @@ class LocalizeCommonProtocol: NSObject { /// Default language, if this can't find a key in your current language /// Try read key in default language - public var defaultLanguage: Languages = .english + public var defaultLanguage: String = "en" /// Determinate if your interface localization is based on LocalizeInterface public var localizableInterface: LocalizeInterface = .boot /// Storaged language or default language in device - public var currentLanguage: Languages { + public var currentLanguage: String { get { - return Languages(rawValue: self.language())! + return self.language() } } @@ -65,24 +65,16 @@ class LocalizeCommonProtocol: NSObject { // MARK: Public methods - /// Update default languaje, this store a language key and retrive the next time - public func update(language:Languages) -> Void { + /// Update default language, this stores a language key which can be retrieved the next time + public func update(language: String) -> Void { let defaults = UserDefaults.standard - defaults.setValue(language.rawValue, forKey: LocalizeStorageKey) + defaults.setValue(language, forKey: LocalizeStorageKey) defaults.synchronize() NotificationCenter.default.post(name: Notification.Name(rawValue: LocalizeChangeNotification), object: nil) } - /// Update default languaje, this store a language key and retrive the next time - public func update(language string:String) -> Void { - guard let language = Languages(rawValue: string) else { - return - } - return self.update(language: language) - } - /// Update default language - public func update(defaultLanguage: Languages) { + public func update(defaultLanguage: String) { self.defaultLanguage = defaultLanguage } @@ -97,7 +89,7 @@ class LocalizeCommonProtocol: NSObject { /// /// - return: String form language code in current user language public func displayNameForLanguage(_ language: String) -> String { - let locale : NSLocale = NSLocale(localeIdentifier: self.currentLanguage.rawValue) + let locale : NSLocale = NSLocale(localeIdentifier: self.currentLanguage) if let name = locale.displayName(forKey: NSLocale.Key.identifier, value: language) { return name.capitalized } @@ -118,7 +110,7 @@ class LocalizeCommonProtocol: NSObject { if let lang = defaults.string(forKey: LocalizeStorageKey) { return lang } - return Locale.preferredLanguages[0].components(separatedBy: "-")[0] + return Locale.preferredLanguages[0] } /// Update base file name, searched in path. diff --git a/Source/LocalizeJson.swift b/Source/LocalizeJson.swift index 1a4e675..df804eb 100644 --- a/Source/LocalizeJson.swift +++ b/Source/LocalizeJson.swift @@ -22,10 +22,10 @@ class LocalizeJson: LocalizeCommonProtocol, LocalizeProtocol { /// As long as the default language is the same as the current one. private func readJSON(tableName:String? = nil) -> NSDictionary? { let tableName = tableName ?? self.fileName - let lang = self.currentLanguage.rawValue + let lang = self.currentLanguage var json = self.readJSON(named: "\(tableName)-\(lang)") - if json == nil && lang != self.defaultLanguage.rawValue { + if json == nil && lang != self.defaultLanguage { json = self.readDefaultJSON() } @@ -37,7 +37,7 @@ class LocalizeJson: LocalizeCommonProtocol, LocalizeProtocol { /// - returns: json or nil value. private func readDefaultJSON(tableName:String? = nil) -> NSDictionary? { let tableName = tableName ?? self.fileName - return self.readJSON(named: "\(tableName)-\(self.defaultLanguage.rawValue)") + return self.readJSON(named: "\(tableName)-\(self.defaultLanguage)") } /// This method has path where file is @@ -124,16 +124,17 @@ class LocalizeJson: LocalizeCommonProtocol, LocalizeProtocol { // MARK: Config methods - /// Show all aviable languajes whit criteria name + /// Show all aviable languages with criteria name /// /// - returns: list with storaged languages code public func availableLanguages() -> [String] { var languages : [String] = [] - for language in iterateEnum(Languages.self) { - let name = "\(self.fileName)-\(language.rawValue)" + + for localeId in NSLocale.availableLocaleIdentifiers { + let name = "\(self.fileName)-\(localeId)" let path = self.bundle().path(forResource: name, ofType: "json") if path != nil { - languages.append(language.rawValue) + languages.append(localeId) } } return languages diff --git a/Source/LocalizeProtocol.swift b/Source/LocalizeProtocol.swift index d09fbd9..059507f 100644 --- a/Source/LocalizeProtocol.swift +++ b/Source/LocalizeProtocol.swift @@ -14,7 +14,7 @@ protocol LocalizeProtocol { /// Default language, if this can't find a key in your current language /// Try read key in default language - var defaultLanguage: Languages {get set} + var defaultLanguage: String {get set} /// MARK: Localize Methos @@ -61,11 +61,8 @@ protocol LocalizeProtocol { /// - returns: current used language func language() -> String - /// Update default languaje, this store a language key and retrive the next time - func update(language:Languages) -> Void - - /// Update default languaje, this store a language key and retrive the next time - func update(language string:String) -> Void + /// Update default language, this stores a language key which can be retrieved the next time + func update(language: String) -> Void /// Update base file name, searched in path. func update(fileName:String) @@ -74,7 +71,7 @@ protocol LocalizeProtocol { func update(bundle: Bundle) /// Update default language - func update(defaultLanguage: Languages) + func update(defaultLanguage: String) /// This remove the language key storaged. func resetLanguage() -> Void diff --git a/Source/LocalizeStatic.swift b/Source/LocalizeStatic.swift index 19bf4e5..a2082ae 100644 --- a/Source/LocalizeStatic.swift +++ b/Source/LocalizeStatic.swift @@ -56,13 +56,8 @@ extension Localize { return Localize.shared.language() } - /// Update default languaje, this store a language key and retrive the next time - public static func update(language:Languages) { - return Localize.shared.update(language: language) - } - - /// Update default languaje, this store a language key and retrive the next time - public static func update(language string:String) { + /// Update default language, this stores a language key which can be retrieved the next time + public static func update(language: String) { return Localize.shared.update(language: string) } @@ -77,7 +72,7 @@ extension Localize { } /// Update default language - public static func update(defaultLanguage: Languages) { + public static func update(defaultLanguage: String) { return Localize.shared.update(defaultLanguage: defaultLanguage) } diff --git a/Source/LocalizeStrings.swift b/Source/LocalizeStrings.swift index 08bdaa5..ed4e97d 100644 --- a/Source/LocalizeStrings.swift +++ b/Source/LocalizeStrings.swift @@ -25,14 +25,14 @@ class LocalizeStrings:LocalizeCommonProtocol, LocalizeProtocol { /// - returns: localized key or same text public override func localize(key:String, tableName:String? = nil) -> String { let tableName = tableName ?? self.fileName - if let path = self.bundle().path(forResource: self.currentLanguage.rawValue, ofType: "lproj") { + if let path = self.bundle().path(forResource: self.currentLanguage, ofType: "lproj") { let bundle = Bundle(path: path)! let localized = bundle.localizedString(forKey: key, value: nil, table: tableName) if localized != key { return localized } } - if let path = self.bundle().path(forResource: self.defaultLanguage.rawValue, ofType: "lproj") { + if let path = self.bundle().path(forResource: self.defaultLanguage, ofType: "lproj") { let bundle = Bundle(path: path)! return bundle.localizedString(forKey: key, value: nil, table: tableName) } diff --git a/Tests/BaseTest.swift b/Tests/BaseTest.swift index 2f2aa26..0372363 100644 --- a/Tests/BaseTest.swift +++ b/Tests/BaseTest.swift @@ -14,7 +14,7 @@ class BaseTest: XCTestCase { super.setUp() Localize.update(provider: .json) Localize.testingMode() - Localize.update(language: .english) + Localize.update(language: "en") } func testLocalizeKey() { diff --git a/Tests/BaseTestInSpanish.swift b/Tests/BaseTestInSpanish.swift index 3b57bb2..1c2e5b1 100644 --- a/Tests/BaseTestInSpanish.swift +++ b/Tests/BaseTestInSpanish.swift @@ -14,7 +14,7 @@ class BaseTestInSpanish: XCTestCase { super.setUp() Localize.update(provider: .json) Localize.testingMode() - Localize.update(language: .spanish) + Localize.update(language: "es") } func testLocalizeKey() { diff --git a/Tests/JsonChanginFileName.swift b/Tests/JsonChanginFileName.swift index 0f85fdc..ad5beec 100644 --- a/Tests/JsonChanginFileName.swift +++ b/Tests/JsonChanginFileName.swift @@ -13,7 +13,7 @@ class JsonChanginFileName: XCTestCase { override func setUp() { super.setUp() Localize.update(provider: .json) - Localize.update(language: .spanish) + Localize.update(language: "es") Localize.update(fileName: "lang") Localize.testingMode() } diff --git a/Tests/OtherLangTest.swift b/Tests/OtherLangTest.swift index 6711ccc..814ed3c 100644 --- a/Tests/OtherLangTest.swift +++ b/Tests/OtherLangTest.swift @@ -14,7 +14,7 @@ class OtherLangTest: XCTestCase { super.setUp() Localize.update(provider: .json) Localize.testingMode() - Localize.update(language: .italian) + Localize.update(language: "it") } func testLocalizeKey() { diff --git a/Tests/ReadingOtherFiles.swift b/Tests/ReadingOtherFiles.swift index 9e1d42b..baa3ec1 100644 --- a/Tests/ReadingOtherFiles.swift +++ b/Tests/ReadingOtherFiles.swift @@ -17,7 +17,7 @@ class ReadingOtherFiles: XCTestCase { func testOtherEnglish() { Localize.testingMode() - Localize.update(language: .english) + Localize.update(language: "en") Localize.update(fileName: "other") let result = "hello".localize() XCTAssert(result == "Hello world!") @@ -25,7 +25,7 @@ class ReadingOtherFiles: XCTestCase { func testSomeItalian() { Localize.testingMode() - Localize.update(language: .italian) + Localize.update(language: "it") Localize.update(fileName: "some") let result = "hello".localize() XCTAssert(result == "Ciao mondo!") @@ -33,7 +33,7 @@ class ReadingOtherFiles: XCTestCase { func testFileGerman() { Localize.testingMode() - Localize.update(language: .german) + Localize.update(language: "de") Localize.update(fileName: "file") let result = "hello".localize() XCTAssert(result == "Hallo Welt!") diff --git a/Tests/StringBaseTest.swift b/Tests/StringBaseTest.swift index 4466d1e..eecd8c7 100644 --- a/Tests/StringBaseTest.swift +++ b/Tests/StringBaseTest.swift @@ -14,7 +14,7 @@ class StringBaseTest: XCTestCase { super.setUp() Localize.update(provider: .strings) Localize.testingMode() - Localize.update(language: .english) + Localize.update(language: "en") } func testLocalizeKey() { diff --git a/Tests/StringBaseTestInSpanish.swift b/Tests/StringBaseTestInSpanish.swift index 9e06fae..4cd6afc 100644 --- a/Tests/StringBaseTestInSpanish.swift +++ b/Tests/StringBaseTestInSpanish.swift @@ -14,7 +14,7 @@ class StringBaseTestInSpanish: XCTestCase { super.setUp() Localize.update(provider: .strings) Localize.testingMode() - Localize.update(language: .spanish) + Localize.update(language: "es") } func testLocalizeKey() { diff --git a/Tests/StringsChanginDefaultFileName.swift b/Tests/StringsChanginDefaultFileName.swift index 85f69d0..9508e9c 100644 --- a/Tests/StringsChanginDefaultFileName.swift +++ b/Tests/StringsChanginDefaultFileName.swift @@ -13,7 +13,7 @@ class StringsChanginDefaultFileName: XCTestCase { override func setUp() { super.setUp() Localize.update(provider: .strings) - Localize.update(language: .english) + Localize.update(language: "en") Localize.update(fileName: "Other") Localize.testingMode() } From e3670927c1892d085d64b106404a0ead51ddfce8 Mon Sep 17 00:00:00 2001 From: Benjamin Erhart Date: Thu, 1 Jun 2017 17:44:48 +0200 Subject: [PATCH 2/3] Fixed stupid bug, which happened because I changed stuff after testing. --- Source/LocalizeStatic.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/LocalizeStatic.swift b/Source/LocalizeStatic.swift index a2082ae..6fd330d 100644 --- a/Source/LocalizeStatic.swift +++ b/Source/LocalizeStatic.swift @@ -58,7 +58,7 @@ extension Localize { /// Update default language, this stores a language key which can be retrieved the next time public static func update(language: String) { - return Localize.shared.update(language: string) + return Localize.shared.update(language: language) } /// Update base file name, searched in path. From c45d994cae9b3b75db488b5a5302b7273520a12b Mon Sep 17 00:00:00 2001 From: Benjamin Erhart Date: Fri, 2 Jun 2017 18:17:20 +0200 Subject: [PATCH 3/3] Fixed #localize with placeholder replacement, when the key is not provided in the current language. --- Source/LocalizeCommonProtocol.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Source/LocalizeCommonProtocol.swift b/Source/LocalizeCommonProtocol.swift index 3176889..454a624 100644 --- a/Source/LocalizeCommonProtocol.swift +++ b/Source/LocalizeCommonProtocol.swift @@ -143,9 +143,7 @@ class LocalizeCommonProtocol: NSObject { /// - returns: localized key or same text public func localize(key:String, replace:String, tableName:String? = nil) -> String { let string = self.localize(key: key, tableName:tableName) - if string == key { - return key - } + return string.replacingOccurrences(of: "%", with: replace) }