Xcode Localizable.string多个目标问题

时间:2017-07-24 11:53:53

标签: ios xcode localization localizable.strings

我有一个包含多个目标的项目,它们代表同一个应用程序,只是具有不同的样式和翻译。

由于几乎整个项目对于每个目标看起来都是一样的,我需要在Localizable.strings文件中只有几个字符串,我需要有所不同。而且我不想将整个巨大的Localizable.strings文件复制到每个项目中,因为它的行数很少。

由于项目中包含的第三方库/ SDK,我只需要1个字符串文件。所以我无法将tableName用于localizedString

问题是 - 我需要有一种灵活的可能性,可以分别从Localizable.strings覆盖每个目标的几行。而且我不喜欢将整个文件复制到每个目标的想法,因为它将导致将来烦人的流量,如果我将有10个目标,我需要为所有目标添加1个字符串。

目标是包含所有字符串的1个巨大Localizable.strings文件,这对所有目标都是通用的,并且对于应该告诉不同的字符串的每个目标都有小的配置。因此,目标文件应该合并并覆盖常见的文件。

AFAIK它本身不受Xcode的支持,所以我可能正在寻找一个可以使它运行的脚本。

因此,脚本应该查看common和target的Localizable文件,合并它们,如果两者都定义了一些键,那么它应该使用目标文件中的那个。

任何人都可以帮我这样的剧本吗?

P.S。类似的问题与.xcassets存在,并且CocoaPods通过将多个资产合并为1来解决它,并且它按预期工作 - 如果某些目标的资产包含已包含在公共资产中的同名图像,则目标中的那个将取代它。

P.S.2。 Android开发人员本身也支持类似的功能 - 每个图像,每个翻译都可以被“子”瑕疵或其他任何名称所覆盖:)

2 个答案:

答案 0 :(得分:2)

TL; DR:

示例项目:https://github.com/JakubMazur/SO45279964

好的,更容易做的就是shell / python脚本,因为它适用于每个构建服务器。我假设你对每个目标有不同的方案(否则没有意义)。所以你能做的是:

假设您的目标名为:

  • Target1时
  • TARGET2
  • target3

1)创建单独的文件包含应该不同的所有字符串(我将它放在Localizable目录下。

您的Localizable.strings文件可能如下所示:

"someGeneralString" = "General string 1";
"AppName" = "This is a string that you probably need to change";
"someOtherGeneralString" = "General string 2";

您的任何targetX.strings文件可能如下所示:

"AppName" = "target[x]"

以下是项目中的样子:

enter image description here

请注意,您的target可本地化文件的目标成员资格应仅设置为一个目标,但Localizable.strings应适用于所有目标!

这就是项目配置的全部内容。我们去编写脚本(我将使用python):

#!/usr/bin/python

import sys

supportedLanguages = ["en","pl"]
commonPath = ".lproj/Localizable.strings"
keys = ["AppName"]

    class CopyLocalizable():

        target = ""

        def __init__(self,arg):
            self.target = arg
            self.perform()

        def perform(self):
            for lang in supportedLanguages:
                pathToLocalizable = lang+commonPath
                textToFile = ""
                with open(pathToLocalizable,"r") as languageFile:          
                    for line in languageFile.readlines():
                        for key in keys:
                            if key in line:
                                textToFile += self.foundAndReplace(key,lang)
                            else:
                                textToFile += line
                self.saveInFile(pathToLocalizable,textToFile)


        def foundAndReplace(self,key,lang):
            pathToTargetFile = "Localizable/"+lang+".lproj/"+self.target+".strings"
            with open(pathToTargetFile,"r") as targetFile:
                for targetLine in targetFile.readlines():
                    if key in targetLine:
                        return targetLine

        def saveInFile(self,file,stringToSave):
            with open(file,"w+") as languageFile:
                languageFile.write(stringToSave)

您可以自己优化它。我可以考虑更容易完成工作。

最后让我们自动化一下:   - 去你的目标   - 添加新的构建阶段   - 添加新脚本:

export PATH="/usr/local/bin:$PATH"
cd SO45279964/
python localize.py target[x]

观看魔术发生;)

http://www.giphy.com/gifs/26n6NKgiwYvuQk7WU

在这里,您可以找到我为运行此示例而创建的示例项目: https://github.com/JakubMazur/SO45279964

答案 1 :(得分:0)

为了简单起见,请在Build Settings&amp ;;中为每个目标定义一个宏。在宏部分中定义目标特定字符串,如

#ifdef __TARGET__
//key values in localizable file
#endif