diff options
author | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 13:51:31 +0000 |
---|---|---|
committer | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 13:51:31 +0000 |
commit | d4f45da56975c4ccc8bf3d7ad5a6382ca7f4bfbe (patch) | |
tree | cebdc51464a1ba5e336c4c840959018044647cdf | |
parent | 8d7019c5f7be9ffe7ff8241e11a62e85c22d0042 (diff) | |
download | chromium_src-d4f45da56975c4ccc8bf3d7ad5a6382ca7f4bfbe.zip chromium_src-d4f45da56975c4ccc8bf3d7ad5a6382ca7f4bfbe.tar.gz chromium_src-d4f45da56975c4ccc8bf3d7ad5a6382ca7f4bfbe.tar.bz2 |
Support multiple languages.
There is a case which the input method is used in multiple languages, e.g.
US international is used in many non US languages.
This is also helpful for language code variations, e.g. "zh" and "zh-CN".
BUG=249200
TEST=ran all tests.
Review URL: https://chromiumcodereview.appspot.com/16843010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206974 0039d316-1c4b-4281-b951-d872f2087c98
15 files changed, 80 insertions, 46 deletions
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc index f991506a..a7b5056 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc @@ -110,7 +110,10 @@ void InputMethodEngineIBus::Initialize( engine_desc.author = ibus_id_; component_->mutable_engine_description()->push_back(engine_desc); - manager->AddInputMethodExtension(ibus_id_, engine_name, layouts, language, + + std::vector<std::string> languages; + languages.push_back(language); + manager->AddInputMethodExtension(ibus_id_, engine_name, layouts, languages, options_page, this); // If connection is avaiable, register component. If there are no connection // to ibus-daemon, OnConnected callback will register component instead. diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc index 1b1f297..f2c5d8d 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc @@ -441,7 +441,7 @@ void InputMethodManagerImpl::AddInputMethodExtension( const std::string& id, const std::string& name, const std::vector<std::string>& layouts, - const std::string& language, + const std::vector<std::string>& languages, const GURL& options_url, InputMethodEngine* engine) { if (state_ == STATE_TERMINATING) @@ -454,7 +454,7 @@ void InputMethodManagerImpl::AddInputMethodExtension( } extra_input_methods_[id] = - InputMethodDescriptor(id, name, layouts, language, options_url); + InputMethodDescriptor(id, name, layouts, languages, options_url); if (Contains(enabled_extension_imes_, id) && !ComponentExtensionIMEManager::IsComponentExtensionIMEId(id)) { if (!Contains(active_input_method_ids_, id)) { diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.h b/chrome/browser/chromeos/input_method/input_method_manager_impl.h index 3b2e2bc..c585b46 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl.h +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.h @@ -75,7 +75,7 @@ class InputMethodManagerImpl : public InputMethodManager, const std::string& id, const std::string& name, const std::vector<std::string>& layouts, - const std::string& language, + const std::vector<std::string>& languages, const GURL& options_page, InputMethodEngine* instance) OVERRIDE; virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE; diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc index 66f2bb7..f08cbf9 100644 --- a/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_manager_impl_unittest.cc @@ -1003,11 +1003,13 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) { // Add two Extension IMEs. std::vector<std::string> layouts; layouts.push_back("us"); + std::vector<std::string> languages; + languages.push_back("en-US"); manager_->AddInputMethodExtension( extension_ime_util::GetInputMethodID("deadbeef", "engine_id"), "deadbeef input method", layouts, - "en-US", + languages, GURL(), NULL); @@ -1034,7 +1036,7 @@ TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) { extension_ime_util::GetInputMethodID("cafebabe", "engine_id"), "cafebabe input method", layouts, - "en-US", + languages, GURL(), NULL); EXPECT_EQ(2U, manager_->GetNumActiveInputMethods()); @@ -1083,11 +1085,13 @@ TEST_F(InputMethodManagerImplTest, TestAddExtensionInputThenLockScreen) { // Add an Extension IME. std::vector<std::string> layouts; layouts.push_back("us(dvorak)"); + std::vector<std::string> languages; + languages.push_back("en-US"); manager_->AddInputMethodExtension( extension_ime_util::GetInputMethodID("deadbeef", "engine_id"), "deadbeef input method", layouts, - "en-US", + languages, GURL(), NULL); // Extension IME is not enabled by default. diff --git a/chrome/browser/chromeos/input_method/input_method_util.cc b/chrome/browser/chromeos/input_method/input_method_util.cc index cc1c4b0..f70f0eb 100644 --- a/chrome/browser/chromeos/input_method/input_method_util.cc +++ b/chrome/browser/chromeos/input_method/input_method_util.cc @@ -402,7 +402,8 @@ string16 InputMethodUtil::GetInputMethodShortName( if (text.empty()) { const size_t kMaxLanguageNameLen = 2; - const std::string language_code = input_method.language_code(); + DCHECK(!input_method.language_codes().empty()); + const std::string language_code = input_method.language_codes().at(0); text = StringToUpperASCII(UTF8ToUTF16(language_code)).substr( 0, kMaxLanguageNameLen); } @@ -441,7 +442,8 @@ string16 InputMethodUtil::GetInputMethodLongName( // Indic languages: they share "Standard Input Method". const string16 standard_input_method_text = delegate_->GetLocalizedString( IDS_OPTIONS_SETTINGS_LANGUAGES_M17N_STANDARD_INPUT_METHOD); - const std::string language_code = input_method.language_code(); + DCHECK(!input_method.language_codes().empty()); + const std::string language_code = input_method.language_codes().at(0); string16 text = TranslateString(input_method.id()); if (text == standard_input_method_text || @@ -591,7 +593,8 @@ void InputMethodUtil::GetLanguageCodesFromInputMethodIds( DVLOG(1) << "Unknown input method ID: " << input_method_ids[i]; continue; } - const std::string language_code = input_method->language_code(); + DCHECK(!input_method->language_codes().empty()); + const std::string language_code = input_method->language_codes().at(0); // Add it if it's not already present. if (std::count(out_language_codes->begin(), out_language_codes->end(), language_code) == 0) { @@ -617,7 +620,8 @@ void InputMethodUtil::SetComponentExtensions( component_extension_ime_id_to_descriptor_.clear(); for (size_t i = 0; i < imes.size(); ++i) { const InputMethodDescriptor& input_method = imes.at(i); - const std::string language_code = input_method.language_code(); + DCHECK(!input_method.language_codes().empty()); + const std::string language_code = input_method.language_codes().at(0); id_to_language_code_.insert( std::make_pair(input_method.id(), language_code)); id_to_descriptor_.insert( @@ -628,10 +632,12 @@ void InputMethodUtil::SetComponentExtensions( InputMethodDescriptor InputMethodUtil::GetFallbackInputMethodDescriptor() { std::vector<std::string> layouts; layouts.push_back("us"); + std::vector<std::string> languages; + languages.push_back("en-US"); return InputMethodDescriptor("xkb:us::eng", "", layouts, - "en-US", + languages, GURL()); // options page, not available. } @@ -650,12 +656,15 @@ void InputMethodUtil::ReloadInternalMaps() { for (size_t i = 0; i < supported_input_methods_->size(); ++i) { const InputMethodDescriptor& input_method = supported_input_methods_->at(i); - const std::string language_code = input_method.language_code(); - language_code_to_ids_.insert( - std::make_pair(language_code, input_method.id())); - // Remember the pairs. - id_to_language_code_.insert( - std::make_pair(input_method.id(), language_code)); + const std::vector<std::string>& language_codes = + input_method.language_codes(); + for (size_t i = 0; i < language_codes.size(); ++i) { + language_code_to_ids_.insert( + std::make_pair(language_codes[i], input_method.id())); + // Remember the pairs. + id_to_language_code_.insert( + std::make_pair(input_method.id(), language_codes[i])); + } id_to_descriptor_.insert( std::make_pair(input_method.id(), input_method)); if (IsKeyboardLayout(input_method.id())) { diff --git a/chrome/browser/chromeos/input_method/input_method_util_unittest.cc b/chrome/browser/chromeos/input_method/input_method_util_unittest.cc index a6b7140..7a4a33f 100644 --- a/chrome/browser/chromeos/input_method/input_method_util_unittest.cc +++ b/chrome/browser/chromeos/input_method/input_method_util_unittest.cc @@ -54,10 +54,12 @@ class InputMethodUtilTest : public testing::Test { const std::string& language_code) { std::vector<std::string> layouts; layouts.push_back(raw_layout); + std::vector<std::string> languages; + languages.push_back(language_code); return InputMethodDescriptor(id, "", layouts, - language_code, + languages, GURL()); // options page url } @@ -329,7 +331,8 @@ TEST_F(InputMethodUtilTest, TestGetInputMethodDescriptorFromId) { EXPECT_EQ("us", descriptor->GetPreferredKeyboardLayout()); // This used to be "zh" but now we have "zh-CN" in input_methods.h, // hence this should be zh-CN now. - EXPECT_EQ("zh-CN", descriptor->language_code()); + ASSERT_TRUE(!descriptor->language_codes().empty()); + EXPECT_EQ("zh-CN", descriptor->language_codes().at(0)); } TEST_F(InputMethodUtilTest, TestGetInputMethodIdsForLanguageCode) { @@ -465,7 +468,7 @@ TEST_F(InputMethodUtilTest, TestGetLanguageCodesFromInputMethodIds) { TEST_F(InputMethodUtilTest, TestIBusInputMethodText) { for (size_t i = 0; i < util_.supported_input_methods_->size(); ++i) { const std::string language_code = - util_.supported_input_methods_->at(i).language_code(); + util_.supported_input_methods_->at(i).language_codes().at(0); const string16 display_name = l10n_util::GetDisplayNameForLocale(language_code, "en", false); // Only two formats, like "fr" (lower case) and "en-US" (lower-upper), are diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc index bf83f20..9efe97f 100644 --- a/chrome/browser/chromeos/input_method/mock_input_method_manager.cc +++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.cc @@ -87,7 +87,7 @@ void MockInputMethodManager::AddInputMethodExtension( const std::string& id, const std::string& name, const std::vector<std::string>& layouts, - const std::string& language, + const std::vector<std::string>& languages, const GURL& options_url, InputMethodEngine* instance) { } @@ -123,7 +123,7 @@ InputMethodDescriptor MockInputMethodManager::GetCurrentInputMethod() const { return InputMethodDescriptor(current_input_method_id_, descriptor.name(), descriptor.keyboard_layouts(), - descriptor.language_code(), + descriptor.language_codes(), GURL()); // options page url. } return descriptor; diff --git a/chrome/browser/chromeos/input_method/mock_input_method_manager.h b/chrome/browser/chromeos/input_method/mock_input_method_manager.h index cbefc92..77d760d 100644 --- a/chrome/browser/chromeos/input_method/mock_input_method_manager.h +++ b/chrome/browser/chromeos/input_method/mock_input_method_manager.h @@ -48,7 +48,7 @@ class MockInputMethodManager : public InputMethodManager { const std::string& id, const std::string& name, const std::vector<std::string>& layouts, - const std::string& language, + const std::vector<std::string>& languages, const GURL& options_url, InputMethodEngine* instance) OVERRIDE; virtual void RemoveInputMethodExtension(const std::string& id) OVERRIDE; diff --git a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc index 0629f69..315738b 100644 --- a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.cc @@ -161,7 +161,6 @@ ListValue* CrosLanguageOptionsHandler::GetInputMethodList( for (size_t i = 0; i < descriptors.size(); ++i) { const input_method::InputMethodDescriptor& descriptor = descriptors[i]; - const std::string language_code = descriptor.language_code(); const std::string display_name = manager->GetInputMethodUtil()->GetInputMethodDisplayNameFromId( descriptor.id()); @@ -171,16 +170,18 @@ ListValue* CrosLanguageOptionsHandler::GetInputMethodList( // One input method can be associated with multiple languages, hence // we use a dictionary here. - DictionaryValue* language_codes = new DictionaryValue(); - language_codes->SetBoolean(language_code, true); + DictionaryValue* languages = new DictionaryValue(); + for (size_t i = 0; i < descriptor.language_codes().size(); ++i) { + languages->SetBoolean(descriptor.language_codes().at(i), true); + } // Check extra languages to see if there are languages associated with // this input method. If these are present, add these. const std::vector<std::string> extra_language_codes = manager->GetInputMethodUtil()->GetExtraLanguageCodesFromId( descriptor.id()); for (size_t j = 0; j < extra_language_codes.size(); ++j) - language_codes->SetBoolean(extra_language_codes[j], true); - dictionary->Set("languageCodeSet", language_codes); + languages->SetBoolean(extra_language_codes[j], true); + dictionary->Set("languageCodeSet", languages); input_method_list->Append(dictionary); } @@ -198,8 +199,10 @@ ListValue* CrosLanguageOptionsHandler::GetLanguageListInternal( // Collect the language codes from the supported input methods. for (size_t i = 0; i < descriptors.size(); ++i) { const input_method::InputMethodDescriptor& descriptor = descriptors[i]; - const std::string language_code = descriptor.language_code(); - language_codes.insert(language_code); + const std::vector<std::string>& languages = + descriptor.language_codes(); + for (size_t i = 0; i < languages.size(); ++i) + language_codes.insert(languages[i]); } // Collect the language codes from extra languages. const std::vector<std::string> extra_language_codes = @@ -316,7 +319,8 @@ base::ListValue* dictionary->SetString("displayName", descriptor.name()); dictionary->SetString("optionsPage", descriptor.options_page_url().spec()); scoped_ptr<DictionaryValue> language_codes(new DictionaryValue()); - language_codes->SetBoolean(descriptor.language_code(), true); + for (size_t i = 0; i < descriptor.language_codes().size(); ++i) + language_codes->SetBoolean(descriptor.language_codes().at(i), true); dictionary->Set("languageCodeSet", language_codes.release()); ime_ids_list->Append(dictionary.release()); } diff --git a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler_unittest.cc b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler_unittest.cc index fab2730..b51e0f0 100644 --- a/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler_unittest.cc +++ b/chrome/browser/ui/webui/options/chromeos/cros_language_options_handler_unittest.cc @@ -45,10 +45,12 @@ class CrosLanguageOptionsHandlerTest : public testing::Test { const std::string& language_code) { std::vector<std::string> layouts; layouts.push_back(raw_layout); + std::vector<std::string> languages; + languages.push_back(language_code); return InputMethodDescriptor(id, "", // name layouts, - language_code, + languages, GURL()); // options page url } }; diff --git a/chromeos/ime/component_extension_ime_manager.cc b/chromeos/ime/component_extension_ime_manager.cc index 40aeb76..c557d09 100644 --- a/chromeos/ime/component_extension_ime_manager.cc +++ b/chromeos/ime/component_extension_ime_manager.cc @@ -143,6 +143,9 @@ input_method::InputMethodDescriptors input_method::InputMethodDescriptors result; for (size_t i = 0; i < component_extension_imes_.size(); ++i) { for (size_t j = 0; j < component_extension_imes_[i].engines.size(); ++j) { + std::vector<std::string> languages; + languages.push_back( + component_extension_imes_[i].engines[j].language_code); result.push_back( input_method::InputMethodDescriptor( GetComponentExtensionIMEId( @@ -150,7 +153,7 @@ input_method::InputMethodDescriptors component_extension_imes_[i].engines[j].engine_id), component_extension_imes_[i].engines[j].display_name, component_extension_imes_[i].engines[j].layouts, - component_extension_imes_[i].engines[j].language_code, + languages, component_extension_imes_[i].options_page_url)); } } diff --git a/chromeos/ime/input_method_descriptor.cc b/chromeos/ime/input_method_descriptor.cc index c19ae8b..785884e 100644 --- a/chromeos/ime/input_method_descriptor.cc +++ b/chromeos/ime/input_method_descriptor.cc @@ -17,12 +17,12 @@ InputMethodDescriptor::InputMethodDescriptor( const std::string& id, const std::string& name, const std::vector<std::string>& keyboard_layouts, - const std::string& language_code, + const std::vector<std::string>& language_codes, const GURL& options_page_url) : id_(id), name_(name), keyboard_layouts_(keyboard_layouts), - language_code_(language_code), + language_codes_(language_codes), options_page_url_(options_page_url) { } diff --git a/chromeos/ime/input_method_descriptor.h b/chromeos/ime/input_method_descriptor.h index fbe687a..fc2cf27 100644 --- a/chromeos/ime/input_method_descriptor.h +++ b/chromeos/ime/input_method_descriptor.h @@ -22,14 +22,16 @@ class CHROMEOS_EXPORT InputMethodDescriptor { InputMethodDescriptor(const std::string& id, const std::string& name, const std::vector<std::string>& keyboard_layouts, - const std::string& language_code, + const std::vector<std::string>& language_codes, const GURL& options_page_url); ~InputMethodDescriptor(); // Accessors const std::string& id() const { return id_; } const std::string& name() const { return name_; } - const std::string& language_code() const { return language_code_; } + const std::vector<std::string>& language_codes() const { + return language_codes_; + } const GURL& options_page_url() const { return options_page_url_; } const std::vector<std::string>& keyboard_layouts() const { return keyboard_layouts_; @@ -52,7 +54,7 @@ class CHROMEOS_EXPORT InputMethodDescriptor { std::vector<std::string> keyboard_layouts_; // Language code like "ko", "ja", "en-US", and "zh-CN". - std::string language_code_; + std::vector<std::string> language_codes_; // Options page URL e.g. // "chrome-extension://ceaajjmckiakobniehbjpdcidfpohlin/options.html". diff --git a/chromeos/ime/input_method_manager.h b/chromeos/ime/input_method_manager.h index 56dcee5..075804e 100644 --- a/chromeos/ime/input_method_manager.h +++ b/chromeos/ime/input_method_manager.h @@ -140,12 +140,13 @@ class CHROMEOS_EXPORT InputMethodManager { // Adds an input method extension. This function does not takes ownership of // |instance|. - virtual void AddInputMethodExtension(const std::string& id, - const std::string& name, - const std::vector<std::string>& layouts, - const std::string& language, - const GURL& options_url, - InputMethodEngine* instance) = 0; + virtual void AddInputMethodExtension( + const std::string& id, + const std::string& name, + const std::vector<std::string>& layouts, + const std::vector<std::string>& languages, + const GURL& options_url, + InputMethodEngine* instance) = 0; // Removes an input method extension. virtual void RemoveInputMethodExtension(const std::string& id) = 0; diff --git a/chromeos/ime/input_method_whitelist.cc b/chromeos/ime/input_method_whitelist.cc index 0f90787..cea052c 100644 --- a/chromeos/ime/input_method_whitelist.cc +++ b/chromeos/ime/input_method_whitelist.cc @@ -34,11 +34,14 @@ InputMethodWhitelist::GetSupportedInputMethods() const { std::vector<std::string> layouts; layouts.push_back(kInputMethods[i].xkb_layout_id); + std::vector<std::string> languages; + languages.push_back(kInputMethods[i].language_code); + input_methods->push_back(InputMethodDescriptor( kInputMethods[i].input_method_id, "", layouts, - kInputMethods[i].language_code, + languages, GURL())); // options page url, not available for non-extension input // method. } |