diff options
Diffstat (limited to 'platform')
-rw-r--r-- | platform/macos/app/Base.lproj/MainMenu.xib | 21 | ||||
-rw-r--r-- | platform/macos/app/MapDocument.m | 69 |
2 files changed, 90 insertions, 0 deletions
diff --git a/platform/macos/app/Base.lproj/MainMenu.xib b/platform/macos/app/Base.lproj/MainMenu.xib index 4efb8d4c46..cb9905d4a1 100644 --- a/platform/macos/app/Base.lproj/MainMenu.xib +++ b/platform/macos/app/Base.lproj/MainMenu.xib @@ -434,6 +434,27 @@ <action selector="toggleLayers:" target="-1" id="YdA-Mr-MHi"/> </connections> </menuItem> + <menuItem isSeparatorItem="YES" id="8aO-Nm-fxF"/> + <menuItem title="Labels In" id="M7v-B1-vo3"> + <modifierMask key="keyEquivalentModifierMask"/> + <menu key="submenu" title="Labels In" id="gOc-5u-4v5"> + <items> + <menuItem title="Local Language" id="hTL-wF-DEs"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="setLabelLanguage:" target="-1" id="Zc4-TL-Cxe"/> + </connections> + </menuItem> + <menuItem title="Preferred Language" tag="1" id="PkP-Ne-ISX"> + <modifierMask key="keyEquivalentModifierMask"/> + <connections> + <action selector="setLabelLanguage:" target="-1" id="7Io-iF-xf8"/> + </connections> + </menuItem> + </items> + </menu> + </menuItem> + <menuItem isSeparatorItem="YES" id="qTh-Hu-dGV"/> </items> </menu> </menuItem> diff --git a/platform/macos/app/MapDocument.m b/platform/macos/app/MapDocument.m index c05a85f960..d2e6a0f810 100644 --- a/platform/macos/app/MapDocument.m +++ b/platform/macos/app/MapDocument.m @@ -64,6 +64,7 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio NSUInteger _droppedPinCounter; NSNumberFormatter *_spellOutNumberFormatter; + BOOL _isLocalizingLabels; BOOL _showsToolTipsOnDroppedPins; BOOL _randomizesCursorsOnDroppedPins; BOOL _isTouringWorld; @@ -123,10 +124,12 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio - (void)window:(NSWindow *)window willEncodeRestorableState:(NSCoder *)state { [state encodeObject:self.mapView.styleURL forKey:@"MBXMapViewStyleURL"]; + [state encodeBool:_isLocalizingLabels forKey:@"MBXLocalizeLabels"]; } - (void)window:(NSWindow *)window didDecodeRestorableState:(NSCoder *)state { self.mapView.styleURL = [state decodeObjectForKey:@"MBXMapViewStyleURL"]; + _isLocalizingLabels = [state decodeBoolForKey:@"MBXLocalizeLabels"]; } #pragma mark Services @@ -325,6 +328,60 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio [self.styleLayersArrayController removeObjectsAtArrangedObjectIndexes:indices]; } +- (IBAction)setLabelLanguage:(NSMenuItem *)sender { + _isLocalizingLabels = sender.tag; + [self updateLabels]; +} + +- (void)updateLabels { + NSString *preferredLanguageCode = self.preferredLanguageCode; + NSString *preferredNameToken = _isLocalizingLabels ? [NSString stringWithFormat:@"{name_%@}", preferredLanguageCode] : @"{name}"; + NSRegularExpression *nameTokenExpression = [NSRegularExpression regularExpressionWithPattern:@"\\{name(?:_\\w{2})?\\}" options:0 error:NULL]; + + for (MGLSymbolStyleLayer *layer in self.mapView.style.layers) { + if (![layer isKindOfClass:[MGLSymbolStyleLayer class]]) { + continue; + } + + if ([layer.textField isKindOfClass:[MGLStyleConstantValue class]]) { + NSString *textField = [(MGLStyleConstantValue<NSString *> *)layer.textField rawValue]; + textField = [nameTokenExpression stringByReplacingMatchesInString:textField + options:0 + range:NSMakeRange(0, textField.length) + withTemplate:preferredNameToken]; + layer.textField = [MGLStyleValue<NSString *> valueWithRawValue:textField]; + } else if ([layer.textField isKindOfClass:[MGLStyleFunction class]]) { + MGLStyleFunction *function = (MGLStyleFunction<NSString *> *)layer.textField; + NSMutableDictionary *stops = function.stops.mutableCopy; + [stops enumerateKeysAndObjectsUsingBlock:^(NSNumber *zoomLevel, MGLStyleConstantValue<NSString *> *stop, BOOL *done) { + NSString *textField = stop.rawValue; + textField = [nameTokenExpression stringByReplacingMatchesInString:textField + options:0 + range:NSMakeRange(0, textField.length) + withTemplate:preferredNameToken]; + stops[zoomLevel] = [MGLStyleValue<NSString *> valueWithRawValue:textField]; + }]; + function.stops = stops; + layer.textField = function; + } + } +} + +- (NSString *)preferredLanguageCode { + // Languages supported by Mapbox Streets v10. + NSSet *supportedLanguages = [NSSet setWithObjects:@"en", @"es", @"fr", @"de", @"ru", @"zh", nil]; + NSArray *preferredLanguages = [NSLocale preferredLanguages]; + + for (NSString *language in preferredLanguages) { + NSString *languageCode = [[NSLocale localeWithLocaleIdentifier:language] objectForKey:NSLocaleLanguageCode]; + if ([supportedLanguages containsObject:languageCode]) { + return languageCode; + } + } + + return @"en"; +} + - (void)applyPendingState { if (_inheritedStyleURL) { self.mapView.styleURL = _inheritedStyleURL; @@ -736,6 +793,14 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio if (menuItem.action == @selector(deleteStyleLayers:)) { return self.styleLayersTableView.clickedRow >= 0 || self.styleLayersTableView.selectedRow >= 0; } + if (menuItem.action == @selector(setLabelLanguage:)) { + menuItem.state = menuItem.tag == _isLocalizingLabels ? NSOnState: NSOffState; + if (menuItem.tag) { + NSLocale *locale = [NSLocale localeWithLocaleIdentifier:[NSBundle mainBundle].developmentLocalization]; + menuItem.title = [locale displayNameForKey:NSLocaleIdentifier value:self.preferredLanguageCode]; + } + return YES; + } if (menuItem.action == @selector(manipulateStyle:)) { return YES; } @@ -922,6 +987,10 @@ NS_ARRAY_OF(id <MGLAnnotation>) *MBXFlattenedShapes(NS_ARRAY_OF(id <MGLAnnotatio #pragma mark MGLMapViewDelegate methods +- (void)mapView:(MGLMapView *)mapView didFinishLoadingStyle:(MGLStyle *)style { + [self updateLabels]; +} + - (BOOL)mapView:(MGLMapView *)mapView annotationCanShowCallout:(id <MGLAnnotation>)annotation { return YES; } |