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 |