如何在多个语言环境中检查NSLocalizedString的值?

问题描述

我们的iOS应用已翻译成19种语言,最近我发现一个问题,即屏幕上的两个按钮具有相同的标题-这意味着用户无法分辨要按哪个按钮!

我想编写一个单元测试,以检查特定区域设置中的两个NSLocalizedString键,并确保它们不会冲突。

如何在任意语言环境中查找NSLocalizedString的值?

(例如,假设我要查找“删除”和“删除”的翻译版本,或类似的东西,并确保这两个翻译的字符串不同。)

(我猜答案将与Bundle有关吗?​​)

这是我正在寻找的伪代码

class TranslationTest: XCTest {
  func testNoTranslationCollision() {
    let allLocales = // list of all supported locales in the app
    allLocales.forEach { locale in
      let translatedStringA = "Remove".asTranslatedIn(locale)
      let translatedStringB = "Delete".asTranslatedIn(locale)
      XCTAssertNotEqual(
        translatedStringA,translatedStringB,"The translations for these different strings shouldn't be identical!"
      )
    }
  }
}

解决方法

现在,在Xcode 11中,您可以使用“测试计划”为每个测试定义不同的配置。因此,请定义不同的配置,以便每个配置都使用特定语言启动应用程序。如果未在“应用​​程序语言”中显示特定语言(如波斯语),则将其语言代码添加到“启动时传递的参数”中,如下所示:

-AppleLanguages (en)

首先,您需要创建一个受支持的语言代码数组,并遍历该数组并设置语言并比较您的字符串

let stringA = NSLocalizedString("Remove",comment: "stringA")
let stringB = NSLocalizedString("Delete",comment: "stringB")
XCTAssertNotEqual(
    stringA,stringB,"The translations for these different strings shouldn't be identical!"
  )

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...