| // Copyright 2016 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. |
| |
| #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_COUNTRY_NAMES_H_ |
| #define COMPONENTS_AUTOFILL_CORE_BROWSER_COUNTRY_NAMES_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/strings/string16.h" |
| #include "third_party/icu/source/common/unicode/locid.h" |
| #include "third_party/icu/source/i18n/unicode/coll.h" |
| |
| namespace base { |
| template <typename T> |
| struct DefaultSingletonTraits; |
| } |
| |
| namespace autofill { |
| |
| // A singleton class that encapsulates mappings from country names to their |
| // corresponding country codes. |
| class CountryNames { |
| public: |
| // The first call to this function, causing the creation of CountryNames, |
| // is expensive. |
| static CountryNames* GetInstance(); |
| |
| // Tells CountryNames, what is the application locale. Only the first supplied |
| // value is used, further calls result in no changes. Call this on the UI |
| // thread, before first using CountryNames. |locale| must not be empty. |
| static void SetLocaleString(const std::string& locale); |
| |
| // Returns the country code corresponding to |country|, which should be a |
| // country code or country name localized to |locale_name|. |
| const std::string GetCountryCode(const base::string16& country); |
| |
| protected: |
| // Create CountryNames for |locale_name|. Protected for testing. |
| explicit CountryNames(const std::string& locale_name); |
| |
| // Protected for testing. |
| ~CountryNames(); |
| |
| private: |
| // Create CountryNames for the default locale. |
| CountryNames(); |
| |
| friend struct base::DefaultSingletonTraits<CountryNames>; |
| |
| // Looks up |country_name| in |localized_names|, using |collator| and |
| // returns the corresponding country code or an empty string if there is |
| // none. |
| const std::string GetCountryCodeForLocalizedName( |
| const base::string16& country_name, |
| const std::map<std::string, std::string>& localized_names, |
| const icu::Collator& collator); |
| |
| // Returns an ICU collator -- i.e. string comparator -- appropriate for the |
| // given |locale|, or null if no collator is available. |
| const icu::Collator* GetCollatorForLocale(const icu::Locale& locale); |
| |
| // The locale object for the application locale string. |
| const icu::Locale locale_; |
| |
| // Collator for the application locale. |
| const std::unique_ptr<icu::Collator> collator_; |
| |
| // Collator for the "en_US" locale, if different from the application |
| // locale, null otherwise. |
| const std::unique_ptr<icu::Collator> default_collator_; |
| |
| // 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. |
| const std::map<std::string, std::string> common_names_; |
| |
| // Maps from localized country names (in the application locale) to their |
| // corresponding country codes. The keys are ICU collation sort keys |
| // corresponding to the target localized country name. |
| const std::map<std::string, std::string> localized_names_; |
| |
| // The same as |localized_names_| but for the "en_US" locale. Empty if |
| // "en_US" is the application locale already. |
| const std::map<std::string, std::string> default_localized_names_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CountryNames); |
| }; |
| |
| } // namespace autofill |
| |
| #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_COUNTRY_NAMES_H_ |