diff --git a/Wikipedia.xcodeproj/project.pbxproj b/Wikipedia.xcodeproj/project.pbxproj index 7799985366a..b054a2c492c 100644 --- a/Wikipedia.xcodeproj/project.pbxproj +++ b/Wikipedia.xcodeproj/project.pbxproj @@ -794,6 +794,8 @@ D8B9E2C81D7617C000A465FF /* WMFDatabaseDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E33F2B31D57E15300C6CF94 /* WMFDatabaseDataSource.m */; }; D8B9E2C91D7617C200A465FF /* MWKDataStore+WMFDataSources.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E01B2B31D5BFF13005E3134 /* MWKDataStore+WMFDataSources.h */; settings = {ATTRIBUTES = (Public, ); }; }; D8B9E2CA1D7617C900A465FF /* MWKDataStore+WMFDataSources.m in Sources */ = {isa = PBXBuildFile; fileRef = 0E01B2B41D5BFF13005E3134 /* MWKDataStore+WMFDataSources.m */; }; + D8BBBCDA1D9456AC00DECA36 /* NSLocale+WMFExtras.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0E804971C0CE0B40065EBC0 /* NSLocale+WMFExtras.swift */; }; + D8BBBCE11D94603800DECA36 /* WMFLocaleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D8BBBCE01D94603800DECA36 /* WMFLocaleTests.m */; }; D8C0C00B1D144FF30019374D /* WMFProxyServer.m in Sources */ = {isa = PBXBuildFile; fileRef = D8C0C00A1D144FF30019374D /* WMFProxyServer.m */; }; D8C9BFE81D6CC92C0084624F /* MWKLanguageLinkResponseSerializer.h in Headers */ = {isa = PBXBuildFile; fileRef = B0E8062D1C0CE7670065EBC0 /* MWKLanguageLinkResponseSerializer.h */; settings = {ATTRIBUTES = (Public, ); }; }; D8C9BFE91D6CC9310084624F /* MWKLanguageLinkResponseSerializer.m in Sources */ = {isa = PBXBuildFile; fileRef = B0E8062E1C0CE7670065EBC0 /* MWKLanguageLinkResponseSerializer.m */; }; @@ -2330,6 +2332,7 @@ D8AC39351D6F25A3007E3C14 /* WMFUtilities-global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "WMFUtilities-global.h"; path = "WMFUtilities/WMFUtilities-global.h"; sourceTree = SOURCE_ROOT; }; D8AC39361D6F25A3007E3C14 /* WMFUtilities-prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "WMFUtilities-prefix.pch"; path = "WMFUtilities/WMFUtilities-prefix.pch"; sourceTree = SOURCE_ROOT; }; D8AC39371D6F25A4007E3C14 /* WMFUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WMFUtilities.h; path = WMFUtilities/WMFUtilities.h; sourceTree = SOURCE_ROOT; }; + D8BBBCE01D94603800DECA36 /* WMFLocaleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMFLocaleTests.m; sourceTree = ""; }; D8C0C0091D144FF30019374D /* WMFProxyServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMFProxyServer.h; sourceTree = ""; }; D8C0C00A1D144FF30019374D /* WMFProxyServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WMFProxyServer.m; sourceTree = ""; }; D8CDBA9E1D11976D0004DE05 /* TableOfContentsAboutThisArticleItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TableOfContentsAboutThisArticleItem.swift; path = Wikipedia/Code/TableOfContentsAboutThisArticleItem.swift; sourceTree = SOURCE_ROOT; }; @@ -5094,6 +5097,7 @@ children = ( BCB669D11A83F6D300C7B1FE /* MediaWikiKitTests */, B0E808FC1C0D18730065EBC0 /* WMFJoinedPropertyParametersTests.m */, + D8BBBCE01D94603800DECA36 /* WMFLocaleTests.m */, D84649AC1D4514F7009DB4A0 /* WMFTaskGroupTests.m */, B0E808FE1C0D18800065EBC0 /* WMFErrorForApiErrorObjectTests.m */, B0E809001C0D188A0065EBC0 /* NSArray+PredicateTests.m */, @@ -6750,6 +6754,7 @@ D84649AD1D4514F7009DB4A0 /* WMFTaskGroupTests.m in Sources */, B0E808B61C0D17070065EBC0 /* LSStubResponseDSL+WithJSON.m in Sources */, B0E809371C0D1A420065EBC0 /* MWKLanguageLinkControllerTests.m in Sources */, + D8BBBCE11D94603800DECA36 /* WMFLocaleTests.m in Sources */, B0E809411C0D1A820065EBC0 /* NSURL+WMFLinkParsingTests.m in Sources */, B0E808981C0D16430065EBC0 /* XCTestCase+WMFLocaleTesting.m in Sources */, B0E809011C0D188B0065EBC0 /* NSArray+PredicateTests.m in Sources */, @@ -7075,6 +7080,7 @@ B0E806F51C0CEBB60065EBC0 /* ReferencesVC.m in Sources */, D81FB2691D47B5DC0000C685 /* WMFCVLInvalidationContext.m in Sources */, B0E804411C0CDF850065EBC0 /* MenuButton.m in Sources */, + D8BBBCDA1D9456AC00DECA36 /* NSLocale+WMFExtras.swift in Sources */, B0E804BA1C0CE0B40065EBC0 /* BITHockeyManager+WMFExtensions.m in Sources */, D84692E01D5E1E3F000A7058 /* WMFTableOfContentsHeader.swift in Sources */, B0E8070A1C0CEBDA0065EBC0 /* WMFShareCardImageContainer.m in Sources */, diff --git a/Wikipedia.xcodeproj/xcshareddata/xcschemes/Wikipedia.xcscheme b/Wikipedia.xcodeproj/xcshareddata/xcschemes/Wikipedia.xcscheme index 5fff8f39f80..1564b7b7845 100644 --- a/Wikipedia.xcodeproj/xcshareddata/xcschemes/Wikipedia.xcscheme +++ b/Wikipedia.xcodeproj/xcshareddata/xcschemes/Wikipedia.xcscheme @@ -117,14 +117,6 @@ argument = "-WMFVisualTestBatchRecordMode NO" isEnabled = "YES"> - - - - @implementation AFHTTPRequestSerializer (WMFRequestHeaders) @@ -13,6 +14,8 @@ - (void)wmf_applyAppRequestHeaders { ReadingActionFunnel *funnel = [[ReadingActionFunnel alloc] init]; [self setValue:funnel.appInstallID forHTTPHeaderField:@"X-WMF-UUID"]; } + + [self setValue:[NSLocale wmf_acceptLanguageHeaderForPreferredLanguages] forHTTPHeaderField:@"Accept-Language"]; } @end diff --git a/Wikipedia/Code/NSLocale+WMFExtras.swift b/Wikipedia/Code/NSLocale+WMFExtras.swift index b29c58a7902..1c1e0e0b0a4 100644 --- a/Wikipedia/Code/NSLocale+WMFExtras.swift +++ b/Wikipedia/Code/NSLocale+WMFExtras.swift @@ -7,7 +7,61 @@ extension NSLocale { } return (langCode == "en" || langCode.hasPrefix("en-")) ? true : false; } + public func wmf_localizedLanguageNameForCode(code: String) -> String? { return self.displayNameForKey(NSLocaleLanguageCode, value: code) } + + public class func wmf_uniqueLanguageCodesForLanguages(languages: [String]) -> [String] { + var uniqueLanguageCodes = [String]() + for preferredLanguage in languages { + var components = preferredLanguage.componentsSeparatedByString("-") + if components.count > 1 { + components.removeAtIndex(components.count - 1) + } + let languageCode = components.joinWithSeparator("-").lowercaseString + if uniqueLanguageCodes.contains(languageCode) { + continue + } + uniqueLanguageCodes.append(languageCode) + } + return uniqueLanguageCodes + } + + public class var wmf_preferredLanguageCodes: [String] { + get { + return wmf_uniqueLanguageCodesForLanguages(preferredLanguages()) + } + } + + public class func wmf_acceptLanguageHeaderForLanguageCodes(languageCodes: [String]) -> String { + let count: Double = Double(languageCodes.count) + var q: Double = 1.0 + let qDelta = 1.0/count + var acceptLanguageString = "" + for languageCode in languageCodes { + if q < 1.0 { + acceptLanguageString += ", " + } + acceptLanguageString += languageCode + if q < 1.0 { + acceptLanguageString += String(format: ";q=%.2g", q) + } + q -= qDelta + } + return acceptLanguageString + } + + public class var wmf_acceptLanguageHeaderForPreferredLanguages: String { + get { + struct Once { + static var token: dispatch_once_t = 0 + static var header: String = "" + } + dispatch_once(&Once.token) { + Once.header = wmf_acceptLanguageHeaderForLanguageCodes(wmf_preferredLanguageCodes) + } + return Once.header + } + } } diff --git a/WikipediaUnitTests/Code/WMFLocaleTests.m b/WikipediaUnitTests/Code/WMFLocaleTests.m new file mode 100644 index 00000000000..1cc409569ea --- /dev/null +++ b/WikipediaUnitTests/Code/WMFLocaleTests.m @@ -0,0 +1,19 @@ +#import +#import + +@interface WMFLocaleTests : XCTestCase + +@end + +@implementation WMFLocaleTests + +- (void)testLocaleHeaders { + NSArray *languages = [NSLocale wmf_uniqueLanguageCodesForLanguages:@[@"en-US", @"zh-Hans-US", @"zh-Hant-US", @"en-GB"]]; + NSArray *expectedResult = @[@"en", @"zh-hans", @"zh-hant"]; + XCTAssert([languages isEqualToArray:expectedResult]); + + NSString *header = [NSLocale wmf_acceptLanguageHeaderForLanguageCodes:languages]; + XCTAssert([header isEqualToString:@"en, zh-hans;q=0.67, zh-hant;q=0.33"]); +} + +@end