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