Index: chrome/browser/resources/options/language_options.js |
diff --git a/chrome/browser/resources/options/language_options.js b/chrome/browser/resources/options/language_options.js |
index 996a324f87c33fb1cf3e1ec895cb9efcc92c7fb7..f296d0117a8679baebe448602083435645d0487b 100644 |
--- a/chrome/browser/resources/options/language_options.js |
+++ b/chrome/browser/resources/options/language_options.js |
@@ -52,8 +52,8 @@ cr.define('options', function() { |
var TRANSLATE_BLOCKED_LANGUAGES_PREF = 'translate_blocked_languages'; |
/** |
- * The preference key that is a string that describes the spell check |
- * dictionary language, like "en-US". |
+ * The preference key that is a list of strings that describes the spellcheck |
+ * dictionary language, like ["en-US", "fr"]. |
* @type {string} |
* @const |
*/ |
@@ -136,12 +136,12 @@ cr.define('options', function() { |
translateSupportedLanguages_: [], |
/** |
- * The preference is a string that describes the spell check dictionary |
- * language, like "en-US". |
- * @type {string} |
+ * The dictionary of currently selected spellcheck dictionary languages, |
+ * like {"en-US": true, "sl-SI": true}. |
+ * @type {Object} |
* @private |
*/ |
- spellCheckDictionary_: '', |
+ spellCheckLanguages_: {}, |
/** |
* The map of language code to input method IDs, like: |
@@ -188,7 +188,7 @@ cr.define('options', function() { |
TRANSLATE_BLOCKED_LANGUAGES_PREF, |
this.handleTranslateBlockedLanguagesPrefChange_.bind(this)); |
Preferences.getInstance().addEventListener(SPELL_CHECK_DICTIONARIES_PREF, |
- this.handleSpellCheckDictionaryPrefChange_.bind(this)); |
+ this.handleSpellCheckDictionariesPrefChange_.bind(this)); |
Preferences.getInstance().addEventListener(ENABLE_TRANSLATE, |
this.handleEnableTranslatePrefChange_.bind(this)); |
this.translateSupportedLanguages_ = |
@@ -240,11 +240,15 @@ cr.define('options', function() { |
// Handle clicks on "Use this language for spell checking" button. |
if (!cr.isMac) { |
- var spellCheckLanguageButton = getRequiredElement( |
- 'language-options-spell-check-language-button'); |
- spellCheckLanguageButton.addEventListener( |
- 'click', |
- this.handleSpellCheckLanguageButtonClick_.bind(this)); |
+ if (loadTimeData.getBoolean('enableMultilingualSpellChecker')) { |
+ $('spellcheck-language-checkbox').addEventListener( |
+ 'change', |
+ this.handleSpellCheckLanguageCheckboxClick_.bind(this)); |
+ } else { |
+ $('spellcheck-language-button').addEventListener( |
+ 'click', |
+ this.handleSpellCheckLanguageButtonClick_.bind(this)); |
+ } |
} |
if (cr.isChromeOS) { |
@@ -427,7 +431,7 @@ cr.define('options', function() { |
this.updateSelectedLanguageName_(languageCode); |
if (!cr.isMac) |
- this.updateSpellCheckLanguageButton_(languageCode); |
+ this.updateSpellCheckLanguageControls_(languageCode); |
if (cr.isChromeOS) |
this.updateInputMethodList_(languageCode); |
@@ -604,56 +608,71 @@ cr.define('options', function() { |
* @param {string} languageCode Language code (ex. "fr"). |
* @private |
*/ |
- updateSpellCheckLanguageButton_: function(languageCode) { |
+ updateSpellCheckLanguageControls_: function(languageCode) { |
+ assert(languageCode); |
var spellCheckLanguageSection = $('language-options-spellcheck'); |
- var spellCheckLanguageButton = |
- $('language-options-spell-check-language-button'); |
- var spellCheckLanguageMessage = |
- $('language-options-spell-check-language-message'); |
+ var spellCheckLanguageButton = $('spellcheck-language-button'); |
+ var spellCheckLanguageCheckboxContainer = |
+ $('spellcheck-language-checkbox-container'); |
+ var spellCheckLanguageCheckbox = $('spellcheck-language-checkbox'); |
+ var spellCheckLanguageMessage = $('spellcheck-language-message'); |
var dictionaryDownloadInProgress = |
$('language-options-dictionary-downloading-message'); |
var dictionaryDownloadFailed = |
$('language-options-dictionary-download-failed-message'); |
var dictionaryDownloadFailHelp = |
$('language-options-dictionary-download-fail-help-message'); |
+ |
spellCheckLanguageSection.hidden = false; |
spellCheckLanguageMessage.hidden = true; |
spellCheckLanguageButton.hidden = true; |
+ spellCheckLanguageCheckboxContainer.hidden = true; |
dictionaryDownloadInProgress.hidden = true; |
dictionaryDownloadFailed.hidden = true; |
dictionaryDownloadFailHelp.hidden = true; |
+ spellCheckLanguageCheckbox.checked = false; |
+ |
+ var canBeUsedForSpellchecking = |
+ languageCode in loadTimeData.getValue('spellCheckLanguageCodeSet'); |
+ |
+ if (!canBeUsedForSpellchecking) { |
+ spellCheckLanguageMessage.textContent = |
+ loadTimeData.getString('cannotBeUsedForSpellChecking'); |
+ spellCheckLanguageMessage.hidden = false; |
+ return; |
+ } |
+ |
+ var isUsedForSpellchecking = languageCode in this.spellCheckLanguages_; |
+ var isLanguageDownloaded = |
+ !(languageCode in this.spellcheckDictionaryDownloadStatus_); |
- if (languageCode == this.spellCheckDictionary_) { |
- if (!(languageCode in this.spellcheckDictionaryDownloadStatus_)) { |
+ if (loadTimeData.getBoolean('enableMultilingualSpellChecker')) { |
+ spellCheckLanguageCheckbox.languageCode = languageCode; |
+ spellCheckLanguageCheckbox.checked = isUsedForSpellchecking; |
+ spellCheckLanguageCheckboxContainer.hidden = false; |
+ } else if (isUsedForSpellchecking) { |
+ if (isLanguageDownloaded) { |
spellCheckLanguageMessage.textContent = |
loadTimeData.getString('isUsedForSpellChecking'); |
- showMutuallyExclusiveNodes( |
- [spellCheckLanguageButton, spellCheckLanguageMessage], 1); |
- } else if (this.spellcheckDictionaryDownloadStatus_[languageCode] == |
- DOWNLOAD_STATUS.IN_PROGRESS) { |
- dictionaryDownloadInProgress.hidden = false; |
- } else if (this.spellcheckDictionaryDownloadStatus_[languageCode] == |
- DOWNLOAD_STATUS.FAILED) { |
- spellCheckLanguageSection.hidden = true; |
- dictionaryDownloadFailed.hidden = false; |
- if (this.spellcheckDictionaryDownloadFailures_ > 1) |
- dictionaryDownloadFailHelp.hidden = false; |
+ spellCheckLanguageMessage.hidden = false; |
} |
- } else if (languageCode in |
- loadTimeData.getValue('spellCheckLanguageCodeSet')) { |
+ } else { |
spellCheckLanguageButton.textContent = |
loadTimeData.getString('useThisForSpellChecking'); |
- showMutuallyExclusiveNodes( |
- [spellCheckLanguageButton, spellCheckLanguageMessage], 0); |
+ spellCheckLanguageButton.hidden = false; |
spellCheckLanguageButton.languageCode = languageCode; |
- } else if (!languageCode) { |
- spellCheckLanguageButton.hidden = true; |
- spellCheckLanguageMessage.hidden = true; |
- } else { |
- spellCheckLanguageMessage.textContent = |
- loadTimeData.getString('cannotBeUsedForSpellChecking'); |
- showMutuallyExclusiveNodes( |
- [spellCheckLanguageButton, spellCheckLanguageMessage], 1); |
+ } |
+ |
+ switch (this.spellcheckDictionaryDownloadStatus_[languageCode]) { |
+ case DOWNLOAD_STATUS.IN_PROGRESS: |
+ dictionaryDownloadInProgress.hidden = false; |
+ break; |
+ case DOWNLOAD_STATUS.FAILED: |
+ showMutuallyExclusiveNodes( |
+ [spellCheckLanguageSection, dictionaryDownloadFailed], 1); |
+ if (this.spellcheckDictionaryDownloadFailures_ > 1) |
+ dictionaryDownloadFailHelp.hidden = false; |
+ break; |
} |
}, |
@@ -919,8 +938,8 @@ cr.define('options', function() { |
* @private |
*/ |
updateEnableSpellCheck_: function(e) { |
- var value = !$('enable-spell-check').checked; |
- $('language-options-spell-check-language-button').disabled = value; |
+ var value = !$('enable-spellcheck').checked; |
+ $('spellcheck-language-button').disabled = value; |
if (!cr.isMac) |
$('edit-dictionary-button').hidden = value; |
}, |
@@ -937,17 +956,23 @@ cr.define('options', function() { |
}, |
/** |
- * Handles spellCheckDictionaryPref change. |
- * @param {Event} e Change event. |
+ * Updates spellcheck dictionary UI (checkboxes, buttons, and labels) when |
+ * preferences change. |
+ * @param {Event} e Preference change event where e.value.value is the list |
+ * of languages currently used for spellchecking. |
* @private |
*/ |
- handleSpellCheckDictionaryPrefChange_: function(e) { |
- var languageCode = e.value.value; |
- this.spellCheckDictionary_ = languageCode; |
- if (!cr.isMac) { |
- this.updateSpellCheckLanguageButton_( |
- $('language-options-list').getSelectedLanguageCode()); |
+ handleSpellCheckDictionariesPrefChange_: function(e) { |
+ if (cr.isMac) |
+ return; |
+ |
+ var languages = e.value.value; |
+ this.spellCheckLanguages_ = {}; |
+ for (var i = 0; i < languages.length; i++) { |
+ this.spellCheckLanguages_[languages[i]] = true; |
} |
+ this.updateSpellCheckLanguageControls_( |
+ $('language-options-list').getSelectedLanguageCode()); |
}, |
/** |
@@ -968,10 +993,36 @@ cr.define('options', function() { |
* @private |
*/ |
handleSpellCheckLanguageButtonClick_: function(e) { |
- var languageCodes = [e.target.languageCode]; |
+ var languageCode = e.currentTarget.languageCode; |
// Save the preference. |
Preferences.setListPref(SPELL_CHECK_DICTIONARIES_PREF, |
+ [languageCode], true); |
+ |
+ // The spellCheckLanguageChange argument is only used for logging. |
+ chrome.send('spellCheckLanguageChange', [languageCode]); |
+ chrome.send('coreOptionsUserMetricsAction', |
+ ['Options_Languages_SpellCheck']); |
+ }, |
+ |
+ /** |
+ * Updates the spellcheck.dictionaries preference with the currently |
+ * selected language codes. |
+ * @param {Event} e Click event. e.currentTarget represents the "Use this |
+ * language for spellchecking" checkbox. |
+ * @private |
+ */ |
+ handleSpellCheckLanguageCheckboxClick_: function(e) { |
+ var languageCode = e.currentTarget.languageCode; |
+ |
+ if (e.currentTarget.checked) |
+ this.spellCheckLanguages_[languageCode] = true; |
+ else |
+ delete this.spellCheckLanguages_[languageCode]; |
+ |
+ var languageCodes = Object.keys(this.spellCheckLanguages_); |
+ Preferences.setListPref(SPELL_CHECK_DICTIONARIES_PREF, |
languageCodes, true); |
+ |
// The spellCheckLanguageChange argument is only used for logging. |
chrome.send('spellCheckLanguageChange', [languageCodes.join(',')]); |
chrome.send('coreOptionsUserMetricsAction', |
@@ -1277,7 +1328,7 @@ cr.define('options', function() { |
if (!cr.isMac && |
languageCode == |
$('language-options-list').getSelectedLanguageCode()) { |
- this.updateSpellCheckLanguageButton_(languageCode); |
+ this.updateSpellCheckLanguageControls_(languageCode); |
} |
}, |
@@ -1293,7 +1344,7 @@ cr.define('options', function() { |
if (!cr.isMac && |
languageCode == |
$('language-options-list').getSelectedLanguageCode()) { |
- this.updateSpellCheckLanguageButton_(languageCode); |
+ this.updateSpellCheckLanguageControls_(languageCode); |
} |
}, |
@@ -1310,7 +1361,7 @@ cr.define('options', function() { |
if (!cr.isMac && |
languageCode == |
$('language-options-list').getSelectedLanguageCode()) { |
- this.updateSpellCheckLanguageButton_(languageCode); |
+ this.updateSpellCheckLanguageControls_(languageCode); |
} |
}, |