summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorMinh Nguyễn <mxn@1ec5.org>2016-11-22 23:40:54 -0800
committerMinh Nguyễn <mxn@1ec5.org>2016-11-28 15:45:44 -0800
commit83e134eb9f2a8737d2ce008cd7564b4df0777c39 (patch)
tree77182f6b22fc805ae4dfa72a2446ca0bbebbc277 /platform
parentf6113559126b5e5fa90c4f8c31ef589058998def (diff)
downloadqtlocation-mapboxgl-83e134eb9f2a8737d2ce008cd7564b4df0777c39.tar.gz
[macos] Added option to localize labels
Added a setting to macosapp to change all symbol layers in the current style to use the preferred language if available. If the setting is off, change all symbol layers to use local languages.
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;
}