0

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

if (UserLocation.country == @"Switzerland") {
      //country is Switzerland
}

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

如何强制设备始终以英语向我提供国家/地区字符串?

4

2 回答 2

5

使用自然语言(即我们作为人类说和写的语言)来存储本质上是象征性的信息通常并不理想。

你自己找到了一个很好的例子,当你的软件传播时就会出现,就像世界范围内使用的现代设备一样。

另一个原因可能是即使在同一种语言中,也可能有几种广泛使用的方式来指代同一个“对象”或主题。想想美国,它可以被称为美国、美国、美国,可能还有其他几个名字。或者英国,它被称为英国(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
}

国际化是一个广泛的主题,您可以在此处找到 Apple 的iOS 文档。OS X 版本在这里- 但它们将基本相同。

于 2013-02-28T08:50:03.093 回答
0

我使用了 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

于 2016-06-04T21:42:50.990 回答