| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 /** | 5 /** |
| 6 * @fileoverview 'settings-languages' handles Chrome's language and input | 6 * @fileoverview 'settings-languages' handles Chrome's language and input |
| 7 * method settings. The 'languages' property, which reflects the current | 7 * method settings. The 'languages' property, which reflects the current |
| 8 * language settings, must not be changed directly. Instead, changes to | 8 * language settings, must not be changed directly. Instead, changes to |
| 9 * language settings should be made using the LanguageHelper APIs provided by | 9 * language settings should be made using the LanguageHelper APIs provided by |
| 10 * this class via languageHelper. | 10 * this class via languageHelper. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 | 27 |
| 28 // Some ISO 639 language codes have been renamed, e.g. "he" to "iw", but | 28 // Some ISO 639 language codes have been renamed, e.g. "he" to "iw", but |
| 29 // Translate still uses the old versions. TODO(michaelpg): Chrome does too. | 29 // Translate still uses the old versions. TODO(michaelpg): Chrome does too. |
| 30 // Follow up with Translate owners to understand the right thing to do. | 30 // Follow up with Translate owners to understand the right thing to do. |
| 31 var kTranslateLanguageSynonyms = { | 31 var kTranslateLanguageSynonyms = { |
| 32 'he': 'iw', | 32 'he': 'iw', |
| 33 'jv': 'jw', | 33 'jv': 'jw', |
| 34 }; | 34 }; |
| 35 | 35 |
| 36 var preferredLanguagesPrefName = cr.isChromeOS ? | 36 var preferredLanguagesPrefName = cr.isChromeOS ? |
| 37 'settings.language.preferred_languages' : 'intl.accept_languages'; | 37 'settings.language.preferred_languages' : |
| 38 'intl.accept_languages'; |
| 38 | 39 |
| 39 /** | 40 /** |
| 40 * Singleton element that generates the languages model on start-up and | 41 * Singleton element that generates the languages model on start-up and |
| 41 * updates it whenever Chrome's pref store and other settings change. | 42 * updates it whenever Chrome's pref store and other settings change. |
| 42 * @implements {LanguageHelper} | 43 * @implements {LanguageHelper} |
| 43 */ | 44 */ |
| 44 Polymer({ | 45 Polymer({ |
| 45 is: 'settings-languages', | 46 is: 'settings-languages', |
| 46 | 47 |
| 47 behaviors: [PrefsBehavior], | 48 behaviors: [PrefsBehavior], |
| 48 | 49 |
| 49 properties: { | 50 properties: { |
| 50 /** | 51 /** |
| 51 * @type {!LanguagesModel|undefined} | 52 * @type {!LanguagesModel|undefined} |
| 52 */ | 53 */ |
| 53 languages: { | 54 languages: { |
| 54 type: Object, | 55 type: Object, |
| 55 notify: true, | 56 notify: true, |
| 56 readOnly: true, | 57 readOnly: true, |
| 57 }, | 58 }, |
| 58 | 59 |
| 59 /** | 60 /** |
| 60 * This element, as a LanguageHelper instance for API usage. | 61 * This element, as a LanguageHelper instance for API usage. |
| 61 * @type {!LanguageHelper} | 62 * @type {!LanguageHelper} |
| 62 */ | 63 */ |
| 63 languageHelper: { | 64 languageHelper: { |
| 64 type: Object, | 65 type: Object, |
| 65 notify: true, | 66 notify: true, |
| 66 readOnly: true, | 67 readOnly: true, |
| 67 value: function() { return /** @type {!LanguageHelper} */(this); }, | 68 value: function() { |
| 69 return /** @type {!LanguageHelper} */ (this); |
| 70 }, |
| 68 }, | 71 }, |
| 69 | 72 |
| 70 /** | 73 /** |
| 71 * PromiseResolver to be resolved when the singleton has been initialized. | 74 * PromiseResolver to be resolved when the singleton has been initialized. |
| 72 * @private {!PromiseResolver} | 75 * @private {!PromiseResolver} |
| 73 */ | 76 */ |
| 74 resolver_: { | 77 resolver_: { |
| 75 type: Object, | 78 type: Object, |
| 76 value: function() { | 79 value: function() { |
| 77 return new PromiseResolver(); | 80 return new PromiseResolver(); |
| 78 }, | 81 }, |
| 79 }, | 82 }, |
| 80 | 83 |
| 81 /** | 84 /** |
| 82 * Hash map of supported languages by language codes for fast lookup. | 85 * Hash map of supported languages by language codes for fast lookup. |
| 83 * @private {!Map<string, !chrome.languageSettingsPrivate.Language>} | 86 * @private {!Map<string, !chrome.languageSettingsPrivate.Language>} |
| 84 */ | 87 */ |
| 85 supportedLanguageMap_: { | 88 supportedLanguageMap_: { |
| 86 type: Object, | 89 type: Object, |
| 87 value: function() { return new Map(); }, | 90 value: function() { |
| 91 return new Map(); |
| 92 }, |
| 88 }, | 93 }, |
| 89 | 94 |
| 90 /** | 95 /** |
| 91 * Hash set of enabled language codes for membership testing. | 96 * Hash set of enabled language codes for membership testing. |
| 92 * @private {!Set<string>} | 97 * @private {!Set<string>} |
| 93 */ | 98 */ |
| 94 enabledLanguageSet_: { | 99 enabledLanguageSet_: { |
| 95 type: Object, | 100 type: Object, |
| 96 value: function() { return new Set(); }, | 101 value: function() { |
| 102 return new Set(); |
| 103 }, |
| 97 }, | 104 }, |
| 98 | 105 |
| 99 /** | 106 /** |
| 100 * Hash map of supported input methods by ID for fast lookup. | 107 * Hash map of supported input methods by ID for fast lookup. |
| 101 * @private {!Map<string, chrome.languageSettingsPrivate.InputMethod>} | 108 * @private {!Map<string, chrome.languageSettingsPrivate.InputMethod>} |
| 102 */ | 109 */ |
| 103 supportedInputMethodMap_: { | 110 supportedInputMethodMap_: { |
| 104 type: Object, | 111 type: Object, |
| 105 value: function() { return new Map(); }, | 112 value: function() { |
| 113 return new Map(); |
| 114 }, |
| 106 }, | 115 }, |
| 107 | 116 |
| 108 /** | 117 /** |
| 109 * Hash map of input methods supported for each language. | 118 * Hash map of input methods supported for each language. |
| 110 * @type {!Map<string, | 119 * @type {!Map<string, |
| 111 * !Array<!chrome.languageSettingsPrivate.InputMethod>>} | 120 * !Array<!chrome.languageSettingsPrivate.InputMethod>>} |
| 112 * @private | 121 * @private |
| 113 */ | 122 */ |
| 114 languageInputMethods_: { | 123 languageInputMethods_: { |
| 115 type: Object, | 124 type: Object, |
| 116 value: function() { return new Map(); }, | 125 value: function() { |
| 126 return new Map(); |
| 127 }, |
| 117 }, | 128 }, |
| 118 | 129 |
| 119 /** @private Prospective UI language when the page was loaded. */ | 130 /** @private Prospective UI language when the page was loaded. */ |
| 120 originalProspectiveUILanguage_: String, | 131 originalProspectiveUILanguage_: String, |
| 121 }, | 132 }, |
| 122 | 133 |
| 123 observers: [ | 134 observers: [ |
| 124 // All observers wait for the model to be populated by including the | 135 // All observers wait for the model to be populated by including the |
| 125 // |languages| property. | 136 // |languages| property. |
| 126 'prospectiveUILanguageChanged_(prefs.intl.app_locale.value, languages)', | 137 'prospectiveUILanguageChanged_(prefs.intl.app_locale.value, languages)', |
| (...skipping 14 matching lines...) Expand all Loading... |
| 141 | 152 |
| 142 /** @private {?Function} */ | 153 /** @private {?Function} */ |
| 143 boundOnInputMethodChanged_: null, | 154 boundOnInputMethodChanged_: null, |
| 144 | 155 |
| 145 /** @private {?settings.LanguagesBrowserProxy} */ | 156 /** @private {?settings.LanguagesBrowserProxy} */ |
| 146 browserProxy_: null, | 157 browserProxy_: null, |
| 147 | 158 |
| 148 /** @private {?LanguageSettingsPrivate} */ | 159 /** @private {?LanguageSettingsPrivate} */ |
| 149 languageSettingsPrivate_: null, | 160 languageSettingsPrivate_: null, |
| 150 | 161 |
| 151 // <if expr="chromeos"> | 162 // <if expr="chromeos"> |
| 152 /** @private {?InputMethodPrivate} */ | 163 /** @private {?InputMethodPrivate} */ |
| 153 inputMethodPrivate_: null, | 164 inputMethodPrivate_: null, |
| 154 // </if> | 165 // </if> |
| 155 | 166 |
| 156 /** @override */ | 167 /** @override */ |
| 157 attached: function() { | 168 attached: function() { |
| 158 this.browserProxy_ = settings.LanguagesBrowserProxyImpl.getInstance(); | 169 this.browserProxy_ = settings.LanguagesBrowserProxyImpl.getInstance(); |
| 159 this.languageSettingsPrivate_ = | 170 this.languageSettingsPrivate_ = |
| 160 this.browserProxy_.getLanguageSettingsPrivate(); | 171 this.browserProxy_.getLanguageSettingsPrivate(); |
| 161 // <if expr="chromeos"> | 172 // <if expr="chromeos"> |
| 162 this.inputMethodPrivate_ = this.browserProxy_.getInputMethodPrivate(); | 173 this.inputMethodPrivate_ = this.browserProxy_.getInputMethodPrivate(); |
| 163 // </if> | 174 // </if> |
| 164 | 175 |
| 165 var promises = []; | 176 var promises = []; |
| 166 | 177 |
| 167 // Wait until prefs are initialized before creating the model, so we can | 178 // Wait until prefs are initialized before creating the model, so we can |
| 168 // include information about enabled languages. | 179 // include information about enabled languages. |
| 169 promises[0] = CrSettingsPrefs.initialized; | 180 promises[0] = CrSettingsPrefs.initialized; |
| 170 | 181 |
| 171 // Get the language list. | 182 // Get the language list. |
| 172 promises[1] = new Promise(function(resolve) { | 183 promises[1] = new Promise(function(resolve) { |
| 173 this.languageSettingsPrivate_.getLanguageList(resolve); | 184 this.languageSettingsPrivate_.getLanguageList(resolve); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 this.boundOnInputMethodChanged_ = null; | 240 this.boundOnInputMethodChanged_ = null; |
| 230 } | 241 } |
| 231 }, | 242 }, |
| 232 | 243 |
| 233 /** | 244 /** |
| 234 * Updates the prospective UI language based on the new pref value. | 245 * Updates the prospective UI language based on the new pref value. |
| 235 * @param {string} prospectiveUILanguage | 246 * @param {string} prospectiveUILanguage |
| 236 * @private | 247 * @private |
| 237 */ | 248 */ |
| 238 prospectiveUILanguageChanged_: function(prospectiveUILanguage) { | 249 prospectiveUILanguageChanged_: function(prospectiveUILanguage) { |
| 239 this.set('languages.prospectiveUILanguage', | 250 this.set( |
| 251 'languages.prospectiveUILanguage', |
| 240 prospectiveUILanguage || this.originalProspectiveUILanguage_); | 252 prospectiveUILanguage || this.originalProspectiveUILanguage_); |
| 241 }, | 253 }, |
| 242 | 254 |
| 243 /** | 255 /** |
| 244 * Updates the list of enabled languages from the preferred languages pref. | 256 * Updates the list of enabled languages from the preferred languages pref. |
| 245 * @private | 257 * @private |
| 246 */ | 258 */ |
| 247 preferredLanguagesPrefChanged_: function() { | 259 preferredLanguagesPrefChanged_: function() { |
| 248 var enabledLanguageStates = this.getEnabledLanguageStates_( | 260 var enabledLanguageStates = this.getEnabledLanguageStates_( |
| 249 this.languages.translateTarget, this.languages.prospectiveUILanguage); | 261 this.languages.translateTarget, this.languages.prospectiveUILanguage); |
| 250 | 262 |
| 251 // Recreate the enabled language set before updating languages.enabled. | 263 // Recreate the enabled language set before updating languages.enabled. |
| 252 this.enabledLanguageSet_.clear(); | 264 this.enabledLanguageSet_.clear(); |
| 253 for (var i = 0; i < enabledLanguageStates.length; i++) | 265 for (var i = 0; i < enabledLanguageStates.length; i++) |
| 254 this.enabledLanguageSet_.add(enabledLanguageStates[i].language.code); | 266 this.enabledLanguageSet_.add(enabledLanguageStates[i].language.code); |
| 255 | 267 |
| 256 this.set('languages.enabled', enabledLanguageStates); | 268 this.set('languages.enabled', enabledLanguageStates); |
| 257 }, | 269 }, |
| 258 | 270 |
| 259 /** | 271 /** |
| 260 * Updates the spellCheckEnabled state of each enabled language. | 272 * Updates the spellCheckEnabled state of each enabled language. |
| 261 * @private | 273 * @private |
| 262 */ | 274 */ |
| 263 spellCheckDictionariesPrefChanged_: function() { | 275 spellCheckDictionariesPrefChanged_: function() { |
| 264 var spellCheckSet = this.makeSetFromArray_(/** @type {!Array<string>} */( | 276 var spellCheckSet = this.makeSetFromArray_(/** @type {!Array<string>} */ ( |
| 265 this.getPref('spellcheck.dictionaries').value)); | 277 this.getPref('spellcheck.dictionaries').value)); |
| 266 for (var i = 0; i < this.languages.enabled.length; i++) { | 278 for (var i = 0; i < this.languages.enabled.length; i++) { |
| 267 var languageState = this.languages.enabled[i]; | 279 var languageState = this.languages.enabled[i]; |
| 268 this.set('languages.enabled.' + i + '.spellCheckEnabled', | 280 this.set( |
| 269 !!spellCheckSet.has(languageState.language.code)); | 281 'languages.enabled.' + i + '.spellCheckEnabled', |
| 282 !!spellCheckSet.has(languageState.language.code)); |
| 270 } | 283 } |
| 271 }, | 284 }, |
| 272 | 285 |
| 273 /** @private */ | 286 /** @private */ |
| 274 translateLanguagesPrefChanged_: function() { | 287 translateLanguagesPrefChanged_: function() { |
| 275 var translateBlockedPref = this.getPref('translate_blocked_languages'); | 288 var translateBlockedPref = this.getPref('translate_blocked_languages'); |
| 276 var translateBlockedSet = this.makeSetFromArray_( | 289 var translateBlockedSet = this.makeSetFromArray_( |
| 277 /** @type {!Array<string>} */(translateBlockedPref.value)); | 290 /** @type {!Array<string>} */ (translateBlockedPref.value)); |
| 278 | 291 |
| 279 for (var i = 0; i < this.languages.enabled.length; i++) { | 292 for (var i = 0; i < this.languages.enabled.length; i++) { |
| 280 if (this.languages.enabled[i].language.code == | 293 if (this.languages.enabled[i].language.code == |
| 281 this.languages.prospectiveUILanguage) { | 294 this.languages.prospectiveUILanguage) { |
| 282 continue; | 295 continue; |
| 283 } | 296 } |
| 284 var translateCode = this.convertLanguageCodeForTranslate( | 297 var translateCode = this.convertLanguageCodeForTranslate( |
| 285 this.languages.enabled[i].language.code); | 298 this.languages.enabled[i].language.code); |
| 286 this.set( | 299 this.set( |
| 287 'languages.enabled.' + i + '.translateEnabled', | 300 'languages.enabled.' + i + '.translateEnabled', |
| 288 !translateBlockedSet.has(translateCode)); | 301 !translateBlockedSet.has(translateCode)); |
| 289 } | 302 } |
| 290 }, | 303 }, |
| 291 | 304 |
| 292 /** | 305 /** |
| 293 * Constructs the languages model. | 306 * Constructs the languages model. |
| 294 * @param {!Array<!chrome.languageSettingsPrivate.Language>} | 307 * @param {!Array<!chrome.languageSettingsPrivate.Language>} |
| 295 * supportedLanguages | 308 * supportedLanguages |
| 296 * @param {string} translateTarget Language code of the default translate | 309 * @param {string} translateTarget Language code of the default translate |
| 297 * target language. | 310 * target language. |
| 298 * @param {!Array<!chrome.languageSettingsPrivate.InputMethod>|undefined} | 311 * @param {!Array<!chrome.languageSettingsPrivate.InputMethod>|undefined} |
| 299 * supportedInputMethods Input methods (Chrome OS only). | 312 * supportedInputMethods Input methods (Chrome OS only). |
| 300 * @param {string|undefined} currentInputMethodId ID of the currently used | 313 * @param {string|undefined} currentInputMethodId ID of the currently used |
| 301 * input method (Chrome OS only). | 314 * input method (Chrome OS only). |
| 302 * @private | 315 * @private |
| 303 */ | 316 */ |
| 304 createModel_: function(supportedLanguages, translateTarget, | 317 createModel_: function( |
| 305 supportedInputMethods, currentInputMethodId) { | 318 supportedLanguages, translateTarget, supportedInputMethods, |
| 319 currentInputMethodId) { |
| 306 // Populate the hash map of supported languages. | 320 // Populate the hash map of supported languages. |
| 307 for (var i = 0; i < supportedLanguages.length; i++) { | 321 for (var i = 0; i < supportedLanguages.length; i++) { |
| 308 var language = supportedLanguages[i]; | 322 var language = supportedLanguages[i]; |
| 309 language.supportsUI = !!language.supportsUI; | 323 language.supportsUI = !!language.supportsUI; |
| 310 language.supportsTranslate = !!language.supportsTranslate; | 324 language.supportsTranslate = !!language.supportsTranslate; |
| 311 language.supportsSpellcheck = !!language.supportsSpellcheck; | 325 language.supportsSpellcheck = !!language.supportsSpellcheck; |
| 312 this.supportedLanguageMap_.set(language.code, language); | 326 this.supportedLanguageMap_.set(language.code, language); |
| 313 } | 327 } |
| 314 | 328 |
| 315 if (supportedInputMethods) { | 329 if (supportedInputMethods) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 329 this.languageInputMethods_.set(languageCode, [inputMethod]); | 343 this.languageInputMethods_.set(languageCode, [inputMethod]); |
| 330 else | 344 else |
| 331 this.languageInputMethods_.get(languageCode).push(inputMethod); | 345 this.languageInputMethods_.get(languageCode).push(inputMethod); |
| 332 } | 346 } |
| 333 } | 347 } |
| 334 } | 348 } |
| 335 | 349 |
| 336 var prospectiveUILanguage; | 350 var prospectiveUILanguage; |
| 337 if (cr.isChromeOS || cr.isWindows) { | 351 if (cr.isChromeOS || cr.isWindows) { |
| 338 prospectiveUILanguage = | 352 prospectiveUILanguage = |
| 339 /** @type {string} */(this.getPref('intl.app_locale').value) || | 353 /** @type {string} */ (this.getPref('intl.app_locale').value) || |
| 340 this.originalProspectiveUILanguage_; | 354 this.originalProspectiveUILanguage_; |
| 341 } | 355 } |
| 342 | 356 |
| 343 // Create a list of enabled languages from the supported languages. | 357 // Create a list of enabled languages from the supported languages. |
| 344 var enabledLanguageStates = | 358 var enabledLanguageStates = |
| 345 this.getEnabledLanguageStates_(translateTarget, prospectiveUILanguage); | 359 this.getEnabledLanguageStates_(translateTarget, prospectiveUILanguage); |
| 346 // Populate the hash set of enabled languages. | 360 // Populate the hash set of enabled languages. |
| 347 for (var l = 0; l < enabledLanguageStates.length; l++) | 361 for (var l = 0; l < enabledLanguageStates.length; l++) |
| 348 this.enabledLanguageSet_.add(enabledLanguageStates[l].language.code); | 362 this.enabledLanguageSet_.add(enabledLanguageStates[l].language.code); |
| 349 | 363 |
| 350 var model = /** @type {!LanguagesModel} */({ | 364 var model = /** @type {!LanguagesModel} */ ({ |
| 351 supported: supportedLanguages, | 365 supported: supportedLanguages, |
| 352 enabled: enabledLanguageStates, | 366 enabled: enabledLanguageStates, |
| 353 translateTarget: translateTarget, | 367 translateTarget: translateTarget, |
| 354 }); | 368 }); |
| 355 | 369 |
| 356 if (cr.isChromeOS || cr.isWindows) | 370 if (cr.isChromeOS || cr.isWindows) |
| 357 model.prospectiveUILanguage = prospectiveUILanguage; | 371 model.prospectiveUILanguage = prospectiveUILanguage; |
| 358 | 372 |
| 359 if (cr.isChromeOS) { | 373 if (cr.isChromeOS) { |
| 360 model.inputMethods = /** @type {!InputMethodsModel} */({ | 374 model.inputMethods = /** @type {!InputMethodsModel} */ ({ |
| 361 supported: supportedInputMethods, | 375 supported: supportedInputMethods, |
| 362 enabled: this.getEnabledInputMethods_(), | 376 enabled: this.getEnabledInputMethods_(), |
| 363 currentId: currentInputMethodId, | 377 currentId: currentInputMethodId, |
| 364 }); | 378 }); |
| 365 } | 379 } |
| 366 | 380 |
| 367 // Initialize the Polymer languages model. | 381 // Initialize the Polymer languages model. |
| 368 this._setLanguages(model); | 382 this._setLanguages(model); |
| 369 }, | 383 }, |
| 370 | 384 |
| 371 /** | 385 /** |
| 372 * Returns a list of LanguageStates for each enabled language in the supported | 386 * Returns a list of LanguageStates for each enabled language in the supported |
| 373 * languages list. | 387 * languages list. |
| 374 * @param {string} translateTarget Language code of the default translate | 388 * @param {string} translateTarget Language code of the default translate |
| 375 * target language. | 389 * target language. |
| 376 * @param {(string|undefined)} prospectiveUILanguage Prospective UI display | 390 * @param {(string|undefined)} prospectiveUILanguage Prospective UI display |
| 377 * language. Only defined on Windows and Chrome OS. | 391 * language. Only defined on Windows and Chrome OS. |
| 378 * @return {!Array<!LanguageState>} | 392 * @return {!Array<!LanguageState>} |
| 379 * @private | 393 * @private |
| 380 */ | 394 */ |
| 381 getEnabledLanguageStates_: function(translateTarget, prospectiveUILanguage) { | 395 getEnabledLanguageStates_: function(translateTarget, prospectiveUILanguage) { |
| 382 assert(CrSettingsPrefs.isInitialized); | 396 assert(CrSettingsPrefs.isInitialized); |
| 383 | 397 |
| 384 var pref = this.getPref(preferredLanguagesPrefName); | 398 var pref = this.getPref(preferredLanguagesPrefName); |
| 385 var enabledLanguageCodes = pref.value.split(','); | 399 var enabledLanguageCodes = pref.value.split(','); |
| 386 var spellCheckPref = this.getPref('spellcheck.dictionaries'); | 400 var spellCheckPref = this.getPref('spellcheck.dictionaries'); |
| 387 var spellCheckSet = this.makeSetFromArray_(/** @type {!Array<string>} */( | 401 var spellCheckSet = this.makeSetFromArray_( |
| 388 spellCheckPref.value)); | 402 /** @type {!Array<string>} */ (spellCheckPref.value)); |
| 389 | 403 |
| 390 var translateBlockedPref = this.getPref('translate_blocked_languages'); | 404 var translateBlockedPref = this.getPref('translate_blocked_languages'); |
| 391 var translateBlockedSet = this.makeSetFromArray_( | 405 var translateBlockedSet = this.makeSetFromArray_( |
| 392 /** @type {!Array<string>} */(translateBlockedPref.value)); | 406 /** @type {!Array<string>} */ (translateBlockedPref.value)); |
| 393 | 407 |
| 394 var enabledLanguageStates = []; | 408 var enabledLanguageStates = []; |
| 395 for (var i = 0; i < enabledLanguageCodes.length; i++) { | 409 for (var i = 0; i < enabledLanguageCodes.length; i++) { |
| 396 var code = enabledLanguageCodes[i]; | 410 var code = enabledLanguageCodes[i]; |
| 397 var language = this.supportedLanguageMap_.get(code); | 411 var language = this.supportedLanguageMap_.get(code); |
| 398 // Skip unsupported languages. | 412 // Skip unsupported languages. |
| 399 if (!language) | 413 if (!language) |
| 400 continue; | 414 continue; |
| 401 var languageState = /** @type {LanguageState} */({}); | 415 var languageState = /** @type {LanguageState} */ ({}); |
| 402 languageState.language = language; | 416 languageState.language = language; |
| 403 languageState.spellCheckEnabled = !!spellCheckSet.has(code); | 417 languageState.spellCheckEnabled = !!spellCheckSet.has(code); |
| 404 // Translate is considered disabled if this language maps to any translate | 418 // Translate is considered disabled if this language maps to any translate |
| 405 // language that is blocked. | 419 // language that is blocked. |
| 406 var translateCode = this.convertLanguageCodeForTranslate(code); | 420 var translateCode = this.convertLanguageCodeForTranslate(code); |
| 407 languageState.translateEnabled = | 421 languageState.translateEnabled = !!language.supportsTranslate && |
| 408 !!language.supportsTranslate && | |
| 409 !translateBlockedSet.has(translateCode) && | 422 !translateBlockedSet.has(translateCode) && |
| 410 translateCode != translateTarget && | 423 translateCode != translateTarget && |
| 411 (!prospectiveUILanguage || code != prospectiveUILanguage); | 424 (!prospectiveUILanguage || code != prospectiveUILanguage); |
| 412 enabledLanguageStates.push(languageState); | 425 enabledLanguageStates.push(languageState); |
| 413 } | 426 } |
| 414 return enabledLanguageStates; | 427 return enabledLanguageStates; |
| 415 }, | 428 }, |
| 416 | 429 |
| 417 /** | 430 /** |
| 418 * Returns a list of enabled input methods. | 431 * Returns a list of enabled input methods. |
| 419 * @return {!Array<!chrome.languageSettingsPrivate.InputMethod>} | 432 * @return {!Array<!chrome.languageSettingsPrivate.InputMethod>} |
| 420 * @private | 433 * @private |
| 421 */ | 434 */ |
| 422 getEnabledInputMethods_: function() { | 435 getEnabledInputMethods_: function() { |
| 423 assert(cr.isChromeOS); | 436 assert(cr.isChromeOS); |
| 424 assert(CrSettingsPrefs.isInitialized); | 437 assert(CrSettingsPrefs.isInitialized); |
| 425 | 438 |
| 426 var enabledInputMethodIds = | 439 var enabledInputMethodIds = |
| 427 this.getPref('settings.language.preload_engines').value.split(','); | 440 this.getPref('settings.language.preload_engines').value.split(','); |
| 428 enabledInputMethodIds = enabledInputMethodIds.concat(this.getPref( | 441 enabledInputMethodIds = enabledInputMethodIds.concat( |
| 429 'settings.language.enabled_extension_imes').value.split(',')); | 442 this.getPref('settings.language.enabled_extension_imes') |
| 443 .value.split(',')); |
| 430 | 444 |
| 431 // Return only supported input methods. | 445 // Return only supported input methods. |
| 432 return enabledInputMethodIds.map(function(id) { | 446 return enabledInputMethodIds |
| 433 return this.supportedInputMethodMap_.get(id); | 447 .map(function(id) { |
| 434 }.bind(this)).filter(function(inputMethod) { | 448 return this.supportedInputMethodMap_.get(id); |
| 435 return !!inputMethod; | 449 }.bind(this)) |
| 436 }); | 450 .filter(function(inputMethod) { |
| 451 return !!inputMethod; |
| 452 }); |
| 437 }, | 453 }, |
| 438 | 454 |
| 439 /** @private */ | 455 /** @private */ |
| 440 updateEnabledInputMethods_: function() { | 456 updateEnabledInputMethods_: function() { |
| 441 assert(cr.isChromeOS); | 457 assert(cr.isChromeOS); |
| 442 var enabledInputMethods = this.getEnabledInputMethods_(); | 458 var enabledInputMethods = this.getEnabledInputMethods_(); |
| 443 var enabledInputMethodSet = this.makeSetFromArray_(enabledInputMethods); | 459 var enabledInputMethodSet = this.makeSetFromArray_(enabledInputMethods); |
| 444 | 460 |
| 445 for (var i = 0; i < this.languages.inputMethods.supported.length; i++) { | 461 for (var i = 0; i < this.languages.inputMethods.supported.length; i++) { |
| 446 this.set('languages.inputMethods.supported.' + i + '.enabled', | 462 this.set( |
| 463 'languages.inputMethods.supported.' + i + '.enabled', |
| 447 enabledInputMethodSet.has(this.languages.inputMethods.supported[i])); | 464 enabledInputMethodSet.has(this.languages.inputMethods.supported[i])); |
| 448 } | 465 } |
| 449 this.set('languages.inputMethods.enabled', enabledInputMethods); | 466 this.set('languages.inputMethods.enabled', enabledInputMethods); |
| 450 }, | 467 }, |
| 451 | 468 |
| 452 /** | 469 /** |
| 453 * Updates the |removable| property of the enabled language states based | 470 * Updates the |removable| property of the enabled language states based |
| 454 * on what other languages and input methods are enabled. | 471 * on what other languages and input methods are enabled. |
| 455 * @private | 472 * @private |
| 456 */ | 473 */ |
| 457 updateRemovableLanguages_: function() { | 474 updateRemovableLanguages_: function() { |
| 458 assert(this.languages); | 475 assert(this.languages); |
| 459 // TODO(michaelpg): Enabled input methods can affect which languages are | 476 // TODO(michaelpg): Enabled input methods can affect which languages are |
| 460 // removable, so run updateEnabledInputMethods_ first (if it has been | 477 // removable, so run updateEnabledInputMethods_ first (if it has been |
| 461 // scheduled). | 478 // scheduled). |
| 462 if (cr.isChromeOS) | 479 if (cr.isChromeOS) |
| 463 this.updateEnabledInputMethods_(); | 480 this.updateEnabledInputMethods_(); |
| 464 | 481 |
| 465 for (var i = 0; i < this.languages.enabled.length; i++) { | 482 for (var i = 0; i < this.languages.enabled.length; i++) { |
| 466 var languageState = this.languages.enabled[i]; | 483 var languageState = this.languages.enabled[i]; |
| 467 this.set('languages.enabled.' + i + '.removable', | 484 this.set( |
| 485 'languages.enabled.' + i + '.removable', |
| 468 this.canDisableLanguage(languageState.language.code)); | 486 this.canDisableLanguage(languageState.language.code)); |
| 469 } | 487 } |
| 470 }, | 488 }, |
| 471 | 489 |
| 472 /** | 490 /** |
| 473 * Creates a Set from the elements of the array. | 491 * Creates a Set from the elements of the array. |
| 474 * @param {!Array<T>} list | 492 * @param {!Array<T>} list |
| 475 * @return {!Set<T>} | 493 * @return {!Set<T>} |
| 476 * @template T | 494 * @template T |
| 477 * @private | 495 * @private |
| 478 */ | 496 */ |
| 479 makeSetFromArray_: function(list) { | 497 makeSetFromArray_: function(list) { |
| 480 return new Set(list); | 498 return new Set(list); |
| 481 }, | 499 }, |
| 482 | 500 |
| 483 // LanguageHelper implementation. | 501 // LanguageHelper implementation. |
| 484 // TODO(michaelpg): replace duplicate docs with @override once b/24294625 | 502 // TODO(michaelpg): replace duplicate docs with @override once b/24294625 |
| 485 // is fixed. | 503 // is fixed. |
| 486 | 504 |
| 487 /** @return {!Promise} */ | 505 /** @return {!Promise} */ |
| 488 whenReady: function() { | 506 whenReady: function() { |
| 489 return this.resolver_.promise; | 507 return this.resolver_.promise; |
| 490 }, | 508 }, |
| 491 | 509 |
| 492 // <if expr="chromeos or is_win"> | 510 // <if expr="chromeos or is_win"> |
| 493 /** | 511 /** |
| 494 * Sets the prospective UI language to the chosen language. This won't affect | 512 * Sets the prospective UI language to the chosen language. This won't affect |
| 495 * the actual UI language until a restart. | 513 * the actual UI language until a restart. |
| 496 * @param {string} languageCode | 514 * @param {string} languageCode |
| 497 */ | 515 */ |
| 498 setProspectiveUILanguage: function(languageCode) { | 516 setProspectiveUILanguage: function(languageCode) { |
| 499 this.browserProxy_.setProspectiveUILanguage(languageCode); | 517 this.browserProxy_.setProspectiveUILanguage(languageCode); |
| 500 }, | 518 }, |
| 501 | 519 |
| 502 /** | 520 /** |
| 503 * True if the prospective UI language was changed from its starting value. | 521 * True if the prospective UI language was changed from its starting value. |
| 504 * @return {boolean} | 522 * @return {boolean} |
| 505 */ | 523 */ |
| 506 requiresRestart: function() { | 524 requiresRestart: function() { |
| 507 return this.originalProspectiveUILanguage_ != | 525 return this.originalProspectiveUILanguage_ != |
| 508 this.languages.prospectiveUILanguage; | 526 this.languages.prospectiveUILanguage; |
| 509 }, | 527 }, |
| 510 // </if> | 528 // </if> |
| 511 | 529 |
| 512 /** | 530 /** |
| 513 * @param {string} languageCode | 531 * @param {string} languageCode |
| 514 * @return {boolean} True if the language is enabled. | 532 * @return {boolean} True if the language is enabled. |
| 515 */ | 533 */ |
| 516 isLanguageEnabled: function(languageCode) { | 534 isLanguageEnabled: function(languageCode) { |
| 517 return this.enabledLanguageSet_.has(languageCode); | 535 return this.enabledLanguageSet_.has(languageCode); |
| 518 }, | 536 }, |
| 519 | 537 |
| 520 /** | 538 /** |
| (...skipping 19 matching lines...) Expand all Loading... |
| 540 assert(this.canDisableLanguage(languageCode)); | 558 assert(this.canDisableLanguage(languageCode)); |
| 541 | 559 |
| 542 // Remove the language from spell check. | 560 // Remove the language from spell check. |
| 543 this.deletePrefListItem('spellcheck.dictionaries', languageCode); | 561 this.deletePrefListItem('spellcheck.dictionaries', languageCode); |
| 544 | 562 |
| 545 if (cr.isChromeOS) { | 563 if (cr.isChromeOS) { |
| 546 // Remove input methods that don't support any other enabled language. | 564 // Remove input methods that don't support any other enabled language. |
| 547 var inputMethods = this.languageInputMethods_.get(languageCode) || []; | 565 var inputMethods = this.languageInputMethods_.get(languageCode) || []; |
| 548 for (var i = 0; i < inputMethods.length; i++) { | 566 for (var i = 0; i < inputMethods.length; i++) { |
| 549 var inputMethod = inputMethods[i]; | 567 var inputMethod = inputMethods[i]; |
| 550 var supportsOtherEnabledLanguages = inputMethod.languageCodes.some( | 568 var supportsOtherEnabledLanguages = |
| 551 function(otherLanguageCode) { | 569 inputMethod.languageCodes.some(function(otherLanguageCode) { |
| 552 return otherLanguageCode != languageCode && | 570 return otherLanguageCode != languageCode && |
| 553 this.isLanguageEnabled(otherLanguageCode); | 571 this.isLanguageEnabled(otherLanguageCode); |
| 554 }.bind(this)); | 572 }.bind(this)); |
| 555 if (!supportsOtherEnabledLanguages) | 573 if (!supportsOtherEnabledLanguages) |
| 556 this.removeInputMethod(inputMethod.id); | 574 this.removeInputMethod(inputMethod.id); |
| 557 } | 575 } |
| 558 } | 576 } |
| 559 | 577 |
| 560 // Remove the language from preferred languages. | 578 // Remove the language from preferred languages. |
| 561 this.languageSettingsPrivate_.disableLanguage(languageCode); | 579 this.languageSettingsPrivate_.disableLanguage(languageCode); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 573 | 591 |
| 574 // Cannot disable the only enabled language. | 592 // Cannot disable the only enabled language. |
| 575 if (this.languages.enabled.length == 1) | 593 if (this.languages.enabled.length == 1) |
| 576 return false; | 594 return false; |
| 577 | 595 |
| 578 if (!cr.isChromeOS) | 596 if (!cr.isChromeOS) |
| 579 return true; | 597 return true; |
| 580 | 598 |
| 581 // If this is the only enabled language that is supported by all enabled | 599 // If this is the only enabled language that is supported by all enabled |
| 582 // component IMEs, it cannot be disabled because we need those IMEs. | 600 // component IMEs, it cannot be disabled because we need those IMEs. |
| 583 var otherInputMethodsEnabled = this.languages.enabled.some( | 601 var otherInputMethodsEnabled = |
| 584 function(languageState) { | 602 this.languages.enabled.some(function(languageState) { |
| 585 var otherLanguageCode = languageState.language.code; | 603 var otherLanguageCode = languageState.language.code; |
| 586 if (otherLanguageCode == languageCode) | 604 if (otherLanguageCode == languageCode) |
| 587 return false; | 605 return false; |
| 588 var inputMethods = this.languageInputMethods_.get(otherLanguageCode); | 606 var inputMethods = this.languageInputMethods_.get(otherLanguageCode); |
| 589 return inputMethods && inputMethods.some(function(inputMethod) { | 607 return inputMethods && inputMethods.some(function(inputMethod) { |
| 590 return this.isComponentIme(inputMethod) && | 608 return this.isComponentIme(inputMethod) && |
| 591 this.supportedInputMethodMap_.get(inputMethod.id).enabled; | 609 this.supportedInputMethodMap_.get(inputMethod.id).enabled; |
| 592 }, this); | 610 }, this); |
| 593 }, this); | 611 }, this); |
| 594 return otherInputMethodsEnabled; | 612 return otherInputMethodsEnabled; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 657 languageCode = this.convertLanguageCodeForTranslate(languageCode); | 675 languageCode = this.convertLanguageCodeForTranslate(languageCode); |
| 658 this.deletePrefListItem('translate_blocked_languages', languageCode); | 676 this.deletePrefListItem('translate_blocked_languages', languageCode); |
| 659 }, | 677 }, |
| 660 | 678 |
| 661 /** | 679 /** |
| 662 * Disables translate for the given language by adding the translate | 680 * Disables translate for the given language by adding the translate |
| 663 * language to the blocked languages preference. | 681 * language to the blocked languages preference. |
| 664 * @param {string} languageCode | 682 * @param {string} languageCode |
| 665 */ | 683 */ |
| 666 disableTranslateLanguage: function(languageCode) { | 684 disableTranslateLanguage: function(languageCode) { |
| 667 this.appendPrefListItem('translate_blocked_languages', | 685 this.appendPrefListItem( |
| 686 'translate_blocked_languages', |
| 668 this.convertLanguageCodeForTranslate(languageCode)); | 687 this.convertLanguageCodeForTranslate(languageCode)); |
| 669 }, | 688 }, |
| 670 | 689 |
| 671 /** | 690 /** |
| 672 * Enables or disables spell check for the given language. | 691 * Enables or disables spell check for the given language. |
| 673 * @param {string} languageCode | 692 * @param {string} languageCode |
| 674 * @param {boolean} enable | 693 * @param {boolean} enable |
| 675 */ | 694 */ |
| 676 toggleSpellCheck: function(languageCode, enable) { | 695 toggleSpellCheck: function(languageCode, enable) { |
| 677 if (!this.languages) | 696 if (!this.languages) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 }, | 745 }, |
| 727 | 746 |
| 728 /** | 747 /** |
| 729 * @param {string} languageCode | 748 * @param {string} languageCode |
| 730 * @return {!chrome.languageSettingsPrivate.Language|undefined} | 749 * @return {!chrome.languageSettingsPrivate.Language|undefined} |
| 731 */ | 750 */ |
| 732 getLanguage: function(languageCode) { | 751 getLanguage: function(languageCode) { |
| 733 return this.supportedLanguageMap_.get(languageCode); | 752 return this.supportedLanguageMap_.get(languageCode); |
| 734 }, | 753 }, |
| 735 | 754 |
| 736 // <if expr="chromeos"> | 755 // <if expr="chromeos"> |
| 737 /** @param {string} id */ | 756 /** @param {string} id */ |
| 738 addInputMethod: function(id) { | 757 addInputMethod: function(id) { |
| 739 if (!this.supportedInputMethodMap_.has(id)) | 758 if (!this.supportedInputMethodMap_.has(id)) |
| 740 return; | 759 return; |
| 741 this.languageSettingsPrivate_.addInputMethod(id); | 760 this.languageSettingsPrivate_.addInputMethod(id); |
| 742 }, | 761 }, |
| 743 | 762 |
| 744 /** @param {string} id */ | 763 /** @param {string} id */ |
| 745 removeInputMethod: function(id) { | 764 removeInputMethod: function(id) { |
| 746 if (!this.supportedInputMethodMap_.has(id)) | 765 if (!this.supportedInputMethodMap_.has(id)) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 | 800 |
| 782 /** @param {string} id Added input method ID. */ | 801 /** @param {string} id Added input method ID. */ |
| 783 onInputMethodAdded_: function(id) { | 802 onInputMethodAdded_: function(id) { |
| 784 this.updateEnabledInputMethods_(); | 803 this.updateEnabledInputMethods_(); |
| 785 }, | 804 }, |
| 786 | 805 |
| 787 /** @param {string} id Removed input method ID. */ | 806 /** @param {string} id Removed input method ID. */ |
| 788 onInputMethodRemoved_: function(id) { | 807 onInputMethodRemoved_: function(id) { |
| 789 this.updateEnabledInputMethods_(); | 808 this.updateEnabledInputMethods_(); |
| 790 }, | 809 }, |
| 791 // </if> | 810 // </if> |
| 792 }); | 811 }); |
| 793 })(); | 812 })(); |
| OLD | NEW |