diff options
5 files changed, 133 insertions, 12 deletions
diff --git a/chrome/browser/chromeos/dom_ui/language_options_handler.cc b/chrome/browser/chromeos/dom_ui/language_options_handler.cc index c78cccc..0a94285 100644 --- a/chrome/browser/chromeos/dom_ui/language_options_handler.cc +++ b/chrome/browser/chromeos/dom_ui/language_options_handler.cc @@ -7,6 +7,8 @@ #include "app/l10n_util.h" #include "app/resource_bundle.h" #include "base/values.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/chromeos/input_method/input_method_util.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" @@ -41,4 +43,12 @@ void LanguageOptionsHandler::GetLocalizedValues( l10n_util::GetStringF( IDS_OPTIONS_SETTINGS_LANGUAGES_DISPLAY_IN_THIS_LANGUAGE, l10n_util::GetString(IDS_PRODUCT_OS_NAME))); + + // Build mappings of locale code (language code) to display name + // (ex. "en-US" => "English (United States)". + const std::vector<std::string>& locales = l10n_util::GetAvailableLocales(); + for (size_t i = 0; i < locales.size(); ++i) { + localized_strings->SetString(UTF8ToWide(locales[i]), + chromeos::input_method::GetLanguageDisplayNameFromCode(locales[i])); + } } diff --git a/chrome/browser/resources/options.html b/chrome/browser/resources/options.html index 5d5cfd4..e829473 100644 --- a/chrome/browser/resources/options.html +++ b/chrome/browser/resources/options.html @@ -21,6 +21,8 @@ <script src="options/pref_ui.js"></script> <script src="options/options_page.js"></script> <if expr="pp_ifdef('chromeos')"> + <script src="options/chromeos_language_list.js"></script> + <script src="options/chromeos_language_options.js"></script> <script src="options/chromeos_system_options.js"></script> <script src="options/chromeos_accounts_options.js"></script> <script src="options/chromeos_accounts_user_list.js"></script> @@ -69,11 +71,7 @@ function load() { localStrings.getString('labsPage'), 'labsPage'); OptionsPage.register(labsOptions); - var languageSettings = new OptionsPage('language', - localStrings.getString( - 'languagePage'), - 'languagePage'); - OptionsPage.registerSubPage(languageSettings); + OptionsPage.registerSubPage(LanguageOptions.getInstance()); } var syncSettings = new OptionsPage('sync', diff --git a/chrome/browser/resources/options/chromeos_language_list.js b/chrome/browser/resources/options/chromeos_language_list.js new file mode 100644 index 0000000..cb4bc50 --- /dev/null +++ b/chrome/browser/resources/options/chromeos_language_list.js @@ -0,0 +1,71 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +cr.define('options.language', function() { + const List = cr.ui.List; + const ListItem = cr.ui.ListItem; + const ArrayDataModel = cr.ui.ArrayDataModel; + + /** + * Creates a new language list. + * @param {Object=} opt_propertyBag Optional properties. + * @constructor + * @extends {cr.ui.List} + */ + var LanguageList = cr.ui.define('list'); + + LanguageList.prototype = { + __proto__: List.prototype, + + pref: 'settings.language.preferred_languages', + + /** @inheritDoc */ + decorate: function() { + List.prototype.decorate.call(this); + + // HACK(arv): http://crbug.com/40902 + window.addEventListener('resize', cr.bind(this.redraw, this)); + + // Listens to pref change. + Preferences.getInstance().addEventListener(this.pref, + cr.bind(this.handlePrefChange_, this)); + }, + + createItem: function(languageCode) { + var languageDisplayName = localStrings.getString(languageCode); + return new ListItem({label: languageDisplayName}); + }, + + /** + * Handles pref change. + * @param {Event} event The change event object. + * @private + */ + handlePrefChange_: function(event) { + this.load_(event.value); + }, + + /** + * Loads given language list. + * @param {string} languageCodesInCsv A CSV string of language codes. + * @private + */ + load_: function(languageCodesInCsv) { + var languageCodes = languageCodesInCsv.split(','); + this.dataModel = new ArrayDataModel(languageCodes); + }, + + /** + * Updates backend. + */ + updateBackend_: function() { + // Encode the language codes into a CSV string. + Preferences.setStringPref(this.pref, this.dataModel.slice().join(',')); + }, + }; + + return { + LanguageList: LanguageList + }; +}); diff --git a/chrome/browser/resources/options/chromeos_language_options.html b/chrome/browser/resources/options/chromeos_language_options.html index 7d8ef823..a69f004 100644 --- a/chrome/browser/resources/options/chromeos_language_options.html +++ b/chrome/browser/resources/options/chromeos_language_options.html @@ -5,13 +5,7 @@ <div class="language-options"> <div class="language-options-left"> <h3 i18n-content="languages"></h3> - <list id="language-options-list"> - <!-- TODO: The contents should be dynamically changed. --> - <li>English (United States)</li> - <li>Spanish</li> - <li>French</li> - <li>Japanese</li> - </list> + <list id="language-options-list"></list> <div class="language-options-lower-left"> <button id="add-button" i18n-content="add_button"></button> <button id="remove-button" i18n-content="remove_button"></button> diff --git a/chrome/browser/resources/options/chromeos_language_options.js b/chrome/browser/resources/options/chromeos_language_options.js new file mode 100644 index 0000000..99fed77 --- /dev/null +++ b/chrome/browser/resources/options/chromeos_language_options.js @@ -0,0 +1,48 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/////////////////////////////////////////////////////////////////////////////// +// LanguageOptions class: + +/** + * Encapsulated handling of ChromeOS language options page. + * @constructor + */ +function LanguageOptions(model) { + OptionsPage.call(this, 'language', localStrings.getString('languagePage'), + 'languagePage'); +} + +cr.addSingletonGetter(LanguageOptions); + +// Inherit LanguageOptions from OptionsPage. +LanguageOptions.prototype = { + __proto__: OptionsPage.prototype, + + /** + * Initializes LanguageOptions page. + * Calls base class implementation to starts preference initialization. + */ + initializePage: function() { + OptionsPage.prototype.initializePage.call(this); + + options.language.LanguageList.decorate($('language-options-list')); + + this.addEventListener('visibleChange', + cr.bind(this.handleVisibleChange_, this)); + }, + + languageListInitalized_: false, + + /** + * Handler for OptionsPage's visible property change event. + * @param {Event} e Property change event. + */ + handleVisibleChange_ : function(e) { + if (!this.languageListInitalized_ && this.visible) { + this.languageListInitalized_ = true; + $('language-options-list').redraw(); + } + } +}; |