OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/options/language_config_view.h" | 5 #include "chrome/browser/chromeos/options/language_config_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "app/l10n_util.h" | 11 #include "app/l10n_util.h" |
12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/chromeos/cros/cros_library.h" | 14 #include "chrome/browser/chromeos/cros/cros_library.h" |
15 #include "chrome/browser/chromeos/cros/language_library.h" | 15 #include "chrome/browser/chromeos/cros/language_library.h" |
16 #include "chrome/browser/chromeos/options/language_hangul_config_view.h" | 16 #include "chrome/browser/chromeos/options/language_hangul_config_view.h" |
17 #include "chrome/browser/chromeos/preferences.h" | 17 #include "chrome/browser/chromeos/preferences.h" |
18 #include "chrome/browser/language_combobox_model.h" | 18 #include "chrome/browser/language_combobox_model.h" |
19 #include "chrome/common/notification_type.h" | 19 #include "chrome/common/notification_type.h" |
20 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
21 #include "gfx/font.h" | 21 #include "gfx/font.h" |
22 #include "grit/generated_resources.h" | 22 #include "grit/generated_resources.h" |
23 #include "grit/locale_settings.h" | 23 #include "grit/locale_settings.h" |
| 24 #include "third_party/icu/public/common/unicode/uloc.h" |
24 #include "views/controls/button/checkbox.h" | 25 #include "views/controls/button/checkbox.h" |
25 #include "views/controls/combobox/combobox.h" | 26 #include "views/controls/combobox/combobox.h" |
26 #include "views/controls/label.h" | 27 #include "views/controls/label.h" |
27 #include "views/fill_layout.h" | 28 #include "views/fill_layout.h" |
28 #include "views/grid_layout.h" | 29 #include "views/grid_layout.h" |
29 #include "views/standard_layout.h" | 30 #include "views/standard_layout.h" |
30 #include "views/window/window.h" | 31 #include "views/window/window.h" |
31 | 32 |
32 namespace chromeos { | 33 namespace chromeos { |
33 using views::ColumnSet; | 34 using views::ColumnSet; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 language_combobox_ = new views::Combobox(language_combobox_model_.get()); | 135 language_combobox_ = new views::Combobox(language_combobox_model_.get()); |
135 language_combobox_->SetSelectedItem(selected_index_); | 136 language_combobox_->SetSelectedItem(selected_index_); |
136 language_combobox_->set_listener(this); | 137 language_combobox_->set_listener(this); |
137 layout->StartRow(0, kColumnSetId); | 138 layout->StartRow(0, kColumnSetId); |
138 layout->AddView(language_combobox_); | 139 layout->AddView(language_combobox_); |
139 } | 140 } |
140 | 141 |
141 // Creates the language combobox model from the supported languages. | 142 // Creates the language combobox model from the supported languages. |
142 LanguageComboboxModel* CreateLanguageComboboxModel() { | 143 LanguageComboboxModel* CreateLanguageComboboxModel() { |
143 std::vector<std::string> language_codes; | 144 std::vector<std::string> language_codes; |
144 parent_view_->GetSupportedLangageCodes(&language_codes); | 145 parent_view_->GetSupportedLanguageCodes(&language_codes); |
145 // LanguageComboboxModel sorts languages by their display names. | 146 // LanguageComboboxModel sorts languages by their display names. |
146 return new LanguageComboboxModelWithOthers(NULL, language_codes); | 147 return new LanguageComboboxModelWithOthers(NULL, language_codes); |
147 } | 148 } |
148 | 149 |
149 LanguageConfigView* parent_view_; | 150 LanguageConfigView* parent_view_; |
150 | 151 |
151 // Combobox and its corresponding model. | 152 // Combobox and its corresponding model. |
152 scoped_ptr<LanguageComboboxModel> language_combobox_model_; | 153 scoped_ptr<LanguageComboboxModel> language_combobox_model_; |
153 views::Combobox* language_combobox_; | 154 views::Combobox* language_combobox_; |
154 views::View* contents_; | 155 views::View* contents_; |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 // Add the title label. | 301 // Add the title label. |
301 layout->StartRow(0, kTitleColumnSetId); | 302 layout->StartRow(0, kTitleColumnSetId); |
302 layout->AddView(title_label); | 303 layout->AddView(title_label); |
303 layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); | 304 layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); |
304 | 305 |
305 // Add input method names and configuration buttons. | 306 // Add input method names and configuration buttons. |
306 input_method_buttons_.clear(); | 307 input_method_buttons_.clear(); |
307 input_method_checkboxes_.clear(); | 308 input_method_checkboxes_.clear(); |
308 | 309 |
309 std::vector<std::string> language_ids; | 310 std::vector<std::string> language_ids; |
310 GetSupportedLangageIDs(&language_ids); | 311 GetSupportedLanguageIDs(&language_ids); |
311 for (size_t i = 0; i < language_ids.size(); ++i) { | 312 for (size_t i = 0; i < language_ids.size(); ++i) { |
312 const std::string& language_id = language_ids[i]; | 313 const std::string& language_id = language_ids[i]; |
313 const std::string language_code = GetLanguageCodeFromID(language_id); | 314 const std::string language_code = GetLanguageCodeFromID(language_id); |
314 const std::string display_name = GetDisplayNameFromID(language_id); | 315 const std::string display_name = GetDisplayNameFromID(language_id); |
315 if (language_code == target_language_code) { | 316 if (language_code == target_language_code) { |
316 layout->StartRow(0, kDoubleColumnSetId); | 317 layout->StartRow(0, kDoubleColumnSetId); |
317 InputMethodCheckbox* checkbox | 318 InputMethodCheckbox* checkbox |
318 = new InputMethodCheckbox(language_id, display_name); | 319 = new InputMethodCheckbox(language_id, display_name); |
319 checkbox->set_listener(this); | 320 checkbox->set_listener(this); |
320 checkbox->SetChecked(LanguageIsActivated(language_id)); | 321 checkbox->SetChecked(LanguageIsActivated(language_id)); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 input_method_config_view_map_["hangul"] = | 435 input_method_config_view_map_["hangul"] = |
435 CreateLanguageHangulConfigView; | 436 CreateLanguageHangulConfigView; |
436 } | 437 } |
437 | 438 |
438 void LanguageConfigView::InitLanguageIdMaps() { | 439 void LanguageConfigView::InitLanguageIdMaps() { |
439 // GetSupportedLanguages() never return NULL. | 440 // GetSupportedLanguages() never return NULL. |
440 scoped_ptr<InputLanguageList> supported_language_list( | 441 scoped_ptr<InputLanguageList> supported_language_list( |
441 CrosLibrary::Get()->GetLanguageLibrary()->GetSupportedLanguages()); | 442 CrosLibrary::Get()->GetLanguageLibrary()->GetSupportedLanguages()); |
442 for (size_t i = 0; i < supported_language_list->size(); ++i) { | 443 for (size_t i = 0; i < supported_language_list->size(); ++i) { |
443 const InputLanguage& language = supported_language_list->at(i); | 444 const InputLanguage& language = supported_language_list->at(i); |
| 445 // Normalize the language code as some engines return three-letter |
| 446 // codes like "jpn" wheres some other engines return two-letter codes |
| 447 // like "ja". |
| 448 std::string language_code = NormalizeLanguageCode(language.language_code); |
444 id_to_language_code_map_.insert( | 449 id_to_language_code_map_.insert( |
445 std::make_pair(language.id, language.language_code)); | 450 std::make_pair(language.id, language_code)); |
446 id_to_display_name_map_.insert( | 451 id_to_display_name_map_.insert( |
447 std::make_pair(language.id, language.display_name)); | 452 std::make_pair(language.id, language.display_name)); |
448 } | 453 } |
449 } | 454 } |
450 | 455 |
451 views::View* LanguageConfigView::CreateContentsOnLeft() { | 456 views::View* LanguageConfigView::CreateContentsOnLeft() { |
452 views::View* contents = new views::View; | 457 views::View* contents = new views::View; |
453 GridLayout* layout = new GridLayout(contents); | 458 GridLayout* layout = new GridLayout(contents); |
454 contents->SetLayoutManager(layout); | 459 contents->SetLayoutManager(layout); |
455 | 460 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 } | 509 } |
505 | 510 |
506 void LanguageConfigView::OnAddLanguage(const std::string& language_code) { | 511 void LanguageConfigView::OnAddLanguage(const std::string& language_code) { |
507 if (std::find(preferred_language_codes_.begin(), | 512 if (std::find(preferred_language_codes_.begin(), |
508 preferred_language_codes_.end(), | 513 preferred_language_codes_.end(), |
509 language_code) == preferred_language_codes_.end()) { | 514 language_code) == preferred_language_codes_.end()) { |
510 // Activate the first input language associated with the language. We have | 515 // Activate the first input language associated with the language. We have |
511 // to call this before the OnItemsAdded() call below so the checkbox for | 516 // to call this before the OnItemsAdded() call below so the checkbox for |
512 // the first input language gets checked. | 517 // the first input language gets checked. |
513 std::vector<std::string> language_ids; | 518 std::vector<std::string> language_ids; |
514 GetSupportedLangageIDs(&language_ids); | 519 GetSupportedLanguageIDs(&language_ids); |
515 for (size_t i = 0; i < language_ids.size(); ++i) { | 520 for (size_t i = 0; i < language_ids.size(); ++i) { |
516 if (GetLanguageCodeFromID(language_ids[i]) == language_code) { | 521 if (GetLanguageCodeFromID(language_ids[i]) == language_code) { |
517 SetLanguageActivated(language_ids[i], true); | 522 SetLanguageActivated(language_ids[i], true); |
518 break; | 523 break; |
519 } | 524 } |
520 } | 525 } |
521 | 526 |
522 // Append the language to the list of language codes. | 527 // Append the language to the list of language codes. |
523 preferred_language_codes_.push_back(language_code); | 528 preferred_language_codes_.push_back(language_code); |
524 // Update the language table accordingly. | 529 // Update the language table accordingly. |
525 preferred_language_table_->OnItemsAdded(RowCount() - 1, 1); | 530 preferred_language_table_->OnItemsAdded(RowCount() - 1, 1); |
526 preferred_language_table_->SelectRow(RowCount() - 1); | 531 preferred_language_table_->SelectRow(RowCount() - 1); |
527 } | 532 } |
528 } | 533 } |
529 | 534 |
530 void LanguageConfigView::DeactivateInputLanguagesFor( | 535 void LanguageConfigView::DeactivateInputLanguagesFor( |
531 const std::string& language_code) { | 536 const std::string& language_code) { |
532 std::vector<std::string> language_ids; | 537 std::vector<std::string> language_ids; |
533 GetSupportedLangageIDs(&language_ids); | 538 GetSupportedLanguageIDs(&language_ids); |
534 for (size_t i = 0; i < language_ids.size(); ++i) { | 539 for (size_t i = 0; i < language_ids.size(); ++i) { |
535 if (GetLanguageCodeFromID(language_ids[i]) == language_code) { | 540 if (GetLanguageCodeFromID(language_ids[i]) == language_code) { |
536 SetLanguageActivated(language_ids[i], false); | 541 SetLanguageActivated(language_ids[i], false); |
537 // Do not break; here in order to disable all engines that belong to | 542 // Do not break; here in order to disable all engines that belong to |
538 // |language_code|. | 543 // |language_code|. |
539 } | 544 } |
540 } | 545 } |
541 | 546 |
542 // Switch back to the US English. | 547 // Switch back to the US English. |
543 // TODO(yusukes): what if "USA" is not active? | 548 // TODO(yusukes): what if "USA" is not active? |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
590 language_ids.end()); | 595 language_ids.end()); |
591 } | 596 } |
592 | 597 |
593 void LanguageConfigView::GetActiveLanguageIDs( | 598 void LanguageConfigView::GetActiveLanguageIDs( |
594 std::vector<std::string>* out_language_ids) { | 599 std::vector<std::string>* out_language_ids) { |
595 const std::wstring value = preload_engines_.GetValue(); | 600 const std::wstring value = preload_engines_.GetValue(); |
596 out_language_ids->clear(); | 601 out_language_ids->clear(); |
597 SplitString(WideToUTF8(value), ',', out_language_ids); | 602 SplitString(WideToUTF8(value), ',', out_language_ids); |
598 } | 603 } |
599 | 604 |
600 void LanguageConfigView::GetSupportedLangageIDs( | 605 void LanguageConfigView::GetSupportedLanguageIDs( |
601 std::vector<std::string>* out_language_ids) const { | 606 std::vector<std::string>* out_language_ids) const { |
602 out_language_ids->clear(); | 607 out_language_ids->clear(); |
603 std::map<std::string, std::string>::const_iterator iter; | 608 std::map<std::string, std::string>::const_iterator iter; |
604 for (iter = id_to_language_code_map_.begin(); | 609 for (iter = id_to_language_code_map_.begin(); |
605 iter != id_to_language_code_map_.end(); | 610 iter != id_to_language_code_map_.end(); |
606 ++iter) { | 611 ++iter) { |
607 out_language_ids->push_back(iter->first); | 612 out_language_ids->push_back(iter->first); |
608 } | 613 } |
609 } | 614 } |
610 | 615 |
611 void LanguageConfigView::GetSupportedLangageCodes( | 616 void LanguageConfigView::GetSupportedLanguageCodes( |
612 std::vector<std::string>* out_language_codes) const { | 617 std::vector<std::string>* out_language_codes) const { |
613 std::set<std::string> language_code_set; | 618 std::set<std::string> language_code_set; |
614 std::map<std::string, std::string>::const_iterator iter; | 619 std::map<std::string, std::string>::const_iterator iter; |
615 for (iter = id_to_language_code_map_.begin(); | 620 for (iter = id_to_language_code_map_.begin(); |
616 iter != id_to_language_code_map_.end(); | 621 iter != id_to_language_code_map_.end(); |
617 ++iter) { | 622 ++iter) { |
618 language_code_set.insert(iter->second); | 623 language_code_set.insert(iter->second); |
619 } | 624 } |
620 out_language_codes->clear(); | 625 out_language_codes->clear(); |
621 out_language_codes->assign( | 626 out_language_codes->assign( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 const std::wstring& language_name) { | 660 const std::wstring& language_name) { |
656 // "t" is used as the language code for input methods that don't fall | 661 // "t" is used as the language code for input methods that don't fall |
657 // under any other languages. | 662 // under any other languages. |
658 if (language_name == L"t") { | 663 if (language_name == L"t") { |
659 return l10n_util::GetString( | 664 return l10n_util::GetString( |
660 IDS_OPTIONS_SETTINGS_LANGUAGES_OTHERS); | 665 IDS_OPTIONS_SETTINGS_LANGUAGES_OTHERS); |
661 } | 666 } |
662 return language_name; | 667 return language_name; |
663 } | 668 } |
664 | 669 |
| 670 std::string LanguageConfigView::NormalizeLanguageCode( |
| 671 const std::string& language_code) { |
| 672 // We only handle two-letter codes here. |
| 673 // Some ibus engines return locale codes like "zh_CN" as language codes, |
| 674 // and we don't want to rewrite this to "zho". |
| 675 if (language_code.size() != 2) { |
| 676 return language_code; |
| 677 } |
| 678 const char* three_letter_code = uloc_getISO3Language( |
| 679 language_code.c_str()); |
| 680 if (three_letter_code && strlen(three_letter_code) > 0) { |
| 681 return three_letter_code; |
| 682 } |
| 683 return language_code; |
| 684 } |
| 685 |
665 } // namespace chromeos | 686 } // namespace chromeos |
OLD | NEW |