From fb2ddb2227120d63e61b792a391a08e2015d9de3 Mon Sep 17 00:00:00 2001 From: Quentin Bandera Date: Wed, 17 Apr 2024 09:44:09 +0200 Subject: [PATCH] =?UTF-8?q?DEVTOOLS-181=20G=C3=A9rer=20le=20tag=20noTransl?= =?UTF-8?q?ation=20pour=20les=20xcstrings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ResgenSwift/Generate/GenerateError.swift | 6 +- .../Parser/ConfigurationFileParser.swift | 11 ++- .../Generator/StringsFileGenerator.swift | 35 +++++-- .../Strings/Stringium/Stringium.swift | 21 ++-- .../Colors/ParsedColorTests.swift | 2 +- .../Strings/StringsFileGeneratorTests.swift | 99 ++----------------- 6 files changed, 59 insertions(+), 115 deletions(-) diff --git a/Sources/ResgenSwift/Generate/GenerateError.swift b/Sources/ResgenSwift/Generate/GenerateError.swift index 2ebc045..03c3c16 100644 --- a/Sources/ResgenSwift/Generate/GenerateError.swift +++ b/Sources/ResgenSwift/Generate/GenerateError.swift @@ -9,7 +9,7 @@ import Foundation enum GenerateError: Error { case fileNotExists(String) - case invalidConfigurationFile(String) + case invalidConfigurationFile(String, String) case commandError([String], String) case writeFile(String, String) @@ -18,8 +18,8 @@ enum GenerateError: Error { case .fileNotExists(let filename): return "error: [\(Generate.toolName)] File \(filename) does not exists" - case .invalidConfigurationFile(let filename): - return "error: [\(Generate.toolName)] File \(filename) is not a valid configuration file" + case .invalidConfigurationFile(let filename, let underneathErrorDescription): + return "error: [\(Generate.toolName)] File \(filename) is not a valid configuration file. Underneath error: \(underneathErrorDescription)" case .commandError(let command, let terminationStatus): let readableCommand = command diff --git a/Sources/ResgenSwift/Generate/Parser/ConfigurationFileParser.swift b/Sources/ResgenSwift/Generate/Parser/ConfigurationFileParser.swift index 0b0c885..4b61d31 100644 --- a/Sources/ResgenSwift/Generate/Parser/ConfigurationFileParser.swift +++ b/Sources/ResgenSwift/Generate/Parser/ConfigurationFileParser.swift @@ -16,12 +16,15 @@ class ConfigurationFileParser { Generate.exit(withError: error) } - guard let configuration = try? YAMLDecoder().decode(ConfigurationFile.self, from: data) else { - let error = GenerateError.invalidConfigurationFile(configurationFile) + do { + return try YAMLDecoder().decode(ConfigurationFile.self, from: data) + } catch { + let error = GenerateError.invalidConfigurationFile( + configurationFile, + error.localizedDescription.description + ) print(error.description) Generate.exit(withError: error) } - - return configuration } } diff --git a/Sources/ResgenSwift/Strings/Generator/StringsFileGenerator.swift b/Sources/ResgenSwift/Strings/Generator/StringsFileGenerator.swift index cba1761..ce26ffb 100644 --- a/Sources/ResgenSwift/Strings/Generator/StringsFileGenerator.swift +++ b/Sources/ResgenSwift/Strings/Generator/StringsFileGenerator.swift @@ -163,6 +163,7 @@ class StringsFileGenerator { section.definitions.forEach { definition in var skipDefinition = false + var isNoTranslation = false var localizationTab: [XCStringLocalization] = [] @@ -170,17 +171,37 @@ class StringsFileGenerator { skipDefinition = true } + if definition.tags.contains(Stringium.noTranslationTag) { + isNoTranslation = true + } + if !skipDefinition { - for (lang, value) in definition.translations where !value.isEmpty { + if isNoTranslation { + // Search for langs in yaml + for lang in langs { + if let value = definition.translations[defaultLang], !value.isEmpty { + let localization = XCStringLocalization( + lang: lang, + content: XCStringLocalizationLangContent( + stringUnit: DefaultStringUnit(state: "translated", value: value) + ) + ) + localizationTab.append(localization) + } + } + } else { + // Search for langs in twine + for (lang, value) in definition.translations where !value.isEmpty { - let localization = XCStringLocalization( - lang: lang, - content: XCStringLocalizationLangContent( - stringUnit: DefaultStringUnit(state: "translated", value: value) + let localization = XCStringLocalization( + lang: lang, + content: XCStringLocalizationLangContent( + stringUnit: DefaultStringUnit(state: "translated", value: value) + ) ) - ) - localizationTab.append(localization) + localizationTab.append(localization) + } } let xcStringDefinition = XCStringDefinition( diff --git a/Sources/ResgenSwift/Strings/Stringium/Stringium.swift b/Sources/ResgenSwift/Strings/Stringium/Stringium.swift index 5ac0ecf..a27ebfe 100644 --- a/Sources/ResgenSwift/Strings/Stringium/Stringium.swift +++ b/Sources/ResgenSwift/Strings/Stringium/Stringium.swift @@ -53,17 +53,6 @@ struct Stringium: ParsableCommand { tags: options.tags, outputPath: options.stringsFileOutputPath, inputFilenameWithoutExt: options.inputFilenameWithoutExt) - - // Generate extension - StringsFileGenerator.writeExtensionFiles(sections: sections, - defaultLang: options.defaultLang, - tags: options.tags, - staticVar: options.staticMembers, - inputFilename: options.inputFilenameWithoutExt, - extensionName: options.extensionName, - extensionFilePath: options.extensionFilePath, - extensionSuffix: options.extensionSuffix) - } else { print("[\(Self.toolName)] Will generate xcStrings") StringsFileGenerator.writeXcStringsFiles(sections: sections, @@ -74,6 +63,16 @@ struct Stringium: ParsableCommand { inputFilenameWithoutExt: options.inputFilenameWithoutExt) } + // Generate extension + StringsFileGenerator.writeExtensionFiles(sections: sections, + defaultLang: options.defaultLang, + tags: options.tags, + staticVar: options.staticMembers, + inputFilename: options.inputFilenameWithoutExt, + extensionName: options.extensionName, + extensionFilePath: options.extensionFilePath, + extensionSuffix: options.extensionSuffix) + print("[\(Self.toolName)] Strings generated") } diff --git a/Tests/ResgenSwiftTests/Colors/ParsedColorTests.swift b/Tests/ResgenSwiftTests/Colors/ParsedColorTests.swift index cd9e45e..c0620cf 100644 --- a/Tests/ResgenSwiftTests/Colors/ParsedColorTests.swift +++ b/Tests/ResgenSwiftTests/Colors/ParsedColorTests.swift @@ -91,7 +91,7 @@ final class ParsedColorTests: XCTestCase { // When let contentJson = color.contentsJSON() guard let data = contentJson.data(using: .utf8), - let parsedJson = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else { + let parsedJson = try? JSONSerialization.jsonObject(with: data) as? [String: Any] else { XCTFail("Cannot convert `contentJSON` string to Data") return } diff --git a/Tests/ResgenSwiftTests/Strings/StringsFileGeneratorTests.swift b/Tests/ResgenSwiftTests/Strings/StringsFileGeneratorTests.swift index 3520710..dec6627 100644 --- a/Tests/ResgenSwiftTests/Strings/StringsFileGeneratorTests.swift +++ b/Tests/ResgenSwiftTests/Strings/StringsFileGeneratorTests.swift @@ -213,7 +213,7 @@ final class StringsFileGeneratorTests: XCTestCase { // [s2_def_two] // fr = Section Deux - Definition deux // en = Section Two - Definition Two - // tags = ios,iosonly + // tags = notranslation // comments = @@ -359,7 +359,7 @@ final class StringsFileGeneratorTests: XCTestCase { content: XCStringLocalizationLangContent( stringUnit: DefaultStringUnit( state: "translated", - value: "Section Deux - Definition Deux" + value: "Section Two - Definition Two" ) ) ) @@ -372,82 +372,6 @@ final class StringsFileGeneratorTests: XCTestCase { version: "1.0" ) - // """ - // { - // "sourceLanguage" : "en", - // "strings" : { - // "s1_def_one" : { - // "extractionState" : "manual", - // "localizations" : { - // "en" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section One - Definition One" - // } - // }, - // "fr" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Un - Definition Un" - // } - // } - // } - // }, - // "s1_def_two" : { - // "extractionState" : "manual", - // "localizations" : { - // "en" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section One - Definition Two" - // } - // }, - // "fr" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Un - Definition Deux" - // } - // } - // } - // }, - // "s2_def_one" : { - // "extractionState" : "manual", - // "localizations" : { - // "en" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Two - Definition One" - // } - // }, - // "fr" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Deux - Definition Une" - // } - // } - // } - // }, - // "s2_def_two" : { - // "extractionState" : "manual", - // "localizations" : { - // "en" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Two - Definition Two" - // } - // }, - // "fr" : { - // "stringUnit" : { - // "state" : "translated", - // "value" : "Section Deux - Definition Deux" - // } - // } - // } - // } - // }, - // "version" : "1.0" - // } - // """ XCTAssertEqual(rootObject, expect) } @@ -472,8 +396,7 @@ final class StringsFileGeneratorTests: XCTestCase { "en": "Section Two - Definition One"], tags: ["ios","iosonly"]), getDefinition(name: "s2_def_two", - translations: ["fr": "Section Deux - Definition Deux", - "en": "Section Two - Definition Two"], + translations: ["en": "Section Two - Definition Two"], tags: ["notranslation"]) ] @@ -504,9 +427,8 @@ final class StringsFileGeneratorTests: XCTestCase { // tags = ios,iosonly // comments = // [s2_def_two] - // fr = Section Deux - Definition deux // en = Section Two - Definition Two - // tags = ios,iosonly + // tags = notranslation // comments = // Expect @@ -592,7 +514,7 @@ final class StringsFileGeneratorTests: XCTestCase { content: XCStringLocalizationLangContent( stringUnit: DefaultStringUnit( state: "translated", - value: "Section Deux - Definition Deux" + value: "Section Two - Definition Two" ) ) ) @@ -740,7 +662,7 @@ final class StringsFileGeneratorTests: XCTestCase { // [s2_def_two] // fr = Section Deux - Definition deux // en = Section Two - Definition Two - // tags = ios,iosonly + // tags = notranslation // comments = @@ -765,15 +687,14 @@ final class StringsFileGeneratorTests: XCTestCase { "en": "Section Two - Definition One"], tags: ["ios","iosonly"]), getDefinition(name: "s2_def_two", - translations: ["fr": "Section Deux - Definition Deux", - "en": "Section Two - Definition Two"], + translations: ["fr": "Section Deux - Definition Deux"], tags: ["notranslation"]) ] // When let rootObject = StringsFileGenerator.generateRootObject( langs: ["fr", "en"], - defaultLang: "en", + defaultLang: "fr", tags: ["ios", "iosonly", "notranslation"], sections: [sectionOne, sectionTwo] ) @@ -781,7 +702,7 @@ final class StringsFileGeneratorTests: XCTestCase { // Expect let expect = Root( - sourceLanguage: "en", + sourceLanguage: "fr", strings: XCStringDefinitionContainer( strings: [ XCStringDefinition( @@ -881,7 +802,7 @@ final class StringsFileGeneratorTests: XCTestCase { content: XCStringLocalizationLangContent( stringUnit: DefaultStringUnit( state: "translated", - value: "Section Two - Definition Two" + value: "Section Deux - Definition Deux" ) ) ),