基于我之前讨论的本地化字符串线程,我还有一个问题.链接在这里:
How to do automated UI testing for system button on XCode7?
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" = "完了";
欢迎任何建议.
解决方法
步骤1.将localizable.strings文件添加到UI Test目标
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”)获取本地化字符串
注意:这似乎不适用于所有本地化字符串.我发现它对我来说不适用于storyboard字符串,只有localizable.strings文件.