// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/autofill/core/browser/autofill_country.h" #include #include #include #include #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/memory/singleton.h" #include "base/stl_util.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "grit/component_strings.h" #include "third_party/icu/source/common/unicode/locid.h" #include "third_party/icu/source/common/unicode/uloc.h" #include "third_party/icu/source/common/unicode/unistr.h" #include "third_party/icu/source/common/unicode/urename.h" #include "third_party/icu/source/common/unicode/utypes.h" #include "third_party/icu/source/i18n/unicode/coll.h" #include "third_party/icu/source/i18n/unicode/ucol.h" #include "ui/base/l10n/l10n_util.h" namespace autofill { namespace { // The maximum capacity needed to store a locale up to the country code. const size_t kLocaleCapacity = ULOC_LANG_CAPACITY + ULOC_SCRIPT_CAPACITY + ULOC_COUNTRY_CAPACITY + 1; struct CountryData { int postal_code_label_id; int state_label_id; AddressRequiredFields address_required_fields; }; struct StaticCountryData { char country_code[3]; CountryData country_data; }; // Maps country codes to localized label string identifiers. const StaticCountryData kCountryData[] = { { "AD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PARISH, ADDRESS_REQUIRES_STATE } }, { "AE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_EMIRATE, ADDRESS_REQUIRES_STATE } }, { "AF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } }, { "AI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AS", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "AT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "AU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "AW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "AX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "AZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PARISH, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "BF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "BM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "BS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "BZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "CC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "CI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "CO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "CZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "DE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "DJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "DK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "DM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "DO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "DZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "EC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "EE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "EG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "EH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ER", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ES", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "ET", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "FI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "FJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "FK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "FM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "FO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "FR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_COUNTY, ADDRESS_REQUIRES_CITY_ZIP } }, { "GD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } }, { "GL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "GT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GU", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "GW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "GY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "HK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_AREA, ADDRESS_REQUIRES_STATE } }, { "HM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "HN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "HR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "HT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "HU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ID", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "IE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_COUNTY, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "IL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "IM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "IN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "IO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "IQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "IS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "IT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "JE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "JM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PARISH, ADDRESS_REQUIRES_CITY_STATE } }, { "JO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "JP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PREFECTURE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "KE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIRES_CITY_STATE } }, { "KP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "KW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "KY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIRES_STATE } }, { "KZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "LK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "LV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "LY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ME", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "MG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MH", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "MK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ML", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } }, { "MP", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "MQ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "MR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "MX", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_ZIP } }, { "MY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_ZIP } }, { "MZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "NE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_DEPARTMENT, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "NO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "NP", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_DISTRICT, ADDRESS_REQUIRES_STATE } }, { "NU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "NZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "OM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "PA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "PE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "PF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "PG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "PH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY } }, { "PK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "PL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "PM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "PN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "PR", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "PS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "PT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "PW", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "PY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "QA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "RE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "RO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "RS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "RU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "RW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SB", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "SG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ZIP } }, { "SH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "SI", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "SK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ZIP } }, { "SN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "SR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "ST", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "SV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "SZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "TD", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TH", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TJ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TK", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TL", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TO", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TR", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "TT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TV", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_ISLAND, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "TW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_COUNTY, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "TZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "UA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "UG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "UM", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE } }, { "US", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "UY", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "UZ", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "VA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "VC", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "VE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_STATE } }, { "VG", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_ADDRESS_LINE_1_ONLY } }, { "VI", { IDS_AUTOFILL_FIELD_LABEL_ZIP_CODE, IDS_AUTOFILL_FIELD_LABEL_STATE, ADDRESS_REQUIRES_CITY_STATE_ZIP } }, { "VN", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY } }, { "VU", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "WF", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "WS", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, { "YE", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY } }, { "YT", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "ZA", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY_ZIP } }, { "ZM", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIRES_CITY } }, { "ZW", { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE, ADDRESS_REQUIREMENTS_UNKNOWN } }, }; // A singleton class that encapsulates a map from country codes to country data. class CountryDataMap { public: // A const iterator over the wrapped map data. typedef std::map::const_iterator Iterator; static CountryDataMap* GetInstance(); static const Iterator Begin(); static const Iterator End(); static const Iterator Find(const std::string& country_code); private: CountryDataMap(); friend struct DefaultSingletonTraits; std::map country_data_; DISALLOW_COPY_AND_ASSIGN(CountryDataMap); }; // static CountryDataMap* CountryDataMap::GetInstance() { return Singleton::get(); } CountryDataMap::CountryDataMap() { // Add all the countries we have explicit data for. for (size_t i = 0; i < arraysize(kCountryData); ++i) { const StaticCountryData& static_data = kCountryData[i]; country_data_.insert(std::make_pair(static_data.country_code, static_data.country_data)); } // Add any other countries that ICU knows about, falling back to default data // values. for (const char* const* country_pointer = icu::Locale::getISOCountries(); *country_pointer; ++country_pointer) { std::string country_code = *country_pointer; if (!country_data_.count(country_code)) { CountryData data = { IDS_AUTOFILL_FIELD_LABEL_POSTAL_CODE, IDS_AUTOFILL_FIELD_LABEL_PROVINCE }; country_data_.insert(std::make_pair(country_code, data)); } } } const CountryDataMap::Iterator CountryDataMap::Begin() { return GetInstance()->country_data_.begin(); } const CountryDataMap::Iterator CountryDataMap::End() { return GetInstance()->country_data_.end(); } const CountryDataMap::Iterator CountryDataMap::Find( const std::string& country_code) { return GetInstance()->country_data_.find(country_code); } // A singleton class that encapsulates mappings from country names to their // corresponding country codes. class CountryNames { public: static CountryNames* GetInstance(); // Returns the country code corresponding to |country|, which should be a // country code or country name localized to |locale|. const std::string GetCountryCode(const base::string16& country, const std::string& locale); private: CountryNames(); ~CountryNames(); friend struct DefaultSingletonTraits; // Populates |locales_to_localized_names_| with the mapping of country names // localized to |locale| to their corresponding country codes. void AddLocalizedNamesForLocale(const std::string& locale); // Interprets |country_name| as a full country name localized to the given // |locale| and returns the corresponding country code stored in // |locales_to_localized_names_|, or an empty string if there is none. const std::string GetCountryCodeForLocalizedName( const base::string16& country_name, const std::string& locale); // Returns an ICU collator -- i.e. string comparator -- appropriate for the // given |locale|. icu::Collator* GetCollatorForLocale(const std::string& locale); // Returns the ICU sort key corresponding to |str| for the given |collator|. // Uses |buffer| as temporary storage, and might resize |buffer| as a side- // effect. |buffer_size| should specify the |buffer|'s size, and is updated if // the |buffer| is resized. const std::string GetSortKey(const icu::Collator& collator, const base::string16& str, scoped_ptr* buffer, int32_t* buffer_size) const; // Maps from common country names, including 2- and 3-letter country codes, // to the corresponding 2-letter country codes. The keys are uppercase ASCII // strings. std::map common_names_; // The outer map keys are ICU locale identifiers. // The inner maps map from localized country names to their corresponding // country codes. The inner map keys are ICU collation sort keys corresponding // to the target localized country name. std::map > locales_to_localized_names_; // Maps ICU locale names to their corresponding collators. std::map collators_; DISALLOW_COPY_AND_ASSIGN(CountryNames); }; // static CountryNames* CountryNames::GetInstance() { return Singleton::get(); } CountryNames::CountryNames() { // Add 2- and 3-letter ISO country codes. for (CountryDataMap::Iterator it = CountryDataMap::Begin(); it != CountryDataMap::End(); ++it) { const std::string& country_code = it->first; std::string iso3_country_code = icu::Locale(NULL, country_code.c_str()).getISO3Country(); common_names_.insert(std::make_pair(country_code, country_code)); common_names_.insert(std::make_pair(iso3_country_code, country_code)); } // Add a few other common synonyms. common_names_.insert(std::make_pair("UNITED STATES OF AMERICA", "US")); common_names_.insert(std::make_pair("U.S.A.", "US")); common_names_.insert(std::make_pair("GREAT BRITAIN", "GB")); common_names_.insert(std::make_pair("UK", "GB")); common_names_.insert(std::make_pair("BRASIL", "BR")); common_names_.insert(std::make_pair("DEUTSCHLAND", "DE")); } CountryNames::~CountryNames() { STLDeleteContainerPairSecondPointers(collators_.begin(), collators_.end()); } const std::string CountryNames::GetCountryCode(const base::string16& country, const std::string& locale) { // First, check common country names, including 2- and 3-letter country codes. std::string country_utf8 = UTF16ToUTF8(StringToUpperASCII(country)); std::map::const_iterator result = common_names_.find(country_utf8); if (result != common_names_.end()) return result->second; // Next, check country names localized to |locale|. std::string country_code = GetCountryCodeForLocalizedName(country, locale); if (!country_code.empty()) return country_code; // Finally, check country names localized to US English. return GetCountryCodeForLocalizedName(country, "en_US"); } void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) { // Nothing to do if we've previously added the localized names for the given // |locale|. if (locales_to_localized_names_.count(locale)) return; std::map localized_names; const icu::Collator* collator = GetCollatorForLocale(locale); int32_t buffer_size = 1000; scoped_ptr buffer(new uint8_t[buffer_size]); for (CountryDataMap::Iterator it = CountryDataMap::Begin(); it != CountryDataMap::End(); ++it) { const std::string& country_code = it->first; base::string16 country_name = l10n_util::GetDisplayNameForCountry( country_code, locale); std::string sort_key = GetSortKey(*collator, country_name, &buffer, &buffer_size); localized_names.insert(std::make_pair(sort_key, country_code)); } locales_to_localized_names_.insert(std::make_pair(locale, localized_names)); } const std::string CountryNames::GetCountryCodeForLocalizedName( const base::string16& country_name, const std::string& locale) { AddLocalizedNamesForLocale(locale); icu::Collator* collator = GetCollatorForLocale(locale); // As recommended[1] by ICU, initialize the buffer size to four times the // source string length. // [1] http://userguide.icu-project.org/collation/api#TOC-Examples int32_t buffer_size = country_name.size() * 4; scoped_ptr buffer(new uint8_t[buffer_size]); std::string sort_key = GetSortKey(*collator, country_name, &buffer, &buffer_size); const std::map& localized_names = locales_to_localized_names_[locale]; std::map::const_iterator result = localized_names.find(sort_key); if (result != localized_names.end()) return result->second; return std::string(); } icu::Collator* CountryNames::GetCollatorForLocale(const std::string& locale) { if (!collators_.count(locale)) { icu::Locale icu_locale(locale.c_str()); UErrorCode ignored = U_ZERO_ERROR; icu::Collator* collator(icu::Collator::createInstance(icu_locale, ignored)); // Compare case-insensitively and ignoring punctuation. ignored = U_ZERO_ERROR; collator->setAttribute(UCOL_STRENGTH, UCOL_SECONDARY, ignored); ignored = U_ZERO_ERROR; collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored); collators_.insert(std::make_pair(locale, collator)); } return collators_[locale]; } const std::string CountryNames::GetSortKey(const icu::Collator& collator, const base::string16& str, scoped_ptr* buffer, int32_t* buffer_size) const { DCHECK(buffer); DCHECK(buffer_size); icu::UnicodeString icu_str(str.c_str(), str.length()); int32_t expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size); if (expected_size > *buffer_size) { // If there wasn't enough space, grow the buffer and try again. *buffer_size = expected_size; buffer->reset(new uint8_t[*buffer_size]); DCHECK(buffer->get()); expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size); DCHECK_EQ(*buffer_size, expected_size); } return std::string(reinterpret_cast(buffer->get())); } } // namespace AutofillCountry::AutofillCountry(const std::string& country_code, const std::string& locale) { const CountryDataMap::Iterator result = CountryDataMap::Find(country_code); DCHECK(result != CountryDataMap::End()); const CountryData& data = result->second; country_code_ = country_code; name_ = l10n_util::GetDisplayNameForCountry(country_code, locale); postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id); state_label_ = l10n_util::GetStringUTF16(data.state_label_id); address_required_fields_ = data.address_required_fields; } AutofillCountry::~AutofillCountry() { } // static void AutofillCountry::GetAvailableCountries( std::vector* country_codes) { DCHECK(country_codes); for (CountryDataMap::Iterator it = CountryDataMap::Begin(); it != CountryDataMap::End(); ++it) { country_codes->push_back(it->first); } } // static const std::string AutofillCountry::CountryCodeForLocale( const std::string& locale) { // Add likely subtags to the locale. In particular, add any likely country // subtags -- e.g. for locales like "ru" that only include the language. std::string likely_locale; UErrorCode error_ignored = U_ZERO_ERROR; uloc_addLikelySubtags(locale.c_str(), WriteInto(&likely_locale, kLocaleCapacity), kLocaleCapacity, &error_ignored); // Extract the country code. std::string country_code = icu::Locale(likely_locale.c_str()).getCountry(); // Default to the United States if we have no better guess. if (CountryDataMap::Find(country_code) == CountryDataMap::End()) return "US"; return country_code; } // static const std::string AutofillCountry::GetCountryCode(const base::string16& country, const std::string& locale) { return CountryNames::GetInstance()->GetCountryCode(country, locale); } AutofillCountry::AutofillCountry(const std::string& country_code, const base::string16& name, const base::string16& postal_code_label, const base::string16& state_label) : country_code_(country_code), name_(name), postal_code_label_(postal_code_label), state_label_(state_label) { } } // namespace autofill