切换MKMapView显示语言

时间:2012-08-20 15:03:52

标签: iphone ios

是否可以将MKMapView的基础语言切换到与系统区域设置不同的语言?

例如,如果地址显示翻译的街道名称(英语),但我需要查看母语翻译(例如在中国大陆或日本)。

另一种选择是包含一个本地地图引擎(如百度),但我希望看看iOS是否可以开箱即用。

5 个答案:

答案 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功能,使我的应用程序放弃任何本地化字符串。而且还有很多。

enter image description here

regionDidChangeAnimated?

    // الرياض, السعودية
    // دبي ، الإمارات
    // القاهرة، مصر
  • 奇怪的是,mapView忽略了我的应用默认语言设置,并使用用户默认语言呈现标签。这恰好是偶然的优势

答案 4 :(得分:0)

只需在style.localizeLabels(into: Locale.current)函数中执行mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle)

确保您的应用已在项目设置中启用了该特定语言,并且MapBox支持该语言。