xcstrings #10

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

View File

@ -166,7 +166,8 @@ class StringsFileGenerator {
} }
if !skipDefinition { if !skipDefinition {
for (lang, value) in definition.translations { for (lang, value) in definition.translations where !value.isEmpty {
let localization = XCStringLocalization( let localization = XCStringLocalization(
lang: lang, lang: lang,
content: XCStringLocalizationLangContent( content: XCStringLocalizationLangContent(
@ -180,6 +181,7 @@ class StringsFileGenerator {
let xcStringDefinition = XCStringDefinition( let xcStringDefinition = XCStringDefinition(
title: definition.name, title: definition.name,
content: XCStringDefinitionContent( content: XCStringDefinitionContent(
comment: definition.comment,
extractionState: "manual", extractionState: "manual",
localizations: XCStringLocalizationContainer( localizations: XCStringLocalizationContainer(
localizations: localizationTab localizations: localizationTab

View File

@ -50,8 +50,15 @@ struct XCStringDefinition: Codable, Equatable {
} }
struct XCStringDefinitionContent: Codable, Equatable { struct XCStringDefinitionContent: Codable, Equatable {
let comment: String?
let extractionState: String let extractionState: String
var localizations: XCStringLocalizationContainer var localizations: XCStringLocalizationContainer
init(comment: String? = nil, extractionState: String, localizations: XCStringLocalizationContainer) {
self.comment = comment
self.extractionState = extractionState
self.localizations = localizations
}
} }
struct XCStringLocalizationContainer: Codable, Equatable { struct XCStringLocalizationContainer: Codable, Equatable {

View File

@ -460,7 +460,7 @@ final class StringsFileGeneratorTests: XCTestCase {
"en": "Section One - Definition One"], "en": "Section One - Definition One"],
tags: ["ios","iosonly"]), tags: ["ios","iosonly"]),
getDefinition(name: "s1_def_two", getDefinition(name: "s1_def_two",
translations: ["fr": "Section Un - Definition Deux", translations: ["fr": "",
"en": "Section One - Definition Two"], "en": "Section One - Definition Two"],
tags: ["ios","iosonly"]) tags: ["ios","iosonly"])
] ]
@ -472,7 +472,8 @@ final class StringsFileGeneratorTests: XCTestCase {
"en": "Section Two - Definition One"], "en": "Section Two - Definition One"],
tags: ["ios","iosonly"]), tags: ["ios","iosonly"]),
getDefinition(name: "s2_def_two", getDefinition(name: "s2_def_two",
translations: ["fr": "Section Deux - Definition Deux"], translations: ["fr": "Section Deux - Definition Deux",
"en": "Section Two - Definition Two"],
tags: ["notranslation"]) tags: ["notranslation"])
] ]
@ -486,19 +487,19 @@ final class StringsFileGeneratorTests: XCTestCase {
// [[section_one]] // [[section_one]]
// [s1_def_one] // [s1_def_one]
// fr = Section Un - Definition Un // fr =
// en = Section One - Definition One // en = Section One - Definition One
// tags = ios,iosonly // tags = ios,iosonly
// comments = // comments =
// [s1_def_two] // [s1_def_two]
// fr = Section Un - Definition Deux // fr =
// en = Section One - Definition Two // en = Section One - Definition Two
// tags = ios,iosonly // tags = ios,iosonly
// comments = // comments =
// //
// [[section_two] // [[section_two]
// [s2_def_one] // [s2_def_one]
// fr = Section Deux - Definition Un // fr =
// en = Section Two - Definition One // en = Section Two - Definition One
// tags = ios,iosonly // tags = ios,iosonly
// comments = // comments =
@ -517,6 +518,276 @@ final class StringsFileGeneratorTests: XCTestCase {
XCStringDefinition( XCStringDefinition(
title: "s1_def_one", title: "s1_def_one",
content: XCStringDefinitionContent( content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: [
XCStringLocalization(
lang: "en",
content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit(
state: "translated",
value: "Section One - Definition One"
)
)
)
]
)
)
),
XCStringDefinition(
title: "s1_def_two",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: [
XCStringLocalization(
lang: "en",
content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit(
state: "translated",
value: "Section One - Definition Two"
)
)
)
]
)
)
),
XCStringDefinition(
title: "s2_def_one",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: [
XCStringLocalization(
lang: "en",
content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit(
state: "translated",
value: "Section Two - Definition One"
)
)
)
]
)
)
),
XCStringDefinition(
title: "s2_def_two",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: [
XCStringLocalization(
lang: "en",
content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit(
state: "translated",
value: "Section Two - Definition Two"
)
)
),
XCStringLocalization(
lang: "fr",
content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit(
state: "translated",
value: "Section Deux - Definition Deux"
)
)
)
]
)
)
)
]
),
version: "1.0"
)
XCTAssertEqual(rootObject, expect)
}
func testGenerateXcStringsRootObjectWithNoTranslations() {
// Given
let sectionOne = Section(name: "section_one")
sectionOne.definitions = [
getDefinition(name: "s1_def_one",
translations: ["fr": "",
"en": ""],
tags: ["ios","iosonly"]),
getDefinition(name: "s1_def_two",
translations: ["fr": "",
"en": ""],
tags: ["ios","iosonly"])
]
let sectionTwo = Section(name: "section_two")
sectionTwo.definitions = [
getDefinition(name: "s2_def_one",
translations: ["fr": "",
"en": ""],
tags: ["ios","iosonly"]),
getDefinition(name: "s2_def_two",
translations: ["fr": "",
"en": ""],
tags: ["notranslation"])
]
// When
let rootObject = StringsFileGenerator.generateRootObject(
langs: ["fr", "en"],
defaultLang: "en",
tags: ["ios", "iosonly", "notranslation"],
sections: [sectionOne, sectionTwo]
)
// [[section_one]]
// [s1_def_one]
// fr =
// en =
// tags = ios,iosonly
// comments =
// [s1_def_two]
// fr =
// en =
// tags = ios,iosonly
// comments =
//
// [[section_two]
// [s2_def_one]
// fr =
// en =
// tags = ios,iosonly
// comments =
// [s2_def_two]
// fr =
// en =
// tags = ios,iosonly
// comments =
// Expect
let expect =
Root(
sourceLanguage: "en",
strings: XCStringDefinitionContainer(
strings: [
XCStringDefinition(
title: "s1_def_one",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: []
)
)
),
XCStringDefinition(
title: "s1_def_two",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: []
)
)
),
XCStringDefinition(
title: "s2_def_one",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: []
)
)
),
XCStringDefinition(
title: "s2_def_two",
content: XCStringDefinitionContent(
extractionState: "manual",
localizations: XCStringLocalizationContainer(
localizations: []
)
)
)
]
),
version: "1.0"
)
XCTAssertEqual(rootObject, expect)
}
func testGenerateXcStringsRootObjectWithComments() {
// Given
// [[section_one]]
// [s1_def_one]
// fr = Section Un - Definition Un
// en = Section One - Definition One
// tags = ios,iosonly
// comments = Comment 1
// [s1_def_two]
// fr = Section Un - Definition Deux
// en = Section One - Definition Two
// tags = ios,iosonly
// comments = Comment 2
//
// [[section_two]
// [s2_def_one]
// fr = Section Deux - Definition Un
// en = Section Two - Definition One
// tags = ios,iosonly
// comments =
// [s2_def_two]
// fr = Section Deux - Definition deux
// en = Section Two - Definition Two
// tags = ios,iosonly
// comments =
let sectionOne = Section(name: "section_one")
sectionOne.definitions = [
getDefinition(name: "s1_def_one",
translations: ["fr": "Section Un - Definition Un",
"en": "Section One - Definition One"],
tags: ["ios","iosonly"],
comment: "Comment 1"),
getDefinition(name: "s1_def_two",
translations: ["fr": "Section Un - Definition Deux",
"en": "Section One - Definition Two"],
tags: ["ios","iosonly"],
comment: "Comment 2")
]
let sectionTwo = Section(name: "section_two")
sectionTwo.definitions = [
getDefinition(name: "s2_def_one",
translations: ["fr": "Section Deux - Definition Un",
"en": "Section Two - Definition One"],
tags: ["ios","iosonly"]),
getDefinition(name: "s2_def_two",
translations: ["fr": "Section Deux - Definition Deux",
"en": "Section Two - Definition Two"],
tags: ["notranslation"])
]
// When
let rootObject = StringsFileGenerator.generateRootObject(
langs: ["fr", "en"],
defaultLang: "en",
tags: ["ios", "iosonly", "notranslation"],
sections: [sectionOne, sectionTwo]
)
// Expect
let expect =
Root(
sourceLanguage: "en",
strings: XCStringDefinitionContainer(
strings: [
XCStringDefinition(
title: "s1_def_one",
content: XCStringDefinitionContent(
comment: "Comment 1",
extractionState: "manual", extractionState: "manual",
localizations: XCStringLocalizationContainer( localizations: XCStringLocalizationContainer(
localizations: [ localizations: [
@ -545,6 +816,7 @@ final class StringsFileGeneratorTests: XCTestCase {
XCStringDefinition( XCStringDefinition(
title: "s1_def_two", title: "s1_def_two",
content: XCStringDefinitionContent( content: XCStringDefinitionContent(
comment: "Comment 2",
extractionState: "manual", extractionState: "manual",
localizations: XCStringLocalizationContainer( localizations: XCStringLocalizationContainer(
localizations: [ localizations: [
@ -590,7 +862,7 @@ final class StringsFileGeneratorTests: XCTestCase {
content: XCStringLocalizationLangContent( content: XCStringLocalizationLangContent(
stringUnit: DefaultStringUnit( stringUnit: DefaultStringUnit(
state: "translated", state: "translated",
value: "Section Two - Definition Un" value: "Section Deux - Definition Un"
) )
) )
) )
@ -707,7 +979,6 @@ final class StringsFileGeneratorTests: XCTestCase {
// "version" : "1.0" // "version" : "1.0"
// } // }
// """ // """
XCTAssertEqual(rootObject, expect) XCTAssertEqual(rootObject, expect)
} }