summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Wray <jason@mapbox.com>2018-01-09 16:09:41 -0500
committerJason Wray <jason@mapbox.com>2018-01-10 14:25:27 -0500
commitfe5f5cebf9f3979567b6c42a62ad10a8ee10102c (patch)
tree9408514a1a1f390b159758ecc237c9f4fd8ef81b
parent06033885b78eee2c4bb2cba476594f793cac5979 (diff)
downloadqtlocation-mapboxgl-fe5f5cebf9f3979567b6c42a62ad10a8ee10102c.tar.gz
[ios] Fix and expand accessibility feature transliteration
- Fixed pre-iOS 11 compatibility. - Expanded transliteration to all supported languages.
-rw-r--r--platform/ios/ios.xcodeproj/project.pbxproj12
-rw-r--r--platform/ios/src/MGLMapAccessibilityElement.mm37
-rw-r--r--platform/ios/src/NSOrthography+MGLAdditions.h7
-rw-r--r--platform/ios/src/NSOrthography+MGLAdditions.m33
-rw-r--r--platform/ios/test/MGLMapAccessibilityElementTests.m16
5 files changed, 83 insertions, 22 deletions
diff --git a/platform/ios/ios.xcodeproj/project.pbxproj b/platform/ios/ios.xcodeproj/project.pbxproj
index 324ab1fc8f..cd2987aecd 100644
--- a/platform/ios/ios.xcodeproj/project.pbxproj
+++ b/platform/ios/ios.xcodeproj/project.pbxproj
@@ -227,6 +227,10 @@
927FBD021F4DB05500F8BF1F /* MGLMapSnapshotter.mm in Sources */ = {isa = PBXBuildFile; fileRef = 927FBCFE1F4DB05500F8BF1F /* MGLMapSnapshotter.mm */; };
929EFFAB1F56DCD4003A77D5 /* MGLAnnotationView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4018B1C41CDC277F00F666AF /* MGLAnnotationView.mm */; };
92F2C3ED1F0E3C3A00268EC0 /* MGLRendererFrontend.h in Headers */ = {isa = PBXBuildFile; fileRef = 92F2C3EC1F0E3C3A00268EC0 /* MGLRendererFrontend.h */; };
+ 96036A01200565C700510F3D /* NSOrthography+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */; };
+ 96036A02200565C700510F3D /* NSOrthography+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */; };
+ 96036A03200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */; };
+ 96036A04200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */; };
960D0C361ECF5AAF008E151F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 960D0C351ECF5AAF008E151F /* Images.xcassets */; };
960D0C371ECF5AAF008E151F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 960D0C351ECF5AAF008E151F /* Images.xcassets */; };
9620BB381E69FE1700705A1D /* MGLSDKUpdateChecker.h in Headers */ = {isa = PBXBuildFile; fileRef = 9620BB361E69FE1700705A1D /* MGLSDKUpdateChecker.h */; };
@@ -764,6 +768,8 @@
927FBCFD1F4DB05500F8BF1F /* MGLMapSnapshotter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLMapSnapshotter.h; sourceTree = "<group>"; };
927FBCFE1F4DB05500F8BF1F /* MGLMapSnapshotter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLMapSnapshotter.mm; sourceTree = "<group>"; };
92F2C3EC1F0E3C3A00268EC0 /* MGLRendererFrontend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLRendererFrontend.h; sourceTree = "<group>"; };
+ 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSOrthography+MGLAdditions.h"; sourceTree = "<group>"; };
+ 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSOrthography+MGLAdditions.m"; sourceTree = "<group>"; };
960D0C351ECF5AAF008E151F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
9620BB361E69FE1700705A1D /* MGLSDKUpdateChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLSDKUpdateChecker.h; sourceTree = "<group>"; };
9620BB371E69FE1700705A1D /* MGLSDKUpdateChecker.mm */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = MGLSDKUpdateChecker.mm; sourceTree = "<group>"; };
@@ -1231,6 +1237,8 @@
children = (
357FE2DB1E02D2B20068B753 /* NSCoder+MGLAdditions.h */,
357FE2DC1E02D2B20068B753 /* NSCoder+MGLAdditions.mm */,
+ 960369FF200565C700510F3D /* NSOrthography+MGLAdditions.h */,
+ 96036A00200565C700510F3D /* NSOrthography+MGLAdditions.m */,
35CE61801D4165D9004F2359 /* UIColor+MGLAdditions.h */,
35CE61811D4165D9004F2359 /* UIColor+MGLAdditions.mm */,
30E578111DAA7D690050F07E /* UIImage+MGLAdditions.h */,
@@ -1871,6 +1879,7 @@
353933F21D3FB753003F57D7 /* MGLCircleStyleLayer.h in Headers */,
DA8847F31CBAFA5100AB86E3 /* MGLMultiPoint.h in Headers */,
30E578171DAA85520050F07E /* UIImage+MGLAdditions.h in Headers */,
+ 96036A01200565C700510F3D /* NSOrthography+MGLAdditions.h in Headers */,
1F7454961ECD450D00021D39 /* MGLLight_Private.h in Headers */,
DAD1656C1CF41981001FF4B9 /* MGLFeature.h in Headers */,
40EDA1C01CFE0E0200D9EA68 /* MGLAnnotationContainerView.h in Headers */,
@@ -1925,6 +1934,7 @@
DABFB8641CBE99E500D62B32 /* MGLOfflineStorage.h in Headers */,
96E516E32000552A00A02306 /* MGLAccountManager_Private.h in Headers */,
96E5170420005A6B00A02306 /* SMCalloutView.h in Headers */,
+ 96036A02200565C700510F3D /* NSOrthography+MGLAdditions.h in Headers */,
DAD165791CF4CDFF001FF4B9 /* MGLShapeCollection.h in Headers */,
4049C29E1DB6CD6C00B3F799 /* MGLPointCollection.h in Headers */,
3566C7671D4A77BA008152BC /* MGLShapeSource.h in Headers */,
@@ -2420,6 +2430,7 @@
DA6408DD1DA4E7D300908C90 /* MGLVectorStyleLayer.m in Sources */,
3566C7681D4A77BA008152BC /* MGLShapeSource.mm in Sources */,
400533021DB0862B0069F638 /* NSArray+MGLAdditions.mm in Sources */,
+ 96036A03200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */,
35136D421D42274500C20EFD /* MGLRasterStyleLayer.mm in Sources */,
3538AA1F1D542239008EC33D /* MGLForegroundStyleLayer.mm in Sources */,
DA00FC901D5EEB0D009AABC8 /* MGLAttributionInfo.mm in Sources */,
@@ -2508,6 +2519,7 @@
3566C7691D4A77BA008152BC /* MGLShapeSource.mm in Sources */,
400533031DB086490069F638 /* NSArray+MGLAdditions.mm in Sources */,
35136D431D42274500C20EFD /* MGLRasterStyleLayer.mm in Sources */,
+ 96036A04200565C700510F3D /* NSOrthography+MGLAdditions.m in Sources */,
3538AA201D542239008EC33D /* MGLForegroundStyleLayer.mm in Sources */,
DA00FC911D5EEB0D009AABC8 /* MGLAttributionInfo.mm in Sources */,
DAA4E4201CBB730400178DFB /* MGLOfflinePack.mm in Sources */,
diff --git a/platform/ios/src/MGLMapAccessibilityElement.mm b/platform/ios/src/MGLMapAccessibilityElement.mm
index 1a2953b0bb..e9bec1fa12 100644
--- a/platform/ios/src/MGLMapAccessibilityElement.mm
+++ b/platform/ios/src/MGLMapAccessibilityElement.mm
@@ -7,6 +7,7 @@
#import "MGLVectorSource_Private.h"
#import "NSBundle+MGLAdditions.h"
+#import "NSOrthography+MGLAdditions.h"
@implementation MGLMapAccessibilityElement
@@ -49,24 +50,30 @@
NSString *languageCode = [MGLVectorSource preferredMapboxStreetsLanguage];
NSString *nameAttribute = [NSString stringWithFormat:@"name_%@", languageCode];
NSString *name = [feature attributeForKey:nameAttribute];
-
+
// If a feature hasn’t been translated into the preferred language, it
// may be in the local language, which may be written in another script.
- // Romanize it.
- NSLocale *locale = [NSLocale localeWithLocaleIdentifier:languageCode];
- NSOrthography *orthography;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunguarded-availability-new"
- if ([NSOrthography respondsToSelector:@selector(defaultOrthographyForLanguage:)]) {
- orthography = [NSOrthography defaultOrthographyForLanguage:locale.localeIdentifier];
- }
-#pragma clang diagnostic pop
-#endif
- if ([orthography.dominantScript isEqualToString:@"Latn"]) {
- name = [name stringByApplyingTransform:NSStringTransformToLatin reverse:NO];
+ // Attempt to transform to the script of the preferred language, keeping
+ // the original string if no transform exists or if transformation fails.
+ if (@available(iOS 9.0, *)) {
+ NSStringTransform transform;
+ NSString *dominantScript = [NSOrthography mgl_dominantScriptForMapboxStreetsLanguage:languageCode];
+
+ if ([dominantScript isEqualToString:@"Latn"]) {
+ transform = NSStringTransformToLatin;
+ } else if ([dominantScript isEqualToString:@"Hans"]) {
+ // Transform not available.
+ } else if ([dominantScript isEqualToString:@"Cyrl"]) {
+ transform = NSStringTransformLatinToCyrillic;
+ } else if ([dominantScript isEqualToString:@"Arab"]) {
+ transform = NSStringTransformLatinToArabic;
+ }
+
+ if (transform) {
+ name = [name stringByApplyingTransform:transform reverse:NO];
+ }
}
-
+
self.accessibilityLabel = name;
}
return self;
diff --git a/platform/ios/src/NSOrthography+MGLAdditions.h b/platform/ios/src/NSOrthography+MGLAdditions.h
new file mode 100644
index 0000000000..0fad954c8a
--- /dev/null
+++ b/platform/ios/src/NSOrthography+MGLAdditions.h
@@ -0,0 +1,7 @@
+#import <Foundation/Foundation.h>
+
+@interface NSOrthography (NSOrthography_MGLAdditions)
+
++ (NSString *)mgl_dominantScriptForMapboxStreetsLanguage:(NSString *)language;
+
+@end
diff --git a/platform/ios/src/NSOrthography+MGLAdditions.m b/platform/ios/src/NSOrthography+MGLAdditions.m
new file mode 100644
index 0000000000..f8b4f649b5
--- /dev/null
+++ b/platform/ios/src/NSOrthography+MGLAdditions.m
@@ -0,0 +1,33 @@
+#import "NSOrthography+MGLAdditions.h"
+
+@implementation NSOrthography (MGLAdditions)
+
++ (NSString *)mgl_dominantScriptForMapboxStreetsLanguage:(NSString *)language {
+ if (@available(iOS 11.0, *)) {
+ NSLocale *locale = [NSLocale localeWithLocaleIdentifier:language];
+ NSOrthography *orthography = [NSOrthography defaultOrthographyForLanguage:locale.localeIdentifier];
+
+ return orthography.dominantScript;
+ }
+
+ // Manually map Mapbox Streets languages to ISO 15924 script codes.
+ NSSet *latinLanguages = [NSSet setWithObjects:@"de", @"en", @"es", @"fr", @"pt", nil];
+ NSSet *hansLanaguages = [NSSet setWithObjects:@"zh", @"zh-Hans", nil];
+ NSSet *cyrillicLanguages = [NSSet setWithObjects:@"ru", nil];
+ NSSet *arabicLanguages = [NSSet setWithObjects:@"ar", nil];
+
+ if ([latinLanguages containsObject:language]) {
+ return @"Latn";
+ } else if ([hansLanaguages containsObject:language]) {
+ return @"Hans";
+ } else if ([cyrillicLanguages containsObject:language]) {
+ return @"Cyrl";
+ } else if ([arabicLanguages containsObject:language]) {
+ return @"Arab";
+ } else {
+ // Code for undetermined script
+ return @"Zyyy";
+ }
+}
+
+@end
diff --git a/platform/ios/test/MGLMapAccessibilityElementTests.m b/platform/ios/test/MGLMapAccessibilityElementTests.m
index 5c79d85de1..a04b80887c 100644
--- a/platform/ios/test/MGLMapAccessibilityElementTests.m
+++ b/platform/ios/test/MGLMapAccessibilityElementTests.m
@@ -19,13 +19,15 @@
};
MGLFeatureAccessibilityElement *element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature];
XCTAssertEqualObjects(element.accessibilityLabel, @"English", @"Accessibility label should be localized.");
-
- feature.attributes = @{
- @"name": @"Цинциннати",
- @"name_en": @"Цинциннати",
- };
- element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature];
- XCTAssertEqualObjects(element.accessibilityLabel, @"Cincinnati", @"Accessibility label should be romanized.");
+
+ if (@available(iOS 9.0, *)) {
+ feature.attributes = @{
+ @"name": @"Цинциннати",
+ @"name_en": @"Цинциннати",
+ };
+ element = [[MGLFeatureAccessibilityElement alloc] initWithAccessibilityContainer:self feature:feature];
+ XCTAssertEqualObjects(element.accessibilityLabel, @"Cincinnati", @"Accessibility label should be romanized.");
+ }
}
- (void)testPlaceFeatureValues {