From e24c0e29c77ee6d33a8f0aede3892b8c6664a11f Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 10:33:10 +0900 Subject: [PATCH 1/4] Refactor localized file references generation - Use getFileReference() to generate localized file references - Add name parameter to getFileReference --- Sources/XcodeGenKit/PBXProjGenerator.swift | 25 ++++++---------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4f200341..c7ce20fc 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -484,11 +484,11 @@ public class PBXProjGenerator { return nil } - func getFileReference(path: Path, inPath: Path) -> String { + func getFileReference(path: Path, inPath: Path, name: String? = nil) -> String { if let fileReference = fileReferencesByPath[path] { return fileReference } else { - let fileReference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), sourceTree: .group, path: path.byRemovingBase(path: inPath).string) + let fileReference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), sourceTree: .group, name: name, path: path.byRemovingBase(path: inPath).string) addObject(fileReference) fileReferencesByPath[path] = fileReference.reference return fileReference.reference @@ -604,25 +604,12 @@ public class PBXProjGenerator { // add references to localised resources into base localisation variant groups for localisedDirectory in localisedDirectories { let localisationName = localisedDirectory.lastComponentWithoutExtension - for path in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { - let filePath = "\(localisedDirectory.lastComponent)/\(path.lastComponent)" - + for filePath in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { // find base localisation variant group - let name = path.lastComponentWithoutExtension + let name = filePath.lastComponentWithoutExtension let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == name } - let fileReference: String - if let cachedFileReference = fileReferencesByPath[path] { - fileReference = cachedFileReference - } else { - let reference = PBXFileReference(reference: generateUUID(PBXFileReference.self, path.lastComponent), - sourceTree: .group, - name: variantGroup != nil ? localisationName : path.lastComponent, - path: filePath) - addObject(reference) - fileReference = reference.reference - fileReferencesByPath[path] = fileReference - } + let fileReference = getFileReference(path: filePath, inPath: path, name: variantGroup != nil ? localisationName : filePath.lastComponent) if let variantGroup = variantGroup { if !variantGroup.children.contains(fileReference) { @@ -633,7 +620,7 @@ public class PBXProjGenerator { let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, fileReference), fileRef: fileReference, settings: nil) - allSourceFiles.append(SourceFile(path: path, fileReference: fileReference, buildFile: buildFile)) + allSourceFiles.append(SourceFile(path: filePath, fileReference: fileReference, buildFile: buildFile)) groupChildren.append(fileReference) } } From ce27af06471ba1b220fbc6b4126ba97be8868daf Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 10:51:48 +0900 Subject: [PATCH 2/4] Refactor variant group generation - Add getVariantGroup() in the same manner as getFileReference() --- Sources/XcodeGenKit/PBXProjGenerator.swift | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index c7ce20fc..8438aa1b 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -540,6 +540,21 @@ public class PBXProjGenerator { ) } + func getVariantGroup(path: Path, inPath: Path) -> PBXVariantGroup { + let variantGroup: PBXVariantGroup + if let cachedGroup = variantGroupsByPath[path] { + variantGroup = cachedGroup + } else { + variantGroup = PBXVariantGroup(reference: generateUUID(PBXVariantGroup.self, path.byRemovingBase(path: inPath).string), + children: [], + name: path.lastComponent, + sourceTree: .group) + addObject(variantGroup) + variantGroupsByPath[path] = variantGroup + } + return variantGroup + } + func getSources(sourceMetadata source: Source, path: Path, depth: Int = 0) throws -> (sourceFiles: [SourceFile], groups: [PBXGroup]) { // if we have a file, move it to children and use the parent as the path let (children, path) = path.isFile ? @@ -577,27 +592,13 @@ public class PBXProjGenerator { // create variant groups of the base localisation first var baseLocalisationVariantGroups: [PBXVariantGroup] = [] if let baseLocalisedDirectory = localisedDirectories.first(where: { $0.lastComponent == "Base.lproj" }) { - for path in try baseLocalisedDirectory.children() { - let filePath = "\(baseLocalisedDirectory.lastComponent)/\(path.lastComponent)" - - let variantGroup: PBXVariantGroup - if let cachedGroup = variantGroupsByPath[path] { - variantGroup = cachedGroup - } else { - variantGroup = PBXVariantGroup(reference: generateUUID(PBXVariantGroup.self, filePath), - children: [], - name: path.lastComponent, - sourceTree: .group) - variantGroupsByPath[path] = variantGroup - - addObject(variantGroup) - groupChildren.append(variantGroup.reference) - } - + for filePath in try baseLocalisedDirectory.children() { + let variantGroup = getVariantGroup(path: filePath, inPath: path) + groupChildren.append(variantGroup.reference) baseLocalisationVariantGroups.append(variantGroup) let buildFile = PBXBuildFile(reference: generateUUID(PBXBuildFile.self, variantGroup.reference), fileRef: variantGroup.reference, settings: nil) - allSourceFiles.append(SourceFile(path: path, fileReference: variantGroup.reference, buildFile: buildFile)) + allSourceFiles.append(SourceFile(path: filePath, fileReference: variantGroup.reference, buildFile: buildFile)) } } From 66a2893dd0e8d762583d1aff45c5c074cf81e366 Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 11:41:13 +0900 Subject: [PATCH 3/4] Fix localized files with same name #122 --- Sources/XcodeGenKit/PBXProjGenerator.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 8438aa1b..f28f2ca4 100644 --- a/Sources/XcodeGenKit/PBXProjGenerator.swift +++ b/Sources/XcodeGenKit/PBXProjGenerator.swift @@ -607,8 +607,9 @@ public class PBXProjGenerator { let localisationName = localisedDirectory.lastComponentWithoutExtension for filePath in try localisedDirectory.children().sorted { $0.lastComponent < $1.lastComponent } { // find base localisation variant group - let name = filePath.lastComponentWithoutExtension - let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == name } + // ex: Foo.strings will be added to Foo.strings or Foo.storyboard variant group + let variantGroup = baseLocalisationVariantGroups.first { Path($0.name!).lastComponent == filePath.lastComponent } ?? + baseLocalisationVariantGroups.first { Path($0.name!).lastComponentWithoutExtension == filePath.lastComponentWithoutExtension } let fileReference = getFileReference(path: filePath, inPath: path, name: variantGroup != nil ? localisationName : filePath.lastComponent) From 7eb4e92f0089ff7cb9e2711bdba43572ea028eda Mon Sep 17 00:00:00 2001 From: ryohey Date: Fri, 3 Nov 2017 12:31:35 +0900 Subject: [PATCH 4/4] Add stringsdict file to TestProject --- .../App_iOS/Base.lproj/Localizable.strings | 7 +++++ .../Base.lproj/Localizable.stringsdict | 30 +++++++++++++++++++ .../App_iOS/en.lproj/Localizable.strings | 7 +++++ .../App_iOS/en.lproj/Localizable.stringsdict | 30 +++++++++++++++++++ .../Project.xcodeproj/project.pbxproj | 28 +++++++++++++++++ 5 files changed, 102 insertions(+) create mode 100644 Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings create mode 100644 Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict create mode 100644 Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings create mode 100644 Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict diff --git a/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings new file mode 100644 index 00000000..84643cdc --- /dev/null +++ b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + Project + + Created by ryohey on 2017/11/03. + +*/ diff --git a/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict new file mode 100644 index 00000000..458f0f3e --- /dev/null +++ b/Fixtures/TestProject/App_iOS/Base.lproj/Localizable.stringsdict @@ -0,0 +1,30 @@ + + + + + StringKey + + NSStringLocalizedFormatKey + %#@VARIABLE@ + Variable + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + + zero + + one + + two + + few + + many + + other + + + + + diff --git a/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings new file mode 100644 index 00000000..84643cdc --- /dev/null +++ b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.strings @@ -0,0 +1,7 @@ +/* + Localizable.strings + Project + + Created by ryohey on 2017/11/03. + +*/ diff --git a/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict new file mode 100644 index 00000000..458f0f3e --- /dev/null +++ b/Fixtures/TestProject/App_iOS/en.lproj/Localizable.stringsdict @@ -0,0 +1,30 @@ + + + + + StringKey + + NSStringLocalizedFormatKey + %#@VARIABLE@ + Variable + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + + zero + + one + + two + + few + + many + + other + + + + + diff --git a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj index f33166ae..58f30bd5 100644 --- a/Fixtures/TestProject/Project.xcodeproj/project.pbxproj +++ b/Fixtures/TestProject/Project.xcodeproj/project.pbxproj @@ -18,10 +18,12 @@ BF3008399601 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072503 /* Alamofire.framework */; }; BF3154421201 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FR5980633301 /* Assets.xcassets */; settings = {COMPILER_FLAGS = "-Werror"; }; }; BF3314441201 = {isa = PBXBuildFile; fileRef = FR5251191201 /* Framework_macOS.framework */; }; + BF3371332801 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = VG5506161801 /* Localizable.strings */; }; BF3515549501 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549502 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549503 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF3515549504 /* MyFramework.h in Headers */ = {isa = PBXBuildFile; fileRef = FR7740960501 /* MyFramework.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF4414242001 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = VG1597538701 /* Localizable.stringsdict */; }; BF4530793601 /* Framework_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR4722960401 /* Framework_iOS.framework */; }; BF5539436901 = {isa = PBXBuildFile; fileRef = FR6623158301 /* Framework_tvOS.framework */; }; BF6380159901 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FR3032072502 /* Alamofire.framework */; }; @@ -77,6 +79,8 @@ FR3032072503 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3032072504 /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Alamofire.framework; sourceTree = ""; }; FR3546283901 /* base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = base.xcconfig; sourceTree = ""; }; + FR3899172901 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; + FR3899172902 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; FR4387045301 /* Framework_watchOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_watchOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FR4722960401 /* Framework_iOS.framework */ = {isa = PBXFileReference; explicitFileType = framework; includeInIndex = 0; lastKnownFileType = wrapper.framework; path = Framework_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FR4822987701 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LocalizedStoryboard.storyboard; sourceTree = ""; }; @@ -92,6 +96,8 @@ FR7831228901 /* App_iOS_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = xctest; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = App_iOS_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; FR8182352201 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/LocalizedStoryboard.strings; sourceTree = ""; }; FR8252321101 /* App_iOS.app */ = {isa = PBXFileReference; explicitFileType = app; includeInIndex = 0; lastKnownFileType = wrapper.application; path = App_iOS.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FR9612050601 /* Base */ = {isa = PBXFileReference; name = Base; path = Base.lproj/Localizable.stringsdict; sourceTree = ""; }; + FR9612050602 /* en */ = {isa = PBXFileReference; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -242,6 +248,8 @@ FR1345298501 /* Info.plist */, FR6218091901 /* ViewController.swift */, VG2858723001 /* LaunchScreen.storyboard */, + VG5506161801 /* Localizable.strings */, + VG1597538701 /* Localizable.stringsdict */, VG3182922801 /* LocalizedStoryboard.storyboard */, VG2043127501 /* Main.storyboard */, ); @@ -495,6 +503,8 @@ files = ( BF3154421201 /* Assets.xcassets in Resources */, BF2445564001 /* LaunchScreen.storyboard in Resources */, + BF3371332801 /* Localizable.strings in Resources */, + BF4414242001 /* Localizable.stringsdict in Resources */, BF2513089601 /* LocalizedStoryboard.storyboard in Resources */, BF2250910101 /* Main.storyboard in Resources */, ); @@ -665,6 +675,15 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + VG1597538701 /* Localizable.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + FR9612050601 /* Base */, + FR9612050602 /* en */, + ); + name = Localizable.stringsdict; + sourceTree = ""; + }; VG2043127501 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -690,6 +709,15 @@ name = LocalizedStoryboard.storyboard; sourceTree = ""; }; + VG5506161801 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + FR3899172901 /* Base */, + FR3899172902 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */