如何通过 Fastlane 脚本添加 Xcode 本地化语言

Posted

技术标签:

【中文标题】如何通过 Fastlane 脚本添加 Xcode 本地化语言【英文标题】:How to add a Xcode localization language via Fastlane script 【发布时间】:2018-03-14 18:00:27 【问题描述】:

我有一个包含多个应用程序目标的项目,并且需要能够将现有的英文本地化字符串文件添加到其中一个目标中,仅供开发使用。

这是我的场景:

    目标 A 使用英语 + 多个非英语本地化字符串文件。 目标 B 仅使用 1 个非英语本地化字符串文件。 App Store 版本中不能包含目标 B 的英文字符串。

但是,为了在开发过程中提供帮助,我们目前手动将英文字符串添加到 Target B 的本地化文件中(在出现提示时使用 Target A 中的现有文件),并在提交 App Store 之前将其删除。

由于我们已经运行了 Fastlane 设置/拆卸脚本,我想自动从脚本中添加/删除英文字符串,这样我们就不必每次都手动进行。

在 Fastfile 中,我知道如何将文件添加到目标 B,但由于 Xcode 中本地化文件/引用的结构与常规文件略有不同,我不确定正确的做法是什么。

这是我目前所拥有的:

def add_english_localization()
    require 'xcodeproj'

    project = Xcodeproj::Project.open("../Code/#XCODE_PROJ")

    app_target = project.targets.first #Target B
    english_file_ref = project.main_group.new_file('../Code/TargetA/Application/Supporting Files/en.lproj') #Existing english file in Target A's directory
    app_target.add_file_references([english_file_ref]) #This adds the file but doesn't properly update Xcode's Localization references...?

    project.save
  end

截图:

【问题讨论】:

您也许可以使用Xcodeproj 来做到这一点,尽管我不知道怎么做。我知道检查这些会在您的 project.pbxproj 文件中添加一些行。 【参考方案1】:

这是一个小小的 ruby​​ 脚本,使用 xcodeproj 删除和添加本地化:

删除语言(本例中为法语):

require 'xcodeproj'
project_path = './Whatever.xcodeproj'
project = Xcodeproj::Project.open(project_path)

for o in project.objects do 
    if o.is_a? Xcodeproj::Project::Object::PBXGroup
        if o.hierarchy_path == "/TargetA/Localizable.strings"
            group = o
            break
        end
    end
end


files = group.files
for file in files do

    if file.path == "fr.lproj/Localizable.strings"
        file.remove_from_project
        puts "Removed " + file.path
    end
end

project.save

添加语言(也是法语):

require 'xcodeproj'
project_path = './Whatever.xcodeproj'
project = Xcodeproj::Project.open(project_path)

for o in project.objects do 
    if o.is_a? Xcodeproj::Project::Object::PBXGroup
        if o.hierarchy_path == "/TargetA/Localizable.strings"
            group = o
            break
        end
    end
end

file = project.new_file("fr.lproj/Localizable.strings")
file.move(group)
file.name = "fr"

project.save

你应该可以在fastfile中调用它,但我没有检查...你可以直接使用sh("ruby ./name.rb")调用它

【讨论】:

感谢脚本!但是,我实际上遇到的问题不仅仅是移动文件,而是添加对 xcode 项目的正确引用,以便“启用”英语(参见屏幕截图)。我添加标头引用的原始方法似乎没有实现启用本地化语言的特殊技巧。有什么建议吗? 脚本没有移动文件 - 它从 .xcodeproj 添加/删除文件,与选中复选框相同。此上下文中的文件是来自 .xcodeproj 的引用。您可以测试脚本,只需运行添加/删除文件脚本,然后尝试 git diff。还要确保 hierarchy_path 是正确的。看起来像TargetA/Application/Supporting Files/language.lproj/Localizable.strings 对不起,层次结构路径没有language.lproj 太棒了!经过几次调整后就可以工作了!非常感谢您的帮助,这让我发疯了,找不到很好的文档。

以上是关于如何通过 Fastlane 脚本添加 Xcode 本地化语言的主要内容,如果未能解决你的问题,请参考以下文章

Ionic/cordova:如何使用 fastlane 或 xcodebuild 添加推送功能?

如何在使用 Xcode 自动代码签名的同时使用 Fastlane 和 Crashlytics 进行构建?

内部版本号不是由 fastlane 设置的,而是由 Xcode 设置的

Fastlane - 如何通过组将用户添加到 Testflight?

Fastlane 扫描显示零单元测试

将 fastlane/gym 与 xcode build 进行比较