blob: 412783b48b1ce7ae953b1a9be896d2ff960a406b [file] [log] [blame]
// 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