Skip to content
This repository was archived by the owner on Aug 8, 2023. It is now read-only.

Commit c9de6cd

Browse files
committed
[ios, macos] More robust Streets localization
Added Arabic, Portuguese, and Simplified Chinese to the list of languages with specialized fields in the Mapbox Streets source. Rely on NSBundle to select the most appropriate locale based on the user’s preferred languages.
1 parent a57e9bc commit c9de6cd

File tree

4 files changed

+25
-21
lines changed

4 files changed

+25
-21
lines changed

platform/ios/app/MBXViewController.m

+11-10
Original file line numberDiff line numberDiff line change
@@ -1397,19 +1397,20 @@ - (void)styleLabelLanguageForLayersNamed:(NSArray<NSString *> *)layers
13971397

13981398
- (NSString *)bestLanguageForUser
13991399
{
1400-
NSArray *supportedLanguages = @[ @"en", @"es", @"fr", @"de", @"ru", @"zh" ];
1401-
NSArray<NSString *> *preferredLanguages = [NSLocale preferredLanguages];
1402-
NSString *bestLanguage;
1403-
1404-
for (NSString *language in preferredLanguages) {
1405-
NSString *thisLanguage = [[NSLocale localeWithLocaleIdentifier:language] objectForKey:NSLocaleLanguageCode];
1406-
if ([supportedLanguages containsObject:thisLanguage]) {
1407-
bestLanguage = thisLanguage;
1408-
break;
1400+
// https://www.mapbox.com/vector-tiles/mapbox-streets-v7/#overview
1401+
NSArray *supportedLanguages = @[ @"ar", @"en", @"es", @"fr", @"de", @"pt", @"ru", @"zh", @"zh-Hans" ];
1402+
NSArray<NSString *> *preferredLanguages = [NSBundle preferredLocalizationsFromArray:supportedLanguages forPreferences:[NSLocale preferredLanguages]];
1403+
NSString *mostSpecificLanguage;
1404+
1405+
for (NSString *language in preferredLanguages)
1406+
{
1407+
if (language.length > mostSpecificLanguage.length)
1408+
{
1409+
mostSpecificLanguage = language;
14091410
}
14101411
}
14111412

1412-
return bestLanguage ?: @"en";
1413+
return mostSpecificLanguage ?: @"en";
14131414
}
14141415

14151416
- (IBAction)startWorldTour

platform/macos/app/MGLVectorSource+MBXAdditions.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ NS_ASSUME_NONNULL_BEGIN
44

55
@interface MGLVectorSource (MBXAdditions)
66

7-
+ (nullable NSString *)preferredMapboxStreetsLanguage;
7+
+ (NSString *)preferredMapboxStreetsLanguage;
88

99
- (NS_DICTIONARY_OF(NSString *, NSString *) *)localizedKeysByKeyForPreferredLanguage:(nullable NSString *)preferredLanguage;
1010

platform/macos/app/MGLVectorSource+MBXAdditions.m

+11-7
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,23 @@ @implementation MGLVectorSource (MBXAdditions)
77
static dispatch_once_t onceToken;
88
static NS_SET_OF(NSString *) *mapboxStreetsLanguages;
99
dispatch_once(&onceToken, ^{
10-
mapboxStreetsLanguages = [NSSet setWithObjects:@"en", @"es", @"fr", @"de", @"ru", @"zh", nil];
10+
// https://www.mapbox.com/vector-tiles/mapbox-streets-v7/#overview
11+
mapboxStreetsLanguages = [NSSet setWithObjects:@"ar", @"de", @"en", @"es", @"fr", @"pt", @"ru", @"zh", @"zh-Hans", nil];
1112
});
1213
return mapboxStreetsLanguages;
1314
}
1415

15-
+ (nullable NSString *)preferredMapboxStreetsLanguage {
16-
for (NSString *language in [NSLocale preferredLanguages]) {
17-
NSString *languageCode = [[NSLocale localeWithLocaleIdentifier:language] objectForKey:NSLocaleLanguageCode];
18-
if ([[MGLVectorSource mapboxStreetsLanguages] containsObject:languageCode]) {
19-
return languageCode;
16+
+ (NSString *)preferredMapboxStreetsLanguage {
17+
NSArray<NSString *> *supportedLanguages = [MGLVectorSource mapboxStreetsLanguages].allObjects;
18+
NSArray<NSString *> *preferredLanguages = [NSBundle preferredLocalizationsFromArray:supportedLanguages
19+
forPreferences:[NSLocale preferredLanguages]];
20+
NSString *mostSpecificLanguage;
21+
for (NSString *language in preferredLanguages) {
22+
if (language.length > mostSpecificLanguage.length) {
23+
mostSpecificLanguage = language;
2024
}
2125
}
22-
return nil;
26+
return mostSpecificLanguage ?: @"en";
2327
}
2428

2529
- (BOOL)isMapboxStreets {

platform/macos/app/MapDocument.m

+2-3
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ - (IBAction)setLabelLanguage:(NSMenuItem *)sender {
345345

346346
- (void)updateLabels {
347347
MGLStyle *style = self.mapView.style;
348-
NSString *preferredLanguage = _isLocalizingLabels ? ([MGLVectorSource preferredMapboxStreetsLanguage] ?: @"en") : nil;
348+
NSString *preferredLanguage = _isLocalizingLabels ? [MGLVectorSource preferredMapboxStreetsLanguage] : nil;
349349
NSMutableDictionary *localizedKeysByKeyBySourceIdentifier = [NSMutableDictionary dictionary];
350350
for (MGLSymbolStyleLayer *layer in style.layers) {
351351
if (![layer isKindOfClass:[MGLSymbolStyleLayer class]]) {
@@ -855,8 +855,7 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
855855
if (menuItem.tag) {
856856
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[NSBundle mainBundle].developmentLocalization];
857857
NSString *preferredLanguage = [MGLVectorSource preferredMapboxStreetsLanguage];
858-
menuItem.enabled = !!preferredLanguage;
859-
menuItem.title = [locale displayNameForKey:NSLocaleIdentifier value:preferredLanguage ?: @"Preferred Language"];
858+
menuItem.title = [locale displayNameForKey:NSLocaleIdentifier value:preferredLanguage];
860859
}
861860
return YES;
862861
}

0 commit comments

Comments
 (0)