From 99a046345a68fbce201a0f7987d709068201d6e5 Mon Sep 17 00:00:00 2001 From: Zhao Gang Date: Wed, 13 Mar 2019 23:11:46 +0800 Subject: [PATCH 1/3] [localization] Add Traditional Chinese locale Locale PRC is the same as Locale CHINA as they are both aliases for Locale SIMPLIFIED_CHINESE. Changed Locale PRC to Locale TAIWAN so we can support Traditional Chinese locale. Traditional Chinese locale is supported in mapbox-streets-v8 as name_zh-Hant. --- .../localization/LocalizationPlugin.java | 5 ---- .../plugins/localization/MapLocale.java | 28 +++++++++---------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java index e9688aeb1..447e969eb 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java @@ -260,11 +260,6 @@ private void convertExpressionV8(@NonNull MapLocale mapLocale, Layer layer, Prop String mapLanguage = mapLocale.getMapLanguage(); if (!mapLanguage.equals(MapLocale.ENGLISH)) { - if (mapLanguage.equals(MapLocale.CHINESE)) { - // in streets v8 tiles chinese is declared as "name_zh-Hant" instead of "name_zh" - mapLanguage = MapLocale.CHINESE_V8; - } - stringExpression = stringExpression.replaceAll(EXPRESSION_V8_REGEX_BASE, String.format(Locale.US, EXPRESSION_V8_TEMPLATE_LOCALIZED, diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java index 37d3aec6f..eff68e423 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java @@ -86,9 +86,9 @@ public final class MapLocale { public static final String CHINESE = "name_zh"; /** - * Chinese (if available) + * Traditional Chinese (if available) */ - static final String CHINESE_V8 = "name_zh-Hant"; + static final String TRADITIONAL_CHINESE = "name_zh-Hant"; /** * Simplified Chinese (if available) @@ -106,8 +106,8 @@ public final class MapLocale { public static final String KOREAN = "name_ko"; @Retention(SOURCE) - @StringDef( {LOCAL_NAME, ENGLISH, FRENCH, SIMPLIFIED_CHINESE, ARABIC, SPANISH, GERMAN, PORTUGUESE, - RUSSIAN, CHINESE, JAPANESE, KOREAN}) + @StringDef( {LOCAL_NAME, ARABIC, CHINESE, SIMPLIFIED_CHINESE, TRADITIONAL_CHINESE, ENGLISH, + FRENCH, GERMAN, JAPANESE, KOREAN, PORTUGUESE, RUSSIAN, SPANISH}) public @interface Languages { } @@ -143,6 +143,13 @@ public final class MapLocale { .include(new LatLng(53.56086, 73.557693)) .include(new LatLng(15.775416, 134.773911)).build(); + /** + * Taiwan Bounding Box extracted from Open Street Map + */ + static final LatLngBounds TAIWAN_BBOX = new LatLngBounds.Builder() + .include(new LatLng(26.389444, 118.115255566105)) + .include(new LatLng(21.733333, 122.107778)).build(); + /** * Germany Bounding Box extracted from Open Street Map */ @@ -171,13 +178,6 @@ public final class MapLocale { .include(new LatLng(51.092804, -5.142222)) .include(new LatLng(41.371582, 9.561556)).build(); - /** - * Peoples Republic of China Bounding Box extracted from Open Street Map - */ - static final LatLngBounds PRC_BBOX = new LatLngBounds.Builder() - .include(new LatLng(53.56086, 73.557693)) - .include(new LatLng(15.775416, 134.773911)).build(); - /** * Russian Bounding box extracted from Open Street Map */ @@ -224,7 +224,7 @@ public final class MapLocale { /** * Useful constant for country. */ - public static final MapLocale PRC = new MapLocale(SIMPLIFIED_CHINESE, PRC_BBOX); + public static final MapLocale TAIWAN = new MapLocale(TRADITIONAL_CHINESE, TAIWAN_BBOX); /** * Useful constant for country. @@ -268,7 +268,7 @@ public final class MapLocale { LOCALE_SET.put(Locale.CANADA_FRENCH, MapLocale.CANADA_FRENCH); LOCALE_SET.put(Locale.CANADA, MapLocale.CANADA); LOCALE_SET.put(Locale.CHINA, MapLocale.CHINA); - LOCALE_SET.put(Locale.PRC, MapLocale.PRC); + LOCALE_SET.put(Locale.TAIWAN, MapLocale.TAIWAN); LOCALE_SET.put(Locale.UK, MapLocale.UK); LOCALE_SET.put(Locale.JAPAN, MapLocale.JAPAN); LOCALE_SET.put(Locale.KOREA, MapLocale.KOREA); @@ -413,4 +413,4 @@ private static MapLocale getMapLocaleFallback(@NonNull Locale locale) { } return foundMapLocale; } -} \ No newline at end of file +} From d9feff71b4fb07649135641a344b6750b39a7526 Mon Sep 17 00:00:00 2001 From: Zhao Gang Date: Thu, 14 Mar 2019 22:22:04 +0800 Subject: [PATCH 2/3] [localization] Add better support for Chinese languages (fix #877) Different mapbox-streets source versions have different levels/types of support for Chinese languages. Android system's Chinese Locales also changed in different android versions. Add support for above conditions. --- .../localization/LocalizationPlugin.java | 43 +++++++++++++++++-- .../plugins/localization/MapLocale.java | 32 ++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java index 447e969eb..2580cb713 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java @@ -126,6 +126,22 @@ public void onStyleLoaded(@NonNull Style style) { mapView.addOnWillStartLoadingMapListener(styleLoadListener); } + private MapLocale getChineseMapLocale(MapLocale mapLocale, boolean isStreetsV7) { + if (isStreetsV7) { + // streets v7 supports name_zh(MapLocale.CHINA) and name_zh-Hans(MapLocale.CHINESE_HANS) + // https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v7/#name-fields + if (mapLocale.equals(MapLocale.CHINESE_HANS)) { + return mapLocale; + } else { + return MapLocale.CHINA; + } + } else { + // streets V6 only supports name_zh(MapLocale.CHINA) + // https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v6/#name-fields + return MapLocale.CHINA; + } + } + /* * Map languages */ @@ -190,9 +206,10 @@ public void setMapLanguage(@NonNull Locale locale) { public void setMapLanguage(@NonNull Locale locale, boolean acceptFallback) { MapLocale mapLocale = MapLocale.getMapLocale(locale, acceptFallback); if (mapLocale != null) { + Timber.d("Locale: %s, set MapLocale: %s", locale.toString(), mapLocale.getMapLanguage()); setMapLanguage(mapLocale); } else { - Timber.e("Couldn't match Locale %s to a MapLocale", locale.getDisplayName()); + Timber.e("Couldn't match Locale %s %s to a MapLocale", locale.toString(), locale.getDisplayName()); } } @@ -214,6 +231,7 @@ public void setMapLanguage(@NonNull MapLocale mapLocale) { for (Source source : style.getSources()) { if (sourceIsFromMapbox(source)) { boolean isStreetsV8 = sourceIsStreetsV8(source); + boolean isStreetsV7 = sourceIsStreetsV7(source); for (Layer layer : layers) { if (layer instanceof SymbolLayer) { PropertyValue textFieldProperty = ((SymbolLayer) layer).getTextField(); @@ -221,7 +239,7 @@ public void setMapLanguage(@NonNull MapLocale mapLocale) { if (isStreetsV8) { convertExpressionV8(mapLocale, layer, textFieldProperty); } else { - convertExpression(mapLocale, layer, textFieldProperty); + convertExpression(mapLocale, layer, textFieldProperty, isStreetsV7); } } } @@ -240,10 +258,19 @@ public void setMapLanguage(@NonNull MapLocale mapLocale) { } } - private void convertExpression(@NonNull MapLocale mapLocale, Layer layer, PropertyValue textFieldProperty) { + private void convertExpression(@NonNull MapLocale mapLocale, Layer layer, + PropertyValue textFieldProperty, boolean isStreetsV7) { Expression textFieldExpression = textFieldProperty.getExpression(); if (textFieldExpression != null) { - String text = textFieldExpression.toString().replaceAll(EXPRESSION_REGEX, mapLocale.getMapLanguage()); + MapLocale newMapLocale = mapLocale; + String mapLanguage = mapLocale.getMapLanguage(); + if (mapLanguage.startsWith("name_zh")) { + // need to re-get mapLocale, since the default is for street-v8 + newMapLocale = getChineseMapLocale(mapLocale, isStreetsV7); + Timber.d("reset mapLocale to: %s", newMapLocale.getMapLanguage()); + } + + String text = textFieldExpression.toString().replaceAll(EXPRESSION_REGEX, newMapLocale.getMapLanguage()); if (text.startsWith("[\"step") && textFieldExpression.toArray().length % 2 == 0) { // got an invalid step expression from core, we need to add an additional name_x into step text = text.replaceAll(STEP_REGEX, STEP_TEMPLATE); @@ -344,6 +371,14 @@ private boolean sourceIsFromMapbox(Source singleSource) { return false; } + private boolean sourceIsStreetsV7(Source source) { + if (source instanceof VectorSource) { + String url = ((VectorSource) source).getUrl(); + return url != null && url.contains("mapbox.mapbox-streets-v7"); + } + return false; + } + private boolean sourceIsStreetsV8(Source source) { if (source instanceof VectorSource) { String url = ((VectorSource) source).getUrl(); diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java index eff68e423..d6f2c8623 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java @@ -226,6 +226,16 @@ public final class MapLocale { */ public static final MapLocale TAIWAN = new MapLocale(TRADITIONAL_CHINESE, TAIWAN_BBOX); + /** + * Useful constant for country. General Simplified Chinese + */ + public static final MapLocale CHINESE_HANS = new MapLocale(SIMPLIFIED_CHINESE); + + /** + * Useful constant for country. General Traditional Chinese + */ + public static final MapLocale CHINESE_HANT = new MapLocale(TRADITIONAL_CHINESE); + /** * Useful constant for country. */ @@ -276,6 +286,28 @@ public final class MapLocale { LOCALE_SET.put(Locale.FRANCE, MapLocale.FRANCE); LOCALE_SET.put(new Locale("ru", "RU"), RUSSIA); LOCALE_SET.put(new Locale("es", "ES"), SPAIN); + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + Locale zh_CN_Hans = new Locale.Builder().setLanguage("zh").setRegion("CN").setScript("Hans").build(); + Locale zh_HK_Hans = new Locale.Builder().setLanguage("zh").setRegion("HK").setScript("Hans").build(); + Locale zh_MO_Hans = new Locale.Builder().setLanguage("zh").setRegion("MO").setScript("Hans").build(); + Locale zh_SG_Hans = new Locale.Builder().setLanguage("zh").setRegion("SG").setScript("Hans").build(); + + Locale zh_TW_Hant = new Locale.Builder().setLanguage("zh").setRegion("TW").setScript("Hant").build(); + Locale zh_HK_Hant = new Locale.Builder().setLanguage("zh").setRegion("HK").setScript("Hant").build(); + Locale zh_MO_Hant = new Locale.Builder().setLanguage("zh").setRegion("MO").setScript("Hant").build(); + + // streets v8 supports name_zh-Hans(MapLocale.CHINESE_HANS) and name_zh-Hant(MapLocale.CHINESE_HANT) + // https://docs.mapbox.com/vector-tiles/reference/mapbox-streets-v8/#name-text--name_lang-code-text + LOCALE_SET.put(zh_CN_Hans, MapLocale.CHINESE_HANS); + LOCALE_SET.put(zh_HK_Hans, MapLocale.CHINESE_HANS); + LOCALE_SET.put(zh_MO_Hans, MapLocale.CHINESE_HANS); + LOCALE_SET.put(zh_SG_Hans, MapLocale.CHINESE_HANS); + + LOCALE_SET.put(zh_TW_Hant, MapLocale.TAIWAN); + LOCALE_SET.put(zh_HK_Hant, MapLocale.CHINESE_HANT); + LOCALE_SET.put(zh_MO_Hant, MapLocale.CHINESE_HANT); + } } private final LatLngBounds countryBounds; From b277a4701b15483a9aeb00140694d1f5fb5aa5f1 Mon Sep 17 00:00:00 2001 From: Zhao Gang Date: Fri, 22 Mar 2019 22:17:00 +0800 Subject: [PATCH 3/3] [localization] Update Chinese languages setting --- .../mapboxsdk/plugins/localization/LocalizationPlugin.java | 5 ++++- .../com/mapbox/mapboxsdk/plugins/localization/MapLocale.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java index 2580cb713..01a673a37 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/LocalizationPlugin.java @@ -231,7 +231,6 @@ public void setMapLanguage(@NonNull MapLocale mapLocale) { for (Source source : style.getSources()) { if (sourceIsFromMapbox(source)) { boolean isStreetsV8 = sourceIsStreetsV8(source); - boolean isStreetsV7 = sourceIsStreetsV7(source); for (Layer layer : layers) { if (layer instanceof SymbolLayer) { PropertyValue textFieldProperty = ((SymbolLayer) layer).getTextField(); @@ -239,6 +238,7 @@ public void setMapLanguage(@NonNull MapLocale mapLocale) { if (isStreetsV8) { convertExpressionV8(mapLocale, layer, textFieldProperty); } else { + boolean isStreetsV7 = sourceIsStreetsV7(source); convertExpression(mapLocale, layer, textFieldProperty, isStreetsV7); } } @@ -287,6 +287,9 @@ private void convertExpressionV8(@NonNull MapLocale mapLocale, Layer layer, Prop String mapLanguage = mapLocale.getMapLanguage(); if (!mapLanguage.equals(MapLocale.ENGLISH)) { + if (mapLanguage.equals("name_zh")) { + mapLanguage = MapLocale.SIMPLIFIED_CHINESE; + } stringExpression = stringExpression.replaceAll(EXPRESSION_V8_REGEX_BASE, String.format(Locale.US, EXPRESSION_V8_TEMPLATE_LOCALIZED, diff --git a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java index d6f2c8623..16125482b 100644 --- a/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java +++ b/plugin-localization/src/main/java/com/mapbox/mapboxsdk/plugins/localization/MapLocale.java @@ -277,7 +277,7 @@ public final class MapLocale { LOCALE_SET.put(Locale.US, MapLocale.US); LOCALE_SET.put(Locale.CANADA_FRENCH, MapLocale.CANADA_FRENCH); LOCALE_SET.put(Locale.CANADA, MapLocale.CANADA); - LOCALE_SET.put(Locale.CHINA, MapLocale.CHINA); + LOCALE_SET.put(Locale.CHINA, MapLocale.CHINESE_HANS); LOCALE_SET.put(Locale.TAIWAN, MapLocale.TAIWAN); LOCALE_SET.put(Locale.UK, MapLocale.UK); LOCALE_SET.put(Locale.JAPAN, MapLocale.JAPAN);