我有一个包含多个目标的项目,它们代表同一个应用程序,只是具有不同的样式和翻译。
由于几乎整个项目对于每个目标看起来都是一样的,我需要在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开发人员本身也支持类似的功能 - 每个图像,每个翻译都可以被“子”瑕疵或其他任何名称所覆盖:)
答案 0 :(得分:2)
好的,更容易做的就是shell / python脚本,因为它适用于每个构建服务器。我假设你对每个目标有不同的方案(否则没有意义)。所以你能做的是:
假设您的目标名为:
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]"
以下是项目中的样子:
请注意,您的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