加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – Xcode Localizable.string多个目标问题

发布时间:2020-12-14 19:42:08 所属栏目:百科 来源:网络整理
导读:我有一个包含多个目标的项目,它们代表相同的应用程序,只是具有不同的样式和翻译. 由于几乎整个项目对于每个目标看起来都是一样的,我需要在Localizable.strings文件中只有几个字符串,我需要不同.而且我不想将整个巨大的Localizable.strings文件复制到每个项目
我有一个包含多个目标的项目,它们代表相同的应用程序,只是具有不同的样式和翻译.

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

由于项目中包含第三方库/ SDK,因此我只需要1个字符串文件.所以我不能将tableName用于localizedString.

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

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

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

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

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

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

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

解决方法

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

请注意,目标可本地化文件的目标成员资格应仅设置为一个目标,但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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读