Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(556)

Side by Side Diff: chrome/browser/resources/settings/languages_page/languages.js

Issue 1419033008: Extract language settings methods into a LanguageHelper interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@LanguagePage5InputMethodsAPI
Patch Set: 100% less rebase error Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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' provides convenient access to 6 * @fileoverview 'settings-languages' provides convenient access to
7 * Chrome's language and input method settings. 7 * Chrome's language and input method settings.
8 * 8 *
9 * Instances of this element have a 'languages' property, which reflects the 9 * Instances of this element have a 'languages' property, which reflects the
10 * current language settings. The 'languages' property is read-only, meaning 10 * current language settings. The 'languages' property is read-only, meaning
11 * hosts using this element cannot change it directly. Instead, changes to 11 * hosts using this element cannot change it directly. Instead, changes to
12 * language settings should be made using this element's public functions. 12 * language settings should be made using the LanguageHelper singleton.
13 * 13 *
14 * Use two-way binding syntax to propagate changes from child to host, so that 14 * Use upward binding syntax to propagate changes from child to host, so that
15 * changes made internally to 'languages' propagate to your host element: 15 * changes made internally to 'languages' propagate to your host element:
16 * 16 *
17 * <template> 17 * <template>
18 * <settings-languages languages="{{languages}}"> 18 * <settings-languages languages="{{languages}}">
19 * </settings-languages> 19 * </settings-languages>
20 * <div>[[languages.someProperty]]</div> 20 * <div>[[languages.someProperty]]</div>
21 * </template> 21 * </template>
22 * 22 *
23 * @group Chrome Settings Elements 23 * @group Chrome Settings Elements
24 * @element settings-languages 24 * @element settings-languages
25 */ 25 */
26 26
27 /** @typedef {{spellCheckEnabled: boolean, translateEnabled: boolean}} */
28 var LanguageState;
29
30 /**
31 * @typedef {{language: !chrome.languageSettingsPrivate.Language,
32 * state: !LanguageState}}
33 */
34 var LanguageInfo;
35
36 /**
37 * supportedLanguages: an array of languages, ordered alphabetically.
38 * enabledLanguages: an array of enabled language info and state, ordered by
39 * preference.
40 * @typedef {{
41 * supportedLanguages: !Array<!chrome.languageSettingsPrivate.Language>,
42 * enabledLanguages: !Array<!LanguageInfo>,
43 * translateTarget: string
44 * }}
45 */
46 var LanguagesModel;
47
48 (function() { 27 (function() {
49 'use strict'; 28 'use strict';
50 29
51 // Translate server treats some language codes the same. 30 // Translate server treats some language codes the same.
52 // See also: components/translate/core/common/translate_util.cc. 31 // See also: components/translate/core/common/translate_util.cc.
53 var kLanguageCodeToTranslateCode = { 32 var kLanguageCodeToTranslateCode = {
54 'nb': 'no', 33 'nb': 'no',
55 'fil': 'tl', 34 'fil': 'tl',
56 'zh-HK': 'zh-TW', 35 'zh-HK': 'zh-TW',
57 'zh-MO': 'zh-TW', 36 'zh-MO': 'zh-TW',
58 'zh-SG': 'zh-CN', 37 'zh-SG': 'zh-CN',
59 }; 38 };
60 39
61 // Some ISO 639 language codes have been renamed, e.g. "he" to "iw", but 40 // Some ISO 639 language codes have been renamed, e.g. "he" to "iw", but
62 // Translate still uses the old versions. TODO(michaelpg): Chrome does too. 41 // Translate still uses the old versions. TODO(michaelpg): Chrome does too.
63 // Follow up with Translate owners to understand the right thing to do. 42 // Follow up with Translate owners to understand the right thing to do.
64 var kTranslateLanguageSynonyms = { 43 var kTranslateLanguageSynonyms = {
65 'he': 'iw', 44 'he': 'iw',
66 'jv': 'jw', 45 'jv': 'jw',
67 }; 46 };
68 47
69 /**
70 * This element has a reference to the singleton, exposing the singleton's
71 * language model to the host of this element as the 'languages' property.
72 */
73 Polymer({
74 is: 'settings-languages',
75
76 properties: {
77 /**
78 * Singleton element created at startup which provides the languages model.
79 * @type {!Element}
80 */
81 singleton_: {
82 type: Object,
83 value: document.createElement('settings-languages-singleton'),
84 },
85
86 /**
87 * A reference to the languages model from the singleton, exposed as a
88 * read-only property so hosts can bind to it, but not change it.
89 * @type {LanguagesModel|undefined}
90 */
91 languages: {
92 type: Object,
93 notify: true,
94 readOnly: true,
95 },
96 },
97
98 ready: function() {
99 // Set the 'languages' property to reference the singleton's model.
100 this._setLanguages(this.singleton_.languages);
101 // Listen for changes to the singleton's languages property, so we know
102 // when to notify hosts of changes to (our reference to) the property.
103 this.listen(
104 this.singleton_, 'languages-changed', 'singletonLanguagesChanged_');
105 },
106
107 /**
108 * Takes changes reported by the singleton and forwards them to the host,
109 * manually sending a change notification for our 'languages' property (since
110 * it's the same object as the singleton's property, but isn't bound by
111 * Polymer).
112 * @private
113 */
114 singletonLanguagesChanged_: function(e) {
115 // Forward the change notification to the host.
116 this.fire(e.type, e.detail, {bubbles: false});
117 },
118
119 // Forward public methods to the singleton.
120
121 /** @param {string} languageCode */
122 setUILanguage: function(languageCode) {
123 if (cr.isWindows || cr.isChromeOS)
124 this.singleton_.setUILanguage(languageCode);
125 },
126
127 resetUILanguage: function() {
128 if (cr.isWindows || cr.isChromeOS)
129 this.singleton_.resetUILanguage();
130 },
131
132 /** @return {string} */
133 getProspectiveUILanguage: function() {
134 return this.singleton_.getProspectiveUILanguage();
135 },
136
137 /** @param {string} languageCode */
138 enableLanguage: function(languageCode) {
139 this.singleton_.enableLanguage(languageCode);
140 },
141
142 /** @param {string} languageCode */
143 disableLanguage: function(languageCode) {
144 this.singleton_.disableLanguage(languageCode);
145 },
146
147 /** @param {string} languageCode */
148 enableTranslateLanguage: function(languageCode) {
149 this.singleton_.enableTranslateLanguage(languageCode);
150 },
151
152 /** @param {string} languageCode */
153 disableTranslateLanguage: function(languageCode) {
154 this.singleton_.disableTranslateLanguage(languageCode);
155 },
156
157 /**
158 * @param {string} languageCode
159 * @return {boolean}
160 */
161 isEnabled: function(languageCode) {
162 return this.singleton_.isEnabled(languageCode);
163 },
164
165 /**
166 * @param {string} languageCode
167 * @param {boolean} enable
168 */
169 toggleSpellCheck: function(languageCode, enable) {
170 this.singleton_.toggleSpellCheck(languageCode, enable);
171 },
172
173 /**
174 * @param {string} languageCode
175 * @return {string}
176 */
177 convertLanguageCodeForTranslate: function(languageCode) {
178 return this.singleton_.convertLanguageCodeForTranslate(languageCode);
179 },
180 });
181
182 var preferredLanguagesPrefName = cr.isChromeOS ? 48 var preferredLanguagesPrefName = cr.isChromeOS ?
183 'settings.language.preferred_languages' : 'intl.accept_languages'; 49 'settings.language.preferred_languages' : 'intl.accept_languages';
184 50
185 /** 51 /**
186 * Singleton element created when settings-languages is registered. 52 * Singleton element that generates the languages model on start-up and
187 * Generates the languages model on start-up, and updates it whenever Chrome's 53 * updates it whenever Chrome's pref store and other settings change. These
188 * pref store and other settings change. These updates propagate to each 54 * updates propagate to each <settings-language> instance so that their
189 * <settings-language> instance so that their 'languages' property updates 55 * 'languages' property updates like any other Polymer property.
190 * like any other Polymer property. 56 * @implements {LanguageSettingsHelper}
Dan Beam 2015/11/25 00:29:38 does this now compile? @implements on top of Poly
michaelpg 2015/11/25 06:20:51 Compile, yes, does it have an effect, no. See the
191 */ 57 */
192 Polymer({ 58 var SettingsLanguagesSingletonElement = Polymer({
Dan Beam 2015/11/25 00:29:38 why can't this just be LanguageHelper? why does i
michaelpg 2015/11/25 06:20:51 to avoid inconsistency, because the Polymer pass n
193 is: 'settings-languages-singleton', 59 is: 'settings-languages-singleton',
194 60
195 behaviors: [PrefsBehavior], 61 behaviors: [PrefsBehavior],
196 62
197 properties: { 63 properties: {
198 /** 64 /**
199 * @type {LanguagesModel|undefined} 65 * @type {LanguagesModel|undefined}
200 */ 66 */
201 languages: { 67 languages: {
202 type: Object, 68 type: Object,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 resolve(); 126 resolve();
261 }); 127 });
262 }), 128 }),
263 ]).then(function() { 129 ]).then(function() {
264 this.createModel_(languageList, translateTarget); 130 this.createModel_(languageList, translateTarget);
265 this.initialized_ = true; 131 this.initialized_ = true;
266 }.bind(this)); 132 }.bind(this));
267 }, 133 },
268 134
269 /** 135 /**
136 * Updates the list of enabled languages from the preferred languages pref.
137 * @private
138 */
139 preferredLanguagesPrefChanged_: function() {
140 if (!this.initialized_)
141 return;
142 var enabledLanguages =
143 this.getEnabledLanguages_(this.languages.translateTarget);
144
145 // Reset the enabled language map before updating
146 // languages.enabledLanguages.
147 this.enabledLanguageMap_ = {};
148 for (var i = 0; i < enabledLanguages.length; i++) {
149 var languageInfo = enabledLanguages[i];
150 this.enabledLanguageMap_[languageInfo.language.code] = languageInfo;
151 }
152 this.set('languages.enabledLanguages', enabledLanguages);
153 },
154
155 /**
156 * Updates the spellCheckEnabled state of each enabled language.
157 * @private
158 */
159 spellCheckDictionariesPrefChanged_: function() {
160 if (!this.initialized_)
161 return;
162
163 var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */(
164 this.getPref('spellcheck.dictionaries').value));
165 for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
166 var languageCode = this.languages.enabledLanguages[i].language.code;
167 this.set('languages.enabledLanguages.' + i + '.state.spellCheckEnabled',
168 !!spellCheckMap[languageCode]);
169 }
170 },
171
172 /** @private */
173 translateLanguagesPrefChanged_: function() {
174 if (!this.initialized_)
175 return;
176
177 var translateBlockedPref = this.getPref('translate_blocked_languages');
178 var translateBlockedMap = this.makeMapFromArray_(
179 /** @type {!Array<string>} */(translateBlockedPref.value));
180
181 for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
182 var translateCode = this.convertLanguageCodeForTranslate(
183 this.languages.enabledLanguages[i].language.code);
184 this.set(
185 'languages.enabledLanguages.' + i + '.state.translateEnabled',
186 !translateBlockedMap[translateCode]);
187 }
188 },
189
190 /**
270 * Constructs the languages model. 191 * Constructs the languages model.
271 * @param {!Array<!chrome.languageSettingsPrivate.Language>} 192 * @param {!Array<!chrome.languageSettingsPrivate.Language>}
272 * supportedLanguages 193 * supportedLanguages
273 * @param {string} translateTarget Language code of the default translate 194 * @param {string} translateTarget Language code of the default translate
274 * target language. 195 * target language.
196 * @private
275 */ 197 */
276 createModel_: function(supportedLanguages, translateTarget) { 198 createModel_: function(supportedLanguages, translateTarget) {
277 // Populate the hash map of supported languages. 199 // Populate the hash map of supported languages.
278 for (var i = 0; i < supportedLanguages.length; i++) { 200 for (var i = 0; i < supportedLanguages.length; i++) {
279 var language = supportedLanguages[i]; 201 var language = supportedLanguages[i];
280 language.supportsUI = !!language.supportsUI; 202 language.supportsUI = !!language.supportsUI;
281 language.supportsTranslate = !!language.supportsTranslate; 203 language.supportsTranslate = !!language.supportsTranslate;
282 language.supportsSpellcheck = !!language.supportsSpellcheck; 204 language.supportsSpellcheck = !!language.supportsSpellcheck;
283 this.supportedLanguageMap_[language.code] = language; 205 this.supportedLanguageMap_[language.code] = language;
284 } 206 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */( 240 var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */(
319 spellCheckPref.value)); 241 spellCheckPref.value));
320 242
321 var translateBlockedPref = this.getPref('translate_blocked_languages'); 243 var translateBlockedPref = this.getPref('translate_blocked_languages');
322 var translateBlockedMap = this.makeMapFromArray_( 244 var translateBlockedMap = this.makeMapFromArray_(
323 /** @type {!Array<string>} */(translateBlockedPref.value)); 245 /** @type {!Array<string>} */(translateBlockedPref.value));
324 246
325 for (var i = 0; i < enabledLanguageCodes.length; i++) { 247 for (var i = 0; i < enabledLanguageCodes.length; i++) {
326 var code = enabledLanguageCodes[i]; 248 var code = enabledLanguageCodes[i];
327 var language = this.supportedLanguageMap_[code]; 249 var language = this.supportedLanguageMap_[code];
250 // Skip unsupported languages.
328 if (!language) 251 if (!language)
329 continue; 252 continue;
330 var state = {}; 253 var state = /** @type {LanguageState} */({});
331 state.spellCheckEnabled = !!spellCheckMap[code]; 254 state.spellCheckEnabled = !!spellCheckMap[code];
332 // Translate is considered disabled if this language maps to any translate 255 // Translate is considered disabled if this language maps to any translate
333 // language that is blocked. 256 // language that is blocked.
334 var translateCode = this.convertLanguageCodeForTranslate(code); 257 var translateCode = this.convertLanguageCodeForTranslate(code);
335 state.translateEnabled = language.supportsTranslate && 258 state.translateEnabled = !!language.supportsTranslate &&
336 !translateBlockedMap[translateCode] && 259 !translateBlockedMap[translateCode] &&
337 translateCode != translateTarget; 260 translateCode != translateTarget;
338 enabledLanguages.push({language: language, state: state}); 261 enabledLanguages.push(/** @type {LanguageInfo} */(
262 {language: language, state: state}));
339 } 263 }
340 return enabledLanguages; 264 return enabledLanguages;
341 }, 265 },
342 266
343 /** 267 /**
344 * Creates an object whose keys are the elements of the list. 268 * Creates an object whose keys are the elements of the list.
345 * @param {!Array<string>} list 269 * @param {!Array<string>} list
346 * @return {!Object<boolean>} 270 * @return {!Object<boolean>}
271 * @private
347 */ 272 */
348 makeMapFromArray_: function(list) { 273 makeMapFromArray_: function(list) {
349 var map = {}; 274 var map = {};
350 for (var i = 0; i < list.length; i++) 275 for (var i = 0; i < list.length; i++)
351 map[list[i]] = true; 276 map[list[i]] = true;
352 return map; 277 return map;
353 }, 278 },
354 279
280 // LanguageSettingsHelper implementation.
Dan Beam 2015/11/25 00:29:38 should this be LanguageHelper?
michaelpg 2015/11/25 06:20:51 Does renaming LSH -> LH makes sense? Yes. Should
281 // TODO(michaelpg): replace duplicate docs with @override once b/24294625
282 // is fixed.
283
284 <if expr="chromeos or is_win">
355 /** 285 /**
356 * Updates the list of enabled languages from the preferred languages pref. 286 * Sets the prospective UI language to the chosen language. This won't affect
357 * @private 287 * the actual UI language until a restart.
358 * */
359 preferredLanguagesPrefChanged_: function() {
360 if (!this.initialized_)
361 return;
362
363 var enabledLanguages =
364 this.getEnabledLanguages_(this.languages.translateTarget);
365 // Reset the enabled language map. Do this before notifying of the change
366 // via languages.enabledLanguages.
367 this.enabledLanguageMap_ = {};
368 for (var i = 0; i < enabledLanguages.length; i++) {
369 var languageInfo = enabledLanguages[i];
370 this.enabledLanguageMap_[languageInfo.language.code] = languageInfo;
371 }
372 this.set('languages.enabledLanguages', enabledLanguages);
373 },
374
375 /**
376 * Updates the spellCheckEnabled state of each enabled language.
377 * @private
378 */
379 spellCheckDictionariesPrefChanged_: function() {
380 if (!this.initialized_)
381 return;
382
383 var spellCheckMap = this.makeMapFromArray_(/** @type {!Array<string>} */(
384 this.getPref('spellcheck.dictionaries').value));
385 for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
386 var languageCode = this.languages.enabledLanguages[i].language.code;
387 this.set('languages.enabledLanguages.' + i + '.state.spellCheckEnabled',
388 !!spellCheckMap[languageCode]);
389 }
390 },
391
392 translateLanguagesPrefChanged_: function() {
393 if (!this.initialized_)
394 return;
395
396 var translateBlockedPref = this.getPref('translate_blocked_languages');
397 var translateBlockedMap = this.makeMapFromArray_(
398 /** @type {!Array<string>} */(translateBlockedPref.value));
399
400 for (var i = 0; i < this.languages.enabledLanguages.length; i++) {
401 var translateCode = this.convertLanguageCodeForTranslate(
402 this.languages.enabledLanguages[i].language.code);
403 this.set(
404 'languages.enabledLanguages.' + i + '.state.translateEnabled',
405 !translateBlockedMap[translateCode]);
406 }
407 },
408
409 /**
410 * Deletes the given item from the pref at the given key if the item is found.
411 * Asserts if the pref itself is not found or is not an Array type.
412 * @param {string} key
413 * @param {*} item
414 */
415 deletePrefItem_: function(key, item) {
416 assert(this.getPref(key).type == chrome.settingsPrivate.PrefType.LIST);
417 this.arrayDelete('prefs.' + key + '.value', item);
418 },
419
420 /**
421 * Windows and Chrome OS only: Sets the prospective UI language to the chosen
422 * language. This dosen't affect the actual UI language until a restart.
423 * @param {string} languageCode 288 * @param {string} languageCode
424 */ 289 */
425 setUILanguage: function(languageCode) { 290 setUILanguage: function(languageCode) {
426 chrome.send('setUILanguage', [languageCode]); 291 chrome.send('setUILanguage', [languageCode]);
427 }, 292 },
428 293
429 /** 294 /** Resets the prospective UI language back to the actual UI language. */
430 * Windows and Chrome OS only: Resets the prospective UI language back to the
431 * actual UI language.
432 */
433 resetUILanguage: function() { 295 resetUILanguage: function() {
434 chrome.send('setUILanguage', [navigator.language]); 296 chrome.send('setUILanguage', [navigator.language]);
435 }, 297 },
436 298
437 /** 299 /**
438 * Returns the "prospective" UI language, i.e. the one to be used on next 300 * Returns the "prospective" UI language, i.e. the one to be used on next
439 * restart. If the pref is not set, the current UI language is also the 301 * restart. If the pref is not set, the current UI language is also the
440 * "prospective" language. 302 * "prospective" language.
441 * @return {string} Language code of the prospective UI language. 303 * @return {string} Language code of the prospective UI language.
442 * @private
443 */ 304 */
444 getProspectiveUILanguage: function() { 305 getProspectiveUILanguage: function() {
445 return /** @type {string} */(this.getPref('intl.app_locale').value) || 306 return /** @type {string} */(this.getPref('intl.app_locale').value) ||
446 navigator.language; 307 navigator.language;
447 }, 308 },
309 </if>
310
311 /**
312 * @param {string} languageCode
313 * @return {boolean} True if the language is enabled.
314 */
315 isLanguageEnabled: function(languageCode) {
316 return !!this.enabledLanguageMap_[languageCode];
317 },
448 318
449 /** 319 /**
450 * Enables the language, making it available for spell check and input. 320 * Enables the language, making it available for spell check and input.
451 * @param {string} languageCode 321 * @param {string} languageCode
452 */ 322 */
453 enableLanguage: function(languageCode) { 323 enableLanguage: function(languageCode) {
454 if (!CrSettingsPrefs.isInitialized) 324 if (!CrSettingsPrefs.isInitialized)
455 return; 325 return;
456 326
457 var languageCodes = 327 var languageCodes =
458 this.getPref(preferredLanguagesPrefName).value.split(','); 328 this.getPref(preferredLanguagesPrefName).value.split(',');
459 if (languageCodes.indexOf(languageCode) > -1) 329 if (languageCodes.indexOf(languageCode) > -1)
460 return; 330 return;
461 languageCodes.push(languageCode); 331 languageCodes.push(languageCode);
462 chrome.languageSettingsPrivate.setLanguageList(languageCodes); 332 chrome.languageSettingsPrivate.setLanguageList(languageCodes);
463 this.disableTranslateLanguage(languageCode); 333 this.disableTranslateLanguage(languageCode);
464 }, 334 },
465 335
466 /** 336 /**
467 * Disables the language. 337 * Disables the language.
468 * @param {string} languageCode 338 * @param {string} languageCode
469 */ 339 */
470 disableLanguage: function(languageCode) { 340 disableLanguage: function(languageCode) {
471 if (!CrSettingsPrefs.isInitialized) 341 if (!CrSettingsPrefs.isInitialized)
472 return; 342 return;
473 343
474 // Cannot disable the UI language. 344 assert(this.canDisableLanguage(languageCode));
475 assert(languageCode != this.getProspectiveUILanguage());
476 345
477 // Cannot disable the only enabled language. 346 // Remove the language from spell check.
347 this.arrayDelete('prefs.spellcheck.dictionaries.value', languageCode);
348
349 // Remove the language from preferred languages.
478 var languageCodes = 350 var languageCodes =
479 this.getPref(preferredLanguagesPrefName).value.split(','); 351 this.getPref(preferredLanguagesPrefName).value.split(',');
480 assert(languageCodes.length > 1);
481
482 // Remove the language from spell check.
483 this.deletePrefItem_('spellcheck.dictionaries', languageCode);
484
485 var languageIndex = languageCodes.indexOf(languageCode); 352 var languageIndex = languageCodes.indexOf(languageCode);
486 if (languageIndex == -1) 353 if (languageIndex == -1)
487 return; 354 return;
488 languageCodes.splice(languageIndex, 1); 355 languageCodes.splice(languageIndex, 1);
489 chrome.languageSettingsPrivate.setLanguageList(languageCodes); 356 chrome.languageSettingsPrivate.setLanguageList(languageCodes);
490 this.enableTranslateLanguage(languageCode); 357 this.enableTranslateLanguage(languageCode);
491 }, 358 },
492 359
493 /** 360 /**
494 * @param {string} languageCode 361 * @param {string} languageCode Language code for an enabled language.
495 * @return {boolean} True if the language is enabled. 362 * @return {boolean}
496 */ 363 */
497 isEnabled: function(languageCode) { 364 canDisableLanguage: function(languageCode) {
498 return !!this.enabledLanguageMap_[languageCode]; 365 // Cannot disable the prospective UI language.
366 if ((cr.isChromeOS || cr.isWindows) &&
367 languageCode == this.getProspectiveUILanguage()) {
368 return false;
369 }
370
371 // Cannot disable the only enabled language.
372 if (this.languages.enabledLanguages.length == 1)
373 return false;
374
375 return true;
499 }, 376 },
500 377
501 /** 378 /**
502 * Enables translate for the given language by removing the translate 379 * Enables translate for the given language by removing the translate
503 * language from the blocked languages preference. 380 * language from the blocked languages preference.
504 * @param {string} languageCode 381 * @param {string} languageCode
505 */ 382 */
506 enableTranslateLanguage: function(languageCode) { 383 enableTranslateLanguage: function(languageCode) {
507 languageCode = this.convertLanguageCodeForTranslate(languageCode); 384 languageCode = this.convertLanguageCodeForTranslate(languageCode);
508 this.arrayDelete('prefs.translate_blocked_languages.value', languageCode); 385 this.arrayDelete('prefs.translate_blocked_languages.value', languageCode);
(...skipping 29 matching lines...) Expand all
538 this.arrayDelete('prefs.spellcheck.dictionaries.value', languageCode); 415 this.arrayDelete('prefs.spellcheck.dictionaries.value', languageCode);
539 } 416 }
540 }, 417 },
541 418
542 /** 419 /**
543 * Converts the language code for translate. There are some differences 420 * Converts the language code for translate. There are some differences
544 * between the language set the Translate server uses and that for 421 * between the language set the Translate server uses and that for
545 * Accept-Language. 422 * Accept-Language.
546 * @param {string} languageCode 423 * @param {string} languageCode
547 * @return {string} The converted language code. 424 * @return {string} The converted language code.
548 * @private
549 */ 425 */
550 convertLanguageCodeForTranslate: function(languageCode) { 426 convertLanguageCodeForTranslate: function(languageCode) {
551 if (languageCode in kLanguageCodeToTranslateCode) 427 if (languageCode in kLanguageCodeToTranslateCode)
552 return kLanguageCodeToTranslateCode[languageCode]; 428 return kLanguageCodeToTranslateCode[languageCode];
553 429
554 var main = languageCode.split('-')[0]; 430 var main = languageCode.split('-')[0];
555 if (main == 'zh') { 431 if (main == 'zh') {
556 // In Translate, general Chinese is not used, and the sub code is 432 // In Translate, general Chinese is not used, and the sub code is
557 // necessary as a language code for the Translate server. 433 // necessary as a language code for the Translate server.
558 return languageCode; 434 return languageCode;
559 } 435 }
560 if (main in kTranslateLanguageSynonyms) 436 if (main in kTranslateLanguageSynonyms)
561 return kTranslateLanguageSynonyms[main]; 437 return kTranslateLanguageSynonyms[main];
562 438
563 return main; 439 return main;
564 }, 440 },
441
442 /**
443 * @param {string} languageCode
444 * @return {!chrome.languageSettingsPrivate.Language|undefined}
445 */
446 getLanguage: function(languageCode) {
447 return this.supportedLanguageMap_[languageCode];
448 },
449 });
450
451 /**
452 * A reference to the singleton under the guise of a LanguageSettingsHelper
453 * implementation. This provides a limited API but implies the singleton
454 * should not be used directly for data binding.
455 */
456 var LanguageHelper = new SettingsLanguagesSingletonElement();
457 cr.addSingletonGetter(LanguageHelper);
Dan Beam 2015/11/25 00:29:38 so addSingletonGetter [essentially] does this:
michaelpg 2015/11/25 06:20:51 I clearly tested the wrong executable, sorry.
458
459 /**
460 * This element has a reference to the singleton, exposing the singleton's
461 * |languages| model to the host of this element.
462 */
463 Polymer({
464 is: 'settings-languages',
465
466 properties: {
467 /**
468 * Singleton element created at startup which provides the languages model.
469 * @type {!SettingsLanguagesSingletonElement}
Dan Beam 2015/11/25 00:29:38 so here you're intentionally using the concrete ty
michaelpg 2015/11/25 06:20:51 yes, because this element interacts with the <sett
470 */
471 singleton_: {
472 type: Object,
473 value: LanguageHelper.getInstance(),
474 },
475
476 /**
477 * A reference to the languages model from the singleton, exposed as a
478 * read-only property so hosts can bind to it, but not change it.
479 * @type {LanguagesModel|undefined}
480 */
481 languages: {
482 type: Object,
483 notify: true,
484 readOnly: true,
485 },
486 },
487
488 ready: function() {
489 // Set the 'languages' property to reference the singleton's model.
490 this._setLanguages(this.singleton_.languages);
491 // Listen for changes to the singleton's languages property, so we know
492 // when to notify hosts of changes to (our reference to) the property.
493 this.listen(
494 this.singleton_, 'languages-changed', 'singletonLanguagesChanged_');
495 },
496
497 /**
498 * Takes changes reported by the singleton and forwards them to the host,
499 * manually sending a change notification for our 'languages' property (since
500 * it's the same object as the singleton's property, but isn't bound by
501 * Polymer).
502 * @private
503 */
504 singletonLanguagesChanged_: function(e) {
505 // Forward the change notification to the host.
506 this.fire(e.type, e.detail, {bubbles: false});
507 },
565 }); 508 });
566 })(); 509 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698