是否可以将MKMapView的基础语言切换到与系统区域设置不同的语言?
例如,如果地址显示翻译的街道名称(英语),但我需要查看母语翻译(例如在中国大陆或日本)。
另一种选择是包含一个本地地图引擎(如百度),但我希望看看iOS是否可以开箱即用。
答案 0 :(得分:5)
地图将以其所显示国家/地区的语言显示,通常使用英语(或者您当地的语言)作为第二语言。例如,打开手机上的地图应用程序并输入迪拜或埃及开罗,您将看到城市和街道的阿拉伯文字。
其他语言也是如此。输入中国上海,您将获得中文文本,东京,日本,您将获得日文文本等。
现在(截至目前)没有开放框架功能来手动更改输入的语言。我知道openstreetmap API有一些调用,但这需要滚动你自己的地图处理程序。
答案 1 :(得分:2)
使用googlesdk
。我这样做,它根据本地位置太有用,地图将转换成本地语言,如果你担心注释和多个注释,你可以实现所有这些事情就像MKMapview
答案 2 :(得分:2)
地图应用程序可以选择以本地语言而不是系统语言显示标签,但MapKit无法使用此选项。
Mapbox Maps SDK for iOS确实可以选择将标签本地化为每个地区的本地语言,也可以全局定位到九种语言中的一种(基于OpenStreetMap和Wikidata)。
要将地图上的所有标签更改为系统语言,请让MGLMapViewDelegate
对象实施-mapView:didFinishLoadingStyle:
方法,然后调用-[MGLStyle localizeLabelsIntoLocale:]
方法。
在斯威夫特:
func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
// Into the system language
style.localizeLabels(into: nil)
// Into Simplified Chinese
style.localizeLabels(into: Locale(identifier: "zh-Hans"))
// Into the local language where a given feature is located
style.localizeLabels(into: Locale(identifier: "mul"))
}
或在Objective-C中:
- (void)mapView:(MGLMapView *)mapView didFinishLoadingStyle:(MGLStyle *)style {
// Into the system language
[style localizeLabelsIntoLocale:nil];
// Into Simplified Chinese
[style localizeLabelsIntoLocale:[NSLocale localeWithLocaleIdentifier:@"zh-Hans"]];
// Into the local language where a given feature is located
[style localizeLabelsIntoLocale:[NSLocale localeWithLocaleIdentifier:@"mul"]];
}
还可以选择本地化某些类型的功能,例如仅限街道或仅使用地标。有关详细信息,请参阅this document。
答案 3 :(得分:0)
通过强制使用应用默认语言,可以克服此约束。虽然价格昂贵,但确实有回报。
#define DVEM_EXPORT __attribute__((visibility("default"))) namespace boost { template <class Tag,class T> class DVEM_EXPORT error_info; } #include <boost/exception/all.hpp> #include <stdexcept> namespace dv { template <typename=void> struct DVEM_EXPORT BaseException : virtual boost::exception, virtual std::exception { }; } #include <string> class DVEM_EXPORT UnsupportedDataTypeException : public dv::BaseException<> {}; struct DVEM_EXPORT errinfo_data_type_ {}; typedef boost::error_info<errinfo_data_type_, std::string> errinfo_data_type; DVEM_EXPORT void foo() { throw UnsupportedDataTypeException() << errinfo_data_type("bar"); }
在我的应用程序中,使用基于阿拉伯语的设备的用户错误地使用其阿拉伯语国家/地区和城市名称搜索我的数据库。
regionDidChangeAnimated?
let langCultureCode: String = "en"
let defaults = UserDefaults.standard
defaults.set([langCultureCode], forKey: "AppleLanguages")
defaults.synchronize()
// UserDefaults.standard.set(["AR"], forKey: "AppleLanguages") // case Arabic
强行忽略设备默认语言并不是免费的。恢复我的Mapview功能,使我的应用程序放弃任何本地化字符串。而且还有很多。
regionDidChangeAnimated?
// الرياض, السعودية
// دبي ، الإمارات
// القاهرة، مصر
答案 4 :(得分:0)
只需在style.localizeLabels(into: Locale.current)
函数中执行mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle)
。
确保您的应用已在项目设置中启用了该特定语言,并且MapBox支持该语言。