| // 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 <stddef.h> |
| |
| #include "base/logging.h" |
| #include "base/stl_util.h" |
| #include "base/strings/string_util.h" |
| #include "components/autofill/core/browser/country_data.h" |
| #include "components/autofill/core/browser/country_names.h" |
| #include "third_party/icu/source/common/unicode/locid.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; |
| |
| } // namespace |
| |
| AutofillCountry::AutofillCountry(const std::string& country_code, |
| const std::string& locale) { |
| auto result = |
| CountryDataMap::GetInstance()->country_data().find(country_code); |
| DCHECK(result != CountryDataMap::GetInstance()->country_data().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 |
| 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(), |
| base::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 (!base::ContainsValue(CountryDataMap::GetInstance()->country_codes(), |
| country_code)) { |
| return "US"; |
| } |
| |
| return country_code; |
| } |
| |
| 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 |