browser/components/preferences/languages.js

Wed, 31 Dec 2014 07:53:36 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:53:36 +0100
branch
TOR_BUG_3246
changeset 5
4ab42b5ab56c
permissions
-rw-r--r--

Correct small whitespace inconsistency, lost while renaming variables.

     1 /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 var gLanguagesDialog = {
     8   _availableLanguagesList : [],
     9   _acceptLanguages        : { },
    11   _selectedItemID         : null,
    13   init: function ()
    14   {
    15     if (!this._availableLanguagesList.length)
    16       this._loadAvailableLanguages();
    17   },
    19   get _activeLanguages()
    20   {
    21     return document.getElementById("activeLanguages");
    22   },
    24   get _availableLanguages()
    25   {
    26     return document.getElementById("availableLanguages");
    27   },
    29   _loadAvailableLanguages: function ()
    30   {
    31     // This is a parser for: resource://gre/res/language.properties
    32     // The file is formatted like so:
    33     // ab[-cd].accept=true|false
    34     //  ab = language
    35     //  cd = region
    36     var bundleAccepted    = document.getElementById("bundleAccepted");
    37     var bundleRegions     = document.getElementById("bundleRegions");
    38     var bundleLanguages   = document.getElementById("bundleLanguages");
    39     var bundlePreferences = document.getElementById("bundlePreferences");
    41     function LanguageInfo(aName, aABCD, aIsVisible)
    42     {
    43       this.name = aName;
    44       this.abcd = aABCD;
    45       this.isVisible = aIsVisible;
    46     }
    48     // 1) Read the available languages out of language.properties
    49     var strings = bundleAccepted.strings;
    50     while (strings.hasMoreElements()) {
    51       var currString = strings.getNext();
    52       if (!(currString instanceof Components.interfaces.nsIPropertyElement))
    53         break;
    55       var property = currString.key.split("."); // ab[-cd].accept
    56       if (property[1] == "accept") {
    57         var abCD = property[0];
    58         var abCDPairs = abCD.split("-");      // ab[-cd]
    59         var useABCDFormat = abCDPairs.length > 1;
    60         var ab = useABCDFormat ? abCDPairs[0] : abCD;
    61         var cd = useABCDFormat ? abCDPairs[1] : "";
    62         if (ab) {
    63           var language = "";
    64           try {
    65             language = bundleLanguages.getString(ab);
    66           } 
    67           catch (e) { continue; };
    69           var region = "";
    70           if (useABCDFormat) {
    71             try {
    72               region = bundleRegions.getString(cd);
    73             }
    74             catch (e) { continue; }
    75           }
    77           var name = "";
    78           if (useABCDFormat)
    79             name = bundlePreferences.getFormattedString("languageRegionCodeFormat", 
    80                                                         [language, region, abCD]);
    81           else
    82             name = bundlePreferences.getFormattedString("languageCodeFormat", 
    83                                                         [language, abCD]);
    85           if (name && abCD) {
    86             var isVisible = currString.value == "true" && 
    87                             (!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD]);
    88             var li = new LanguageInfo(name, abCD, isVisible);
    89             this._availableLanguagesList.push(li);
    90           }
    91         }
    92       }
    93     }
    94     this._buildAvailableLanguageList();
    95   },
    97   _buildAvailableLanguageList: function ()
    98   {
    99     var availableLanguagesPopup = document.getElementById("availableLanguagesPopup");
   100     while (availableLanguagesPopup.hasChildNodes())
   101       availableLanguagesPopup.removeChild(availableLanguagesPopup.firstChild);
   103     // Sort the list of languages by name
   104     this._availableLanguagesList.sort(function (a, b) {
   105                                         return a.name.localeCompare(b.name);
   106                                       });
   108     // Load the UI with the data
   109     for (var i = 0; i < this._availableLanguagesList.length; ++i) {
   110       var abCD = this._availableLanguagesList[i].abcd;
   111       if (this._availableLanguagesList[i].isVisible && 
   112           (!(abCD in this._acceptLanguages) || !this._acceptLanguages[abCD])) {
   113         var menuitem = document.createElement("menuitem");
   114         menuitem.id = this._availableLanguagesList[i].abcd;
   115         availableLanguagesPopup.appendChild(menuitem);
   116         menuitem.setAttribute("label", this._availableLanguagesList[i].name);
   117       }
   118     }
   119   },
   121   readAcceptLanguages: function ()
   122   {
   123     while (this._activeLanguages.hasChildNodes())
   124       this._activeLanguages.removeChild(this._activeLanguages.firstChild);
   126     var selectedIndex = 0;
   127     var preference = document.getElementById("intl.accept_languages");
   128     if (preference.value == "") 
   129       return undefined;
   130     var languages = preference.value.toLowerCase().split(/\s*,\s*/);
   131     for (var i = 0; i < languages.length; ++i) {
   132       var name = this._getLanguageName(languages[i]);
   133       if (!name)
   134         name = "[" + languages[i] + "]";
   135       var listitem = document.createElement("listitem");
   136       listitem.id = languages[i];
   137       if (languages[i] == this._selectedItemID)
   138         selectedIndex = i;
   139       this._activeLanguages.appendChild(listitem);
   140       listitem.setAttribute("label", name);
   142       // Hash this language as an "Active" language so we don't
   143       // show it in the list that can be added. 
   144       this._acceptLanguages[languages[i]] = true;
   145     }
   147     if (this._activeLanguages.childNodes.length > 0) {
   148       this._activeLanguages.ensureIndexIsVisible(selectedIndex);
   149       this._activeLanguages.selectedIndex = selectedIndex;
   150     }
   152     return undefined;
   153   },
   155   writeAcceptLanguages: function ()
   156   {
   157     return undefined;
   158   },
   160   onAvailableLanguageSelect: function ()
   161   {
   162     var addButton = document.getElementById("addButton");
   163     addButton.disabled = false;
   165     this._availableLanguages.removeAttribute("accesskey");
   166   },
   168   addLanguage: function ()
   169   {
   170     var selectedID = this._availableLanguages.selectedItem.id;
   171     var preference = document.getElementById("intl.accept_languages");
   172     var arrayOfPrefs = preference.value.toLowerCase().split(/\s*,\s*/);
   173     for (var i = 0; i < arrayOfPrefs.length; ++i ){
   174       if (arrayOfPrefs[i] == selectedID)
   175         return;
   176     }
   178     this._selectedItemID = selectedID;
   180     if (preference.value == "") 
   181       preference.value = selectedID;
   182     else {
   183       arrayOfPrefs.unshift(selectedID);
   184       preference.value = arrayOfPrefs.join(",");
   185     }
   187     this._acceptLanguages[selectedID] = true;
   188     this._availableLanguages.selectedItem = null;
   190     // Rebuild the available list with the added item removed...
   191     this._buildAvailableLanguageList(); 
   193     this._availableLanguages.setAttribute("label", this._availableLanguages.getAttribute("label2"));
   194   },
   196   removeLanguage: function ()
   197   {
   198     // Build the new preference value string.
   199     var languagesArray = [];
   200     for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
   201       var item = this._activeLanguages.childNodes[i];
   202       if (!item.selected) 
   203         languagesArray.push(item.id);
   204       else  
   205         this._acceptLanguages[item.id] = false;
   206     }
   207     var string = languagesArray.join(",");
   209     // Get the item to select after the remove operation completes.     
   210     var selection = this._activeLanguages.selectedItems;
   211     var lastSelected = selection[selection.length-1];
   212     var selectItem = lastSelected.nextSibling || lastSelected.previousSibling;
   213     selectItem = selectItem ? selectItem.id : null;
   215     this._selectedItemID = selectItem;
   217     // Update the preference and force a UI rebuild
   218     var preference = document.getElementById("intl.accept_languages");
   219     preference.value = string;
   221     this._buildAvailableLanguageList(); 
   222   },
   224   _getLanguageName: function (aABCD)
   225   {
   226     if (!this._availableLanguagesList.length)
   227       this._loadAvailableLanguages();
   228     for (var i = 0; i < this._availableLanguagesList.length; ++i) {
   229       if (aABCD == this._availableLanguagesList[i].abcd) 
   230         return this._availableLanguagesList[i].name;
   231     }
   232     return "";
   233   },
   235   moveUp: function ()
   236   {
   237     var selectedItem = this._activeLanguages.selectedItems[0];
   238     var previousItem = selectedItem.previousSibling;
   240     var string = "";
   241     for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
   242       var item = this._activeLanguages.childNodes[i];
   243       string += (i == 0 ? "" : ",");
   244       if (item.id == previousItem.id) 
   245         string += selectedItem.id;
   246       else if (item.id == selectedItem.id)
   247         string += previousItem.id;
   248       else
   249         string += item.id;
   250     }
   252     this._selectedItemID = selectedItem.id;
   254     // Update the preference and force a UI rebuild
   255     var preference = document.getElementById("intl.accept_languages");
   256     preference.value = string;
   257   },
   259   moveDown: function ()
   260   {
   261     var selectedItem = this._activeLanguages.selectedItems[0];
   262     var nextItem = selectedItem.nextSibling;
   264     var string = "";
   265     for (var i = 0; i < this._activeLanguages.childNodes.length; ++i) {
   266       var item = this._activeLanguages.childNodes[i];
   267       string += (i == 0 ? "" : ",");
   268       if (item.id == nextItem.id) 
   269         string += selectedItem.id;
   270       else if (item.id == selectedItem.id)
   271         string += nextItem.id;
   272       else
   273         string += item.id;
   274     }
   276     this._selectedItemID = selectedItem.id;
   278     // Update the preference and force a UI rebuild
   279     var preference = document.getElementById("intl.accept_languages");
   280     preference.value = string;
   281   },
   283   onLanguageSelect: function ()
   284   {
   285     var upButton = document.getElementById("up");
   286     var downButton = document.getElementById("down");
   287     var removeButton = document.getElementById("remove");
   288     switch (this._activeLanguages.selectedCount) {
   289     case 0:
   290       upButton.disabled = downButton.disabled = removeButton.disabled = true;
   291       break;
   292     case 1:
   293       upButton.disabled = this._activeLanguages.selectedIndex == 0;
   294       downButton.disabled = this._activeLanguages.selectedIndex == this._activeLanguages.childNodes.length - 1;
   295       removeButton.disabled = false;
   296       break;
   297     default:
   298       upButton.disabled = true;
   299       downButton.disabled = true;
   300       removeButton.disabled = false;
   301     }
   302   }
   303 };

mercurial