在我的应用程序中,我有一个地理定位系统,用于将用户的国家/地区与我的代码中的字符串进行比较。这是类似的东西:
if (UserLocation.country == @"Switzerland") {
//country is Switzerland
}
如果设备的用户语言是英语,则此系统正常工作。 一些用户报告说它没有工作,并且他们有德语或意大利语的设备。
如何强制设备以英文提供该国家/地区的字符串?
答案 0 :(得分:5)
使用自然语言(即我们所说和写作人类的语言)来存储本质上具有象征意义的信息通常并不理想。
您自己找到了一个很好的例子,当您的软件旅行时,就像在世界范围内使用的现代设备一样。
另一个原因可能是,即使在同一种语言中,也可能有几种广泛使用的方式来引用相同的“对象”或主题。想想美国,它可以被称为美国,美国,美国,也可能是其他几个名字。或者英国,它被称为英国(英国)和英国(GB)。甚至对于一些简单的对象属性:它是color
还是colour
?我相信其他语言可以找到更多的例子 - 特别是如果它们在不止一个国家使用。
最重要的是,自然语言也容易出现拼写错误,输入错误,使用缩写以及随着时间的推移更改拼写标准。
因此,更好的解决方案是使用与语言无关的方法。
国家名称的普遍接受的做法是使用ISO国家代码(瑞士为“CH”,德国为“DE”等,如果您使用2个字母的版本。)
在您的数据库中(可以像plist文件一样简单),您将创建一个名为countrycode
长度为2个字符的字段,该字段的值应为“US”,“CH”,“DE” “,”FR“等符合ISO 3166标准。您也可以使用3个字母的ISO国家/地区代码,但似乎最常用的是2个字母的代码。
然后,出于用户界面的目的,您将保留另一个表格,该表格可以是.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;
在其余代码中,即在UI中向用户显示数据之前处理数据的代码,您只能使用ISO代码来区分国家/地区。有些人将这部分代码称为业务逻辑,作为一个简单的例子,它可能看起来像这样:
if ( [UserLocation.countryCode isEqualToString: @"CH"] ) {
// Do things needed for Switzerland
}
国际化是一个广泛的主题,你可以在iOS上找到关于它的Apple文档here。 OS X版本为here - 但它们大致相同。
答案 1 :(得分: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