From bc501b16f2561665179e601315bed99ed714162a Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 18 May 2017 16:05:51 -0400 Subject: [PATCH] Let users manually specify the domain fronting country. // FREEBIE --- Signal.xcodeproj/project.pbxproj | 12 + .../AdvancedSettingsTableViewController.m | 69 +- .../DomainFrontingCountryViewController.h | 13 + .../DomainFrontingCountryViewController.m | 109 +++ .../src/ViewControllers/OWSCountryMetadata.h | 21 + .../src/ViewControllers/OWSCountryMetadata.m | 844 ++++++++++++++++++ .../translations/en.lproj/Localizable.strings | 11 +- 7 files changed, 1077 insertions(+), 2 deletions(-) create mode 100644 Signal/src/ViewControllers/DomainFrontingCountryViewController.h create mode 100644 Signal/src/ViewControllers/DomainFrontingCountryViewController.m create mode 100644 Signal/src/ViewControllers/OWSCountryMetadata.h create mode 100644 Signal/src/ViewControllers/OWSCountryMetadata.m diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index bd24f5e7d..706feab1b 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 3456710A1E8A9F5D006EE662 /* TSGenericAttachmentAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 345671091E8A9F5D006EE662 /* TSGenericAttachmentAdapter.m */; }; 3471B1DA1EB7C63600F6AEC8 /* NewNonContactConversationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3471B1D91EB7C63600F6AEC8 /* NewNonContactConversationViewController.m */; }; 3472229F1EB22FFE00E53955 /* AddToGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3472229E1EB22FFE00E53955 /* AddToGroupViewController.m */; }; + 3497DBEC1ECE257500DB2605 /* OWSCountryMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 3497DBEB1ECE257500DB2605 /* OWSCountryMetadata.m */; }; + 3497DBEF1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3497DBEE1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m */; }; 34B3F8711E8DF1700035BE1A /* AboutTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F8351E8DF1700035BE1A /* AboutTableViewController.m */; }; 34B3F8721E8DF1700035BE1A /* AdvancedSettingsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F8371E8DF1700035BE1A /* AdvancedSettingsTableViewController.m */; }; 34B3F8731E8DF1700035BE1A /* AttachmentApprovalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F8381E8DF1700035BE1A /* AttachmentApprovalViewController.swift */; }; @@ -396,6 +398,10 @@ 3471B1D91EB7C63600F6AEC8 /* NewNonContactConversationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewNonContactConversationViewController.m; sourceTree = ""; }; 3472229D1EB22FFE00E53955 /* AddToGroupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddToGroupViewController.h; sourceTree = ""; }; 3472229E1EB22FFE00E53955 /* AddToGroupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddToGroupViewController.m; sourceTree = ""; }; + 3497DBEA1ECE257500DB2605 /* OWSCountryMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSCountryMetadata.h; sourceTree = ""; }; + 3497DBEB1ECE257500DB2605 /* OWSCountryMetadata.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSCountryMetadata.m; sourceTree = ""; }; + 3497DBED1ECE2E4700DB2605 /* DomainFrontingCountryViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DomainFrontingCountryViewController.h; sourceTree = ""; }; + 3497DBEE1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DomainFrontingCountryViewController.m; sourceTree = ""; }; 34B3F8341E8DF1700035BE1A /* AboutTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutTableViewController.h; sourceTree = ""; }; 34B3F8351E8DF1700035BE1A /* AboutTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutTableViewController.m; sourceTree = ""; }; 34B3F8361E8DF1700035BE1A /* AdvancedSettingsTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdvancedSettingsTableViewController.h; sourceTree = ""; }; @@ -898,6 +904,8 @@ 34B3F8401E8DF1700035BE1A /* CountryCodeViewController.h */, 34B3F8411E8DF1700035BE1A /* CountryCodeViewController.m */, 34D8C0221ED3673300188D7C /* DebugUI */, + 3497DBED1ECE2E4700DB2605 /* DomainFrontingCountryViewController.h */, + 3497DBEE1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m */, 34B3F8441E8DF1700035BE1A /* ExperienceUpgradesPageViewController.swift */, 34B3F8451E8DF1700035BE1A /* FingerprintViewController.h */, 34B3F8461E8DF1700035BE1A /* FingerprintViewController.m */, @@ -930,6 +938,8 @@ 34B3F85B1E8DF1700035BE1A /* OWSConversationSettingsTableViewController.h */, 34B3F85C1E8DF1700035BE1A /* OWSConversationSettingsTableViewController.m */, 34D5CCAB1EAE7136005515DB /* OWSConversationSettingsViewDelegate.h */, + 3497DBEA1ECE257500DB2605 /* OWSCountryMetadata.h */, + 3497DBEB1ECE257500DB2605 /* OWSCountryMetadata.m */, 34B3F85D1E8DF1700035BE1A /* OWSLinkDeviceViewController.h */, 34B3F85E1E8DF1700035BE1A /* OWSLinkDeviceViewController.m */, 34B3F85F1E8DF1700035BE1A /* OWSLinkedDevicesTableViewController.h */, @@ -2113,6 +2123,7 @@ 45E615161E8C590B0018AD52 /* DisplayableTextFilter.swift in Sources */, 34B3F88A1E8DF1700035BE1A /* OWSLinkDeviceViewController.m in Sources */, 76EB068618170B34006006FC /* ContactTableViewCell.m in Sources */, + 3497DBEF1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m in Sources */, 34B3F8881E8DF1700035BE1A /* OversizeTextMessageViewController.swift in Sources */, 34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */, 34B3F8A21E8EA6040035BE1A /* ViewControllerUtils.m in Sources */, @@ -2130,6 +2141,7 @@ 450573FE1E78A06D00615BB4 /* OWS103EnableVideoCalling.m in Sources */, 34B3F8751E8DF1700035BE1A /* CallViewController.swift in Sources */, 34D8C0281ED3673300188D7C /* DebugUITableViewController.m in Sources */, + 3497DBEC1ECE257500DB2605 /* OWSCountryMetadata.m in Sources */, 34B3F8851E8DF1700035BE1A /* NewGroupViewController.m in Sources */, B6C93C4E199567AD00EDF894 /* DebugLogger.m in Sources */, 34D8C0271ED3673300188D7C /* DebugUIMessages.m in Sources */, diff --git a/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m b/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m index 7c751ff95..a7a4db3e0 100644 --- a/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m +++ b/Signal/src/ViewControllers/AdvancedSettingsTableViewController.m @@ -4,7 +4,9 @@ #import "AdvancedSettingsTableViewController.h" #import "DebugLogger.h" +#import "DomainFrontingCountryViewController.h" #import "Environment.h" +#import "OWSCountryMetadata.h" #import "Pastelog.h" #import "PropertyListPreferences.h" #import "PushManager.h" @@ -84,6 +86,13 @@ NS_ASSUME_NONNULL_BEGIN [self updateTableContents]; } +- (void)viewWillAppear:(BOOL)animated +{ + [super viewWillAppear:animated]; + + [self updateTableContents]; +} + #pragma mark - Table Contents - (void)updateTableContents @@ -161,7 +170,7 @@ NS_ASSUME_NONNULL_BEGIN [censorshipSection addItem:[OWSTableItem itemWithCustomCellBlock:^{ UITableViewCell *cell = [UITableViewCell new]; cell.textLabel.text = NSLocalizedString( - @"SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION", @"Label for the 'censorship circumvention' switch."); + @"SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION", @"Label for the 'manual censorship circumvention' switch."); cell.textLabel.font = [UIFont ows_regularFontWithSize:18.f]; cell.textLabel.textColor = [UIColor blackColor]; @@ -193,11 +202,69 @@ NS_ASSUME_NONNULL_BEGIN return cell; } actionBlock:nil]]; + + if (OWSSignalService.sharedInstance.isCensorshipCircumventionManuallyActivated) { + [censorshipSection addItem:[OWSTableItem itemWithCustomCellBlock:^{ + OWSCountryMetadata *manualCensorshipCircumventionCountry = + [weakSelf ensureManualCensorshipCircumventionCountry]; + OWSAssert(manualCensorshipCircumventionCountry); + + UITableViewCell *cell = [UITableViewCell new]; + cell.textLabel.text = [NSString + stringWithFormat:NSLocalizedString(@"SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION_COUNTRY_FORMAT", + @"Label for the 'manual censorship circumvention' country. Embeds {{the manual " + @"censorship circumvention country}}."), + manualCensorshipCircumventionCountry.localizedCountryName]; + cell.textLabel.font = [UIFont ows_regularFontWithSize:18.f]; + cell.textLabel.textColor = [UIColor blackColor]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + return cell; + } + actionBlock:^{ + [weakSelf showDomainFrontingCountryView]; + }]]; + } [contents addSection:censorshipSection]; self.contents = contents; } +- (void)showDomainFrontingCountryView +{ + DomainFrontingCountryViewController *vc = [DomainFrontingCountryViewController new]; + [self.navigationController pushViewController:vc animated:YES]; +} + +- (OWSCountryMetadata *)ensureManualCensorshipCircumventionCountry +{ + OWSCountryMetadata *countryMetadata = nil; + NSString *countryCode = OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode; + if (countryCode) { + countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; + } + + if (!countryMetadata) { + countryCode = [NSLocale.currentLocale objectForKey:NSLocaleCountryCode]; + if (countryCode) { + countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; + } + } + + if (!countryMetadata) { + countryCode = @"US"; + countryMetadata = [OWSCountryMetadata countryMetadataForCountryCode:countryCode]; + OWSAssert(countryMetadata); + } + + if (countryMetadata) { + // Ensure the "manual censorship circumvention" country state is in sync. + OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode = countryCode; + OWSSignalService.sharedInstance.manualCensorshipCircumventionDomain = countryMetadata.googleDomain; + } + + return countryMetadata; +} + #pragma mark - Actions - (void)syncPushTokens diff --git a/Signal/src/ViewControllers/DomainFrontingCountryViewController.h b/Signal/src/ViewControllers/DomainFrontingCountryViewController.h new file mode 100644 index 000000000..c1be0ccfe --- /dev/null +++ b/Signal/src/ViewControllers/DomainFrontingCountryViewController.h @@ -0,0 +1,13 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface DomainFrontingCountryViewController : UIViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/ViewControllers/DomainFrontingCountryViewController.m b/Signal/src/ViewControllers/DomainFrontingCountryViewController.m new file mode 100644 index 000000000..3ed7b37d3 --- /dev/null +++ b/Signal/src/ViewControllers/DomainFrontingCountryViewController.m @@ -0,0 +1,109 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "DomainFrontingCountryViewController.h" +#import "OWSCountryMetadata.h" +#import "OWSTableViewController.h" +#import "UIFont+OWS.h" +#import "UIView+OWS.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +#pragma mark - + +@interface DomainFrontingCountryViewController () + +@property (nonatomic, readonly) OWSTableViewController *tableViewController; + +@end + +#pragma mark - + +@implementation DomainFrontingCountryViewController + +- (void)loadView +{ + [super loadView]; + + self.title + = NSLocalizedString(@"DOMAIN_FRONTING_COUNTRY_VIEW_TITLE", @"Title for the 'domain fronting country' view."); + + self.view.backgroundColor = [UIColor whiteColor]; + [self.navigationController.navigationBar setTranslucent:NO]; + + [self createViews]; +} + +- (void)createViews +{ + _tableViewController = [OWSTableViewController new]; + [self.view addSubview:self.tableViewController.view]; + [_tableViewController.view autoPinWidthToSuperview]; + [_tableViewController.view autoPinToTopLayoutGuideOfViewController:self withInset:0]; + [_tableViewController.view autoPinToBottomLayoutGuideOfViewController:self withInset:0]; + + [self updateTableContents]; +} + +#pragma mark - Table Contents + +- (void)updateTableContents +{ + OWSTableContents *contents = [OWSTableContents new]; + + NSString *currentCountryCode = OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode; + + __weak DomainFrontingCountryViewController *weakSelf = self; + + OWSTableSection *section = [OWSTableSection new]; + section.headerTitle = NSLocalizedString( + @"DOMAIN_FRONTING_COUNTRY_VIEW_SECTION_HEADER", @"Section title for the 'domain fronting country' view."); + for (OWSCountryMetadata *countryMetadata in [OWSCountryMetadata allCountryMetadatas]) { + [section addItem:[OWSTableItem itemWithCustomCellBlock:^{ + UITableViewCell *cell = [UITableViewCell new]; + cell.textLabel.text = countryMetadata.localizedCountryName; + cell.textLabel.font = [UIFont ows_regularFontWithSize:18.f]; + cell.textLabel.textColor = [UIColor blackColor]; + + if ([countryMetadata.countryCode isEqualToString:currentCountryCode]) { + cell.accessoryType = UITableViewCellAccessoryCheckmark; + } + + return cell; + } + actionBlock:^{ + [weakSelf selectCountry:countryMetadata]; + }]]; + } + [contents addSection:section]; + + self.tableViewController.contents = contents; +} + +- (void)selectCountry:(OWSCountryMetadata *)countryMetadata +{ + OWSAssert(countryMetadata); + + OWSSignalService.sharedInstance.manualCensorshipCircumventionCountryCode = countryMetadata.countryCode; + OWSSignalService.sharedInstance.manualCensorshipCircumventionDomain = countryMetadata.googleDomain; + + [self.navigationController popViewControllerAnimated:YES]; +} + +#pragma mark - Logging + ++ (NSString *)tag +{ + return [NSString stringWithFormat:@"[%@]", self.class]; +} + +- (NSString *)tag +{ + return self.class.tag; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/ViewControllers/OWSCountryMetadata.h b/Signal/src/ViewControllers/OWSCountryMetadata.h new file mode 100644 index 000000000..3b42068aa --- /dev/null +++ b/Signal/src/ViewControllers/OWSCountryMetadata.h @@ -0,0 +1,21 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSCountryMetadata : NSObject + +@property (nonatomic) NSString *name; +@property (nonatomic) NSString *tld; +@property (nonatomic) NSString *googleDomain; +@property (nonatomic) NSString *countryCode; +@property (nonatomic) NSString *localizedCountryName; + ++ (OWSCountryMetadata *)countryMetadataForCountryCode:(NSString *)countryCode; + ++ (NSArray *)allCountryMetadatas; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/ViewControllers/OWSCountryMetadata.m b/Signal/src/ViewControllers/OWSCountryMetadata.m new file mode 100644 index 000000000..3ae0b22a6 --- /dev/null +++ b/Signal/src/ViewControllers/OWSCountryMetadata.m @@ -0,0 +1,844 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSCountryMetadata.h" + +NS_ASSUME_NONNULL_BEGIN + +@implementation OWSCountryMetadata + ++ (OWSCountryMetadata *)countryMetadataWithName:(NSString *)name + tld:(NSString *)tld + googleDomain:(NSString *)googleDomain + countryCode:(NSString *)countryCode +{ + OWSAssert(name.length > 0); + OWSAssert(tld.length > 0); + OWSAssert(googleDomain.length > 0); + OWSAssert(countryCode.length > 0); + + OWSCountryMetadata *instance = [OWSCountryMetadata new]; + instance.name = name; + instance.tld = tld; + instance.googleDomain = googleDomain; + instance.countryCode = countryCode; + + NSString *localizedCountryName = [[NSLocale currentLocale] localizedStringForCountryCode:countryCode]; + if (localizedCountryName.length < 1) { + localizedCountryName = name; + } + instance.localizedCountryName = localizedCountryName; + + return instance; +} + ++ (OWSCountryMetadata *)countryMetadataForCountryCode:(NSString *)countryCode +{ + OWSAssert(countryCode.length > 0); + + return [self countryCodeToCountryMetadataMap][countryCode]; +} + ++ (NSDictionary *)countryCodeToCountryMetadataMap +{ + static NSDictionary *cachedValue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSMutableDictionary *map = [NSMutableDictionary new]; + for (OWSCountryMetadata *metadata in [self allCountryMetadatas]) { + map[metadata.countryCode] = metadata; + } + cachedValue = map; + }); + return cachedValue; +} + ++ (NSArray *)allCountryMetadatas +{ + static NSArray *cachedValue = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + // This list is derived from: + // + // * https://en.wikipedia.org/wiki/List_of_Google_domains + // * https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 + cachedValue = @[ + [OWSCountryMetadata countryMetadataWithName:@"Andorra" + tld:@".ad" + googleDomain:@"google.ad" + countryCode:@"AD"], + [OWSCountryMetadata countryMetadataWithName:@"United Arab Emirates" + tld:@".ae" + googleDomain:@"google.ae" + countryCode:@"AE"], + [OWSCountryMetadata countryMetadataWithName:@"Afghanistan" + tld:@".af" + googleDomain:@"google.com.af" + countryCode:@"AF"], + [OWSCountryMetadata countryMetadataWithName:@"Antigua and Barbuda" + tld:@".ag" + googleDomain:@"google.com.ag" + countryCode:@"AG"], + [OWSCountryMetadata countryMetadataWithName:@"Anguilla" + tld:@".ai" + googleDomain:@"google.com.ai" + countryCode:@"AI"], + [OWSCountryMetadata countryMetadataWithName:@"Albania" + tld:@".al" + googleDomain:@"google.al" + countryCode:@"AL"], + [OWSCountryMetadata countryMetadataWithName:@"Armenia" + tld:@".am" + googleDomain:@"google.am" + countryCode:@"AM"], + [OWSCountryMetadata countryMetadataWithName:@"Angola" + tld:@".ao" + googleDomain:@"google.co.ao" + countryCode:@"AO"], + [OWSCountryMetadata countryMetadataWithName:@"Argentina" + tld:@".ar" + googleDomain:@"google.com.ar" + countryCode:@"AR"], + [OWSCountryMetadata countryMetadataWithName:@"American Samoa" + tld:@".as" + googleDomain:@"google.as" + countryCode:@"AS"], + [OWSCountryMetadata countryMetadataWithName:@"Austria" + tld:@".at" + googleDomain:@"google.at" + countryCode:@"AT"], + [OWSCountryMetadata countryMetadataWithName:@"Australia" + tld:@".au" + googleDomain:@"google.com.au" + countryCode:@"AU"], + [OWSCountryMetadata countryMetadataWithName:@"Azerbaijan" + tld:@".az" + googleDomain:@"google.az" + countryCode:@"AZ"], + [OWSCountryMetadata countryMetadataWithName:@"Bosnia and Herzegovina" + tld:@".ba" + googleDomain:@"google.ba" + countryCode:@"BA"], + [OWSCountryMetadata countryMetadataWithName:@"Bangladesh" + tld:@".bd" + googleDomain:@"google.com.bd" + countryCode:@"BD"], + [OWSCountryMetadata countryMetadataWithName:@"Belgium" + tld:@".be" + googleDomain:@"google.be" + countryCode:@"BE"], + [OWSCountryMetadata countryMetadataWithName:@"Burkina Faso" + tld:@".bf" + googleDomain:@"google.bf" + countryCode:@"BF"], + [OWSCountryMetadata countryMetadataWithName:@"Bulgaria" + tld:@".bg" + googleDomain:@"google.bg" + countryCode:@"BG"], + [OWSCountryMetadata countryMetadataWithName:@"Bahrain" + tld:@".bh" + googleDomain:@"google.com.bh" + countryCode:@"BH"], + [OWSCountryMetadata countryMetadataWithName:@"Burundi" + tld:@".bi" + googleDomain:@"google.bi" + countryCode:@"BI"], + [OWSCountryMetadata countryMetadataWithName:@"Benin" + tld:@".bj" + googleDomain:@"google.bj" + countryCode:@"BJ"], + [OWSCountryMetadata countryMetadataWithName:@"Brunei" + tld:@".bn" + googleDomain:@"google.com.bn" + countryCode:@"BN"], + [OWSCountryMetadata countryMetadataWithName:@"Bolivia" + tld:@".bo" + googleDomain:@"google.com.bo" + countryCode:@"BO"], + [OWSCountryMetadata countryMetadataWithName:@"Brazil" + tld:@".br" + googleDomain:@"google.com.br" + countryCode:@"BR"], + [OWSCountryMetadata countryMetadataWithName:@"Bahamas" + tld:@".bs" + googleDomain:@"google.bs" + countryCode:@"BS"], + [OWSCountryMetadata countryMetadataWithName:@"Bhutan" + tld:@".bt" + googleDomain:@"google.bt" + countryCode:@"BT"], + [OWSCountryMetadata countryMetadataWithName:@"Botswana" + tld:@".bw" + googleDomain:@"google.co.bw" + countryCode:@"BW"], + [OWSCountryMetadata countryMetadataWithName:@"Belarus" + tld:@".by" + googleDomain:@"google.by" + countryCode:@"BY"], + [OWSCountryMetadata countryMetadataWithName:@"Belize" + tld:@".bz" + googleDomain:@"google.com.bz" + countryCode:@"BZ"], + [OWSCountryMetadata countryMetadataWithName:@"Canada" + tld:@".ca" + googleDomain:@"google.ca" + countryCode:@"CA"], + [OWSCountryMetadata countryMetadataWithName:@"Cambodia" + tld:@".kh" + googleDomain:@"google.com.kh" + countryCode:@"KH"], + [OWSCountryMetadata countryMetadataWithName:@"Cocos (Keeling) Islands" + tld:@".cc" + googleDomain:@"google.cc" + countryCode:@"CC"], + [OWSCountryMetadata countryMetadataWithName:@"Democratic Republic of the Congo" + tld:@".cd" + googleDomain:@"google.cd" + countryCode:@"CD"], + [OWSCountryMetadata countryMetadataWithName:@"Central African Republic" + tld:@".cf" + googleDomain:@"google.cf" + countryCode:@"CF"], + [OWSCountryMetadata countryMetadataWithName:@"Republic of the Congo" + tld:@".cg" + googleDomain:@"google.cg" + countryCode:@"CG"], + [OWSCountryMetadata countryMetadataWithName:@"Switzerland" + tld:@".ch" + googleDomain:@"google.ch" + countryCode:@"CH"], + [OWSCountryMetadata countryMetadataWithName:@"Ivory Coast" + tld:@".ci" + googleDomain:@"google.ci" + countryCode:@"CI"], + [OWSCountryMetadata countryMetadataWithName:@"Cook Islands" + tld:@".ck" + googleDomain:@"google.co.ck" + countryCode:@"CK"], + [OWSCountryMetadata countryMetadataWithName:@"Chile" + tld:@".cl" + googleDomain:@"google.cl" + countryCode:@"CL"], + [OWSCountryMetadata countryMetadataWithName:@"Cameroon" + tld:@".cm" + googleDomain:@"google.cm" + countryCode:@"CM"], + [OWSCountryMetadata countryMetadataWithName:@"China" + tld:@".cn" + googleDomain:@"google.cn" + countryCode:@"CN"], + [OWSCountryMetadata countryMetadataWithName:@"Colombia" + tld:@".co" + googleDomain:@"google.co" + countryCode:@"CO"], + [OWSCountryMetadata countryMetadataWithName:@"Costa Rica" + tld:@".cr" + googleDomain:@"google.co.cr" + countryCode:@"CR"], + [OWSCountryMetadata countryMetadataWithName:@"Cuba" + tld:@".cu" + googleDomain:@"google.com.cu" + countryCode:@"CU"], + [OWSCountryMetadata countryMetadataWithName:@"Cape Verde" + tld:@".cv" + googleDomain:@"google.cv" + countryCode:@"CV"], + [OWSCountryMetadata countryMetadataWithName:@"Christmas Island" + tld:@".cx" + googleDomain:@"google.cx" + countryCode:@"CX"], + [OWSCountryMetadata countryMetadataWithName:@"Cyprus" + tld:@".cy" + googleDomain:@"google.com.cy" + countryCode:@"CY"], + [OWSCountryMetadata countryMetadataWithName:@"Czech Republic" + tld:@".cz" + googleDomain:@"google.cz" + countryCode:@"CZ"], + [OWSCountryMetadata countryMetadataWithName:@"Germany" + tld:@".de" + googleDomain:@"google.de" + countryCode:@"DE"], + [OWSCountryMetadata countryMetadataWithName:@"Djibouti" + tld:@".dj" + googleDomain:@"google.dj" + countryCode:@"DJ"], + [OWSCountryMetadata countryMetadataWithName:@"Denmark" + tld:@".dk" + googleDomain:@"google.dk" + countryCode:@"DK"], + [OWSCountryMetadata countryMetadataWithName:@"Dominica" + tld:@".dm" + googleDomain:@"google.dm" + countryCode:@"DM"], + [OWSCountryMetadata countryMetadataWithName:@"Dominican Republic" + tld:@".do" + googleDomain:@"google.com.do" + countryCode:@"DO"], + [OWSCountryMetadata countryMetadataWithName:@"Algeria" + tld:@".dz" + googleDomain:@"google.dz" + countryCode:@"DZ"], + [OWSCountryMetadata countryMetadataWithName:@"Ecuador" + tld:@".ec" + googleDomain:@"google.com.ec" + countryCode:@"EC"], + [OWSCountryMetadata countryMetadataWithName:@"Estonia" + tld:@".ee" + googleDomain:@"google.ee" + countryCode:@"EE"], + [OWSCountryMetadata countryMetadataWithName:@"Egypt" + tld:@".eg" + googleDomain:@"google.com.eg" + countryCode:@"EG"], + [OWSCountryMetadata countryMetadataWithName:@"Spain" + tld:@".es" + googleDomain:@"google.es" + countryCode:@"ES"], + [OWSCountryMetadata countryMetadataWithName:@"Ethiopia" + tld:@".et" + googleDomain:@"google.com.et" + countryCode:@"ET"], + [OWSCountryMetadata countryMetadataWithName:@"Finland" + tld:@".fi" + googleDomain:@"google.fi" + countryCode:@"FI"], + [OWSCountryMetadata countryMetadataWithName:@"Fiji" + tld:@".fj" + googleDomain:@"google.com.fj" + countryCode:@"FJ"], + [OWSCountryMetadata countryMetadataWithName:@"Federated States of Micronesia" + tld:@".fm" + googleDomain:@"google.fm" + countryCode:@"FM"], + [OWSCountryMetadata countryMetadataWithName:@"France" + tld:@".fr" + googleDomain:@"google.fr" + countryCode:@"FR"], + [OWSCountryMetadata countryMetadataWithName:@"Gabon" + tld:@".ga" + googleDomain:@"google.ga" + countryCode:@"GA"], + [OWSCountryMetadata countryMetadataWithName:@"Georgia" + tld:@".ge" + googleDomain:@"google.ge" + countryCode:@"GE"], + [OWSCountryMetadata countryMetadataWithName:@"French Guiana" + tld:@".gf" + googleDomain:@"google.gf" + countryCode:@"GF"], + [OWSCountryMetadata countryMetadataWithName:@"Guernsey" + tld:@".gg" + googleDomain:@"google.gg" + countryCode:@"GG"], + [OWSCountryMetadata countryMetadataWithName:@"Ghana" + tld:@".gh" + googleDomain:@"google.com.gh" + countryCode:@"GH"], + [OWSCountryMetadata countryMetadataWithName:@"Gibraltar" + tld:@".gi" + googleDomain:@"google.com.gi" + countryCode:@"GI"], + [OWSCountryMetadata countryMetadataWithName:@"Greenland" + tld:@".gl" + googleDomain:@"google.gl" + countryCode:@"GL"], + [OWSCountryMetadata countryMetadataWithName:@"Gambia" + tld:@".gm" + googleDomain:@"google.gm" + countryCode:@"GM"], + [OWSCountryMetadata countryMetadataWithName:@"Guadeloupe" + tld:@".gp" + googleDomain:@"google.gp" + countryCode:@"GP"], + [OWSCountryMetadata countryMetadataWithName:@"Greece" + tld:@".gr" + googleDomain:@"google.gr" + countryCode:@"GR"], + [OWSCountryMetadata countryMetadataWithName:@"Guatemala" + tld:@".gt" + googleDomain:@"google.com.gt" + countryCode:@"GT"], + [OWSCountryMetadata countryMetadataWithName:@"Guyana" + tld:@".gy" + googleDomain:@"google.gy" + countryCode:@"GY"], + [OWSCountryMetadata countryMetadataWithName:@"Hong Kong" + tld:@".hk" + googleDomain:@"google.com.hk" + countryCode:@"HK"], + [OWSCountryMetadata countryMetadataWithName:@"Honduras" + tld:@".hn" + googleDomain:@"google.hn" + countryCode:@"HN"], + [OWSCountryMetadata countryMetadataWithName:@"Croatia" + tld:@".hr" + googleDomain:@"google.hr" + countryCode:@"HR"], + [OWSCountryMetadata countryMetadataWithName:@"Haiti" + tld:@".ht" + googleDomain:@"google.ht" + countryCode:@"HT"], + [OWSCountryMetadata countryMetadataWithName:@"Hungary" + tld:@".hu" + googleDomain:@"google.hu" + countryCode:@"HU"], + [OWSCountryMetadata countryMetadataWithName:@"Indonesia" + tld:@".id" + googleDomain:@"google.co.id" + countryCode:@"ID"], + [OWSCountryMetadata countryMetadataWithName:@"Iraq" tld:@".iq" googleDomain:@"google.iq" countryCode:@"IQ"], + [OWSCountryMetadata countryMetadataWithName:@"Ireland" + tld:@".ie" + googleDomain:@"google.ie" + countryCode:@"IE"], + [OWSCountryMetadata countryMetadataWithName:@"Israel" + tld:@".il" + googleDomain:@"google.co.il" + countryCode:@"IL"], + [OWSCountryMetadata countryMetadataWithName:@"Isle of Man" + tld:@".im" + googleDomain:@"google.im" + countryCode:@"IM"], + [OWSCountryMetadata countryMetadataWithName:@"India" + tld:@".in" + googleDomain:@"google.co.in" + countryCode:@"IN"], + [OWSCountryMetadata countryMetadataWithName:@"British Indian Ocean Territory" + tld:@".io" + googleDomain:@"google.io" + countryCode:@"IO"], + [OWSCountryMetadata countryMetadataWithName:@"Iceland" + tld:@".is" + googleDomain:@"google.is" + countryCode:@"IS"], + [OWSCountryMetadata countryMetadataWithName:@"Italy" + tld:@".it" + googleDomain:@"google.it" + countryCode:@"IT"], + [OWSCountryMetadata countryMetadataWithName:@"Jersey" + tld:@".je" + googleDomain:@"google.je" + countryCode:@"JE"], + [OWSCountryMetadata countryMetadataWithName:@"Jamaica" + tld:@".jm" + googleDomain:@"google.com.jm" + countryCode:@"JM"], + [OWSCountryMetadata countryMetadataWithName:@"Jordan" + tld:@".jo" + googleDomain:@"google.jo" + countryCode:@"JO"], + [OWSCountryMetadata countryMetadataWithName:@"Japan" + tld:@".jp" + googleDomain:@"google.co.jp" + countryCode:@"JP"], + [OWSCountryMetadata countryMetadataWithName:@"Kenya" + tld:@".ke" + googleDomain:@"google.co.ke" + countryCode:@"KE"], + [OWSCountryMetadata countryMetadataWithName:@"Kiribati" + tld:@".ki" + googleDomain:@"google.ki" + countryCode:@"KI"], + [OWSCountryMetadata countryMetadataWithName:@"Kyrgyzstan" + tld:@".kg" + googleDomain:@"google.kg" + countryCode:@"KG"], + [OWSCountryMetadata countryMetadataWithName:@"South Korea" + tld:@".kr" + googleDomain:@"google.co.kr" + countryCode:@"KR"], + [OWSCountryMetadata countryMetadataWithName:@"Kuwait" + tld:@".kw" + googleDomain:@"google.com.kw" + countryCode:@"KW"], + [OWSCountryMetadata countryMetadataWithName:@"Kazakhstan" + tld:@".kz" + googleDomain:@"google.kz" + countryCode:@"KZ"], + [OWSCountryMetadata countryMetadataWithName:@"Laos" tld:@".la" googleDomain:@"google.la" countryCode:@"LA"], + [OWSCountryMetadata countryMetadataWithName:@"Lebanon" + tld:@".lb" + googleDomain:@"google.com.lb" + countryCode:@"LB"], + [OWSCountryMetadata countryMetadataWithName:@"Saint Lucia" + tld:@".lc" + googleDomain:@"google.com.lc" + countryCode:@"LC"], + [OWSCountryMetadata countryMetadataWithName:@"Liechtenstein" + tld:@".li" + googleDomain:@"google.li" + countryCode:@"LI"], + [OWSCountryMetadata countryMetadataWithName:@"Sri Lanka" + tld:@".lk" + googleDomain:@"google.lk" + countryCode:@"LK"], + [OWSCountryMetadata countryMetadataWithName:@"Lesotho" + tld:@".ls" + googleDomain:@"google.co.ls" + countryCode:@"LS"], + [OWSCountryMetadata countryMetadataWithName:@"Lithuania" + tld:@".lt" + googleDomain:@"google.lt" + countryCode:@"LT"], + [OWSCountryMetadata countryMetadataWithName:@"Luxembourg" + tld:@".lu" + googleDomain:@"google.lu" + countryCode:@"LU"], + [OWSCountryMetadata countryMetadataWithName:@"Latvia" + tld:@".lv" + googleDomain:@"google.lv" + countryCode:@"LV"], + [OWSCountryMetadata countryMetadataWithName:@"Libya" + tld:@".ly" + googleDomain:@"google.com.ly" + countryCode:@"LY"], + [OWSCountryMetadata countryMetadataWithName:@"Morocco" + tld:@".ma" + googleDomain:@"google.co.ma" + countryCode:@"MA"], + [OWSCountryMetadata countryMetadataWithName:@"Moldova" + tld:@".md" + googleDomain:@"google.md" + countryCode:@"MD"], + [OWSCountryMetadata countryMetadataWithName:@"Montenegro" + tld:@".me" + googleDomain:@"google.me" + countryCode:@"ME"], + [OWSCountryMetadata countryMetadataWithName:@"Madagascar" + tld:@".mg" + googleDomain:@"google.mg" + countryCode:@"MG"], + [OWSCountryMetadata countryMetadataWithName:@"Macedonia" + tld:@".mk" + googleDomain:@"google.mk" + countryCode:@"MK"], + [OWSCountryMetadata countryMetadataWithName:@"Mali" tld:@".ml" googleDomain:@"google.ml" countryCode:@"ML"], + [OWSCountryMetadata countryMetadataWithName:@"Myanmar" + tld:@".mm" + googleDomain:@"google.com.mm" + countryCode:@"MM"], + [OWSCountryMetadata countryMetadataWithName:@"Mongolia" + tld:@".mn" + googleDomain:@"google.mn" + countryCode:@"MN"], + [OWSCountryMetadata countryMetadataWithName:@"Montserrat" + tld:@".ms" + googleDomain:@"google.ms" + countryCode:@"MS"], + [OWSCountryMetadata countryMetadataWithName:@"Malta" + tld:@".mt" + googleDomain:@"google.com.mt" + countryCode:@"MT"], + [OWSCountryMetadata countryMetadataWithName:@"Mauritius" + tld:@".mu" + googleDomain:@"google.mu" + countryCode:@"MU"], + [OWSCountryMetadata countryMetadataWithName:@"Maldives" + tld:@".mv" + googleDomain:@"google.mv" + countryCode:@"MV"], + [OWSCountryMetadata countryMetadataWithName:@"Malawi" + tld:@".mw" + googleDomain:@"google.mw" + countryCode:@"MW"], + [OWSCountryMetadata countryMetadataWithName:@"Mexico" + tld:@".mx" + googleDomain:@"google.com.mx" + countryCode:@"MX"], + [OWSCountryMetadata countryMetadataWithName:@"Malaysia" + tld:@".my" + googleDomain:@"google.com.my" + countryCode:@"MY"], + [OWSCountryMetadata countryMetadataWithName:@"Mozambique" + tld:@".mz" + googleDomain:@"google.co.mz" + countryCode:@"MZ"], + [OWSCountryMetadata countryMetadataWithName:@"Namibia" + tld:@".na" + googleDomain:@"google.com.na" + countryCode:@"NA"], + [OWSCountryMetadata countryMetadataWithName:@"Niger" + tld:@".ne" + googleDomain:@"google.ne" + countryCode:@"NE"], + [OWSCountryMetadata countryMetadataWithName:@"Norfolk Island" + tld:@".nf" + googleDomain:@"google.nf" + countryCode:@"NF"], + [OWSCountryMetadata countryMetadataWithName:@"Nigeria" + tld:@".ng" + googleDomain:@"google.com.ng" + countryCode:@"NG"], + [OWSCountryMetadata countryMetadataWithName:@"Nicaragua" + tld:@".ni" + googleDomain:@"google.com.ni" + countryCode:@"NI"], + [OWSCountryMetadata countryMetadataWithName:@"Netherlands" + tld:@".nl" + googleDomain:@"google.nl" + countryCode:@"NL"], + [OWSCountryMetadata countryMetadataWithName:@"Norway" + tld:@".no" + googleDomain:@"google.no" + countryCode:@"NO"], + [OWSCountryMetadata countryMetadataWithName:@"Nepal" + tld:@".np" + googleDomain:@"google.com.np" + countryCode:@"NP"], + [OWSCountryMetadata countryMetadataWithName:@"Nauru" + tld:@".nr" + googleDomain:@"google.nr" + countryCode:@"NR"], + [OWSCountryMetadata countryMetadataWithName:@"Niue" tld:@".nu" googleDomain:@"google.nu" countryCode:@"NU"], + [OWSCountryMetadata countryMetadataWithName:@"New Zealand" + tld:@".nz" + googleDomain:@"google.co.nz" + countryCode:@"NZ"], + [OWSCountryMetadata countryMetadataWithName:@"Oman" + tld:@".om" + googleDomain:@"google.com.om" + countryCode:@"OM"], + [OWSCountryMetadata countryMetadataWithName:@"Pakistan" + tld:@".pk" + googleDomain:@"google.com.pk" + countryCode:@"PK"], + [OWSCountryMetadata countryMetadataWithName:@"Panama" + tld:@".pa" + googleDomain:@"google.com.pa" + countryCode:@"PA"], + [OWSCountryMetadata countryMetadataWithName:@"Peru" + tld:@".pe" + googleDomain:@"google.com.pe" + countryCode:@"PE"], + [OWSCountryMetadata countryMetadataWithName:@"Philippines" + tld:@".ph" + googleDomain:@"google.com.ph" + countryCode:@"PH"], + [OWSCountryMetadata countryMetadataWithName:@"Poland" + tld:@".pl" + googleDomain:@"google.pl" + countryCode:@"PL"], + [OWSCountryMetadata countryMetadataWithName:@"Papua New Guinea" + tld:@".pg" + googleDomain:@"google.com.pg" + countryCode:@"PG"], + [OWSCountryMetadata countryMetadataWithName:@"Pitcairn Islands" + tld:@".pn" + googleDomain:@"google.pn" + countryCode:@"PN"], + [OWSCountryMetadata countryMetadataWithName:@"Puerto Rico" + tld:@".pr" + googleDomain:@"google.com.pr" + countryCode:@"PR"], + [OWSCountryMetadata countryMetadataWithName:@"Palestine[4]" + tld:@".ps" + googleDomain:@"google.ps" + countryCode:@"PS"], + [OWSCountryMetadata countryMetadataWithName:@"Portugal" + tld:@".pt" + googleDomain:@"google.pt" + countryCode:@"PT"], + [OWSCountryMetadata countryMetadataWithName:@"Paraguay" + tld:@".py" + googleDomain:@"google.com.py" + countryCode:@"PY"], + [OWSCountryMetadata countryMetadataWithName:@"Qatar" + tld:@".qa" + googleDomain:@"google.com.qa" + countryCode:@"QA"], + [OWSCountryMetadata countryMetadataWithName:@"Romania" + tld:@".ro" + googleDomain:@"google.ro" + countryCode:@"RO"], + [OWSCountryMetadata countryMetadataWithName:@"Serbia" + tld:@".rs" + googleDomain:@"google.rs" + countryCode:@"RS"], + [OWSCountryMetadata countryMetadataWithName:@"Russia" + tld:@".ru" + googleDomain:@"google.ru" + countryCode:@"RU"], + [OWSCountryMetadata countryMetadataWithName:@"Rwanda" + tld:@".rw" + googleDomain:@"google.rw" + countryCode:@"RW"], + [OWSCountryMetadata countryMetadataWithName:@"Saudi Arabia" + tld:@".sa" + googleDomain:@"google.com.sa" + countryCode:@"SA"], + [OWSCountryMetadata countryMetadataWithName:@"Solomon Islands" + tld:@".sb" + googleDomain:@"google.com.sb" + countryCode:@"SB"], + [OWSCountryMetadata countryMetadataWithName:@"Seychelles" + tld:@".sc" + googleDomain:@"google.sc" + countryCode:@"SC"], + [OWSCountryMetadata countryMetadataWithName:@"Sweden" + tld:@".se" + googleDomain:@"google.se" + countryCode:@"SE"], + [OWSCountryMetadata countryMetadataWithName:@"Singapore" + tld:@".sg" + googleDomain:@"google.com.sg" + countryCode:@"SG"], + [OWSCountryMetadata countryMetadataWithName:@"Saint Helena, Ascension and Tristan da Cunha" + tld:@".sh" + googleDomain:@"google.sh" + countryCode:@"SH"], + [OWSCountryMetadata countryMetadataWithName:@"Slovenia" + tld:@".si" + googleDomain:@"google.si" + countryCode:@"SI"], + [OWSCountryMetadata countryMetadataWithName:@"Slovakia" + tld:@".sk" + googleDomain:@"google.sk" + countryCode:@"SK"], + [OWSCountryMetadata countryMetadataWithName:@"Sierra Leone" + tld:@".sl" + googleDomain:@"google.com.sl" + countryCode:@"SL"], + [OWSCountryMetadata countryMetadataWithName:@"Senegal" + tld:@".sn" + googleDomain:@"google.sn" + countryCode:@"SN"], + [OWSCountryMetadata countryMetadataWithName:@"San Marino" + tld:@".sm" + googleDomain:@"google.sm" + countryCode:@"SM"], + [OWSCountryMetadata countryMetadataWithName:@"Somalia" + tld:@".so" + googleDomain:@"google.so" + countryCode:@"SO"], + [OWSCountryMetadata countryMetadataWithName:@"São Tomé and Príncipe" + tld:@".st" + googleDomain:@"google.st" + countryCode:@"ST"], + [OWSCountryMetadata countryMetadataWithName:@"Suriname" + tld:@".sr" + googleDomain:@"google.sr" + countryCode:@"SR"], + [OWSCountryMetadata countryMetadataWithName:@"El Salvador" + tld:@".sv" + googleDomain:@"google.com.sv" + countryCode:@"SV"], + [OWSCountryMetadata countryMetadataWithName:@"Chad" tld:@".td" googleDomain:@"google.td" countryCode:@"TD"], + [OWSCountryMetadata countryMetadataWithName:@"Togo" tld:@".tg" googleDomain:@"google.tg" countryCode:@"TG"], + [OWSCountryMetadata countryMetadataWithName:@"Thailand" + tld:@".th" + googleDomain:@"google.co.th" + countryCode:@"TH"], + [OWSCountryMetadata countryMetadataWithName:@"Tajikistan" + tld:@".tj" + googleDomain:@"google.com.tj" + countryCode:@"TJ"], + [OWSCountryMetadata countryMetadataWithName:@"Tokelau" + tld:@".tk" + googleDomain:@"google.tk" + countryCode:@"TK"], + [OWSCountryMetadata countryMetadataWithName:@"Timor-Leste" + tld:@".tl" + googleDomain:@"google.tl" + countryCode:@"TL"], + [OWSCountryMetadata countryMetadataWithName:@"Turkmenistan" + tld:@".tm" + googleDomain:@"google.tm" + countryCode:@"TM"], + [OWSCountryMetadata countryMetadataWithName:@"Tonga" + tld:@".to" + googleDomain:@"google.to" + countryCode:@"TO"], + [OWSCountryMetadata countryMetadataWithName:@"Tunisia" + tld:@".tn" + googleDomain:@"google.tn" + countryCode:@"TN"], + [OWSCountryMetadata countryMetadataWithName:@"Turkey" + tld:@".tr" + googleDomain:@"google.com.tr" + countryCode:@"TR"], + [OWSCountryMetadata countryMetadataWithName:@"Trinidad and Tobago" + tld:@".tt" + googleDomain:@"google.tt" + countryCode:@"TT"], + [OWSCountryMetadata countryMetadataWithName:@"Taiwan" + tld:@".tw" + googleDomain:@"google.com.tw" + countryCode:@"TW"], + [OWSCountryMetadata countryMetadataWithName:@"Tanzania" + tld:@".tz" + googleDomain:@"google.co.tz" + countryCode:@"TZ"], + [OWSCountryMetadata countryMetadataWithName:@"Ukraine" + tld:@".ua" + googleDomain:@"google.com.ua" + countryCode:@"UA"], + [OWSCountryMetadata countryMetadataWithName:@"Uganda" + tld:@".ug" + googleDomain:@"google.co.ug" + countryCode:@"UG"], + [OWSCountryMetadata countryMetadataWithName:@"United States" + tld:@".us" + googleDomain:@"google.us" + countryCode:@"US"], + [OWSCountryMetadata countryMetadataWithName:@"Uruguay" + tld:@".uy" + googleDomain:@"google.com.uy" + countryCode:@"UY"], + [OWSCountryMetadata countryMetadataWithName:@"Uzbekistan" + tld:@".uz" + googleDomain:@"google.co.uz" + countryCode:@"UZ"], + [OWSCountryMetadata countryMetadataWithName:@"Saint Vincent and the Grenadines" + tld:@".vc" + googleDomain:@"google.com.vc" + countryCode:@"VC"], + [OWSCountryMetadata countryMetadataWithName:@"Venezuela" + tld:@".ve" + googleDomain:@"google.co.ve" + countryCode:@"VE"], + [OWSCountryMetadata countryMetadataWithName:@"British Virgin Islands" + tld:@".vg" + googleDomain:@"google.vg" + countryCode:@"VG"], + [OWSCountryMetadata countryMetadataWithName:@"United States Virgin Islands" + tld:@".vi" + googleDomain:@"google.co.vi" + countryCode:@"VI"], + [OWSCountryMetadata countryMetadataWithName:@"Vietnam" + tld:@".vn" + googleDomain:@"google.com.vn" + countryCode:@"VN"], + [OWSCountryMetadata countryMetadataWithName:@"Vanuatu" + tld:@".vu" + googleDomain:@"google.vu" + countryCode:@"VU"], + [OWSCountryMetadata countryMetadataWithName:@"Samoa" + tld:@".ws" + googleDomain:@"google.ws" + countryCode:@"WS"], + [OWSCountryMetadata countryMetadataWithName:@"South Africa" + tld:@".za" + googleDomain:@"google.co.za" + countryCode:@"ZA"], + [OWSCountryMetadata countryMetadataWithName:@"Zambia" + tld:@".zm" + googleDomain:@"google.co.zm" + countryCode:@"ZM"], + [OWSCountryMetadata countryMetadataWithName:@"Zimbabwe" + tld:@".zw" + googleDomain:@"google.co.zw" + countryCode:@"ZW"], + ]; + cachedValue = [cachedValue sortedArrayUsingComparator:^NSComparisonResult( + OWSCountryMetadata *_Nonnull left, OWSCountryMetadata *_Nonnull right) { + return [left.localizedCountryName compare:right.localizedCountryName]; + }]; + }); + return cachedValue; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/translations/en.lproj/Localizable.strings b/Signal/translations/en.lproj/Localizable.strings index d41bca713..abb7aa7d2 100644 --- a/Signal/translations/en.lproj/Localizable.strings +++ b/Signal/translations/en.lproj/Localizable.strings @@ -331,6 +331,12 @@ /* Generic short text for button to dismiss a dialog */ "DISMISS_BUTTON_TEXT" = "Dismiss"; +/* Section title for the 'domain fronting country' view. */ +"DOMAIN_FRONTING_COUNTRY_VIEW_SECTION_HEADER" = "Censorship Circumvention Location"; + +/* Title for the 'domain fronting country' view. */ +"DOMAIN_FRONTING_COUNTRY_VIEW_TITLE" = "Select Country"; + /* Alert body for when the user has just tried to edit a contacts after declining to give Signal contacts permissions */ "EDIT_CONTACT_WITHOUT_CONTACTS_PERMISSION_ALERT_BODY" = "You can give access in the Settings app."; @@ -1087,9 +1093,12 @@ /* Title for the 'add to block list' view. */ "SETTINGS_ADD_TO_BLOCK_LIST_TITLE" = "Block"; -/* Label for the 'censorship circumvention' switch. */ +/* Label for the 'manual censorship circumvention' switch. */ "SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION" = "Censorship Circumvention"; +/* Label for the 'manual censorship circumvention' country. Embeds {{the manual censorship circumvention country}}. */ +"SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION_COUNTRY_FORMAT" = "Location: %@"; + /* Table footer for the 'censorship circumvention' section when censorship circumvention can be manually enabled. */ "SETTINGS_ADVANCED_CENSORSHIP_CIRCUMVENTION_FOOTER" = "If enabled, Signal will attempt to circumvent censorship. Do not enable this feature unless you are in a location where Signal is censored.";