From c5f9f1854f1cac2a4e7c459e86bc46a44365f7cf Mon Sep 17 00:00:00 2001 From: "sidchat@google.com" Date: Mon, 1 Dec 2008 21:08:11 +0000 Subject: Add a new submenu in the context menu for a text box. This submenu displays some spell check languages that Chrome supports, derived from the accept languages list and the current spell check language. The spell check language which is currently set is shown to be selected. The user can click on some other spell check language, and it will become effective immediately (this part of the code was addressed in a previous CL, and has been checked in). Review URL: http://codereview.chromium.org/12614 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6162 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/spellchecker.cc | 118 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) (limited to 'chrome/browser/spellchecker.cc') diff --git a/chrome/browser/spellchecker.cc b/chrome/browser/spellchecker.cc index 86ede3c..04a0855 100644 --- a/chrome/browser/spellchecker.cc +++ b/chrome/browser/spellchecker.cc @@ -34,6 +34,124 @@ using base::TimeTicks; static const int kMaxSuggestions = 5; // Max number of dictionary suggestions. +namespace { +const wchar_t* const g_supported_spellchecker_languages[] = { + L"en-US", + L"en-GB", + L"fr-FR", + L"it-IT", + L"de-DE", + L"es-ES", + L"nl-NL", + L"pt-BR", + L"ru-RU", + L"pl-PL", + // L"th-TH", // Not to be included in Spellchecker as per B=1277824 + L"sv-SE", + L"da-DK", + L"pt-PT", + L"ro-RO", + // L"hu-HU", // Not to be included in Spellchecker as per B=1277824 + // L"he-IL", // Not to be included in Spellchecker as per B=1252241 + L"id-ID", + L"cs-CZ", + L"el-GR", + L"nb-NO", + L"vi-VN", + // L"bg-BG", // Not to be included in Spellchecker as per B=1277824 + L"hr-HR", + L"lt-LT", + L"sk-SK", + L"sl-SI", + L"ca-ES", + L"lv-LV", + // L"uk-UA", // Not to be included in Spellchecker as per B=1277824 + L"hi-IN", + // + // TODO(Sidchat): Uncomment/remove languages as and when they get resolved. + // +}; + +} + +void SpellChecker::SpellCheckLanguages(std::vector* languages) { + for (size_t i = 0; + i < arraysize(g_supported_spellchecker_languages); + i++) { + languages->push_back(g_supported_spellchecker_languages[i]); + } +} + +std::wstring SpellChecker::GetCorrespondingSpellCheckLanguage( + const std::wstring& language) { + // Look for exact match in the Spell Check language list. + for (int i = 0; i < arraysize(g_supported_spellchecker_languages); ++i) { + std::wstring spellcheck_language(g_supported_spellchecker_languages[i]); + if (spellcheck_language == language) + return language; + } + + // Find match for the language. For example, for "hi", the corresponding + // Spell Check language is "hi-IN". The input language has to be 2 letter. + if (language.length() == 2) { + for (int i = 0; i < arraysize(g_supported_spellchecker_languages); ++i) { + std::wstring spellcheck_language(g_supported_spellchecker_languages[i]); + std::wstring spellcheck_country(spellcheck_language.substr(0, 2)); + if (spellcheck_country == language) + return spellcheck_language; + } + } + + // No match found - return blank. + return std::wstring(); +} + +int SpellChecker::GetSpellCheckLanguagesToDisplayInContextMenu( + Profile* profile, std::vector* display_language_list) { + std::vector language_list; + StringPrefMember accept_languages; + StringPrefMember dictionary_language; + accept_languages.Init(prefs::kAcceptLanguages, + profile->GetPrefs(), NULL); + dictionary_language.Init(prefs::kSpellCheckDictionary, + profile->GetPrefs(), NULL); + + // The current dictionary language should be there. + display_language_list->push_back(dictionary_language.GetValue().c_str()); + + // Now scan through the list of accept languages, and find possible mappings + // from this list to the existing list of spell check languages. + std::vector accept_language_vector; + SplitString(accept_languages.GetValue(), L',', &accept_language_vector); + for (size_t i = 0; i < accept_language_vector.size(); i++) { + std::wstring language = GetCorrespondingSpellCheckLanguage( + accept_language_vector.at(i)); + if (!language.empty()) { + // Check for duplication. + bool duplicate = false; + for (size_t j = 0; j < display_language_list->size(); j++) { + if (display_language_list->at(j) == language) + duplicate = true; + } + + if (!duplicate) + display_language_list->push_back(language.c_str()); + } + } + + // Sort using locale specific sorter. + l10n_util::SortStrings(g_browser_process->GetApplicationLocale(), + display_language_list); + + int current_spell_check_language_index = -1; + for (size_t i = 0; i < display_language_list->size(); i++) { + if (dictionary_language.GetValue() == display_language_list->at(i)) + current_spell_check_language_index = i; + } + + return current_spell_check_language_index; +} + // This is a helper class which acts as a proxy for invoking a task from the // file loop back to the IO loop. Invoking a task from file loop to the IO // loop directly is not safe as during browser shutdown, the IO loop tears -- cgit v1.1