| Index: chrome/browser/chromeos/options/language_config_view.cc
|
| diff --git a/chrome/browser/chromeos/options/language_config_view.cc b/chrome/browser/chromeos/options/language_config_view.cc
|
| index 52bc243bbd8a5d996c3e812ea18799e6afa02d72..271792b3d11ced180175593df16931643c68ed8c 100644
|
| --- a/chrome/browser/chromeos/options/language_config_view.cc
|
| +++ b/chrome/browser/chromeos/options/language_config_view.cc
|
| @@ -825,6 +825,11 @@ void LanguageConfigView::SetInputMethodActivated(
|
| // Update Chrome's preference.
|
| std::vector<std::string> new_input_method_ids(input_method_id_set.begin(),
|
| input_method_id_set.end());
|
| +
|
| + // Note: Since |new_input_method_ids| is alphabetically sorted and the sort
|
| + // function below uses stable sort, the relateve order of input methods that
|
| + // belong to the same language (e.g. "mozc" and "xkb:jp::jpn") is maintained.
|
| + SortInputMethodIdsByNames(id_to_language_code_map_, &new_input_method_ids);
|
| preload_engines_.SetValue(UTF8ToWide(JoinString(new_input_method_ids, ',')));
|
| }
|
|
|
| @@ -940,12 +945,12 @@ std::wstring LanguageConfigView::GetLanguageDisplayNameFromCode(
|
| }
|
|
|
| namespace {
|
| +
|
| // The comparator is used for sorting language codes by their
|
| // corresponding language names, using the ICU collator.
|
| -struct CompareByLanguageName : std::binary_function<const std::string&,
|
| - const std::string&,
|
| - bool> {
|
| - CompareByLanguageName(icu::Collator* collator)
|
| +struct CompareLanguageCodesByLanguageName
|
| + : std::binary_function<const std::string&, const std::string&, bool> {
|
| + explicit CompareLanguageCodesByLanguageName(icu::Collator* collator)
|
| : collator_(collator) {
|
| }
|
|
|
| @@ -959,8 +964,40 @@ struct CompareByLanguageName : std::binary_function<const std::string&,
|
| LanguageConfigView::GetLanguageDisplayNameFromCode(s2);
|
| return l10n_util::StringComparator<std::wstring>(collator_)(key1, key2);
|
| }
|
| +
|
| icu::Collator* collator_;
|
| };
|
| +
|
| +// The comparator is used for sorting input method ids by their
|
| +// corresponding language names, using the ICU collator.
|
| +struct CompareInputMethodIdsByLanguageName
|
| + : std::binary_function<const std::string&, const std::string&, bool> {
|
| + CompareInputMethodIdsByLanguageName(
|
| + icu::Collator* collator,
|
| + const std::map<std::string, std::string>& id_to_language_code_map)
|
| + : comparator_(collator),
|
| + id_to_language_code_map_(id_to_language_code_map) {
|
| + }
|
| +
|
| + bool operator()(const std::string& s1, const std::string& s2) const {
|
| + std::string language_code_1;
|
| + std::map<std::string, std::string>::const_iterator iter =
|
| + id_to_language_code_map_.find(s1);
|
| + if (iter != id_to_language_code_map_.end()) {
|
| + language_code_1 = iter->second;
|
| + }
|
| + std::string language_code_2;
|
| + iter = id_to_language_code_map_.find(s2);
|
| + if (iter != id_to_language_code_map_.end()) {
|
| + language_code_2 = iter->second;
|
| + }
|
| + return comparator_(language_code_1, language_code_2);
|
| + }
|
| +
|
| + const CompareLanguageCodesByLanguageName comparator_;
|
| + const std::map<std::string, std::string>& id_to_language_code_map_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| void LanguageConfigView::SortLanguageCodesByNames(
|
| @@ -971,10 +1008,26 @@ void LanguageConfigView::SortLanguageCodesByNames(
|
| icu::Locale locale(g_browser_process->GetApplicationLocale().c_str());
|
| scoped_ptr<icu::Collator> collator(
|
| icu::Collator::createInstance(locale, error));
|
| - if (U_FAILURE(error))
|
| + if (U_FAILURE(error)) {
|
| collator.reset();
|
| + }
|
| std::sort(language_codes->begin(), language_codes->end(),
|
| - CompareByLanguageName(collator.get()));
|
| + CompareLanguageCodesByLanguageName(collator.get()));
|
| +}
|
| +
|
| +void LanguageConfigView::SortInputMethodIdsByNames(
|
| + const std::map<std::string, std::string>& id_to_language_code_map,
|
| + std::vector<std::string>* input_method_ids) {
|
| + UErrorCode error = U_ZERO_ERROR;
|
| + icu::Locale locale(g_browser_process->GetApplicationLocale().c_str());
|
| + scoped_ptr<icu::Collator> collator(
|
| + icu::Collator::createInstance(locale, error));
|
| + if (U_FAILURE(error)) {
|
| + collator.reset();
|
| + }
|
| + std::stable_sort(input_method_ids->begin(), input_method_ids->end(),
|
| + CompareInputMethodIdsByLanguageName(
|
| + collator.get(), id_to_language_code_map));
|
| }
|
|
|
| void LanguageConfigView::ReorderInputMethodIdsForLanguageCode(
|
|
|