在我的应用程序中,我有一个地理定位系统,可以将用户所在的国家/地区与我的代码中的字符串进行比较。这是类似的东西:
if (UserLocation.country == @"Switzerland") {
//country is Switzerland
}
如果设备的用户语言是英语,则该系统可以正常工作。一些用户报告说它不工作并且他们有德语或意大利语的设备。
如何强制设备始终以英语向我提供国家/地区字符串?
在我的应用程序中,我有一个地理定位系统,可以将用户所在的国家/地区与我的代码中的字符串进行比较。这是类似的东西:
if (UserLocation.country == @"Switzerland") {
//country is Switzerland
}
如果设备的用户语言是英语,则该系统可以正常工作。一些用户报告说它不工作并且他们有德语或意大利语的设备。
如何强制设备始终以英语向我提供国家/地区字符串?
使用自然语言(即我们作为人类说和写的语言)来存储本质上是象征性的信息通常并不理想。
你自己找到了一个很好的例子,当你的软件传播时就会出现,就像世界范围内使用的现代设备一样。
另一个原因可能是即使在同一种语言中,也可能有几种广泛使用的方式来指代同一个“对象”或主题。想想美国,它可以被称为美国、美国、美国,可能还有其他几个名字。或者英国,它被称为英国(UK)和大不列颠(GB)。甚至对于一些简单的对象属性:是color
还是colour
?我确信可以找到更多其他语言的例子——特别是如果它们在多个国家使用。
最重要的是,随着时间的推移,自然语言也容易出现拼写错误、打字错误、使用缩写和拼写标准的变化。
因此,更好的解决方案是使用与语言无关的方法。
国家名称的普遍接受做法是使用 ISO 国家代码(“CH”代表瑞士,“DE”代表德国等,以防您使用 2 个字母版本。)
在您的数据库中(可以像 plist 文件一样简单),您将创建一个名为 instancecountrycode
的字段,长度为 2 个字符,其值应为“US”、“CH”、“DE”、“FR”等。遵循 ISO 3166 标准。您也可以使用 3 个字母的 ISO 国家/地区代码,但似乎最常用的是 2 个字母的国家代码。
然后,出于 UI 目的,您将保留另一个表,该表可能是.strings
用于本地化的文件,其中包含国家/地区的自然语言名称:
US = United States;
DE = Germany;
CH = Switzerland;
/* etc. */
在屏幕上,您可以翻译成自然语言:
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;
在您的其余代码中,即在将数据显示给用户界面之前处理数据的代码,您只使用 ISO 代码来区分国家/地区。有些人将这部分代码称为业务逻辑,作为一个简单的示例,它可能看起来像这样:
if ( [UserLocation.countryCode isEqualToString: @"CH"] ) {
// Do things needed for Switzerland
}
我使用了 Google 地方信息并向该网址发出了请求
"https://maps.googleapis.com/maps/api/geocode/json?latlng=\(userLocation.latitude),\(userLocation.longitude)&key=\(self.googlePlacesApiKey)&language=en&result_type=country"
所以它总是给我独立于用户的语言或区域设置的英语结果
您可以使用 result_type 参数更改您收到的信息。完整指南在这里:
https://developers.google.com/maps/documentation/geocoding/intro#Viewports