xcstrings #10
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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")
|
||||
}
|
||||
|
||||
|
@ -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"
|
||||
)
|
||||
)
|
||||
),
|
||||
|
Loading…
x
Reference in New Issue
Block a user