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 */ diff --git a/Sources/XcodeGenKit/PBXProjGenerator.swift b/Sources/XcodeGenKit/PBXProjGenerator.swift index 4f200341..f28f2ca4 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 @@ -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,52 +592,26 @@ 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)) } } // 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 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: 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 +622,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) } }