From 55944c4f936faa0f8db9eb89da16387afa10bf77 Mon Sep 17 00:00:00 2001 From: Wolfgang Lutz Date: Tue, 29 Oct 2024 10:35:37 +0100 Subject: [PATCH] improve for real usage --- .../ConvertStringCatalogToAndroidXML.swift | 41 +++++++++++-------- .../StringCatalog+Conversion.swift | 23 +++++++++-- .../StringCatalog+Languages.swift | 13 ++++++ .../Resources/SimpleTest/Output.de.xml | 2 - .../Resources/SimpleTest/Output.en.xml | 2 - 5 files changed, 57 insertions(+), 24 deletions(-) create mode 100644 Sources/StringCatalogConverterLibrary/StringCatalog+Languages.swift diff --git a/Sources/ConvertStringCatalogToAndroidXML/ConvertStringCatalogToAndroidXML.swift b/Sources/ConvertStringCatalogToAndroidXML/ConvertStringCatalogToAndroidXML.swift index 5815492..15ecd6a 100644 --- a/Sources/ConvertStringCatalogToAndroidXML/ConvertStringCatalogToAndroidXML.swift +++ b/Sources/ConvertStringCatalogToAndroidXML/ConvertStringCatalogToAndroidXML.swift @@ -8,8 +8,8 @@ struct ConvertStringCatalogToAndroidXML: ParsableCommand { @Option(help: "Specify the path to the xcstrings file") public var xcstringsPath: String - @Option(help: "Output language") - public var outputLanguage: String + @Option(help: "Base language") + public var baseLanguage: String @Option(help: "Output path for the generated Android XML file") public var outputPath: String @@ -19,20 +19,27 @@ struct ConvertStringCatalogToAndroidXML: ParsableCommand { print("Could not parse file at \(xcstringsPath)") throw ExitCode.failure } - - let outputLanguage = StringLanguage(rawValue: outputLanguage) - - let xmlDocument = catalog.converted(to: outputLanguage) - - let url = URL(fileURLWithPath: outputPath + "/values-\(outputLanguage.rawValue)/") - - try! FileManager.default.createDirectory(at: url, withIntermediateDirectories: true) - - try! xmlDocument.prettyPrinted - .write( - toFile: url.path() + "/strings.xml", - atomically: true, - encoding: .utf8 - ) + + let baseLanguage = StringLanguage(rawValue: baseLanguage) + + for outputLanguage in catalog.languages { + let xmlDocument = catalog.converted(to: outputLanguage) + + let url = (outputLanguage == baseLanguage) + ? URL(fileURLWithPath: outputPath + "/values/") + : URL(fileURLWithPath: outputPath + "/values-\(outputLanguage.rawValue)/") + + try! FileManager.default.createDirectory( + at: url, + withIntermediateDirectories: true + ) + + try! xmlDocument.prettyPrinted + .write( + toFile: url.path() + "/strings.xml", + atomically: true, + encoding: .utf8 + ) + } } } diff --git a/Sources/StringCatalogConverterLibrary/StringCatalog+Conversion.swift b/Sources/StringCatalogConverterLibrary/StringCatalog+Conversion.swift index 604153f..f92c303 100644 --- a/Sources/StringCatalogConverterLibrary/StringCatalog+Conversion.swift +++ b/Sources/StringCatalogConverterLibrary/StringCatalog+Conversion.swift @@ -2,21 +2,38 @@ import Foundation import StringCatalog extension StringCatalog { - public func converted(to language: StringLanguage) -> XMLDocument { + static func cleanupKeyForAndroid(_ key: String) -> String { + key + .replacingOccurrences(of: ".", with: "_") + .replacingOccurrences(of: "-", with: "_") + } + + static func cleanupValueForAndroid(_ value: String) -> String { + value + .replacingOccurrences(of: "'", with: "\\'") + } + + public func converted( + to language: StringLanguage + ) -> XMLDocument { let resources = XMLElement(name: "resources") for string in strings.sorted(by: { lhs, rhs in lhs.key < rhs.key }) { + guard let value = string.value.localizations![language]?.stringUnit?.value else { + continue + } + let element = XMLElement( - name: "string", stringValue: string.value.localizations![language]?.stringUnit?.value ?? "") + name: "string", stringValue: Self.cleanupValueForAndroid(value)) // TODO: implement plurals element.addAttribute( XMLNode.attribute( withName: "name", - stringValue: string.key.replacingOccurrences(of: ".", with: "_") + stringValue: Self.cleanupKeyForAndroid(string.key) ) as! XMLNode ) diff --git a/Sources/StringCatalogConverterLibrary/StringCatalog+Languages.swift b/Sources/StringCatalogConverterLibrary/StringCatalog+Languages.swift new file mode 100644 index 0000000..01ea69c --- /dev/null +++ b/Sources/StringCatalogConverterLibrary/StringCatalog+Languages.swift @@ -0,0 +1,13 @@ +import Foundation +import StringCatalog + +public extension StringCatalog { + var languages: Set { + Set( + strings.values + .map(\.localizations) + .compactMap(\.?.keys) + .flatMap{ $0 } + ) + } +} diff --git a/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.de.xml b/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.de.xml index 8a9e24e..1e89cb1 100644 --- a/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.de.xml +++ b/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.de.xml @@ -8,7 +8,6 @@ Bei der Anfrage ist ein Fehler aufgetreten. Fehler Ein unbekannter Fehler ist aufgetreten. - Ok E-Mail Account muss eingerichtet sein Fehler @@ -20,5 +19,4 @@ Collection Counter Einstellungen - diff --git a/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.en.xml b/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.en.xml index b6ae094..f5ca786 100644 --- a/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.en.xml +++ b/Tests/StringCatalogConverterLibraryTests/Resources/SimpleTest/Output.en.xml @@ -8,7 +8,6 @@ An error occurred during this request. Error An unknown error occurred. - Ok E-mail account must be set up Error @@ -20,5 +19,4 @@ Collection Counter Settings -