如何让用户所在的国家/地区始终使用英语?

Bal*_*ick 0 xcode objective-c geolocation

在我的应用程序中,我有一个地理位置系统,用于将用户的国家/地区与我的代码中的字符串进行比较.这是类似的东西:

if (UserLocation.country == @"Switzerland") {
      //country is Switzerland
}
Run Code Online (Sandbox Code Playgroud)

如果设备的用户语言是英语,则此系统可正常工作.一些用户报告说它没有工作,并且他们有德语或意大利语的设备.

如何强制设备总是用英语给我一个国家的字符串?

Mon*_*olo 5

使用自然语言(即我们所说和写作人类的语言)来存储本质上具有象征意义的信息通常并不理想.

您自己找到了一个很好的例子,当您的软件运行时,就像在世界范围内使用的现代设备一样.

另一个原因可能是即使在同一种语言中,也可能有几种广泛使用的方式来引用相同的"对象"或主题.想想美国,它可以被称为美国,美国,美国,也可能是其他几个名字.或者英国,它被称为英国(英国)和英国(GB).或者甚至是一些简单的对象属性:它color还是colour?我相信其他语言可以找到更多的例子 - 特别是如果它们在不止一个国家​​使用.

最重要的是,自然语言也容易出现拼写错误,输入错误,使用缩写以及随着时间的推移更改拼写标准.

因此,更好的解决方案是使用与语言无关的方法.

国家名称的普遍接受的做法是使用ISO国家代码(瑞士为"CH",德国为"DE"等,如果您使用2个字母的版本.)

在您的数据库中(可以像plist文件一样简单),您将创建一个名为countrycode长度为2个字符的字段,该字段的值应为"US","CH","DE","FR"等.遵循ISO 3166标准.您也可以使用3个字母的ISO国家/地区代码,但似乎最常用的是2个字母的代码.

然后,出于UI目的,您将保留另一个表,该表可以是.strings用于使用国家/地区的自然语言名称进行本地化的文件:

US = United States;
DE = Germany;
CH = Switzerland;
/* etc. */
Run Code Online (Sandbox Code Playgroud)

在屏幕上,您可以翻译为自然语言:

NSString *isoCountryCode = @"CH"; // Or however you want to set it
NSString *countryName = NSLocalizedString(isoCountryCode, @"Default string if country name not found.");

// Now you can set the country name in human-readable form in the UI
myCountryNameLabel.text = countryName;
Run Code Online (Sandbox Code Playgroud)

在其余代码中,即在UI中向用户显示数据之前处理数据的代码,您只能使用ISO代码来区分国家/地区.有些人将这部分代码称为业务逻辑,作为一个简单的例子,它可能看起来像这样:

if ( [UserLocation.countryCode isEqualToString: @"CH"] ) {
     // Do things needed for Switzerland
}
Run Code Online (Sandbox Code Playgroud)

国际化是一个广泛的主题,你可以在这里找到关于iOS的Apple文档.OS X版本在这里 - 但它们在很大程度上是相同的.