diff options
author | Jason Wray <jason@mapbox.com> | 2018-01-09 16:09:41 -0500 |
---|---|---|
committer | Jason Wray <jason@mapbox.com> | 2018-01-10 14:25:27 -0500 |
commit | fe5f5cebf9f3979567b6c42a62ad10a8ee10102c (patch) | |
tree | 9408514a1a1f390b159758ecc237c9f4fd8ef81b | |
parent | 06033885b78eee2c4bb2cba476594f793cac5979 (diff) | |
download | qtlocation-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.pbxproj | 12 | ||||
-rw-r--r-- | platform/ios/src/MGLMapAccessibilityElement.mm | 37 | ||||
-rw-r--r-- | platform/ios/src/NSOrthography+MGLAdditions.h | 7 | ||||
-rw-r--r-- | platform/ios/src/NSOrthography+MGLAdditions.m | 33 | ||||
-rw-r--r-- | platform/ios/test/MGLMapAccessibilityElementTests.m | 16 |
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 { |