| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 /** | 114 /** |
| 115 * Hash map of input methods supported for each language. | 115 * Hash map of input methods supported for each language. |
| 116 * @type {!Map<string, | 116 * @type {!Map<string, |
| 117 * !Array<!chrome.languageSettingsPrivate.InputMethod>>} | 117 * !Array<!chrome.languageSettingsPrivate.InputMethod>>} |
| 118 * @private | 118 * @private |
| 119 */ | 119 */ |
| 120 languageInputMethods_: { | 120 languageInputMethods_: { |
| 121 type: Object, | 121 type: Object, |
| 122 value: function() { return new Map(); }, | 122 value: function() { return new Map(); }, |
| 123 }, | 123 }, |
| 124 |
| 125 /** @private Prospective UI language when the page was loaded. */ |
| 126 originalProspectiveUILanguage_: String, |
| 124 }, | 127 }, |
| 125 | 128 |
| 126 observers: [ | 129 observers: [ |
| 130 'prospectiveUILanguageChanged_(prefs.intl.app_locale.value)', |
| 127 'preferredLanguagesPrefChanged_(' + | 131 'preferredLanguagesPrefChanged_(' + |
| 128 'prefs.' + preferredLanguagesPrefName + '.value, languages)', | 132 'prefs.' + preferredLanguagesPrefName + '.value, languages)', |
| 129 'spellCheckDictionariesPrefChanged_(' + | 133 'spellCheckDictionariesPrefChanged_(' + |
| 130 'prefs.spellcheck.dictionaries.value.*, languages)', | 134 'prefs.spellcheck.dictionaries.value.*, languages)', |
| 131 'translateLanguagesPrefChanged_(' + | 135 'translateLanguagesPrefChanged_(' + |
| 132 'prefs.translate_blocked_languages.value.*, languages)', | 136 'prefs.translate_blocked_languages.value.*, languages)', |
| 133 'updateRemovableLanguages_(' + | 137 'updateRemovableLanguages_(' + |
| 134 'prefs.intl.app_locale.value, languages.enabled)', | 138 'prefs.intl.app_locale.value, languages.enabled)', |
| 135 // Observe Chrome OS prefs (ignored for non-Chrome OS). | 139 // Observe Chrome OS prefs (ignored for non-Chrome OS). |
| 136 'updateRemovableLanguages_(' + | 140 'updateRemovableLanguages_(' + |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 resolve(lists.componentExtensionImes.concat( | 175 resolve(lists.componentExtensionImes.concat( |
| 172 lists.thirdPartyExtensionImes)); | 176 lists.thirdPartyExtensionImes)); |
| 173 }); | 177 }); |
| 174 }.bind(this)); | 178 }.bind(this)); |
| 175 | 179 |
| 176 promises[4] = new Promise(function(resolve) { | 180 promises[4] = new Promise(function(resolve) { |
| 177 this.inputMethodPrivate.getCurrentInputMethod(resolve); | 181 this.inputMethodPrivate.getCurrentInputMethod(resolve); |
| 178 }.bind(this)); | 182 }.bind(this)); |
| 179 } | 183 } |
| 180 | 184 |
| 185 if (cr.isWindows || cr.isChromeOS) { |
| 186 // Fetch the starting UI language, which affects which actions should be |
| 187 // enabled. |
| 188 promises.push(cr.sendWithPromise('getProspectiveUILanguage').then( |
| 189 function(prospectiveUILanguage) { |
| 190 this.originalProspectiveUILanguage_ = |
| 191 prospectiveUILanguage || navigator.language; |
| 192 }.bind(this))); |
| 193 } |
| 194 |
| 181 Promise.all(promises).then(function(results) { | 195 Promise.all(promises).then(function(results) { |
| 182 this.createModel_(results[1], results[2], results[3], results[4]); | 196 this.createModel_(results[1], results[2], results[3], results[4]); |
| 183 this.resolver_.resolve(); | 197 this.resolver_.resolve(); |
| 184 }.bind(this)); | 198 }.bind(this)); |
| 185 | 199 |
| 186 if (cr.isChromeOS) { | 200 if (cr.isChromeOS) { |
| 187 this.inputMethodPrivate.onChanged.addListener( | 201 this.inputMethodPrivate.onChanged.addListener( |
| 188 this.onInputMethodChanged_.bind(this)); | 202 this.onInputMethodChanged_.bind(this)); |
| 189 } | 203 } |
| 190 }, | 204 }, |
| 191 | 205 |
| 192 /** | 206 /** |
| 207 * Updates the prospective UI languages based on the new pref value. |
| 208 * @param {string} prospectiveUILanguage |
| 209 * @private |
| 210 */ |
| 211 prospectiveUILanguageChanged_: function(prospectiveUILanguage) { |
| 212 if (!this.languages) |
| 213 return; |
| 214 |
| 215 this.set('languages.prospectiveUILanguage', |
| 216 prospectiveUILanguage || this.originalProspectiveUILanguage_); |
| 217 }, |
| 218 |
| 219 /** |
| 193 * Updates the list of enabled languages from the preferred languages pref. | 220 * Updates the list of enabled languages from the preferred languages pref. |
| 194 * @private | 221 * @private |
| 195 */ | 222 */ |
| 196 preferredLanguagesPrefChanged_: function() { | 223 preferredLanguagesPrefChanged_: function() { |
| 197 var enabledLanguageStates = | 224 var enabledLanguageStates = |
| 198 this.getEnabledLanguageStates_(this.languages.translateTarget); | 225 this.getEnabledLanguageStates_(this.languages.translateTarget); |
| 199 | 226 |
| 200 // Recreate the enabled language set before updating languages.enabled. | 227 // Recreate the enabled language set before updating languages.enabled. |
| 201 this.enabledLanguageSet_.clear(); | 228 this.enabledLanguageSet_.clear(); |
| 202 for (var languageState of enabledLanguageStates) | 229 for (var languageState of enabledLanguageStates) |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 var enabledLanguageStates = this.getEnabledLanguageStates_(translateTarget); | 308 var enabledLanguageStates = this.getEnabledLanguageStates_(translateTarget); |
| 282 // Populate the hash set of enabled languages. | 309 // Populate the hash set of enabled languages. |
| 283 for (var languageState of enabledLanguageStates) | 310 for (var languageState of enabledLanguageStates) |
| 284 this.enabledLanguageSet_.add(languageState.language.code); | 311 this.enabledLanguageSet_.add(languageState.language.code); |
| 285 | 312 |
| 286 var model = /** @type {!LanguagesModel} */({ | 313 var model = /** @type {!LanguagesModel} */({ |
| 287 supported: supportedLanguages, | 314 supported: supportedLanguages, |
| 288 enabled: enabledLanguageStates, | 315 enabled: enabledLanguageStates, |
| 289 translateTarget: translateTarget, | 316 translateTarget: translateTarget, |
| 290 }); | 317 }); |
| 318 if (cr.isChromeOS || cr.isWindows) { |
| 319 model.prospectiveUILanguage = |
| 320 /** @type {string} */(this.getPref('intl.app_locale').value) || |
| 321 this.originalProspectiveUILanguage_; |
| 322 } |
| 291 if (cr.isChromeOS) { | 323 if (cr.isChromeOS) { |
| 292 model.inputMethods = /** @type {!InputMethodsModel} */({ | 324 model.inputMethods = /** @type {!InputMethodsModel} */({ |
| 293 supported: supportedInputMethods, | 325 supported: supportedInputMethods, |
| 294 enabled: this.getEnabledInputMethods_(), | 326 enabled: this.getEnabledInputMethods_(), |
| 295 currentId: currentInputMethodId, | 327 currentId: currentInputMethodId, |
| 296 }); | 328 }); |
| 297 } | 329 } |
| 298 | 330 |
| 299 // Initialize the Polymer languages model. | 331 // Initialize the Polymer languages model. |
| 300 this._setLanguages(model); | 332 this._setLanguages(model); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 419 /** @return {!Promise} */ | 451 /** @return {!Promise} */ |
| 420 whenReady: function() { | 452 whenReady: function() { |
| 421 return this.resolver_.promise; | 453 return this.resolver_.promise; |
| 422 }, | 454 }, |
| 423 | 455 |
| 424 /** | 456 /** |
| 425 * Sets the prospective UI language to the chosen language. This won't affect | 457 * Sets the prospective UI language to the chosen language. This won't affect |
| 426 * the actual UI language until a restart. | 458 * the actual UI language until a restart. |
| 427 * @param {string} languageCode | 459 * @param {string} languageCode |
| 428 */ | 460 */ |
| 429 setUILanguage: function(languageCode) { | 461 setProspectiveUILanguage: function(languageCode) { |
| 430 assert(cr.isChromeOS || cr.isWindows); | 462 assert(cr.isChromeOS || cr.isWindows); |
| 431 chrome.send('setUILanguage', [languageCode]); | 463 chrome.send('setProspectiveUILanguage', [languageCode]); |
| 432 }, | 464 }, |
| 433 | 465 |
| 434 /** Resets the prospective UI language back to the actual UI language. */ | 466 /** Resets the prospective UI language back to the actual UI language. */ |
| 435 resetUILanguage: function() { | 467 resetProspectiveUILanguage: function() { |
| 436 assert(cr.isChromeOS || cr.isWindows); | 468 assert(cr.isChromeOS || cr.isWindows); |
| 437 chrome.send('setUILanguage', [navigator.language]); | 469 chrome.send( |
| 470 'setProspectiveUILanguage', [this.originalProspectiveUILanguage_]); |
| 438 }, | 471 }, |
| 439 | 472 |
| 440 /** | 473 /** |
| 441 * Returns the "prospective" UI language, i.e. the one to be used on next | 474 * True if the prospective UI language was changed from its starting value. |
| 442 * restart. If the pref is not set, the current UI language is also the | 475 * @return {boolean} |
| 443 * "prospective" language. | |
| 444 * @return {string} Language code of the prospective UI language. | |
| 445 */ | 476 */ |
| 446 getProspectiveUILanguage: function() { | 477 requiresRestart: function() { |
| 447 return /** @type {string} */(this.getPref('intl.app_locale').value) || | 478 return this.originalProspectiveUILanguage_ != |
| 448 navigator.language; | 479 this.languages.prospectiveUILanguage; |
| 449 }, | 480 }, |
| 450 | 481 |
| 451 /** | 482 /** |
| 452 * @param {string} languageCode | 483 * @param {string} languageCode |
| 453 * @return {boolean} True if the language is enabled. | 484 * @return {boolean} True if the language is enabled. |
| 454 */ | 485 */ |
| 455 isLanguageEnabled: function(languageCode) { | 486 isLanguageEnabled: function(languageCode) { |
| 456 return this.enabledLanguageSet_.has(languageCode); | 487 return this.enabledLanguageSet_.has(languageCode); |
| 457 }, | 488 }, |
| 458 | 489 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 this.languageSettingsPrivate.disableLanguage(languageCode); | 530 this.languageSettingsPrivate.disableLanguage(languageCode); |
| 500 this.enableTranslateLanguage(languageCode); | 531 this.enableTranslateLanguage(languageCode); |
| 501 }, | 532 }, |
| 502 | 533 |
| 503 /** | 534 /** |
| 504 * @param {string} languageCode Language code for an enabled language. | 535 * @param {string} languageCode Language code for an enabled language. |
| 505 * @return {boolean} | 536 * @return {boolean} |
| 506 */ | 537 */ |
| 507 canDisableLanguage: function(languageCode) { | 538 canDisableLanguage: function(languageCode) { |
| 508 // Cannot disable the prospective UI language. | 539 // Cannot disable the prospective UI language. |
| 509 if (languageCode == this.getProspectiveUILanguage()) | 540 if (languageCode == this.languages.prospectiveUILanguage) |
| 510 return false; | 541 return false; |
| 511 | 542 |
| 512 // Cannot disable the only enabled language. | 543 // Cannot disable the only enabled language. |
| 513 if (this.languages.enabled.length == 1) | 544 if (this.languages.enabled.length == 1) |
| 514 return false; | 545 return false; |
| 515 | 546 |
| 516 if (!cr.isChromeOS) | 547 if (!cr.isChromeOS) |
| 517 return true; | 548 return true; |
| 518 | 549 |
| 519 // If this is the only enabled language that is supported by all enabled | 550 // If this is the only enabled language that is supported by all enabled |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 this.updateEnabledInputMethods_(); | 768 this.updateEnabledInputMethods_(); |
| 738 }, | 769 }, |
| 739 | 770 |
| 740 /** @param {string} id Removed input method ID. */ | 771 /** @param {string} id Removed input method ID. */ |
| 741 onInputMethodRemoved_: function(id) { | 772 onInputMethodRemoved_: function(id) { |
| 742 assert(cr.isChromeOS); | 773 assert(cr.isChromeOS); |
| 743 this.updateEnabledInputMethods_(); | 774 this.updateEnabledInputMethods_(); |
| 744 }, | 775 }, |
| 745 }); | 776 }); |
| 746 })(); | 777 })(); |
| OLD | NEW |