OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 cr.define('options.language', function() { | 5 cr.define('options.language', function() { |
6 const List = cr.ui.List; | 6 const List = cr.ui.List; |
7 const ListItem = cr.ui.ListItem; | 7 const ListItem = cr.ui.ListItem; |
8 const ArrayDataModel = cr.ui.ArrayDataModel; | 8 const ArrayDataModel = cr.ui.ArrayDataModel; |
| 9 const LanguageOptions = options.LanguageOptions; |
9 | 10 |
10 /** | 11 /** |
11 * Creates a new language list. | 12 * Creates a new language list. |
12 * @param {Object=} opt_propertyBag Optional properties. | 13 * @param {Object=} opt_propertyBag Optional properties. |
13 * @constructor | 14 * @constructor |
14 * @extends {cr.ui.List} | 15 * @extends {cr.ui.List} |
15 */ | 16 */ |
16 var LanguageList = cr.ui.define('list'); | 17 var LanguageList = cr.ui.define('list'); |
17 | 18 |
| 19 /** |
| 20 * Gets display name from the given language code. |
| 21 * @param {string} languageCode Language code (ex. "fr"). |
| 22 */ |
| 23 LanguageList.getDisplayNameFromLanguageCode = function(languageCode) { |
| 24 // Build the language code to display name dictionary at first time. |
| 25 if (!this.languageCodeToDisplayName_) { |
| 26 this.languageCodeToDisplayName_ = {}; |
| 27 var languageList = templateData.languageList; |
| 28 for (var i = 0; i < languageList.length; i++) { |
| 29 var language = languageList[i]; |
| 30 this.languageCodeToDisplayName_[language.code] = language.displayName; |
| 31 } |
| 32 } |
| 33 |
| 34 return this.languageCodeToDisplayName_[languageCode]; |
| 35 } |
| 36 |
18 LanguageList.prototype = { | 37 LanguageList.prototype = { |
19 __proto__: List.prototype, | 38 __proto__: List.prototype, |
20 | 39 |
21 pref: 'settings.language.preferred_languages', | 40 pref: 'settings.language.preferred_languages', |
22 | 41 |
23 /** @inheritDoc */ | 42 /** @inheritDoc */ |
24 decorate: function() { | 43 decorate: function() { |
25 List.prototype.decorate.call(this); | 44 List.prototype.decorate.call(this); |
26 | 45 |
27 // HACK(arv): http://crbug.com/40902 | 46 // HACK(arv): http://crbug.com/40902 |
28 window.addEventListener('resize', cr.bind(this.redraw, this)); | 47 window.addEventListener('resize', cr.bind(this.redraw, this)); |
29 | 48 |
30 // Listen to pref change. | 49 // Listen to pref change. |
31 Preferences.getInstance().addEventListener(this.pref, | 50 Preferences.getInstance().addEventListener(this.pref, |
32 cr.bind(this.handlePrefChange_, this)); | 51 cr.bind(this.handlePrefChange_, this)); |
33 }, | 52 }, |
34 | 53 |
35 createItem: function(languageCode) { | 54 createItem: function(languageCode) { |
36 var languageDisplayName = localStrings.getString(languageCode); | 55 var languageDisplayName = |
| 56 LanguageList.getDisplayNameFromLanguageCode(languageCode); |
37 return new ListItem({label: languageDisplayName}); | 57 return new ListItem({label: languageDisplayName}); |
38 }, | 58 }, |
39 | 59 |
| 60 /* |
| 61 * Adds a language to the language list. |
| 62 * @param {string} languageCode language code (ex. "fr"). |
| 63 */ |
| 64 addLanguage: function(languageCode) { |
| 65 var dataModel = this.dataModel; |
| 66 dataModel.push(languageCode); |
| 67 |
| 68 this.updateBackend_(); |
| 69 }, |
| 70 |
| 71 /* |
| 72 * Gets the language codes of the currently listed languages. |
| 73 */ |
| 74 getLanguageCodes: function() { |
| 75 return this.dataModel.slice(); |
| 76 }, |
| 77 |
| 78 /* |
| 79 * Gets the language code of the selected language. |
| 80 */ |
| 81 getSelectedLanguageCode: function() { |
| 82 return this.selectedItem; |
| 83 }, |
| 84 |
| 85 /* |
| 86 * Removes the currently selected language. |
| 87 */ |
| 88 removeSelectedLanguage: function() { |
| 89 if (this.selectionModel.selectedIndex >= 0 && |
| 90 // Don't allow removing the last language. |
| 91 this.dataModel.length > 1) { |
| 92 // TODO(satorux): Until we switch to the single selection model, |
| 93 // it's possible that multiple languages are selected, but we don't |
| 94 // handle that case here. |
| 95 var originalIndex = this.selectionModel.selectedIndex; |
| 96 this.dataModel.splice(this.selectionModel.selectedIndex, 1); |
| 97 // Select the item at the original index if possible. Otherwise, |
| 98 // select the last item. |
| 99 // TODO(satorux): This should be handled by the selection model |
| 100 // See crbug.com/49893. |
| 101 this.selectionModel.selectedIndex = Math.min( |
| 102 originalIndex, |
| 103 this.dataModel.length - 1); |
| 104 var newLanguageCodes = this.dataModel.slice(); |
| 105 this.load_(newLanguageCodes); |
| 106 this.updateBackend_(); |
| 107 } |
| 108 }, |
| 109 |
40 /** | 110 /** |
41 * Handles pref change. | 111 * Handles pref change. |
42 * @param {Event} e The change event object. | 112 * @param {Event} e The change event object. |
43 * @private | 113 * @private |
44 */ | 114 */ |
45 handlePrefChange_: function(e) { | 115 handlePrefChange_: function(e) { |
46 var languageCodesInCsv = e.value; | 116 var languageCodesInCsv = e.value; |
47 var languageCodes = this.filterBadLanguageCodes_( | 117 var languageCodes = this.filterBadLanguageCodes_( |
48 languageCodesInCsv.split(',')); | 118 languageCodesInCsv.split(',')); |
49 this.load_(languageCodes); | 119 this.load_(languageCodes); |
(...skipping 25 matching lines...) Expand all Loading... |
75 * Filters bad language codes in case bad language codes are | 145 * Filters bad language codes in case bad language codes are |
76 * stored in the preference. | 146 * stored in the preference. |
77 * @param {Array} languageCodes List of language codes. | 147 * @param {Array} languageCodes List of language codes. |
78 * @private | 148 * @private |
79 */ | 149 */ |
80 filterBadLanguageCodes_: function(languageCodes) { | 150 filterBadLanguageCodes_: function(languageCodes) { |
81 var filteredLanguageCodes = []; | 151 var filteredLanguageCodes = []; |
82 for (var i = 0; i < languageCodes.length; i++) { | 152 for (var i = 0; i < languageCodes.length; i++) { |
83 // Check if the translation for the language code is | 153 // Check if the translation for the language code is |
84 // present. Otherwise, skip it. | 154 // present. Otherwise, skip it. |
85 if (localStrings.getString(languageCodes[i])) { | 155 if (LanguageList.getDisplayNameFromLanguageCode(languageCodes[i])) { |
86 filteredLanguageCodes.push(languageCodes[i]); | 156 filteredLanguageCodes.push(languageCodes[i]); |
87 } | 157 } |
88 } | 158 } |
89 return filteredLanguageCodes; | 159 return filteredLanguageCodes; |
90 }, | 160 }, |
91 }; | 161 }; |
92 | 162 |
93 return { | 163 return { |
94 LanguageList: LanguageList | 164 LanguageList: LanguageList |
95 }; | 165 }; |
96 }); | 166 }); |
OLD | NEW |