зеркало из https://github.com/mozilla/pjs.git
port bug 181541 (Add UI to set default languages for web pages, r=mconnor) to the trunk
This commit is contained in:
Родитель
0c874c941c
Коммит
281ad399dd
|
@ -0,0 +1,447 @@
|
|||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||
*
|
||||
* The contents of this file are subject to the Mozilla Public License Version
|
||||
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
* http://www.mozilla.org/MPL/
|
||||
*
|
||||
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||
* for the specific language governing rights and limitations under the
|
||||
* License.
|
||||
*
|
||||
* The Original Code is mozilla.org code.
|
||||
*
|
||||
* The Initial Developer of the Original Code is
|
||||
* Netscape Communications Corporation.
|
||||
* Portions created by the Initial Developer are Copyright (C) 2000
|
||||
* the Initial Developer. All Rights Reserved.
|
||||
*
|
||||
* Contributor(s):
|
||||
* Adrian Havill <havill@redhat.com>
|
||||
* Steffen Wilberg <steffen.wilberg@web.de>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||
* of those above. If you wish to allow use of your version of this file only
|
||||
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||
* use your version of this file under the terms of the MPL, indicate your
|
||||
* decision by deleting the provisions above and replace them with the notice
|
||||
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||
* the provisions above, a recipient may use your version of this file under
|
||||
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
//GLOBALS
|
||||
|
||||
//locale bundles
|
||||
var gRegionsBundle;
|
||||
var gLanguagesBundle;
|
||||
var gAcceptedBundle;
|
||||
var gPrefLangBundle;
|
||||
|
||||
//dictionary of all supported locales
|
||||
var gAvailLanguageDict;
|
||||
|
||||
//XUL listbox handles
|
||||
var gAvailableLanguages;
|
||||
var gActiveLanguages;
|
||||
|
||||
// label and accesskey of the available_languages menulist
|
||||
var gSelectLabel;
|
||||
var gSelectAccesskey;
|
||||
|
||||
//XUL window pref window interface object
|
||||
var gPrefString = new String();
|
||||
|
||||
//Reg expression for splitting multiple pref values
|
||||
var gSeparatorRe = /\s*,\s*/;
|
||||
|
||||
// PrefWindow
|
||||
var gPrefWindow;
|
||||
|
||||
|
||||
function Init()
|
||||
{
|
||||
gRegionsBundle = document.getElementById("bundle_regions");
|
||||
gLanguagesBundle = document.getElementById("bundle_languages");
|
||||
gPrefLangBundle = document.getElementById("bundle_prefLang");
|
||||
gAcceptedBundle = document.getElementById("bundle_accepted");
|
||||
ReadAvailableLanguages();
|
||||
|
||||
try {
|
||||
window.opener.top.initPanel(window.location.href, window);
|
||||
}
|
||||
catch(ex) { } //pref service backup
|
||||
|
||||
gActiveLanguages = document.getElementById("active_languages");
|
||||
gPrefString = gActiveLanguages.getAttribute("prefvalue");
|
||||
LoadActiveLanguages();
|
||||
|
||||
gPrefWindow = window.opener.parent.hPrefWindow;
|
||||
gAvailableLanguages = document.getElementById("available_languages");
|
||||
SelectLanguage();
|
||||
|
||||
LoadAvailableLanguages();
|
||||
gSelectLabel = gAvailableLanguages.getAttribute("label");
|
||||
gSelectAccesskey = gAvailableLanguages.getAttribute("accesskey");
|
||||
}
|
||||
|
||||
|
||||
function onLanguagesDialogOK()
|
||||
{
|
||||
gPrefWindow.wsm.savePageData(window.location.href, window);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function ReadAvailableLanguages()
|
||||
{
|
||||
gAvailLanguageDict = new Array();
|
||||
var visible = new String();
|
||||
var str = new String();
|
||||
var i =0;
|
||||
|
||||
var gAcceptedBundleEnum = gAcceptedBundle.stringBundle.getSimpleEnumeration();
|
||||
|
||||
var curItem;
|
||||
var stringName;
|
||||
var stringNameProperty;
|
||||
|
||||
while (gAcceptedBundleEnum.hasMoreElements()) {
|
||||
|
||||
//progress through the bundle
|
||||
curItem = gAcceptedBundleEnum.getNext();
|
||||
|
||||
//"unpack" the item, nsIPropertyElement is now partially scriptable
|
||||
curItem = curItem.QueryInterface(Components.interfaces.nsIPropertyElement);
|
||||
|
||||
//dump string name (key)
|
||||
stringName = curItem.key;
|
||||
stringNameProperty = stringName.split(".");
|
||||
|
||||
if (stringNameProperty[1] == "accept") {
|
||||
|
||||
//dump the UI string (value)
|
||||
visible = curItem.value;
|
||||
|
||||
//if (visible == "true") {
|
||||
|
||||
str = stringNameProperty[0];
|
||||
var stringLangRegion = stringNameProperty[0].split("-");
|
||||
|
||||
if (stringLangRegion[0]) {
|
||||
var tit;
|
||||
var language;
|
||||
var region;
|
||||
var use_region_format = false;
|
||||
|
||||
try {
|
||||
language = gLanguagesBundle.getString(stringLangRegion[0]);
|
||||
}
|
||||
catch (ex) {
|
||||
language = "";
|
||||
}
|
||||
|
||||
if (stringLangRegion.length > 1) {
|
||||
|
||||
try {
|
||||
region = gRegionsBundle.getString(stringLangRegion[1]);
|
||||
use_region_format = true;
|
||||
}
|
||||
catch (ex) { }
|
||||
}
|
||||
|
||||
if (use_region_format) {
|
||||
tit = gPrefLangBundle.stringBundle.formatStringFromName("languageRegionCodeFormat",
|
||||
[language, region, str], 3);
|
||||
} else {
|
||||
tit = gPrefLangBundle.stringBundle.formatStringFromName("languageCodeFormat",
|
||||
[language, str], 2);
|
||||
}
|
||||
|
||||
} //if language
|
||||
|
||||
if (str && tit) {
|
||||
|
||||
gAvailLanguageDict[i] = new Array(3);
|
||||
gAvailLanguageDict[i][0] = tit;
|
||||
gAvailLanguageDict[i][1] = str;
|
||||
gAvailLanguageDict[i][2] = visible;
|
||||
i++;
|
||||
|
||||
} // if str && tit
|
||||
//} //if visible
|
||||
} //if accepted
|
||||
} //while
|
||||
gAvailLanguageDict.sort( // sort on first element
|
||||
function (a, b) {
|
||||
if (a[0] < b[0]) return -1;
|
||||
if (a[0] > b[0]) return 1;
|
||||
return 0;
|
||||
});
|
||||
} //ReadAvailableLanguages
|
||||
|
||||
|
||||
function LoadAvailableLanguages()
|
||||
{
|
||||
if (gAvailLanguageDict)
|
||||
for (var i = 0; i < gAvailLanguageDict.length; i++)
|
||||
if (gAvailLanguageDict[i][2] == "true")
|
||||
AddMenuOrListItem(document, gAvailableLanguages.menupopup, "menuitem", gAvailLanguageDict[i][1], gAvailLanguageDict[i][0]);
|
||||
}
|
||||
|
||||
|
||||
function LoadActiveLanguages()
|
||||
{
|
||||
if (gPrefString) {
|
||||
var arrayOfPrefs = gPrefString.split(gSeparatorRe);
|
||||
|
||||
for (var i = 0; i < arrayOfPrefs.length; i++) {
|
||||
var str = arrayOfPrefs[i];
|
||||
var tit = GetLanguageTitle(str);
|
||||
|
||||
if (str) {
|
||||
if (!tit)
|
||||
tit = "[" + str + "]";
|
||||
AddMenuOrListItem(document, gActiveLanguages, "listitem", str, tit);
|
||||
} //if
|
||||
} //for
|
||||
} //if
|
||||
}
|
||||
|
||||
|
||||
function LangAlreadyActive(langId)
|
||||
{
|
||||
var found = false;
|
||||
try {
|
||||
var arrayOfPrefs = gPrefString.split(gSeparatorRe);
|
||||
|
||||
if (arrayOfPrefs)
|
||||
for (var i = 0; i < arrayOfPrefs.length; i++) {
|
||||
if (arrayOfPrefs[i] == langId) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
catch(ex){
|
||||
return false;
|
||||
}
|
||||
} //LangAlreadyActive
|
||||
|
||||
|
||||
function SelectAvailableLanguage()
|
||||
{
|
||||
var selItem = gAvailableLanguages.selectedItem;
|
||||
var languageId = selItem.getAttribute("id");
|
||||
var addButton = document.getElementById("add");
|
||||
|
||||
// since we're not displaying "select" anymore, don't underline some random "s"
|
||||
gAvailableLanguages.removeAttribute("accesskey");
|
||||
|
||||
// if the langauge is not already active, activate the "add" button
|
||||
if (!LangAlreadyActive(languageId))
|
||||
addButton.disabled = false;
|
||||
else
|
||||
addButton.disabled = true;
|
||||
}
|
||||
|
||||
function AddAvailableLanguage()
|
||||
{
|
||||
var selItem = gAvailableLanguages.selectedItem;
|
||||
var languageId = selItem.getAttribute("id");
|
||||
var languageName = selItem.getAttribute("label");
|
||||
var addButton = document.getElementById("add");
|
||||
|
||||
if (!LangAlreadyActive(languageId))
|
||||
AddMenuOrListItem(document, gActiveLanguages, "listitem", languageId, languageName);
|
||||
|
||||
// restore the "select" label and accesskey, disable the "add" button again
|
||||
gAvailableLanguages.setAttribute("label", gSelectLabel);
|
||||
gAvailableLanguages.setAttribute("accesskey", gSelectAccesskey);
|
||||
addButton.disabled = true;
|
||||
|
||||
// select the item we just added in the active_languages listbox
|
||||
var lastItem = gActiveLanguages.lastChild;
|
||||
gActiveLanguages.selectItem(lastItem);
|
||||
gActiveLanguages.ensureElementIsVisible(lastItem);
|
||||
|
||||
UpdateSavePrefString();
|
||||
}
|
||||
|
||||
|
||||
function RemoveActiveLanguage()
|
||||
{
|
||||
var nextNode = null;
|
||||
var numSelected = gActiveLanguages.selectedItems.length;
|
||||
var deleted_all = false;
|
||||
|
||||
while (gActiveLanguages.selectedItems.length > 0) {
|
||||
var selectedNode = gActiveLanguages.selectedItems[0];
|
||||
|
||||
nextNode = selectedNode.nextSibling;
|
||||
if (!nextNode && selectedNode.previousSibling)
|
||||
nextNode = selectedNode.previousSibling;
|
||||
|
||||
gActiveLanguages.removeChild(selectedNode);
|
||||
} //while
|
||||
|
||||
if (nextNode)
|
||||
gActiveLanguages.selectItem(nextNode)
|
||||
|
||||
UpdateSavePrefString();
|
||||
}
|
||||
|
||||
|
||||
function GetLanguageTitle(id)
|
||||
{
|
||||
|
||||
if (gAvailLanguageDict)
|
||||
for (var j = 0; j < gAvailLanguageDict.length; j++) {
|
||||
|
||||
if ( gAvailLanguageDict[j][1] == id) {
|
||||
//title =
|
||||
return gAvailLanguageDict[j][0];
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function AddMenuOrListItem(doc, listbox, type, langID, langTitle)
|
||||
{
|
||||
try { //let's beef up our error handling for languages without label / title
|
||||
|
||||
// Create a listitem for the new Language
|
||||
var item = doc.createElement(type);
|
||||
|
||||
// Copy over the attributes
|
||||
item.setAttribute("label", langTitle);
|
||||
item.setAttribute("id", langID);
|
||||
listbox.appendChild(item);
|
||||
|
||||
}
|
||||
catch (ex) { }
|
||||
}
|
||||
|
||||
|
||||
function UpdateSavePrefString()
|
||||
{
|
||||
var num_languages = 0;
|
||||
gPrefString = "";
|
||||
|
||||
for (var item = gActiveLanguages.firstChild; item != null; item = item.nextSibling) {
|
||||
|
||||
var languageId = item.getAttribute("id");
|
||||
|
||||
if (languageId.length > 1) {
|
||||
num_languages++;
|
||||
|
||||
//separate >1 languages by commas
|
||||
if (num_languages > 1) {
|
||||
gPrefString = gPrefString + "," + " " + languageId;
|
||||
} else {
|
||||
gPrefString = languageId;
|
||||
} //if
|
||||
} //if
|
||||
}//for
|
||||
|
||||
gActiveLanguages.setAttribute("prefvalue", gPrefString);
|
||||
}
|
||||
|
||||
|
||||
function MoveUp() {
|
||||
|
||||
if (gActiveLanguages.selectedItems.length == 1) {
|
||||
var selected = gActiveLanguages.selectedItems[0];
|
||||
var before = selected.previousSibling
|
||||
if (before) {
|
||||
before.parentNode.insertBefore(selected, before);
|
||||
gActiveLanguages.selectItem(selected);
|
||||
gActiveLanguages.ensureElementIsVisible(selected);
|
||||
}
|
||||
}
|
||||
|
||||
if (gActiveLanguages.selectedIndex == 0)
|
||||
{
|
||||
// selected item is first
|
||||
var moveUp = document.getElementById("up");
|
||||
moveUp.disabled = true;
|
||||
}
|
||||
|
||||
if (gActiveLanguages.childNodes.length > 1)
|
||||
{
|
||||
// more than one item so we can move selected item back down
|
||||
var moveDown = document.getElementById("down");
|
||||
moveDown.disabled = false;
|
||||
}
|
||||
|
||||
UpdateSavePrefString();
|
||||
} //MoveUp
|
||||
|
||||
|
||||
function MoveDown() {
|
||||
|
||||
if (gActiveLanguages.selectedItems.length == 1) {
|
||||
var selected = gActiveLanguages.selectedItems[0];
|
||||
if (selected.nextSibling) {
|
||||
if (selected.nextSibling.nextSibling) {
|
||||
gActiveLanguages.insertBefore(selected, selected.nextSibling.nextSibling);
|
||||
}
|
||||
else {
|
||||
gActiveLanguages.appendChild(selected);
|
||||
}
|
||||
gActiveLanguages.selectItem(selected);
|
||||
}
|
||||
}
|
||||
|
||||
if (gActiveLanguages.selectedIndex == gActiveLanguages.childNodes.length - 1)
|
||||
{
|
||||
// selected item is last
|
||||
var moveDown = document.getElementById("down");
|
||||
moveDown.disabled = true;
|
||||
}
|
||||
|
||||
if (gActiveLanguages.childNodes.length > 1)
|
||||
{
|
||||
// more than one item so we can move selected item back up
|
||||
var moveUp = document.getElementById("up");
|
||||
moveUp.disabled = false;
|
||||
}
|
||||
|
||||
UpdateSavePrefString();
|
||||
|
||||
} //MoveDown
|
||||
|
||||
|
||||
function SelectLanguage() {
|
||||
if (gActiveLanguages.selectedItems.length) {
|
||||
document.getElementById("remove").disabled = false;
|
||||
|
||||
var selected = gActiveLanguages.selectedItems[0];
|
||||
document.getElementById("down").disabled = !selected.nextSibling;
|
||||
document.getElementById("up").disabled = !selected.previousSibling;
|
||||
}
|
||||
else {
|
||||
document.getElementById("remove").disabled = true;
|
||||
document.getElementById("down").disabled = true;
|
||||
document.getElementById("up").disabled = true;
|
||||
}
|
||||
|
||||
if (gPrefWindow.getPrefIsLocked(document.getElementById("up").getAttribute("prefstring")))
|
||||
document.getElementById("up").disabled = true;
|
||||
if (gPrefWindow.getPrefIsLocked(document.getElementById("down").getAttribute("prefstring")))
|
||||
document.getElementById("down").disabled = true;
|
||||
if (gPrefWindow.getPrefIsLocked(document.getElementById("remove").getAttribute("prefstring")))
|
||||
document.getElementById("remove").disabled = true;
|
||||
if (gPrefWindow.getPrefIsLocked(gAvailableLanguages.getAttribute("prefstring")))
|
||||
gAvailableLanguages.disabled = true; // the "add" button just stays disabled
|
||||
} // SelectLanguage
|
|
@ -242,3 +242,8 @@ function checkNow()
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
function showLanguages()
|
||||
{
|
||||
openDialog("chrome://browser/content/pref/pref-languages.xul", "", "modal,centerscreen,resizable");
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@
|
|||
</groupbox>
|
||||
|
||||
<groupbox>
|
||||
<caption label="&fonts.label;"/>
|
||||
<caption label="&fonts.caption;"/>
|
||||
<hbox align="center">
|
||||
<description flex="1">&fontsInfo.label;</description>
|
||||
<button label="&showFontsAndColors.label;"
|
||||
|
@ -95,6 +95,16 @@
|
|||
</hbox>
|
||||
</groupbox>
|
||||
|
||||
<groupbox>
|
||||
<caption label="&languages.caption;"/>
|
||||
<hbox align="center">
|
||||
<description flex="1">&languagesInfo.label;</description>
|
||||
<button label="&showLanguages.label;"
|
||||
accesskey="&showLanguages.accesskey;"
|
||||
oncommand="showLanguages();"/>
|
||||
</hbox>
|
||||
</groupbox>
|
||||
|
||||
#ifdef HAVE_SHELL_SERVICE
|
||||
<groupbox orient="horizontal" id="defaultBrowserPrefs">
|
||||
<caption label="&defaultBrowserGroup.label;"/>
|
||||
|
|
|
@ -12,6 +12,8 @@ browser.jar:
|
|||
* content/browser/pref/pref-features.js (content/pref-features.js)
|
||||
* content/browser/pref/pref-fonts.xul (content/pref-fonts.xul)
|
||||
* content/browser/pref/pref-fonts.js (content/pref-fonts.js)
|
||||
* content/browser/pref/pref-languages.xul (content/pref-languages.xul)
|
||||
* content/browser/pref/pref-languages.js (content/pref-languages.js)
|
||||
* content/browser/pref/pref-navigator.js (content/pref-navigator.js)
|
||||
* content/browser/pref/pref-calibrate-screen.xul (content/pref-calibrate-screen.xul)
|
||||
* content/browser/pref/pref-navigator.xul (content/pref-navigator.xul)
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
<!ENTITY lHeader "General">
|
||||
|
||||
<!ENTITY header2.label "Home Page">
|
||||
<!ENTITY location.label "Location(s):">
|
||||
<!ENTITY location.accesskey "a">
|
||||
<!ENTITY useCurrent.label "Use Current Page">
|
||||
<!ENTITY useCurrent.accesskey "C">
|
||||
<!ENTITY useCurrentMultiple.label "Use Current Pages">
|
||||
<!ENTITY useBookmark.label "Use Bookmark...">
|
||||
<!ENTITY useBookmark.accesskey "U">
|
||||
<!ENTITY useBlank.label "Use Blank Page">
|
||||
<!ENTITY useBlank.accesskey "B">
|
||||
|
||||
<!ENTITY defaultBrowserGroup.label "Default Browser">
|
||||
<!ENTITY defaultBrowserButton.label "Set Default Browser">
|
||||
<!ENTITY makeDefaultText "Set &brandShortName; as your default browser.">
|
||||
|
||||
<!-- XXXben oh please, can we do better than this text-wise? -->
|
||||
<!ENTITY showConnections.label "Connection Settings...">
|
||||
<!ENTITY showConnections.accesskey "o">
|
||||
|
||||
<!ENTITY proxiesInfo.label "Set up Proxies for accessing the internet.">
|
||||
<!ENTITY connectionsInfo.caption "Connection">
|
||||
|
||||
<!-- XXXben can we do better than this text-wise? -->
|
||||
<!ENTITY fonts.label "Fonts & Colors">
|
||||
<!ENTITY fontsInfo.caption "Fonts & Colors Settings">
|
||||
<!ENTITY fontsInfo.label "Select default Fonts and Colors used when displaying pages.">
|
||||
|
||||
<!ENTITY showFontsAndColors.label "Fonts & Colors...">
|
||||
<!ENTITY showFontsAndColors.accesskey "f">
|
||||
|
||||
|
||||
<!ENTITY checkForDefault.label "&brandShortName; should check to see if it is the default browser when starting.">
|
||||
<!ENTITY checkForDefault.accesskey "d">
|
||||
<!ENTITY checkNow.label "Check Now">
|
||||
<!ENTITY checkNow.accesskey "N">
|
||||
|
|
@ -38,6 +38,8 @@
|
|||
locale/browser/pref/pref-features.dtd (@AB_CD@/chrome/browser/pref/pref-features.dtd)
|
||||
locale/browser/pref/pref-features-images.dtd (@AB_CD@/chrome/browser/pref/pref-features-images.dtd)
|
||||
locale/browser/pref/pref-fonts.dtd (@AB_CD@/chrome/browser/pref/pref-fonts.dtd)
|
||||
locale/browser/pref/pref-languages.dtd (@AB_CD@/chrome/browser/pref/pref-languages.dtd)
|
||||
locale/browser/pref/pref-languages.properties (@AB_CD@/chrome/browser/pref/pref-languages.properties)
|
||||
locale/browser/pref/pref-navigator.dtd (@AB_CD@/chrome/browser/pref/pref-navigator.dtd)
|
||||
locale/browser/pref/pref-privacy.dtd (@AB_CD@/chrome/browser/pref/pref-privacy.dtd)
|
||||
locale/browser/pref/pref-themes.dtd (@AB_CD@/chrome/browser/pref/pref-themes.dtd)
|
||||
|
|
Загрузка…
Ссылка в новой задаче