我还有一个问题基于我之前讨论的本地化字符串线程。链接在这里: How to do automated UI testing for system button on XCode7?
现在如果我将iOS系统语言切换到另一个,我无法获得本地化的字符串,因为它在不同的包中。我发现另一个线程正在谈论这个: Can't get access to string localizations in UI Test (Xcode 7)
如果我将所有本地化字符串从目标应用程序复制到UI测试,那么它的效果很好。但是对于XIB或故事板中的那些字符串,它们使用对象ID来表示消息,它没有意义且不可读。 How to make Object ID human-readable?
所以我必须首先将其转换为在使用NSLocalizedString之前知道它是什么:
NSLocalizedString("Help", bundle: NSBundle(forClass: AClassInYourUITests.self), comment: "")
在Xcode中有没有简单的方法来解决这个问题?如果可能的话,我不想在我的代码中使用这些无意义的字符串,很难知道它是什么。或者我必须编写一个脚本来处理这个问题?
更确切地说,让我们举个例子。目标应用的故事板中我的一些本地化字符串是:
"U2v-M1-HYu.text" = "ヘルプ";
"eTC-Zg-zHl.headerTitle" = "完了";
如果我想为不同语言进行UI测试,我不能只将其复制到UI测试包。我需要先将它转换成这样:
"Help" = "ヘルプ";
"Done" = "完了";
欢迎任何建议。
答案 0 :(得分:0)
第1步。将您的localizable.strings
文件添加到您的UI测试目标
第2步。在Test类中创建这些帮助器方法(找到here):
var currentLanguage: (langCode: String, localeCode: String)? {
let currentLocale = Locale(identifier: Locale.preferredLanguages.first!)
guard let langCode = currentLocale.languageCode else {
return nil
}
var localeCode = langCode
if let scriptCode = currentLocale.scriptCode {
localeCode = "\(langCode)-\(scriptCode)"
} else if let regionCode = currentLocale.regionCode {
localeCode = "\(langCode)-\(regionCode)"
}
return (langCode, localeCode)
}
func localizedString(_ key: String) -> String {
let testBundle = Bundle(for: /*YourTestClass*/.self)
if let currentLanguage = currentLanguage,
let testBundlePath = testBundle.path(forResource: currentLanguage.localeCode, ofType: "lproj") ?? testBundle.path(forResource: currentLanguage.langCode, ofType: "lproj"),
let localizedBundle = Bundle(path: testBundlePath)
{
return NSLocalizedString(key, bundle: localizedBundle, comment: "")
}
return "?"
}
第3步。将第2步代码中的YourTestClass
更改为您的测试类
第4步。使用localizedString("String")
注意:这似乎不适用于所有本地化字符串。我发现它不适合我的故事板字符串,只有localizable.strings
文件。