diff --git a/SampleFiles/Strings/Generated/String+StringPlaceholders.swift b/SampleFiles/Strings/Generated/String+StringPlaceholders.swift new file mode 100644 index 0000000..31c8470 --- /dev/null +++ b/SampleFiles/Strings/Generated/String+StringPlaceholders.swift @@ -0,0 +1,57 @@ +// Generated from Strings-Stringium at 2022-03-07 11:02:15 +0000 + +import UIKit + +fileprivate let kStringsFileName = "sampleStrings" + +extension String { + + // MARK: - Webservice + + /// Translation in en : + /// en + static var param_lang: String { + NSLocalizedString("param_lang", tableName: kStringsFileName, bundle: Bundle.main, value: "en", comment: "") + } + + // MARK: - Generic + + /// Translation in en : + /// Back + static var generic_back: String { + NSLocalizedString("generic_back", tableName: kStringsFileName, bundle: Bundle.main, value: "Back", comment: "") + } + + /// Translation in en : + /// Loading data... + static var generic_loading_data: String { + NSLocalizedString("generic_loading_data", tableName: kStringsFileName, bundle: Bundle.main, value: "Loading data...", comment: "") + } + + /// Translation in en : + /// Welcome \"%@\" ! + static var generic_welcome_firstname_format: String { + NSLocalizedString("generic_welcome_firstname_format", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "") + } + + /// Translation in en : + /// Welcome \"%@\" ! + static func generic_welcome_firstname_format(arg0: String) -> String { + String(format: Self.generic_welcome_firstname_format, arg0) + } + + // MARK: - Placeholders + + /// Translation in en : + /// You %%: %2$@ %1$@ Age: %3$d + static var placeholders_test_one: String { + NSLocalizedString("placeholders_test_one", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "") + } + + /// Translation in en : + /// You %%: %2$@ %1$@ Age: %3$d + static func placeholders_test_one(arg0: String, arg1: String, arg2: Int) -> String { + String(format: Self.placeholders_test_one, arg0, arg1, arg2) + } + +} \ No newline at end of file diff --git a/SampleFiles/Strings/Generated/StringTest+StringPlaceholders.swift b/SampleFiles/Strings/Generated/StringTest+StringPlaceholders.swift new file mode 100644 index 0000000..327d76d --- /dev/null +++ b/SampleFiles/Strings/Generated/StringTest+StringPlaceholders.swift @@ -0,0 +1,57 @@ +// Generated from Strings-Stringium at 2022-03-07 11:00:52 +0000 + +import UIKit + +fileprivate let kStringsFileName = "sampleStrings" + +extension StringTest { + + // MARK: - Webservice + + /// Translation in en : + /// en + var param_lang: String { + NSLocalizedString("param_lang", tableName: kStringsFileName, bundle: Bundle.main, value: "en", comment: "") + } + + // MARK: - Generic + + /// Translation in en : + /// Back + var generic_back: String { + NSLocalizedString("generic_back", tableName: kStringsFileName, bundle: Bundle.main, value: "Back", comment: "") + } + + /// Translation in en : + /// Loading data... + var generic_loading_data: String { + NSLocalizedString("generic_loading_data", tableName: kStringsFileName, bundle: Bundle.main, value: "Loading data...", comment: "") + } + + /// Translation in en : + /// Welcome \"%@\" ! + var generic_welcome_firstname_format: String { + NSLocalizedString("generic_welcome_firstname_format", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "") + } + + /// Translation in en : + /// Welcome \"%@\" ! + func generic_welcome_firstname_format(arg0: String) -> String { + String(format: self.generic_welcome_firstname_format, arg0) + } + + // MARK: - Placeholders + + /// Translation in en : + /// You %%: %2$@ %1$@ Age: %3$d + var placeholders_test_one: String { + NSLocalizedString("placeholders_test_one", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "") + } + + /// Translation in en : + /// You %%: %2$@ %1$@ Age: %3$d + func placeholders_test_one(arg0: String, arg1: String, arg2: Int) -> String { + String(format: self.placeholders_test_one, arg0, arg1, arg2) + } + +} \ No newline at end of file diff --git a/SampleFiles/Strings/Generated/en-us.lproj/sampleStrings.strings b/SampleFiles/Strings/Generated/en-us.lproj/sampleStrings.strings index 6277aac..809b631 100644 --- a/SampleFiles/Strings/Generated/en-us.lproj/sampleStrings.strings +++ b/SampleFiles/Strings/Generated/en-us.lproj/sampleStrings.strings @@ -6,14 +6,19 @@ /********** Webservice **********/ -"param_lang" = "en-us" +"param_lang" = "en-us"; /********** Generic **********/ -"generic_back" = "Back" +"generic_back" = "Back"; -"generic_loading_data" = "Loading data..." +"generic_loading_data" = "Loading data..."; -"generic_welcome_firstname_format" = "Welcome \"%@\" !" +"generic_welcome_firstname_format" = "Welcome \"%@\" !"; + + +/********** Placeholders **********/ + +"placeholders_test_one" = "You %%: %2$@ %1$@ Age: %3$d"; diff --git a/SampleFiles/Strings/Generated/en.lproj/sampleStrings.strings b/SampleFiles/Strings/Generated/en.lproj/sampleStrings.strings index 06a479e..6c41173 100644 --- a/SampleFiles/Strings/Generated/en.lproj/sampleStrings.strings +++ b/SampleFiles/Strings/Generated/en.lproj/sampleStrings.strings @@ -6,14 +6,19 @@ /********** Webservice **********/ -"param_lang" = "en" +"param_lang" = "en"; /********** Generic **********/ -"generic_back" = "Back" +"generic_back" = "Back"; -"generic_loading_data" = "Loading data..." +"generic_loading_data" = "Loading data..."; -"generic_welcome_firstname_format" = "Welcome \"%@\" !" +"generic_welcome_firstname_format" = "Welcome \"%@\" !"; + + +/********** Placeholders **********/ + +"placeholders_test_one" = "You %%: %2$@ %1$@ Age: %3$d"; diff --git a/SampleFiles/Strings/Generated/fr.lproj/sampleStrings.strings b/SampleFiles/Strings/Generated/fr.lproj/sampleStrings.strings index ad5e541..3e8399f 100644 --- a/SampleFiles/Strings/Generated/fr.lproj/sampleStrings.strings +++ b/SampleFiles/Strings/Generated/fr.lproj/sampleStrings.strings @@ -6,14 +6,19 @@ /********** Webservice **********/ -"param_lang" = "fr" +"param_lang" = "fr"; /********** Generic **********/ -"generic_back" = "Retour" +"generic_back" = "Retour"; -"generic_loading_data" = "Chargement des données..." +"generic_loading_data" = "Chargement des données..."; -"generic_welcome_firstname_format" = "Bienvenue \"%@\" !" +"generic_welcome_firstname_format" = "Bienvenue \"%@\" !"; + + +/********** Placeholders **********/ + +"placeholders_test_one" = "Vous %%: %1$@ %2$@ Age: %3$d"; diff --git a/SampleFiles/Strings/sampleStrings.txt b/SampleFiles/Strings/sampleStrings.txt index bfcb217..820b663 100644 --- a/SampleFiles/Strings/sampleStrings.txt +++ b/SampleFiles/Strings/sampleStrings.txt @@ -25,3 +25,11 @@ comments = fr = Bienvenue "%@" ! en-us = Welcome "%@" ! + +[[Placeholders]] + [placeholders_test_one] + en = You %%: %2$@ %1$@ Age: %3$d + tags = droid,ios + comments = + fr = Vous %%: %1$@ %2$@ Age: %3$d + en-us = You %%: %2$@ %1$@ Age: %3$d diff --git a/Sources/Strings/Model/Definition.swift b/Sources/Strings/Model/Definition.swift index e5fd0e4..2eca192 100644 --- a/Sources/Strings/Model/Definition.swift +++ b/Sources/Strings/Model/Definition.swift @@ -38,20 +38,89 @@ class Definition { // MARK: - + private func getStringParameters(input: String) -> (inputParameters: [String], translationArguments: [String])? { + var methodsParameters = [String]() + + let printfPlaceholderRegex = try! NSRegularExpression(pattern: "%(?:\\d+\\$)?[+-]?(?:[ 0]|'.{1})?-?\\d*(?:\\.\\d+)?[blcdeEufFgGosxX@]*") + printfPlaceholderRegex.enumerateMatches(in: input, options: [], range: NSRange(location: 0, length: input.count)) { match, _, stop in + guard let match = match else { return } + + if let range = Range(match.range, in: input), let last = input[range].last { + debugPrint("Found: \(input[range])") + switch last { + case "d", "u": + methodsParameters.append("Int") + case "f", "F": + methodsParameters.append("Double") + case "@", "s", "c": + methodsParameters.append("String") + case "%": + // if you need to print %, you have to add %% + break + default: + break + } + } + } + + if methodsParameters.isEmpty { + return nil + } + + var inputParameters = [String]() + var translationArguments = [String]() + for (index, paramType) in methodsParameters.enumerated() { + let paramName = "arg\(index)" + translationArguments.append(paramName) + inputParameters.append("\(paramName): \(paramType)") + } + + return (inputParameters: inputParameters, translationArguments: translationArguments) + } + + private func getBaseProperty(lang: String, translation: String, isStatic: Bool) -> String { + """ + /// Translation in \(lang) : + /// \(translation) + \(isStatic ? "static ": "")var \(name): String { + NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "") + } + """ + } + + private func getBaseMethod(lang: String, translation: String, isStatic: Bool, inputParameters: [String], translationArguments: [String]) -> String { + """ + + + /// Translation in \(lang) : + /// \(translation) + \(isStatic ? "static ": "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String { + String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", "))) + } + """ + } + func getNSLocalizedStringProperty(forLang lang: String) -> String { guard let translation = translations[lang] else { let error = StringiumError.langNotDefined(lang, name, reference != nil) print(error.localizedDescription) Stringium.exit(withError: error) } + + // Generate property + let property = getBaseProperty(lang: lang, translation: translation, isStatic: false) - return """ - /// Translation in \(lang) : - /// \(translation) - var \(name): String { - NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "") - } - """ + // Generate method + var method = "" + if let parameters = self.getStringParameters(input: translation) { + method = getBaseMethod(lang: lang, + translation: translation, + isStatic: false, + inputParameters: parameters.inputParameters, + translationArguments: parameters.translationArguments) + } + + return property + method } func getNSLocalizedStringStaticProperty(forLang lang: String) -> String { @@ -61,13 +130,20 @@ class Definition { Stringium.exit(withError: error) } - return """ - /// Translation in \(lang) : - /// \(translation) - static var \(name): String { - NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "") - } - """ + // Generate property + let property = getBaseProperty(lang: lang, translation: translation, isStatic: true) + + // Generate method + var method = "" + if let parameters = self.getStringParameters(input: translation) { + method = getBaseMethod(lang: lang, + translation: translation, + isStatic: true, + inputParameters: parameters.inputParameters, + translationArguments: parameters.translationArguments) + } + + return property + method } // MARK: - Raw strings