xcstrings #10

Merged
q.bandera merged 11 commits from xcstrings into master 2024-04-19 16:59:04 +02:00
6 changed files with 59 additions and 115 deletions
Showing only changes of commit fb2ddb2227 - Show all commits

View File

@ -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

View File

@ -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
}
}

View File

@ -163,6 +163,7 @@ class StringsFileGenerator {
section.definitions.forEach { definition in
var skipDefinition = false
var isNoTranslation = false
var localizationTab: [XCStringLocalization] = []
@ -170,7 +171,26 @@ class StringsFileGenerator {
skipDefinition = true
}
if definition.tags.contains(Stringium.noTranslationTag) {
isNoTranslation = true
}
if !skipDefinition {
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(
@ -182,6 +202,7 @@ class StringsFileGenerator {
localizationTab.append(localization)
}
}
let xcStringDefinition = XCStringDefinition(
title: definition.name,

View File

@ -53,6 +53,15 @@ struct Stringium: ParsableCommand {
tags: options.tags,
outputPath: options.stringsFileOutputPath,
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
} else {
print("[\(Self.toolName)] Will generate xcStrings")
StringsFileGenerator.writeXcStringsFiles(sections: sections,
langs: options.langs,
defaultLang: options.defaultLang,
tags: options.tags,
outputPath: options.stringsFileOutputPath,
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
}
// Generate extension
StringsFileGenerator.writeExtensionFiles(sections: sections,
@ -64,16 +73,6 @@ struct Stringium: ParsableCommand {
extensionFilePath: options.extensionFilePath,
extensionSuffix: options.extensionSuffix)
} else {
print("[\(Self.toolName)] Will generate xcStrings")
StringsFileGenerator.writeXcStringsFiles(sections: sections,
langs: options.langs,
defaultLang: options.defaultLang,
tags: options.tags,
outputPath: options.stringsFileOutputPath,
inputFilenameWithoutExt: options.inputFilenameWithoutExt)
}
print("[\(Self.toolName)] Strings generated")
}

View File

@ -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"
)
)
),