summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
Diffstat (limited to 'platform')
-rw-r--r--platform/macos/app/Base.lproj/MainMenu.xib21
-rw-r--r--platform/macos/app/MapDocument.m69
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;
}