1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/components/preferences/languages.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,304 @@ 1.4 +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +var gLanguagesDialog = { 1.10 + 1.11 + _availableLanguagesList : [], 1.12 + _acceptLanguages : { }, 1.13 + 1.14 + _selectedItemID : null, 1.15 + 1.16 + init: function () 1.17 + { 1.18 + if (!this._availableLanguagesList.length) 1.19 + this._loadAvailableLanguages(); 1.20 + }, 1.21 + 1.22 + get _activeLanguages() 1.23 + { 1.24 + return document.getElementById("activeLanguages"); 1.25 + }, 1.26 + 1.27 + get _availableLanguages() 1.28 + { 1.29 + return document.getElementById("availableLanguages"); 1.30 + }, 1.31 + 1.32 + _loadAvailableLanguages: function () 1.33 + { 1.34 + // This is a parser for: resource://gre/res/language.properties 1.35 + // The file is formatted like so: 1.36 + // ab[-cd].accept=true|false 1.37 + // ab = language 1.38 + // cd = region 1.39 + var bundleAccepted = document.getElementById("bundleAccepted"); 1.40 + var bundleRegions = document.getElementById("bundleRegions"); 1.41 + var bundleLanguages = document.getElementById("bundleLanguages"); 1.42 + var bundlePreferences = document.getElementById("bundlePreferences"); 1.43 + 1.44 + function LanguageInfo(aName, aABCD, aIsVisible) 1.45 + { 1.46 + this.name = aName; 1.47 + this.abcd = aABCD; 1.48 + this.isVisible = aIsVisible; 1.49 + } 1.50 + 1.51 + // 1) Read the available languages out of language.properties 1.52 + var strings = bundleAccepted.strings; 1.53 + while (strings.hasMoreElements()) { 1.54 + var currString = strings.getNext(); 1.55 + if (!(currString instanceof Components.interfaces.nsIPropertyElement)) 1.56 + break; 1.57 + 1.58 + var property = currString.key.split("."); // ab[-cd].accept 1.59 + if (property[1] == "accept") { 1.60 + var abCD = property[0]; 1.61 + var abCDPairs = abCD.split("-"); // ab[-cd] 1.62 + var useABCDFormat = abCDPairs.length > 1; 1.63 + var ab = useABCDFormat ? abCDPairs[0] : abCD; 1.64 + var cd = useABCDFormat ? abCDPairs[1] : ""; 1.65 + if (ab) { 1.66 + var language = ""; 1.67 + try { 1.68 + language = bundleLanguages.getString(ab); 1.69 + } 1.70 + catch (e) { continue; }; 1.71 + 1.72 + var region = ""; 1.73 + if (useABCDFormat) { 1.74 + try { 1.75 + region = bundleRegions.getString(cd); 1.76 + } 1.77 + catch (e) { continue; } 1.78 + } 1.79 + 1.80 + var name = ""; 1.81 + if (useABCDFormat) 1.82 + name = bundlePreferences.getFormattedString("languageRegionCodeFormat", 1.83 + [language, region, abCD]); 1.84 + else 1.85 + name = bundlePreferences.getFormattedString("languageCodeFormat", 1.86 + [language, abCD]); 1.87 + 1.88 + if (name && abCD) { 1.89 + var isVisible = currString.value == "true" && 1.90 + (!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD]); 1.91 + var li = new LanguageInfo(name, abCD, isVisible); 1.92 + this._availableLanguagesList.push(li); 1.93 + } 1.94 + } 1.95 + } 1.96 + } 1.97 + this._buildAvailableLanguageList(); 1.98 + }, 1.99 + 1.100 + _buildAvailableLanguageList: function () 1.101 + { 1.102 + var availableLanguagesPopup = document.getElementById("availableLanguagesPopup"); 1.103 + while (availableLanguagesPopup.hasChildNodes()) 1.104 + availableLanguagesPopup.removeChild(availableLanguagesPopup.firstChild); 1.105 + 1.106 + // Sort the list of languages by name 1.107 + this._availableLanguagesList.sort(function (a, b) { 1.108 + return a.name.localeCompare(b.name); 1.109 + }); 1.110 + 1.111 + // Load the UI with the data 1.112 + for (var i = 0; i < this._availableLanguagesList.length; ++i) { 1.113 + var abCD = this._availableLanguagesList[i].abcd; 1.114 + if (this._availableLanguagesList[i].isVisible && 1.115 + (!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD])) { 1.116 + var menuitem = document.createElement("menuitem"); 1.117 + menuitem.id = this._availableLanguagesList[i].abcd; 1.118 + availableLanguagesPopup.appendChild(menuitem); 1.119 + menuitem.setAttribute("label", this._availableLanguagesList[i].name); 1.120 + } 1.121 + } 1.122 + }, 1.123 + 1.124 + readAcceptLanguages: function () 1.125 + { 1.126 + while (this._activeLanguages.hasChildNodes()) 1.127 + this._activeLanguages.removeChild(this._activeLanguages.firstChild); 1.128 + 1.129 + var selectedIndex = 0; 1.130 + var preference = document.getElementById("intl.accept_languages"); 1.131 + if (preference.value == "") 1.132 + return undefined; 1.133 + var languages = preference.value.toLowerCase().split(/\s*,\s*/); 1.134 + for (var i = 0; i < languages.length; ++i) { 1.135 + var name = this._getLanguageName(languages[i]); 1.136 + if (!name) 1.137 + name = "[" + languages[i] + "]"; 1.138 + var listitem = document.createElement("listitem"); 1.139 + listitem.id = languages[i]; 1.140 + if (languages[i] == this._selectedItemID) 1.141 + selectedIndex = i; 1.142 + this._activeLanguages.appendChild(listitem); 1.143 + listitem.setAttribute("label", name); 1.144 + 1.145 + // Hash this language as an "Active" language so we don't 1.146 + // show it in the list that can be added. 1.147 + this._acceptLanguages[languages[i]] = true; 1.148 + } 1.149 + 1.150 + if (this._activeLanguages.childNodes.length > 0) { 1.151 + this._activeLanguages.ensureIndexIsVisible(selectedIndex); 1.152 + this._activeLanguages.selectedIndex = selectedIndex; 1.153 + } 1.154 + 1.155 + return undefined; 1.156 + }, 1.157 + 1.158 + writeAcceptLanguages: function () 1.159 + { 1.160 + return undefined; 1.161 + }, 1.162 + 1.163 + onAvailableLanguageSelect: function () 1.164 + { 1.165 + var addButton = document.getElementById("addButton"); 1.166 + addButton.disabled = false; 1.167 + 1.168 + this._availableLanguages.removeAttribute("accesskey"); 1.169 + }, 1.170 + 1.171 + addLanguage: function () 1.172 + { 1.173 + var selectedID = this._availableLanguages.selectedItem.id; 1.174 + var preference = document.getElementById("intl.accept_languages"); 1.175 + var arrayOfPrefs = preference.value.toLowerCase().split(/\s*,\s*/); 1.176 + for (var i = 0; i < arrayOfPrefs.length; ++i ){ 1.177 + if (arrayOfPrefs[i] == selectedID) 1.178 + return; 1.179 + } 1.180 + 1.181 + this._selectedItemID = selectedID; 1.182 + 1.183 + if (preference.value == "") 1.184 + preference.value = selectedID; 1.185 + else { 1.186 + arrayOfPrefs.unshift(selectedID); 1.187 + preference.value = arrayOfPrefs.join(","); 1.188 + } 1.189 + 1.190 + this._acceptLanguages[selectedID] = true; 1.191 + this._availableLanguages.selectedItem = null; 1.192 + 1.193 + // Rebuild the available list with the added item removed... 1.194 + this._buildAvailableLanguageList(); 1.195 + 1.196 + this._availableLanguages.setAttribute("label", this._availableLanguages.getAttribute("label2")); 1.197 + }, 1.198 + 1.199 + removeLanguage: function () 1.200 + { 1.201 + // Build the new preference value string. 1.202 + var languagesArray = []; 1.203 + for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) { 1.204 + var item = this._activeLanguages.childNodes[i]; 1.205 + if (!item.selected) 1.206 + languagesArray.push(item.id); 1.207 + else 1.208 + this._acceptLanguages[item.id] = false; 1.209 + } 1.210 + var string = languagesArray.join(","); 1.211 + 1.212 + // Get the item to select after the remove operation completes. 1.213 + var selection = this._activeLanguages.selectedItems; 1.214 + var lastSelected = selection[selection.length-1]; 1.215 + var selectItem = lastSelected.nextSibling || lastSelected.previousSibling; 1.216 + selectItem = selectItem ? selectItem.id : null; 1.217 + 1.218 + this._selectedItemID = selectItem; 1.219 + 1.220 + // Update the preference and force a UI rebuild 1.221 + var preference = document.getElementById("intl.accept_languages"); 1.222 + preference.value = string; 1.223 + 1.224 + this._buildAvailableLanguageList(); 1.225 + }, 1.226 + 1.227 + _getLanguageName: function (aABCD) 1.228 + { 1.229 + if (!this._availableLanguagesList.length) 1.230 + this._loadAvailableLanguages(); 1.231 + for (var i = 0; i < this._availableLanguagesList.length; ++i) { 1.232 + if (aABCD == this._availableLanguagesList[i].abcd) 1.233 + return this._availableLanguagesList[i].name; 1.234 + } 1.235 + return ""; 1.236 + }, 1.237 + 1.238 + moveUp: function () 1.239 + { 1.240 + var selectedItem = this._activeLanguages.selectedItems[0]; 1.241 + var previousItem = selectedItem.previousSibling; 1.242 + 1.243 + var string = ""; 1.244 + for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) { 1.245 + var item = this._activeLanguages.childNodes[i]; 1.246 + string += (i == 0 ? "" : ","); 1.247 + if (item.id == previousItem.id) 1.248 + string += selectedItem.id; 1.249 + else if (item.id == selectedItem.id) 1.250 + string += previousItem.id; 1.251 + else 1.252 + string += item.id; 1.253 + } 1.254 + 1.255 + this._selectedItemID = selectedItem.id; 1.256 + 1.257 + // Update the preference and force a UI rebuild 1.258 + var preference = document.getElementById("intl.accept_languages"); 1.259 + preference.value = string; 1.260 + }, 1.261 + 1.262 + moveDown: function () 1.263 + { 1.264 + var selectedItem = this._activeLanguages.selectedItems[0]; 1.265 + var nextItem = selectedItem.nextSibling; 1.266 + 1.267 + var string = ""; 1.268 + for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) { 1.269 + var item = this._activeLanguages.childNodes[i]; 1.270 + string += (i == 0 ? "" : ","); 1.271 + if (item.id == nextItem.id) 1.272 + string += selectedItem.id; 1.273 + else if (item.id == selectedItem.id) 1.274 + string += nextItem.id; 1.275 + else 1.276 + string += item.id; 1.277 + } 1.278 + 1.279 + this._selectedItemID = selectedItem.id; 1.280 + 1.281 + // Update the preference and force a UI rebuild 1.282 + var preference = document.getElementById("intl.accept_languages"); 1.283 + preference.value = string; 1.284 + }, 1.285 + 1.286 + onLanguageSelect: function () 1.287 + { 1.288 + var upButton = document.getElementById("up"); 1.289 + var downButton = document.getElementById("down"); 1.290 + var removeButton = document.getElementById("remove"); 1.291 + switch (this._activeLanguages.selectedCount) { 1.292 + case 0: 1.293 + upButton.disabled = downButton.disabled = removeButton.disabled = true; 1.294 + break; 1.295 + case 1: 1.296 + upButton.disabled = this._activeLanguages.selectedIndex == 0; 1.297 + downButton.disabled = this._activeLanguages.selectedIndex == this._activeLanguages.childNodes.length - 1; 1.298 + removeButton.disabled = false; 1.299 + break; 1.300 + default: 1.301 + upButton.disabled = true; 1.302 + downButton.disabled = true; 1.303 + removeButton.disabled = false; 1.304 + } 1.305 + } 1.306 +}; 1.307 +