[Pkg-mozext-commits] [tabmixplus] 01/05: Imported Upstream version 0.4.1.7~150112a1
David Prévot
taffit at moszumanska.debian.org
Thu Jan 15 01:10:29 UTC 2015
This is an automated email from the git hooks/post-receive script.
taffit pushed a commit to branch master
in repository tabmixplus.
commit 74dd2e617fef899259f9741bc975694de2ebebe0
Author: David Prévot <david at tilapin.org>
Date: Wed Jan 14 20:48:29 2015 -0400
Imported Upstream version 0.4.1.7~150112a1
---
chrome.manifest | 6 +
chrome/content/changecode.js | 2 +-
chrome/content/click/click.js | 11 +-
chrome/content/extensions/extensions.js | 2 +-
chrome/content/links/removeBlankTab.js | 7 +-
chrome/content/links/setup.js | 4 +-
chrome/content/links/userInterface.js | 3 +-
chrome/content/minit/minit.js | 38 +-
chrome/content/minit/tablib.js | 65 ++-
chrome/content/overlay/browsr.css | 4 +
chrome/content/places/places.js | 5 +-
chrome/content/preferences/appearance.js | 2 +
chrome/content/preferences/appearance.xul | 2 +-
chrome/content/preferences/menu.xul | 1 +
chrome/content/preferences/shortcuts.xul | 29 -
chrome/content/preferences/shortcutsLabels.xml | 38 ++
.../preferences/subdialogs/pref-filetype.js | 2 +-
chrome/content/session/session.js | 11 +-
chrome/content/tab/scrollbox.xml | 87 +--
chrome/content/tab/tab.js | 650 +++++++++++++++++++--
chrome/content/tab/tabbrowser_4.xml | 464 +--------------
chrome/content/tabmix.js | 60 +-
chrome/content/utils.js | 2 +-
chrome/locale/ar/misc.dtd | 17 +
chrome/locale/ar/pref-appearance.dtd | 18 +
chrome/locale/ar/pref-filetype.dtd | 5 +
chrome/locale/{en-US => ar}/pref-tabmix.dtd | 618 ++++++++++----------
chrome/locale/ar/session-manager.properties | 107 ++++
chrome/locale/ar/tabmix.dtd | 131 +++++
chrome/locale/ar/tabmix.properties | 40 ++
chrome/locale/en-US/pref-tabmix.dtd | 4 +-
chrome/locale/eu/misc.dtd | 17 +
chrome/locale/eu/pref-appearance.dtd | 18 +
chrome/locale/eu/pref-filetype.dtd | 5 +
chrome/locale/{en-US => eu}/pref-tabmix.dtd | 618 ++++++++++----------
chrome/locale/eu/session-manager.properties | 107 ++++
chrome/locale/eu/tabmix.dtd | 131 +++++
chrome/locale/eu/tabmix.properties | 40 ++
chrome/locale/fi/misc.dtd | 17 +
chrome/locale/fi/pref-appearance.dtd | 18 +
chrome/locale/fi/pref-filetype.dtd | 5 +
chrome/locale/{en-US => fi}/pref-tabmix.dtd | 114 ++--
chrome/locale/fi/session-manager.properties | 107 ++++
chrome/locale/fi/tabmix.dtd | 131 +++++
chrome/locale/fi/tabmix.properties | 40 ++
chrome/locale/lv-LV/misc.dtd | 17 +
chrome/locale/lv-LV/pref-appearance.dtd | 18 +
chrome/locale/lv-LV/pref-filetype.dtd | 5 +
chrome/locale/lv-LV/pref-tabmix.dtd | 308 ++++++++++
chrome/locale/lv-LV/session-manager.properties | 107 ++++
chrome/locale/lv-LV/tabmix.dtd | 131 +++++
chrome/locale/lv-LV/tabmix.properties | 40 ++
install.rdf | 28 +-
modules/AutoReload.jsm | 6 +-
modules/ContentClick.jsm | 5 +-
modules/ContextMenu.jsm | 2 +-
modules/DynamicRules.jsm | 12 +-
modules/RenameTab.jsm | 2 +-
modules/Shortcuts.jsm | 26 +-
modules/extensions/TabGroupsManager.jsm | 11 +-
modules/log.jsm | 2 +-
test.manifest | 0
62 files changed, 3097 insertions(+), 1426 deletions(-)
diff --git a/chrome.manifest b/chrome.manifest
index 7c09839..32fba82 100644
--- a/chrome.manifest
+++ b/chrome.manifest
@@ -1,6 +1,7 @@
content tabmixplus chrome/content/
resource tabmixplus modules/
+locale tabmixplus ar chrome/locale/ar/
locale tabmixplus bg chrome/locale/bg-BG/
locale tabmixplus ca chrome/locale/ca/
locale tabmixplus cs chrome/locale/cs-CZ/
@@ -10,7 +11,9 @@ locale tabmixplus el chrome/locale/el/
locale tabmixplus en-US chrome/locale/en-US/
locale tabmixplus es-ES chrome/locale/es-ES/
locale tabmixplus et chrome/locale/et-EE/
+locale tabmixplus eu chrome/locale/eu/
locale tabmixplus fa chrome/locale/fa-IR/
+locale tabmixplus fi chrome/locale/fi/
locale tabmixplus fr chrome/locale/fr/
locale tabmixplus he chrome/locale/he-IL/
locale tabmixplus hr chrome/locale/hr-HR/
@@ -18,6 +21,7 @@ locale tabmixplus hu chrome/locale/hu-HU/
locale tabmixplus it chrome/locale/it/
locale tabmixplus ja chrome/locale/ja/
locale tabmixplus ko chrome/locale/ko-KR/
+locale tabmixplus lv chrome/locale/lv-LV/
locale tabmixplus nl chrome/locale/nl/
locale tabmixplus pl chrome/locale/pl/
locale tabmixplus pt-BR chrome/locale/pt-BR/
@@ -81,3 +85,5 @@ skin tabmix-os classic/1.0 chrome/skin/app_version/4.0/linux/ os=Linux
style chrome://global/content/customizeToolbar.xul chrome://tabmixplus/skin/tab.css
style chrome://browser/content/preferences/preferences.xul chrome://tabmixplus/skin/preferencesOverlay.css
+
+manifest test.manifest
diff --git a/chrome/content/changecode.js b/chrome/content/changecode.js
index 6960549..0313b59 100644
--- a/chrome/content/changecode.js
+++ b/chrome/content/changecode.js
@@ -121,7 +121,7 @@ Tabmix.changeCode = function(aParent, aName, aOptions) {
show: function(aObj, aName) {
if (aObj && aName in aObj)
console.show({obj: aObj, name: aName, fullName: this.fullName});
- else if (this.fullName != null) {
+ else if (typeof this.fullName == "string") {
let win = typeof window != "undefined" ? window : undefined;
console.show(this.fullName, 500, win);
}
diff --git a/chrome/content/click/click.js b/chrome/content/click/click.js
index da81ec8..009a149 100644
--- a/chrome/content/click/click.js
+++ b/chrome/content/click/click.js
@@ -269,7 +269,7 @@ var TabmixTabClickOptions = {
}
break;
case 30: // enable/disable AutoReload
- if (aTab.autoReloadEnabled === null)
+ if (aTab.autoReloadEnabled === undefined)
Tabmix.autoReload.initTab(aTab);
Tabmix.autoReload.toggle(aTab);
break;
@@ -279,6 +279,9 @@ var TabmixTabClickOptions = {
else
gBrowser.pinTab(aTab);
break;
+ case 32:
+ gBrowser.previousTab(gBrowser.selectedTab);
+ break;
default:
return false;
}
@@ -511,7 +514,7 @@ var TabmixContext = {
var lockedTab = aTab.hasAttribute("locked");
var tabsCount = gBrowser.visibleTabs.length;
var unpinnedTabs = tabsCount - TabmixTabbar._real_numPinnedTabs;
- var cIndex = TMP_TabView.getIndexInVisibleTabsFromTab(aTab);
+ var cIndex = Tabmix.visibleTabs.indexOf(aTab);
if (Tabmix.rtl)
cIndex = tabsCount - 1 - cIndex;
@@ -782,7 +785,7 @@ var TabmixAllTabs = {
let curTabBO = curTab.boxObject;
if (!curTabBO) // "Tabs From Other Computers" menuitem
continue;
- if (tabContainer.mTabstrip.isElementVisible(curTab))
+ if (Tabmix.tabsUtils.isElementVisible(curTab))
this.childNodes[i].setAttribute("tabIsVisible", "true");
else
this.childNodes[i].removeAttribute("tabIsVisible");
@@ -936,7 +939,7 @@ var TabmixAllTabs = {
let addToMenu = side != "right";
for (let t = 0; t < tabs.length; t++) {
let tab = tabs[t];
- let visible = side && gBrowser.tabContainer.mTabstrip.isElementVisible(tab);
+ let visible = side && Tabmix.tabsUtils.isElementVisible(tab);
if (visible) {
if (tab.pinned)
continue;
diff --git a/chrome/content/extensions/extensions.js b/chrome/content/extensions/extensions.js
index b4695ae..e5f5af0 100644
--- a/chrome/content/extensions/extensions.js
+++ b/chrome/content/extensions/extensions.js
@@ -670,7 +670,7 @@ TMP_extensionsCompatibility.treeStyleTab = {
* other places windows
*/
Tabmix.changeCode(TMP_Places, "TMP_Places.openGroup")._replace(
- 'var tabBar = gBrowser.tabContainer;',
+ 'var tabs = gBrowser.visibleTabs;',
'let TSTOpenGroupBookmarkBehavior = arguments.length > 3 && arguments[3] ||\n' +
' TreeStyleTabService.openGroupBookmarkBehavior();\n' +
' $&'
diff --git a/chrome/content/links/removeBlankTab.js b/chrome/content/links/removeBlankTab.js
index 0b4dd94..9240ff3 100644
--- a/chrome/content/links/removeBlankTab.js
+++ b/chrome/content/links/removeBlankTab.js
@@ -56,7 +56,12 @@ let TabmixRemoveBlankTab = {
if (aContext) {
let nav = aContext.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation);
- let doc = nav.document;
+ let doc;
+ try {
+ doc = nav.document;
+ } catch(ex) {
+ return result;
+ }
result.win = nav.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
diff --git a/chrome/content/links/setup.js b/chrome/content/links/setup.js
index a6f5540..c8ae1c1 100644
--- a/chrome/content/links/setup.js
+++ b/chrome/content/links/setup.js
@@ -339,7 +339,7 @@ Tabmix.adjustTabstrip = function tabContainer_adjustTabstrip(skipUpdateScrollSta
var tabbrowser = this.tabbrowser;
var tabs = tabbrowser.visibleTabs;
var tabsCount = tabs.length - tabbrowser._removingTabs.length;
- switch (this.closeButtonsEnabled ? this.mCloseButtons : 0) {
+ switch (Tabmix.tabsUtils.closeButtonsEnabled ? this.mCloseButtons : 0) {
case 0:
this.removeAttribute("closebuttons-hover");
this.setAttribute("closebuttons", "noclose");
@@ -385,7 +385,7 @@ Tabmix.adjustTabstrip = function tabContainer_adjustTabstrip(skipUpdateScrollSta
let currentURI = tabbrowser.currentURI;
aUrl = currentURI ? currentURI.spec : null;
}
- if (this._keepLastTab ||
+ if (Tabmix.tabsUtils._keepLastTab ||
isBlankPageURL(tab.__newLastTab || null) ||
(!aUrl || isBlankPageURL(aUrl)) &&
tabbrowser.isBlankNotBusyTab(tab)) {
diff --git a/chrome/content/links/userInterface.js b/chrome/content/links/userInterface.js
index cbf7f55..288583b 100644
--- a/chrome/content/links/userInterface.js
+++ b/chrome/content/links/userInterface.js
@@ -52,7 +52,8 @@ Tabmix.openURL = function TMP_openURL(aURL, event) {
linkTarget = 1;
}
- if (aURL === null) aURL = "about:blank";
+ if (!aURL)
+ aURL = "about:blank";
// check for an existing window and focus it; it's not application modal
var browserWindow = this.getTopWin();
diff --git a/chrome/content/minit/minit.js b/chrome/content/minit/minit.js
index 4ef425c..d4fb9e8 100644
--- a/chrome/content/minit/minit.js
+++ b/chrome/content/minit/minit.js
@@ -244,12 +244,12 @@ var TMP_tabDNDObserver = {
let tooltip = document.getElementById("tabmix-tooltip");
if (tooltip.state == "closed") {
tooltip.label = this.gMsg;
- tooltip.openPopup(document.getElementById("browser"), null, -1, -1, false, false);
+ tooltip.openPopup(document.getElementById("browser"), null, 1, 1, false, false);
}
}
}
- if (tabBar.overflow) {
+ if (Tabmix.tabsUtils.overflow) {
let tabStrip = tabBar.mTabstrip;
let ltr = Tabmix.ltr || tabStrip.orient == "vertical";
let _scroll, targetAnonid;
@@ -263,12 +263,12 @@ var TMP_tabDNDObserver = {
switch (targetAnonid) {
case "scrollbutton-up":
case "scrollbutton-up-right":
- if (tabBar.canScrollTabsLeft)
+ if (Tabmix.tabsUtils.canScrollTabsLeft)
_scroll = -1;
break;
case "scrollbutton-down":
case "scrollbutton-down-right":
- if (tabBar.canScrollTabsRight)
+ if (Tabmix.tabsUtils.canScrollTabsRight)
_scroll = 1;
break;
}
@@ -558,7 +558,7 @@ var TMP_tabDNDObserver = {
},
getNewIndex: function (event) {
- function getTabRowNumber(tab, top) tab.pinned ? 1 : gBrowser.tabContainer.getTabRowNumber(tab, top)
+ function getTabRowNumber(tab, top) tab.pinned ? 1 : Tabmix.tabsUtils.getTabRowNumber(tab, top)
// if mX is less then the first tab return 0
// check if mY is below the tab.... if yes go to next row
// in the row find the closest tab by mX,
@@ -569,7 +569,7 @@ var TMP_tabDNDObserver = {
var numTabs = tabs.length;
if (!tabBar.hasAttribute("multibar")) {
let i = event.target.localName == "tab" ?
- TMP_TabView.getIndexInVisibleTabsFromTab(event.target) : 0;
+ Tabmix.visibleTabs.indexOf(event.target) : 0;
for (; i < numTabs; i++) {
let tab = tabs[i];
if (Tabmix.compare(mX, Tabmix.itemEnd(tab, Tabmix.ltr), Tabmix.ltr))
@@ -577,7 +577,7 @@ var TMP_tabDNDObserver = {
}
}
else {
- let topY = tabBar.topTabY;
+ let topY = Tabmix.tabsUtils.topTabY;
for (let i = 0; i < numTabs; i++) {
let tab = tabs[i];
let thisRow = getTabRowNumber(tab, topY);
@@ -919,22 +919,6 @@ var TMP_TabView = { /* jshint ignore: line */
return firstTab;
},
- previousVisibleSibling: function (aTab) {
- var tabs = gBrowser.visibleTabs;
- var index = tabs.indexOf(aTab);
- if (--index > -1)
- return tabs[index];
- return null;
- },
-
- nextVisibleSibling: function (aTab) {
- var tabs = gBrowser.visibleTabs;
- var index = tabs.indexOf(aTab);
- if (index > -1 && ++index < tabs.length)
- return tabs[index];
- return null;
- },
-
// includung _removingTabs
currentGroup: function () {
return Array.filter(gBrowser.tabs, function(tab) !tab.hidden);
@@ -953,10 +937,6 @@ var TMP_TabView = { /* jshint ignore: line */
if (aTab)
return gBrowser.visibleTabs.indexOf(aTab);
return -1;
- },
-
- getIndexInVisibleTabsFrom_tPos: function (aIndex) {
- return this.getIndexInVisibleTabsFromTab(gBrowser.tabs.item(aIndex));
}
};
@@ -1325,7 +1305,7 @@ Tabmix.navToolbox = {
next.parentNode.insertBefore(box, next);
if (!onlyPosition) {
let useTabmixButtons = TabmixTabbar.scrollButtonsMode > TabmixTabbar.SCROLL_BUTTONS_LEFT_RIGHT;
- gBrowser.tabContainer.mTabstrip.updateScrollButtons(useTabmixButtons);
+ Tabmix.tabsUtils.updateScrollButtons(useTabmixButtons);
}
return;
}
@@ -1334,7 +1314,7 @@ Tabmix.navToolbox = {
if (!onlyPosition) {
let useTabmixButtons = TabmixTabbar.scrollButtonsMode > TabmixTabbar.SCROLL_BUTTONS_LEFT_RIGHT;
- gBrowser.tabContainer.mTabstrip.updateScrollButtons(useTabmixButtons);
+ Tabmix.tabsUtils.updateScrollButtons(useTabmixButtons);
}
},
diff --git a/chrome/content/minit/tablib.js b/chrome/content/minit/tablib.js
index 678dffc..7d36930 100644
--- a/chrome/content/minit/tablib.js
+++ b/chrome/content/minit/tablib.js
@@ -52,7 +52,8 @@ var tablib = {
},
_loadURIWithFlags: function(browser, uri, flags, referrer, charset, postdata) {
- var allowLoad = browser.tabmix_allowLoad !== false || uri.match(/^javascript:/);
+ var allowLoad = tablib.isException(browser.tabmix_allowLoad !== false ||
+ uri.match(/^javascript:/));
if (!allowLoad) {
try {
let newURI = Services.io.newURI(uri, null, null);
@@ -83,6 +84,33 @@ var tablib = {
return null;
},
+ /**
+ * check if we need to override our preference and force to load the url in
+ * the current tab
+ *
+ * current code only check if the caller is in the exception list
+ */
+ isException: function(loadInCurrent) {
+ if (loadInCurrent)
+ return loadInCurrent;
+
+ let exceptionList = {
+ // secureLogin extension expect to execute the login in the current page
+ // https://addons.mozilla.org/en-us/firefox/addon/secure-login/?src=ss
+ secureLogin: "secureLogin.login"
+ };
+ let keys = Object.keys(exceptionList);
+ let isInstalled = keys.some(function(item) {
+ return typeof window[item] == "object";
+ });
+ if (!isInstalled)
+ return loadInCurrent;
+
+ let stack = Error().stack || Components.stack.caller.formattedStack || "";
+ var re = keys.map(function(key) exceptionList[key]);
+ return new RegExp(re.join("|")).test(stack);
+ },
+
change_gBrowser: function change_gBrowser() {
var obj, fnName;
if (typeof Fd == "object" && typeof Fd.addTab == "function")
@@ -308,7 +336,8 @@ var tablib = {
if (!Tabmix.extensions.verticalTabs) {
Tabmix.changeCode(tabBar, "gBrowser.tabContainer._positionPinnedTabs")._replace(
'this.removeAttribute("positionpinnedtabs");',
- 'this.mTabstrip.resetFirstTabInRow();\
+ 'if (typeof this.mTabstrip.resetFirstTabInRow == "function")\
+ this.mTabstrip.resetFirstTabInRow();\
$&'
)._replace(
/this.mTabstrip._scrollButtonDown.(scrollWidth|getBoundingClientRect\(\).width)/,
@@ -366,15 +395,7 @@ var tablib = {
).toCode();
}
- tabBar.TMP_inSingleRow = function Tabmix_inSingleRow(visibleTabs) {
- if (!this.hasAttribute("multibar"))
- return true;
- // we get here when we are about to go to single row
- // one tab before the last is in the first row and we are closing one tab
- var tabs = visibleTabs || this.tabbrowser.visibleTabs;
- return this.getTabRowNumber(tabs[tabs.length-2], this.topTabY) == 1;
- };
-
+ if (!Tabmix.extensions.verticalTabs) {
Tabmix.changeCode(tabBar, "gBrowser.tabContainer._lockTabSizing")._replace(
'{',
'{if (this.orient != "horizontal" || !Tabmix.prefs.getBoolPref("lockTabSizingOnClose")) return;'
@@ -398,7 +419,7 @@ var tablib = {
' }' +
' return;' +
' }' +
- ' if (!this.TMP_inSingleRow(tabs))' +
+ ' if (!Tabmix.tabsUtils.isSingleRow(tabs))' +
' return;' +
' this._tabDefaultMaxWidth = this.mTabMaxWidth;' +
' $&'
@@ -408,7 +429,7 @@ var tablib = {
if (typeof tabBar._expandSpacerBy == "function")
Tabmix.changeCode(tabBar, "gBrowser.tabContainer._expandSpacerBy")._replace(
'{',
- '{if (TabmixTabbar.widthFitTitle || !this.TMP_inSingleRow()) return;'
+ '{if (TabmixTabbar.widthFitTitle || !Tabmix.tabsUtils.isSingleRow()) return;'
).toCode();
Tabmix.changeCode(tabBar, "gBrowser.tabContainer._unlockTabSizing")._replace(
@@ -429,6 +450,7 @@ var tablib = {
' }' +
' $1$2'
).toCode();
+ }
// when selecting different tab fast with the mouse sometimes original onxblmousedown can call this function
// before our mousedown handler can prevent it
@@ -1009,7 +1031,7 @@ var tablib = {
gBrowser.closeAllTabs = function TMP_closeAllTabs() {
if (this.warnAboutClosingTabs(this.closingTabsEnum.ALL)) {
if (TabmixTabbar.visibleRows > 1)
- this.tabContainer.updateVerticalTabStrip(true);
+ Tabmix.tabsUtils.updateVerticalTabStrip(true);
let tabs = this.visibleTabs.slice();
// remove current tab last
if (!this.mCurrentTab.pinned)
@@ -1112,7 +1134,7 @@ var tablib = {
this.ensureTabIsVisible(this.selectedTab);
var childNodes = this.visibleTabs;
if (TabmixTabbar.visibleRows > 1)
- this.tabContainer.updateVerticalTabStrip(true);
+ Tabmix.tabsUtils.updateVerticalTabStrip(true);
Tabmix.startCountingClosedTabs();
for (var i = childNodes.length - 1; i >= 0; --i) {
if (childNodes[i] != aTab && !childNodes[i].pinned)
@@ -1281,8 +1303,8 @@ var tablib = {
// if no tabmix_selectedID go to previous tab, from first tab go to the next tab
if (tempIndex == -1)
- this.selectedTab = aTab == tabs[0] ? TMP_TabView.nextVisibleSibling(aTab) :
- TMP_TabView.previousVisibleSibling(aTab);
+ this.selectedTab = aTab == tabs[0] ? Tabmix.visibleTabs.next(aTab) :
+ Tabmix.visibleTabs.previous(aTab);
else
this.selectedTab = tabs[tempIndex];
@@ -1533,11 +1555,11 @@ var tablib = {
Tabmix.setNewFunction(gBrowser, "warnAboutClosingTabs", warnAboutClosingTabs);
gBrowser.TMP_selectNewForegroundTab = function (aTab, aLoadInBackground, aUrl, addOwner) {
- var bgLoad = (aLoadInBackground !== null) ? aLoadInBackground :
+ var bgLoad = typeof aLoadInBackground == "boolean" ? aLoadInBackground :
Services.prefs.getBoolPref("browser.tabs.loadInBackground");
if (!bgLoad) {
// set new tab owner
- addOwner = addOwner !== null ? addOwner : true;
+ addOwner = typeof addOwner == "boolean" ? addOwner : true;
if (addOwner)
aTab.owner = this.selectedTab;
this.selectedTab = aTab;
@@ -1580,7 +1602,7 @@ var tablib = {
// Bug 752376 - Avoid calling scrollbox.ensureElementIsVisible()
// if the tab strip doesn't overflow to prevent layout flushes
gBrowser.ensureTabIsVisible = function tabmix_ensureTabIsVisible(aTab, aSmoothScroll) {
- if (this.tabContainer.overflow)
+ if (Tabmix.tabsUtils.overflow)
this.tabContainer.mTabstrip.ensureElementIsVisible(aTab, aSmoothScroll);
};
@@ -1644,9 +1666,8 @@ var tablib = {
// return the current tab only if it is visible
if (TabmixTabbar.widthFitTitle &&
(!TMP_Places.inUpdateBatch || !TMP_Places.currentTab)) {
- let tabBar = gBrowser.tabContainer;
let tab = gBrowser.selectedTab;
- if (tabBar.mTabstrip.isElementVisible(tab))
+ if (Tabmix.tabsUtils.isElementVisible(tab))
TMP_Places.currentTab = tab;
}
return TMP_Places.getTabTitle(aTab, url, title);
diff --git a/chrome/content/overlay/browsr.css b/chrome/content/overlay/browsr.css
index a16d342..aa9098b 100644
--- a/chrome/content/overlay/browsr.css
+++ b/chrome/content/overlay/browsr.css
@@ -6,6 +6,10 @@
*
**/
+vbox[shortcutsLabels="true"] {
+ -moz-binding: url(chrome://tabmixplus/content/preferences/shortcutsLabels.xml#shortcut-labels) !important;
+}
+
/* for Firefox 11.0-19.0, not in use for Firefox 20.0+ */
label.text-link, label[onclick] {
-moz-binding: url(chrome://tabmixplus/content/tab/text.xml#tmp-text-link);
diff --git a/chrome/content/places/places.js b/chrome/content/places/places.js
index 8a36630..f0ae7cb 100644
--- a/chrome/content/places/places.js
+++ b/chrome/content/places/places.js
@@ -246,7 +246,6 @@ var TMP_Places = {
//
//TODO - try to use sessionStore to add many tabs
openGroup: function TMP_PC_openGroup(bmGroup, bmIds, aWhere) {
- var tabBar = gBrowser.tabContainer;
var tabs = gBrowser.visibleTabs;
var doReplace = (/^tab/).test(aWhere) ? false :
@@ -277,7 +276,7 @@ var TMP_Places = {
var tabToSelect = null;
var prevTab = (!doReplace && openTabNext && gBrowser.mCurrentTab._tPos < tabs.length - 1) ?
- gBrowser.mCurrentTab : tabBar.visibleTabsLastChild;
+ gBrowser.mCurrentTab : Tabmix.visibleTabs.last;
var tabPos, index;
var multiple = bmGroup.length > 1;
for (i = 0; i < bmGroup.length ; i++) {
@@ -601,7 +600,7 @@ var TMP_Places = {
this.inUpdateBatch = true;
if (TabmixTabbar.widthFitTitle &&
- gBrowser.tabContainer.mTabstrip.isElementVisible(gBrowser.mCurrentTab))
+ Tabmix.tabsUtils.isElementVisible(gBrowser.mCurrentTab))
this.currentTab = gBrowser.mCurrentTab;
},
diff --git a/chrome/content/preferences/appearance.js b/chrome/content/preferences/appearance.js
index 2697f53..46aec74 100644
--- a/chrome/content/preferences/appearance.js
+++ b/chrome/content/preferences/appearance.js
@@ -9,6 +9,8 @@ var gAppearancePane = { // jshint ignore:line
Tabmix.setItem("tabBarDisplay", "TSTinstalled", true);
Tabmix.setItem("tabBarPosition", "disabled", true);
Tabmix.setItem("tabsScroll", "disabled", true);
+ Tabmix.setItem("maxrow", "disabled", true);
+ Tabmix.setItem("offsetAmountToScroll", "disabled", true);
Tabmix.setItem("scrollDelay", "disabled", true);
Tabmix.setItem("smoothScroll", "disabled", true);
}
diff --git a/chrome/content/preferences/appearance.xul b/chrome/content/preferences/appearance.xul
index e695434..4aeed8c 100644
--- a/chrome/content/preferences/appearance.xul
+++ b/chrome/content/preferences/appearance.xul
@@ -147,7 +147,7 @@
</hbox>
</box>
<hbox align="center" id="maxbar">
- <label value="&maxrow.label;"/>
+ <label value="&maxrow.label;" TSTdisabled="true"/>
<textbox id="maxrow" size="2" maxlength="2" preference="pref_maxrow" type="number" min="2"/>
</hbox>
<checkbox_tmp id="offsetAmountToScroll" label="&offsetAmountToScroll.label;"
diff --git a/chrome/content/preferences/menu.xul b/chrome/content/preferences/menu.xul
index c0d31fc..9c122e1 100644
--- a/chrome/content/preferences/menu.xul
+++ b/chrome/content/preferences/menu.xul
@@ -317,6 +317,7 @@
<shortcut id="ucatab" label="&clicktab.ucatab;"/>
<shortcut id="saveWindow" label="&saveWindow.label;"/>
<shortcut id="saveSession" label="&saveAllWindows.label;"/>
+ <shortcut id="switchToLast" label="Switch to last active tab"/>
<shortcut id="toggleFLST" label="&shortcuts.toggleFLST;"
tooltiptext="&shortcuts.toggleFLST.tooltip;"/>
<shortcut id="slideShow" label="&shortcuts.slideshow;"
diff --git a/chrome/content/preferences/shortcuts.xul b/chrome/content/preferences/shortcuts.xul
index 31fe991..5ca11de 100644
--- a/chrome/content/preferences/shortcuts.xul
+++ b/chrome/content/preferences/shortcuts.xul
@@ -1,8 +1,6 @@
<?xml version="1.0"?>
<!DOCTYPE overlay [
-<!ENTITY % pref-tabmixDTD SYSTEM "chrome://tabmixplus/locale/pref-tabmix.dtd">
-%pref-tabmixDTD;
<!ENTITY % tabmixDTD SYSTEM "chrome://tabmixplus/locale/tabmix.dtd">
%tabmixDTD;
<!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd">
@@ -26,31 +24,4 @@
<key id="key_tm_toggleFLST" label="&shortcuts.toggleFLST;" keycode="VK_F9" oncommand="Tabmix.flst.toggle();" disabled="true"/>
</keyset>
- <script type="application/javascript">
- // we only need to get the labels one time
- if (!Tabmix.ShortcutsInitialized) {
- let sc = Tabmix.shortcutsLabels = {};
- sc.dupTabToWin = "&clicktab.duplicatetabw;";
- sc.protecttab = "&clicktab.protecttab;";
- sc.locktab = "&clicktab.locktab;";
- sc.freezetab = "&clicktab.freezetab;";
- sc.renametab = "&clicktab.renametab;";
- sc.copyTabUrl = "&clicktab.copyTabUrl;";
- sc.pasteTabUrl = "&clicktab.copyUrlFromClipboard;";
- sc.selectMerge = "&clicktab.selectMerge;";
- sc.reload = "&clicktab.reloadtab;";
- sc.reloadtabs = "&clicktab.reloadtabs;";
- sc.reloadothertabs = "&clicktab.reloadothertabs;";
- sc.reloadlefttabs = "&clicktab.reloadlefttabs;";
- sc.reloadrighttabs = "&clicktab.reloadrighttabs;";
- sc.autoReloadTab = "&clicktab.autoReloadTab;";
- sc.removeall = "&clicktab.removeall;";
- sc.removesimilar = "&clicktab.removesimilar;";
- sc.removeother = "&clicktab.removeother;";
- sc.removeleft = "&clicktab.removetoLeft;";
- sc.removeright = "&clicktab.removetoRight;";
- sc.undoClose = "&clicktab.uctab;";
- sc.ucatab = "&clicktab.ucatab;";
- }
- </script>
</overlay>
diff --git a/chrome/content/preferences/shortcutsLabels.xml b/chrome/content/preferences/shortcutsLabels.xml
new file mode 100644
index 0000000..645d83f
--- /dev/null
+++ b/chrome/content/preferences/shortcutsLabels.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+
+<!DOCTYPE bindings [
+<!ENTITY % pref-tabmixDTD SYSTEM "chrome://tabmixplus/locale/pref-tabmix.dtd">
+%pref-tabmixDTD;
+]>
+
+<bindings id="tmp_shortcuts_labels"
+ xmlns="http://www.mozilla.org/xbl"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:xbl="http://www.mozilla.org/xbl">
+
+ <binding id="shortcut-labels" display="xul:vbox">
+ <content hidden="true"
+ dupTabToWin="&clicktab.duplicatetabw;"
+ protecttab="&clicktab.protecttab;"
+ locktab="&clicktab.locktab;"
+ freezetab="&clicktab.freezetab;"
+ renametab="&clicktab.renametab;"
+ copyTabUrl="&clicktab.copyTabUrl;"
+ pasteTabUrl="&clicktab.copyUrlFromClipboard;"
+ selectMerge="&clicktab.selectMerge;"
+ reload="&clicktab.reloadtab;"
+ reloadtabs="&clicktab.reloadtabs;"
+ reloadothertabs="&clicktab.reloadothertabs;"
+ reloadlefttabs="&clicktab.reloadlefttabs;"
+ reloadrighttabs="&clicktab.reloadrighttabs;"
+ autoReloadTab="&clicktab.autoReloadTab;"
+ removeall="&clicktab.removeall;"
+ removesimilar="&clicktab.removesimilar;"
+ removeother="&clicktab.removeother;"
+ removeleft="&clicktab.removetoLeft;"
+ removeright="&clicktab.removetoRight;"
+ undoClose="&clicktab.uctab;">
+ </content>
+ </binding>
+
+</bindings>
diff --git a/chrome/content/preferences/subdialogs/pref-filetype.js b/chrome/content/preferences/subdialogs/pref-filetype.js
index a8771b2..eefde66 100644
--- a/chrome/content/preferences/subdialogs/pref-filetype.js
+++ b/chrome/content/preferences/subdialogs/pref-filetype.js
@@ -77,7 +77,7 @@ function Add()
// check for data in the textbox
if (!entry.value) return false;
- var item = list.appendItem(entry.value, entry.value.toLowerCase());
+ list.appendItem(entry.value, entry.value.toLowerCase());
SelectItemAt(list.getRowCount()-1, true);
setButtonDisable(del, false);
diff --git a/chrome/content/session/session.js b/chrome/content/session/session.js
index 43c75aa..74e0626 100644
--- a/chrome/content/session/session.js
+++ b/chrome/content/session/session.js
@@ -474,7 +474,7 @@ var TabmixSessionManager = { // jshint ignore:line
return resultData;
// we set aPopUp only in canQuitApplication
- if (aPopUp == null)
+ if (aPopUp === undefined)
aPopUp = !window.toolbar.visible;
this.lastSaveTabsCount = this.saveOnWindowClose();
@@ -1755,7 +1755,8 @@ if (container == "error") { Tabmix.log("wrapContainer error path " + path + "\n"
// xxx need to check if we need all this functions
removeSession: function SM_removeSession(value, container) {
- if (value==null) return;
+ if (!value)
+ return;
var node = this.RDFService.GetResource(value);
var rdfNodeWindows = this.RDFService.GetResource(container);
var windowsContainer = this.initContainer(rdfNodeWindows);
@@ -2255,7 +2256,7 @@ if (container == "error") { Tabmix.log("wrapContainer error path " + path + "\n"
// get saved session list, we only need to get session path
var sessionList = this.getSessionList("onlyPath");
var askifempty = restoreFlag > 1 ? false : this.prefBranch.getBoolPref("onStart.askifempty");
- if (sessionList == null) {
+ if (sessionList === null) {
if (((askifempty && afterCrash) || restoreFlag == 1) && !this.corruptedFile) {
msg = TabmixSvc.getSMString("sm.start.msg0") + "\n" +
TabmixSvc.getSMString("sm.afterCrash.msg10");
@@ -2289,7 +2290,7 @@ if (container == "error") { Tabmix.log("wrapContainer error path " + path + "\n"
}
}
}
- if ((thisPath && this.containerEmpty(thisPath)) || sessionIndex == null) {
+ if ((thisPath && this.containerEmpty(thisPath)) || sessionIndex === null) {
// error in pref.js or in session.rdf ask the user what to do
loadSessionIsValid = false;
thisPath = this.gSessionPath[1]; // load last session
@@ -3082,7 +3083,7 @@ try{
case "firstwindowopen":
overwrite = false;
let hasFirstArgument = window.arguments && window.arguments[0];
- if (hasFirstArgument && this.overrideHomepage == null)
+ if (hasFirstArgument && this.overrideHomepage === null)
restoreSelect = false;
break;
case "windowopenedbytabmix":
diff --git a/chrome/content/tab/scrollbox.xml b/chrome/content/tab/scrollbox.xml
index 04908de..14d5084 100644
--- a/chrome/content/tab/scrollbox.xml
+++ b/chrome/content/tab/scrollbox.xml
@@ -110,24 +110,6 @@
document.getAnonymousElementByAttribute(this._scrollbox, "class", "box-inherit scrollbox-innerbox");
</field>
- <method name="updateScrollButtons">
- <parameter name="useTabmixButtons"/>
- <body><![CDATA[
- this._scrollButtonDown = !useTabmixButtons ?
- this._scrollButtonDownLeft : this._scrollButtonDownRight;
- var tabContainer = document.getBindingParent(this);
- tabContainer._animateElement = this._scrollButtonDown;
-
- this._scrollButtonUp = !useTabmixButtons ?
- this._scrollButtonUpLeft : this._scrollButtonUpRight;
- this._updateScrollButtonsDisabledState();
- if (!Tabmix.isVersion(320)) {
- this._scrollButtonUp.collapsed = !tabContainer.overflow;
- this._scrollButtonDown.collapsed = !tabContainer.overflow;
- }
- ]]></body>
- </method>
-
<!-- we replace tabbrowser.xml "tabbrowser-arrowscrollbox" binding with this one
Override scrollbox.xml method, since our scrollbox's children are
inherited from the binding parent -->
@@ -186,7 +168,7 @@
this.tabmix_inited = true;
this.offsetAmountToScroll = Tabmix.prefs.getBoolPref("offsetAmountToScroll");
- this.offsetRatio = document.getBindingParent(this).closeButtonsEnabled ? 0.70 : 0.50;
+ this.offsetRatio = Tabmix.tabsUtils.closeButtonsEnabled ? 0.70 : 0.50;
this.minOffset = TabmixSvc.australis ? 25 : 50;
Tabmix.changeCode(this, "scrollbox.ensureElementIsVisible")._replace(
'var amountToScroll',
@@ -303,9 +285,9 @@
!this.isMultiRow) {
let tab;
if (isScrollingLeft)
- tab = TMP_TabView.nextVisibleSibling(element);
+ tab = Tabmix.visibleTabs.next(element);
else
- tab = TMP_TabView.previousVisibleSibling(element);
+ tab = Tabmix.visibleTabs.previous(element);
if (tab) {
offset = Math.min(this.minOffset, this.offsetRatio * tab.getBoundingClientRect().width);
if (!isScrollingLeft)
@@ -366,35 +348,6 @@
]]></getter>
</property>
- <method name="isElementVisible">
- <parameter name="element"/>
- <body><![CDATA[
- if (!element || !element.parentNode || element.collapsed || element.hidden)
- return false;
-
- // pinned tabs are always visible
- if (element.pinned)
- return true;
-
- var [start, end] = this._startEndProps;
- var rect = this.scrollClientRect;
- var containerStart = rect[start];
- var containerEnd = rect[end];
- rect = element.getBoundingClientRect();
- var elementStart = rect[start];
- var elementEnd = rect[end];
-
- // we don't need the extra check with scrollContentRect
- // like in ensureElementIsVisible, the element will be invisible anyhow.
- if (elementStart < containerStart)
- return false;
- else if (containerEnd < elementEnd)
- return false;
-
- return true;
- ]]></body>
- </method>
-
<method name="_enterVerticalMode">
<parameter name="blockUnderflow"/>
<body><![CDATA[
@@ -407,25 +360,25 @@
return;
var tabBar = document.getBindingParent(this);
- tabBar.adjustNewtabButtonvisibility();
+ Tabmix.tabsUtils.adjustNewtabButtonvisibility();
let tabs = this._getScrollableElements();
if (!tabs.length)
return;
- let isFirstTabVisible = this.isElementVisible(tabs[0]);
- let isLastTabVisible = this.isElementVisible(tabs[tabs.length-1]);
+ let isFirstTabVisible = Tabmix.tabsUtils.isElementVisible(tabs[0]);
+ let isLastTabVisible = Tabmix.tabsUtils.isElementVisible(tabs[tabs.length-1]);
if (!isFirstTabVisible || !isLastTabVisible) {
// show Newtabbutton for the first time
// for the case last tab in row fill the all strip and the button
// is on the next row
- tabBar.disAllowNewtabbutton = false;
+ Tabmix.tabsUtils.disAllowNewtabbutton = false;
this.orient = "vertical";
Tabmix.setItem(tabBar, "multibar", true);
Tabmix.setItem("TabsToolbar", "multibar", true);
- if (tabBar.updateVerticalTabStrip() == null)
+ if (Tabmix.tabsUtils.updateVerticalTabStrip() == null)
TabmixTabbar._failedToEnterVerticalMode = true;
if (blockUnderflow && this.orient == "vertical")
this.blockUnderflow = true;
- this.updateOverflow(tabBar.overflow);
+ this.updateOverflow(Tabmix.tabsUtils.overflow);
}
]]></body>
</method>
@@ -451,7 +404,7 @@
///XXX check if we can set the margin with animation when we scroll
let end = Tabmix.ltr ? "right": "left";
let containerEnd = this.scrollClientRect[end];
- let top = tabBar.topTabY;
+ let top = Tabmix.tabsUtils.topTabY;
let tabs = this._getScrollableElements();
let index, current = 0;
for (let i = 0; i < tabs.length; i++) {
@@ -562,18 +515,18 @@
}
var tabs = document.getBindingParent(this);
- if (tabs.hasAttribute("multibar") && tabs.overflow) {
+ if (tabs.hasAttribute("multibar") && Tabmix.tabsUtils.overflow) {
//XXX don't do anything on Linux when hovering last tab and
// we show close button on tab on hover
if (!TabmixSvc.isLinux || TabmixTabbar.visibleRows == 1 ||
- (!tabs.visibleTabsLastChild.hasAttribute("showbutton") &&
- !tabs.visibleTabsLastChild.hasAttribute("showbutton_removed")))
- tabs.updateVerticalTabStrip();
+ (!Tabmix.visibleTabs.last.hasAttribute("showbutton") &&
+ !Tabmix.visibleTabs.last.hasAttribute("showbutton_removed")))
+ Tabmix.tabsUtils.updateVerticalTabStrip();
}
else
- tabs.overflow = false;
+ Tabmix.tabsUtils.overflow = false;
- this.updateOverflow(tabs.overflow);
+ this.updateOverflow(Tabmix.tabsUtils.overflow);
if (tabs._lastTabClosedByMouse)
tabs._expandSpacerBy(this._scrollButtonDown.clientWidth);
@@ -617,13 +570,13 @@
//XXX don't do anything on Linux when hovering last tab and
// we show close button on tab on hover
if (!TabmixSvc.isLinux || TabmixTabbar.visibleRows == 1 ||
- !tabs.visibleTabsLastChild.hasAttribute("showbutton"))
- tabs.updateVerticalTabStrip();
+ !Tabmix.visibleTabs.last.hasAttribute("showbutton"))
+ Tabmix.tabsUtils.updateVerticalTabStrip();
}
else
- tabs.overflow = true;
+ Tabmix.tabsUtils.overflow = true;
- this.updateOverflow(tabs.overflow);
+ this.updateOverflow(Tabmix.tabsUtils.overflow);
tabs._positionPinnedTabs();
if (Tabmix.isVersion(190))
diff --git a/chrome/content/tab/tab.js b/chrome/content/tab/tab.js
index 15ac2bb..fee419a 100644
--- a/chrome/content/tab/tab.js
+++ b/chrome/content/tab/tab.js
@@ -64,17 +64,17 @@ var TabmixTabbar = {
this.scrollButtonsMode = tabscroll;
var isMultiRow = tabscroll == this.SCROLL_BUTTONS_MULTIROW;
- var currentVisible = start ? true : tabStrip.isElementVisible(gBrowser.mCurrentTab);
+ var currentVisible = start ? true : Tabmix.tabsUtils.isElementVisible(gBrowser.mCurrentTab);
if (prevTabscroll != tabscroll) {
// update pointer to the button object that we are going to use
let useTabmixButtons = tabscroll > this.SCROLL_BUTTONS_LEFT_RIGHT;
- let overflow = tabBar.overflow;
+ let overflow = Tabmix.tabsUtils.overflow;
// from Firefox 4.0+ on we add dynamicly scroll buttons on TabsToolbar.
let tabmixScrollBox = document.getElementById("tabmixScrollBox");
if (tabmixScrollBox) // just in case our box is missing
- tabBar.mTabstrip.updateScrollButtons(useTabmixButtons);
+ Tabmix.tabsUtils.updateScrollButtons(useTabmixButtons);
if (isMultiRow || prevTabscroll == this.SCROLL_BUTTONS_MULTIROW) {
// temporarily hide vertical scroll button.
@@ -91,15 +91,15 @@ var TabmixTabbar = {
if (prevTabscroll == this.SCROLL_BUTTONS_MULTIROW) {
tabBar.mTabstrip.resetFirstTabInRow();
- tabBar.updateVerticalTabStrip(true);
+ Tabmix.tabsUtils.updateVerticalTabStrip(true);
}
else if (isMultiRow && overflow) {
// if we are in overflow in one line we will have more then one line
// in multi-row. we try to prevent extra over/underflow events by setting
// the height in front.
tabStrip.orient = "vertical";
- if (tabBar.updateVerticalTabStrip() == "scrollbar")
- tabBar.overflow = true;
+ if (Tabmix.tabsUtils.updateVerticalTabStrip() == "scrollbar")
+ Tabmix.tabsUtils.overflow = true;
}
Tabmix.setItem(tabmixScrollBox, "collapsed", null);
@@ -115,10 +115,10 @@ var TabmixTabbar = {
// Don't change tabstip orient on start before sessionStore ends.
// if we set orient to vertical before sessionStore finish
// sessionStore don't select the selected tab from last session.
- setTimeout(function() {tabBar.setTabStripOrient();}, 0);
+ setTimeout(function() {Tabmix.tabsUtils.setTabStripOrient();}, 0);
}
else
- tabBar.setTabStripOrient();
+ Tabmix.tabsUtils.setTabStripOrient();
}
Tabmix.setItem(tabBar, "widthFitTitle", this.widthFitTitle || null);
@@ -175,13 +175,6 @@ var TabmixTabbar = {
gTMPprefObserver.setShowNewTabButtonAttr(showNewTabButton, position);
},
- showNewTabButtonOnSide: function(aCondition, aValue) {
- if (Tabmix._show_newtabbutton) {
- Tabmix.setItem("TabsToolbar", "tabmix-show-newtabbutton",
- aCondition ? aValue : Tabmix._show_newtabbutton);
- }
- },
-
updateScrollStatus: function TMP_updateScrollStatus() {
var tabBar = gBrowser.tabContainer;
if (this.isMultiRow) {
@@ -190,7 +183,7 @@ var TabmixTabbar = {
// for other chases we need to call it when we change title
if (tabBar.mTabstrip.orient == "vertical") {
this.setFirstTabInRow();
- tabBar.updateVerticalTabStrip();
+ Tabmix.tabsUtils.updateVerticalTabStrip();
}
// with Australis overflow not always trigger when tab changed width
else if (TabmixSvc.australis && !this.widthFitTitle) {
@@ -198,8 +191,8 @@ var TabmixTabbar = {
this.setFirstTabInRow();
}
}
- else if (!this.isMultiRow && typeof tabBar.adjustNewtabButtonvisibility == "function")
- tabBar.adjustNewtabButtonvisibility();
+ else
+ Tabmix.tabsUtils.adjustNewtabButtonvisibility();
},
// in Firefox 4.0+ rowheight can change when TabsInTitlebar or TabsOnTop
@@ -218,7 +211,7 @@ var TabmixTabbar = {
get singleRowHeight() {
let heights = this._heights[this._tabsPosition];
if (typeof(heights) == "undefined")
- return gBrowser.tabContainer.tabstripInnerbox.getBoundingClientRect().height;
+ return Tabmix.tabsUtils.tabstripInnerbox.getBoundingClientRect().height;
return heights[2] / 2;
},
@@ -248,7 +241,7 @@ var TabmixTabbar = {
if (aRows == 1) {
Tabmix.setItem(tabBar, "multibar", null);
Tabmix.setItem("TabsToolbar", "multibar", null);
- tabBar.overflow = false;
+ Tabmix.tabsUtils.overflow = false;
return;
}
@@ -260,11 +253,11 @@ var TabmixTabbar = {
if (aRows in this._heights[tabsPosition])
newHeight = this._heights[tabsPosition][aRows];
else {
- if (tabBar.tabstripInnerbox) {
- let height = tabBar.tabstripInnerbox.getBoundingClientRect().height;
+ if (Tabmix.tabsUtils.tabstripInnerbox) {
+ let height = Tabmix.tabsUtils.tabstripInnerbox.getBoundingClientRect().height;
if (tabBar.getAttribute("multibar") == "scrollbar") {
// We can get here if we switch to diffrent tabs position while in multibar
- let rowHeight = height/tabBar.lastTabRowNumber;
+ let rowHeight = height/Tabmix.tabsUtils.lastTabRowNumber;
newHeight = rowHeight * aRows;
}
else
@@ -355,10 +348,10 @@ var TabmixTabbar = {
if (tabBar.mTabstrip.orient != "vertical")
tabBar.mTabstrip._enterVerticalMode();
else
- tabBar.updateVerticalTabStrip();
+ Tabmix.tabsUtils.updateVerticalTabStrip();
if (this.position == 1)
- setTimeout(function(){tabBar.updateVerticalTabStrip();},0);
+ setTimeout(function(){Tabmix.tabsUtils.updateVerticalTabStrip();},0);
this.updateBeforeAndAfter();
}
@@ -398,16 +391,16 @@ var TabmixTabbar = {
};
let removed = "tabmix-removed-" + attrib;
- let oldTab = tabBar._tabmixPositionalTabs[type];
+ let oldTab = Tabmix.tabsUtils._tabmixPositionalTabs[type];
if (oldTab && tab != oldTab) {
oldTab.removeAttribute("tabmix-" + attrib + "-visible");
oldTab.removeAttribute(removed);
}
- tabBar._tabmixPositionalTabs[type] = tab;
+ Tabmix.tabsUtils._tabmixPositionalTabs[type] = tab;
let specialTab = isSpecialTab();
if (tab && (TabmixSvc.australis && attrib == "beforeselected" ||
multibar || tab.hasAttribute(removed) || specialTab)) {
- let sameRow = multibar ? tabRow == tabBar.getTabRowNumber(tab, topY) || null : true;
+ let sameRow = multibar ? tabRow == Tabmix.tabsUtils.getTabRowNumber(tab, topY) || null : true;
Tabmix.setItem(tab, removed, !sameRow || null);
Tabmix.setItem(tab, attrib, getAttVal(sameRow, true));
if (visible)
@@ -417,8 +410,8 @@ var TabmixTabbar = {
if (tabBar._hoveredTab && !tabBar._hoveredTab.closing) {
if (multibar) {
- topY = tabBar.topTabY;
- tabRow = tabBar.getTabRowNumber(tabBar._hoveredTab, topY);
+ topY = Tabmix.tabsUtils.topTabY;
+ tabRow = Tabmix.tabsUtils.getTabRowNumber(tabBar._hoveredTab, topY);
}
updateAtt(tabBar._beforeHoveredTab, "beforeHoveredTab", "beforehovered");
updateAtt(tabBar._afterHoveredTab, "afterHoveredTab", "afterhovered");
@@ -442,8 +435,8 @@ var TabmixTabbar = {
}
if (multibar) {
- topY = topY || tabBar.topTabY;
- tabRow = tabBar.getTabRowNumber(selected, topY);
+ topY = topY || Tabmix.tabsUtils.topTabY;
+ tabRow = Tabmix.tabsUtils.getTabRowNumber(selected, topY);
}
updateAtt(prev, "beforeSelectedTab", "beforeselected", TabmixSvc.australis, "tabmix-");
updateAtt(next, "afterSelectedTab", "afterselected", Tabmix.isVersion(220), "");
@@ -453,13 +446,12 @@ var TabmixTabbar = {
if (this._rowHeight && this._rowHeight[tabsPosition])
return this._rowHeight[tabsPosition];
- var tabBar = gBrowser.tabContainer;
var tabs = gBrowser.visibleTabs;
var firstTab = tabs[0];
- var lastTab = tabBar.visibleTabsLastChild;
- var topY = tabBar.topTabY;
- var lastTabRow = tabBar.lastTabRowNumber;
+ var lastTab = Tabmix.visibleTabs.last;
+ var topY = Tabmix.tabsUtils.topTabY;
+ var lastTabRow = Tabmix.tabsUtils.lastTabRowNumber;
if (lastTabRow == 1) { // one row
if (firstTab.getAttribute("selected") == "true")
return lastTab.boxObject.height;
@@ -471,8 +463,8 @@ var TabmixTabbar = {
if (lastTab.getAttribute("selected") == "true") {
// check if previous to last tab in the 1st row
// this happen when the selected tab is the first tab in the 2nd row
- var prev = TMP_TabView.previousVisibleSibling(lastTab);
- if (prev && tabBar.getTabRowNumber(prev, topY) == 1)
+ var prev = Tabmix.visibleTabs.previous(lastTab);
+ if (prev && Tabmix.tabsUtils.getTabRowNumber(prev, topY) == 1)
return lastTab.boxObject.height;
else
newRowHeight = prev.baseY - firstTab.baseY;
@@ -480,8 +472,8 @@ var TabmixTabbar = {
else if (firstTab.getAttribute("selected") == "true") {
// check if 2nd visible tab is in the 2nd row
// (not likely that user set tab width to more then half screen width)
- var next = TMP_TabView.nextVisibleSibling(firstTab);
- if (next && tabBar.getTabRowNumber(next, topY) == 2)
+ var next = Tabmix.visibleTabs.next(firstTab);
+ if (next && Tabmix.tabsUtils.getTabRowNumber(next, topY) == 2)
return lastTab.boxObject.height;
else
newRowHeight = lastTab.baseY - next.baseY;
@@ -520,16 +512,16 @@ var TabmixTabbar = {
if ( !tab1 || !tab2 )
return false;
- var tabBar = gBrowser.tabContainer;
- var topY = tabBar.topTabY;
- return tabBar.getTabRowNumber(tab1, topY) == tabBar.getTabRowNumber(tab2, topY);
+ var topY = Tabmix.tabsUtils.topTabY;
+ return Tabmix.tabsUtils.getTabRowNumber(tab1, topY) ==
+ Tabmix.tabsUtils.getTabRowNumber(tab2, topY);
},
setFirstTabInRow: function() {
var tabBar = gBrowser.tabContainer;
// call our tabstrip function only when we are in multi-row and
// in overflow with pinned tabs
- if (this.isMultiRow && tabBar.overflow && tabBar.firstChild.pinned)
+ if (this.isMultiRow && Tabmix.tabsUtils.overflow && tabBar.firstChild.pinned)
tabBar.mTabstrip.setFirstTabInRow();
},
@@ -555,6 +547,536 @@ var TabmixTabbar = {
}; // TabmixTabbar end
+Tabmix.tabsUtils = {
+ initialized: false,
+ _tabmixPositionalTabs: {},
+
+ get tabBar() {
+ delete this.tabBar;
+ return (this.tabBar = gBrowser.tabContainer);
+ },
+
+ get tabstripInnerbox() {
+ delete this.tabstripInnerbox;
+ let elm = document.getAnonymousElementByAttribute(
+ this.tabBar.mTabstrip._scrollbox, "class", "box-inherit scrollbox-innerbox");
+ return (this.tabstripInnerbox = elm);
+ },
+
+ events: ["MozMouseHittest", "dblclick", "click", "dragstart",
+ "drop", "dragend", "dragexit"],
+
+ init: function() {
+ TMP_eventListener.toggleEventListener(this.tabBar, this.events, true, this);
+ // add dragover event handler to TabsToolbar to capture dragging over
+ // tabbar margin area, filter out events that are out of the tabbar
+ this.tabBar.parentNode.addEventListener("dragover", this, true);
+ if (!Tabmix.isVersion(310))
+ Services.prefs.removeObserver("browser.tabs.closeButtons", this.tabBar._prefObserver);
+
+ if (this.initialized) {
+ Tabmix.log("initializeTabmixUI - some extension initialize tabbrowser-tabs binding again");
+ this.initializeTabmixUI();
+ return;
+ }
+ this.initialized = true;
+
+ var tabbrowser = this.tabBar.tabbrowser;
+ let tab = this.tabBar.firstChild;
+
+ XPCOMUtils.defineLazyGetter(Tabmix, "rtl", function () {
+ return window.getComputedStyle(tabbrowser, null).direction == "rtl";
+ });
+ XPCOMUtils.defineLazyGetter(Tabmix, "ltr", function () {return !Tabmix.rtl;});
+
+ // don't set button to left side if it is not inside tab-content
+ let button = document.getAnonymousElementByAttribute(tab, "anonid", "tmp-close-button") ||
+ document.getAnonymousElementByAttribute(tab, "anonid", "close-button");
+ Tabmix.defaultCloseButtons = button && button.parentNode.className == "tab-content";
+ let onLeft = Tabmix.defaultCloseButtons && Tabmix.prefs.getBoolPref("tabs.closeButtons.onLeft");
+ this.tabBar.setAttribute("closebuttons-side", onLeft ? "left" : "right");
+
+ // mCloseButtons is not in firefox code sinc Firefox 31 bug 865826
+ this.tabBar.mCloseButtons = Tabmix.prefs.getIntPref("tabs.closeButtons");
+ this._keepLastTab = Tabmix.prefs.getBoolPref("keepLastTab");
+ this.closeButtonsEnabled = Tabmix.prefs.getBoolPref("tabs.closeButtons.enable");
+ this._tabmixPositionalTabs = {
+ beforeSelectedTab: null, afterSelectedTab: null,
+ beforeHoveredTab: null, afterHoveredTab: null
+ };
+
+ Tabmix.afterTabsButtonsWidth = [Tabmix.isVersion(280) ? 51.6 : 28];
+ Tabmix.tabsNewtabButton =
+ document.getAnonymousElementByAttribute(this.tabBar, "command", "cmd_newNavigatorTab");
+ this._show_newtabbutton = "aftertabs";
+
+ let attr = ["notpinned", "autoreload", "protected",
+ "locked"].filter(function(att) {
+ return Tabmix.prefs.getBoolPref("extraIcons." + att);
+ });
+ if (attr.length)
+ this.tabBar.setAttribute("tabmix_icons", attr.join(" "));
+
+ Tabmix._debugMode = TabmixSvc.debugMode();
+
+ // initialize first tab
+ Tabmix._nextSelectedID = 1;
+ TMP_eventListener.setTabAttribute(tab);
+ tab.setAttribute("tabmix_selectedID", Tabmix._nextSelectedID++);
+ tab.setAttribute("visited", true);
+ Tabmix.setTabStyle(tab);
+ TabmixTabbar.lockallTabs = Tabmix.prefs.getBoolPref("lockallTabs");
+ if (TabmixTabbar.lockallTabs) {
+ tab.setAttribute("locked", true);
+ tab.tabmix_allowLoad = false;
+ }
+ if ("linkedBrowser" in tab)
+ tablib.setLoadURIWithFlags(tab.linkedBrowser);
+
+ Tabmix.initialization.run("beforeStartup", tabbrowser, this.tabBar);
+ },
+
+ onUnload: function() {
+ if (!this.initialized)
+ return;
+ TMP_eventListener.toggleEventListener(this.tabBar, this.events, false, this);
+ if (this.tabBar.parentNode)
+ this.tabBar.parentNode.removeEventListener("dragover", this, true);
+ delete this.tabstripInnerbox;
+ this._tabmixPositionalTabs = null;
+ },
+
+ handleEvent: function(aEvent) {
+ switch (aEvent.type) {
+ case "MozMouseHittest":
+ if (aEvent.button === 0 && (Tabmix.keyModifierDown || aEvent.detail > 0))
+ aEvent.stopPropagation();
+ break;
+ case "dblclick":
+ if (Tabmix.prefs.getBoolPref("tabbar.click_dragwindow") &&
+ Tabmix.prefs.getBoolPref("tabbar.dblclick_changesize") &&
+ !TabmixSvc.isMac && aEvent.target.localName == "tabs") {
+ let displayAppButton = !(document.getElementById("titlebar") ||
+ document.getElementById("appmenu-toolbar-button")).hidden;
+ let tabsOnTop = !window.TabsOnTop || TabsOnTop.enabled;
+ if (TabsInTitlebar.enabled ||
+ (displayAppButton && tabsOnTop && this.tabBar.parentNode._dragBindingAlive))
+ return;
+ }
+ TabmixTabClickOptions.onTabBarDblClick(aEvent);
+ break;
+ case "click":
+ TabmixTabClickOptions.onTabClick(aEvent);
+ break;
+ case "dragstart":
+ if (this.tabBar.useTabmixDragstart(aEvent))
+ TMP_tabDNDObserver.onDragStart(aEvent);
+ break;
+ case "dragover":
+ let target = aEvent.target.localName;
+ if (target != "tab" && target != "tabs")
+ return;
+ if (this.tabBar.useTabmixDnD(aEvent))
+ TMP_tabDNDObserver.onDragOver(aEvent);
+ break;
+ case "drop":
+ if (this.tabBar.useTabmixDnD(aEvent))
+ TMP_tabDNDObserver.onDrop(aEvent);
+ break;
+ case "dragend":
+ if (this.tabBar.orient == "horizontal")
+ TMP_tabDNDObserver.onDragEnd(aEvent);
+ break;
+ case "dragexit":
+ if (this.tabBar.useTabmixDnD(aEvent))
+ TMP_tabDNDObserver.onDragExit(aEvent);
+ break;
+ }
+ },
+
+ initializeTabmixUI: function() {
+ // https://addons.mozilla.org/EN-US/firefox/addon/vertical-tabs/
+ // verticalTabs 0.9.1+ is restartless.
+ if (typeof VerticalTabs == "object" && !Tabmix.extensions.verticalTabs) {
+ Tabmix.setItem("TabsToolbar", "collapsed", null);
+ Tabmix.extensions.verticalTabs = true;
+ Tabmix.extensions.verticalTabBar = true;
+ TabmixTabbar.updateSettings();
+ }
+
+ // tabbrowser-tabs constructor reset first tab label to New Tab
+ this.tabBar.tabbrowser.setTabTitle(this.tabBar.firstChild);
+ let position = Tabmix.prefs.getIntPref("newTabButton.position");
+ if (position !== 0)
+ gTMPprefObserver.changeNewTabButtonSide(position);
+
+ // need to add TabScope eventListener
+ // need to find a way to do it for all extensions that add event to the tabstrip
+ if ("TabScope" in window) {
+ window.TabScope.uninit();
+ window.TabScope.init();
+ }
+
+ TabmixTabbar.flowing = this.tabBar.getAttribute("flowing");
+ this.setTabStripOrient();
+ Tabmix.navToolbox.setScrollButtons(true);
+
+ // fix incompatibility with Personal Titlebar extension
+ // the extensions trigger tabbar binding reset on toolbars customize
+ // we need to init our ui settings from here and again after customization
+ if (Tabmix.navToolbox.customizeStarted) {
+ TabmixTabbar.visibleRows = 1;
+ TabmixTabbar.updateSettings(false);
+ Tabmix.navToolbox.resetUI = true;
+ }
+ },
+
+ updateVerticalTabStrip: function(aReset) {
+ if (Tabmix.extensions.verticalTabBar || gInPrintPreviewMode || FullScreen._isChromeCollapsed ||
+ !this.tabBar.visible && TabmixTabbar.visibleRows == 1)
+ return null;
+ if (this._inUpdateVerticalTabStrip)
+ return this.tabBar.getAttribute("multibar");
+ this._inUpdateVerticalTabStrip = true;
+
+ // we must adjustNewtabButtonvisibility before get lastTabRowNumber
+ this.adjustNewtabButtonvisibility();
+ // this.lastTabRowNumber is null when we hide the tabbar
+ let rows = aReset || this.tabBar.childNodes.length == 1 ? 1 : (this.lastTabRowNumber || 1);
+
+ let currentMultibar = this.tabBar.getAttribute("multibar") || null;
+ let maxRow = Tabmix.prefs.getIntPref("tabBarMaxRow");
+ // we need to check for the case that last row of tabs is empty and we still have hidden row on top
+ // this can occur when we close last tab in the last row or when some tab changed width
+ if (rows > 1 && rows - maxRow < 0 && this.overflow &&
+ this.canScrollTabsLeft) {
+ // try to scroll all the way up
+ this.tabBar.mTabstrip.scrollByPixels((rows - maxRow) * this.tabBar.mTabstrip.singleRowHeight);
+ // get lastTabRowNumber after the scroll
+ rows = this.lastTabRowNumber;
+ }
+
+ let multibar;
+ if (rows == 1)
+ multibar = null; // removeAttribute "multibar"
+ else if (rows > maxRow)
+ [multibar, rows] = ["scrollbar", maxRow];
+ else
+ multibar = "true";
+
+ if (currentMultibar != multibar) {
+ Tabmix.setItem(this.tabBar, "multibar", multibar);
+ Tabmix.setItem("TabsToolbar", "multibar", multibar);
+ }
+
+ this.setTabStripOrient();
+ TabmixTabbar.setHeight(rows, aReset);
+
+ if (this.tabBar.mTabstrip.orient == "vertical")
+ this.overflow = multibar == "scrollbar";
+
+ if (!this.overflow) {
+ // prevent new-tab-button on the right from flickering when new tabs animate is on.
+ if (this.disAllowNewtabbutton &&
+ Services.prefs.getBoolPref("browser.tabs.animate")) {
+ // after 250ms new tab is fully opened
+ if (!this.adjustNewtabButtonTimeout) {
+ let timeout = 250, callerName = Tabmix.callerName();
+ if (callerName == "onxbloverflow") {
+ let timeFromLastTabOpened = Date.now() - Tabmix._lastTabOpenedTime;
+ if (timeFromLastTabOpened < 250)
+ timeout = 0;
+ }
+ this.adjustNewtabButtonTimeout = setTimeout(function() {
+ this.adjustNewtabButtonvisibility();
+ this.adjustNewtabButtonTimeout = null;
+ }.bind(this), timeout);
+ }
+ }
+ else
+ this.adjustNewtabButtonvisibility();
+ }
+
+ this._inUpdateVerticalTabStrip = false;
+ return multibar;
+ },
+
+ setTabStripOrient: function() {
+ // we can't set dispaly:block and orient=vertical when widthFitTitle is false
+ // and we are in one row.
+ let vertical = TabmixTabbar.isMultiRow &&
+ (TabmixTabbar.widthFitTitle || this.tabBar.hasAttribute("multibar"));
+ let tabstrip = this.tabBar.mTabstrip;
+ Tabmix.setItem(tabstrip, "orient", vertical ? "vertical" : "horizontal");
+ tabstrip._isRTLScrollbox = !vertical && Tabmix.rtl;
+ },
+
+ /**
+ * check that we have enough room to show new tab button after the last tab
+ * in the current row. we don't want the button to be on the next row when the
+ * tab is on the current row
+ */
+ adjustNewtabButtonvisibility: function() {
+ if (!TabmixTabbar.isMultiRow && this.tabBar.mTabstrip.orient == "vertical")
+ return;
+
+ if (!this.checkNewtabButtonVisibility) {
+ this.showNewTabButtonOnSide(this.overflow, "right-side");
+ return;
+ }
+
+ // when Private-tab enabled/disabled we need to reset
+ // tabsNewtabButton and afterTabsButtonsWidth
+ if (!Tabmix.tabsNewtabButton)
+ Tabmix.getAfterTabsButtonsWidth();
+
+ var lastTab = Tabmix.visibleTabs.last;
+ // button is visible
+ // A: last tab and the button are in the same row:
+ // check if we have room for the button in this row
+ // B: last tab and the button are NOT in the same row:
+ // NG - hide the button
+ if (!this.disAllowNewtabbutton) {
+ let sameRow = TabmixTabbar.inSameRow(lastTab, Tabmix.tabsNewtabButton);
+ if (sameRow) {
+ let tabstripEnd = this.tabBar.mTabstrip.scrollBoxObject.screenX +
+ this.tabBar.mTabstrip.scrollBoxObject.width;
+ let buttonEnd = Tabmix.tabsNewtabButton.boxObject.screenX +
+ Tabmix.tabsNewtabButton.boxObject.width;
+ this.disAllowNewtabbutton = buttonEnd > tabstripEnd;
+ }
+ else
+ this.disAllowNewtabbutton = true;
+ return;
+ }
+ // button is NOT visible
+ // A: 2 last tabs are in the same row:
+ // check if we have room for the button in this row
+ // B: 2 last tabs are NOT in the same row:
+ // check if we have room for the last tab + button after
+ // previous to last tab.
+ else {
+ // ignor the case that this tab width is larger then the tabbar
+ let previousTab = Tabmix.visibleTabs.previous(lastTab);
+ if (!previousTab) {
+ this.disAllowNewtabbutton = false;
+ return;
+ }
+
+ // buttons that are not on TabsToolbar or not visible are null
+ let newTabButtonWidth = function(aOnSide) {
+ let width = 0, privatTabButton = TabmixTabbar.newPrivateTabButton();
+ if (privatTabButton) {
+ width += aOnSide ? privatTabButton.boxObject.width :
+ Tabmix.afterTabsButtonsWidth[1];
+ }
+ if (Tabmix.sideNewTabButton) {
+ width += aOnSide ? Tabmix.sideNewTabButton.boxObject.width :
+ Tabmix.afterTabsButtonsWidth[0];
+ }
+ return width;
+ };
+ let tsbo = this.tabBar.mTabstrip.scrollBoxObject;
+ let tsboEnd = tsbo.screenX + tsbo.width + newTabButtonWidth(true);
+ if (TabmixTabbar.inSameRow(lastTab, previousTab)) {
+ let buttonEnd = lastTab.boxObject.screenX + lastTab.boxObject.width +
+ newTabButtonWidth();
+ this.disAllowNewtabbutton = buttonEnd > tsboEnd;
+ return;
+ }
+ else {
+ let lastTabEnd = previousTab.boxObject.screenX +
+ previousTab.boxObject.width + lastTab.boxObject.width;
+ // both last tab and new tab button are in the next row
+ if (lastTabEnd > tsboEnd)
+ this.disAllowNewtabbutton = false;
+ else
+ this.disAllowNewtabbutton = lastTabEnd + newTabButtonWidth() > tsboEnd;
+ return;
+ }
+ }
+ },
+
+ get disAllowNewtabbutton() {
+ let toolbar = document.getElementById("TabsToolbar");
+ return toolbar.getAttribute("tabmix-show-newtabbutton") == "temporary-right-side";
+ },
+
+ set disAllowNewtabbutton(val) {
+ let newVal = this.overflow || val;
+ this.showNewTabButtonOnSide(newVal, "temporary-right-side");
+ return newVal;
+ },
+
+ get overflow() {
+ return this.tabBar.hasAttribute("overflow");
+ },
+
+ set overflow(val) {
+ // don't do anything if other extensions set orient to vertical
+ // when we arn't use it.
+ if (!TabmixTabbar.isMultiRow && this.tabBar.mTabstrip.orient == "vertical")
+ return val;
+
+ if (val != this.overflow) {
+ if (val)
+ this.tabBar.setAttribute("overflow", "true");
+ else
+ this.tabBar.removeAttribute("overflow");
+ this.showNewTabButtonOnSide(val, "right-side");
+ if (typeof this.tabBar.mTabstrip.updateOverflow == "function")
+ this.tabBar.mTabstrip.updateOverflow(val);
+ }
+ return val;
+ },
+
+ showNewTabButtonOnSide: function(aCondition, aValue) {
+ if (this._show_newtabbutton) {
+ Tabmix.setItem("TabsToolbar", "tabmix-show-newtabbutton",
+ aCondition ? aValue : this._show_newtabbutton);
+ }
+ },
+
+ get topTabY() {
+ return this.tabstripInnerbox.getBoundingClientRect().top +
+ Tabmix.getStyle(this.tabstripInnerbox, "paddingTop");
+ },
+
+ get lastTabRowNumber() {
+ return this.getTabRowNumber(Tabmix.visibleTabs.last, this.topTabY);
+ },
+
+ getTabRowNumber: function(aTab, aTop) {
+ var {top, height} = aTab ? aTab.getBoundingClientRect() : {};
+ height = aTab ? aTab.boxObject.height : 0;
+ if (!height) // don't panic
+ return 1;
+ // some theme add marginTop/marginBottom to tabs
+ var cStyle = window.getComputedStyle(aTab, null);
+ var marginTop = parseInt(cStyle["marginTop"]) || 0;
+ var marginBottom = parseInt(cStyle["marginBottom"]) || 0;
+ height += marginTop + marginBottom;
+
+ var tabBottom = top - marginTop + height;
+ return Math.round((tabBottom - aTop)/height);
+ },
+
+ get canScrollTabsLeft() {
+ return !this.tabBar.mTabstrip._scrollButtonUp.disabled;
+ },
+
+ get canScrollTabsRight() {
+ return !this.tabBar.mTabstrip._scrollButtonDown.disabled;
+ },
+
+ isSingleRow: function(visibleTabs) {
+ if (!this.tabBar.hasAttribute("multibar"))
+ return true;
+ // we get here when we are about to go to single row
+ // one tab before the last is in the first row and we are closing one tab
+ let tabs = visibleTabs || gBrowser.visibleTabs;
+ return this.getTabRowNumber(tabs[tabs.length - 2], this.topTabY) == 1;
+ },
+
+ /**** gBrowser.tabContainer.mTabstrip helpers ****/
+ /**
+ * this function is here for the case restart-less extension override our
+ * override our mTabstrip binding when Tabmix's uses its own scroll buttons
+ */
+ updateScrollButtons: function(useTabmixButtons) {
+ let tabstrip = this.tabBar.mTabstrip;
+ tabstrip._scrollButtonDown = useTabmixButtons ?
+ tabstrip._scrollButtonDownRight :
+ tabstrip._scrollButtonUpLeft || // fall back to original
+ document.getAnonymousElementByAttribute(tabstrip, "anonid", "scrollbutton-down");
+ this.tabBar._animateElement = tabstrip._scrollButtonDown;
+
+ tabstrip._scrollButtonUp = useTabmixButtons ?
+ tabstrip._scrollButtonUpRight :
+ tabstrip._scrollButtonUpLeft || // fall back to original
+ document.getAnonymousElementByAttribute(tabstrip, "anonid", "scrollbutton-up");
+ tabstrip._updateScrollButtonsDisabledState();
+
+ if (!Tabmix.isVersion(320)) {
+ let overflow = this.overflow;
+ tabstrip._scrollButtonUp.collapsed = !overflow;
+ tabstrip._scrollButtonDown.collapsed = !overflow;
+ }
+ },
+
+ isElementVisible: function(element) {
+ if (!element || !element.parentNode || element.collapsed || element.hidden)
+ return false;
+
+ // pinned tabs are always visible
+ if (element.pinned)
+ return true;
+
+ var [start, end] = this.tabBar.mTabstrip._startEndProps;
+ var rect = this.tabBar.mTabstrip.scrollClientRect;
+ var containerStart = rect[start];
+ var containerEnd = rect[end];
+ rect = element.getBoundingClientRect();
+ var elementStart = rect[start];
+ var elementEnd = rect[end];
+
+ // we don't need the extra check with scrollContentRect
+ // like in ensureElementIsVisible, the element will be invisible anyhow.
+ if (elementStart < containerStart)
+ return false;
+ else if (containerEnd < elementEnd)
+ return false;
+
+ return true;
+ }
+};
+
+Tabmix.visibleTabs = {
+ get first() {
+ var tabs = gBrowser.tabs;
+ for (let i = 0; i < tabs.length; i++){
+ let tab = tabs[i];
+ if (!tab.hidden && !tab.closing)
+ return tab;
+ }
+ return gBrowser.selectedTab;
+ },
+
+ get last() {
+ // we only need the last visible tab,
+ // find it directly instead of using gBrowser.tabContainer.visibleTabs
+ var tabs = gBrowser.tabs;
+ for (let i = tabs.length - 1; i >= 0; i--){
+ let tab = tabs[i];
+ if (!tab.hidden && !tab.closing)
+ return tab;
+ }
+ return gBrowser.selectedTab;
+ },
+
+ previous: function (aTab) {
+ var tabs = gBrowser.visibleTabs;
+ var index = tabs.indexOf(aTab);
+ if (--index > -1)
+ return tabs[index];
+ return null;
+ },
+
+ next: function (aTab) {
+ var tabs = gBrowser.visibleTabs;
+ var index = tabs.indexOf(aTab);
+ if (index > -1 && ++index < tabs.length)
+ return tabs[index];
+ return null;
+ },
+
+ indexOf: function (aTab) {
+ if (aTab)
+ return gBrowser.visibleTabs.indexOf(aTab);
+ return -1;
+ }
+};
+
// Function to catch changes to Tab Mix preferences and update existing windows and tabs
//
var gTMPprefObserver = {
@@ -707,8 +1229,7 @@ var gTMPprefObserver = {
break;
case "browser.tabs.tabMaxWidth":
case "browser.tabs.tabMinWidth":
- var tabStrip = gBrowser.tabContainer.mTabstrip;
- var currentVisible = tabStrip.isElementVisible(gBrowser.mCurrentTab);
+ var currentVisible = Tabmix.tabsUtils.isElementVisible(gBrowser.mCurrentTab);
let tabMaxWidth = Math.max(16, Services.prefs.getIntPref("browser.tabs.tabMaxWidth"));
let tabMinWidth = Math.max(16, Services.prefs.getIntPref("browser.tabs.tabMinWidth"));
if (tabMaxWidth < tabMinWidth) {
@@ -747,7 +1268,7 @@ var gTMPprefObserver = {
gBrowser.tabContainer.adjustTabstrip();
break;
case "extensions.tabmix.keepLastTab":
- gBrowser.tabContainer._keepLastTab = Services.prefs.getBoolPref(prefName);
+ Tabmix.tabsUtils._keepLastTab = Services.prefs.getBoolPref(prefName);
gBrowser.tabContainer.adjustTabstrip();
break;
case "browser.tabs.closeButtons":
@@ -800,7 +1321,7 @@ var gTMPprefObserver = {
break;
case "extensions.tabmix.tabs.closeButtons.enable":
prefValue = Services.prefs.getBoolPref(prefName);
- gBrowser.tabContainer.closeButtonsEnabled = prefValue;
+ Tabmix.tabsUtils.closeButtonsEnabled = prefValue;
gBrowser.tabContainer.mTabstrip.offsetRatio = prefValue ? 0.70 : 0.50;
gBrowser.tabContainer.adjustTabstrip();
break;
@@ -894,20 +1415,20 @@ var gTMPprefObserver = {
break;
case "extensions.tabmix.tabBarMaxRow":
var tabBar = gBrowser.tabContainer;
- let row = tabBar.maxRow;
+ let row = Tabmix.prefs.getIntPref("tabBarMaxRow");
if (row < 2) {
Tabmix.prefs.setIntPref("tabBarMaxRow", 2);
return;
}
// maxRow changed
if (TabmixTabbar.isMultiRow) {
- let isVisible = tabBar.mTabstrip.isElementVisible(gBrowser.mCurrentTab);
+ let isVisible = Tabmix.tabsUtils.isElementVisible(gBrowser.mCurrentTab);
// we hide the button to see if tabs can fits to fewer rows without the scroll buttons
- if (tabBar.overflow && row > TabmixTabbar.visibleRows)
- tabBar.overflow = false;
+ if (Tabmix.tabsUtils.overflow && row > TabmixTabbar.visibleRows)
+ Tabmix.tabsUtils.overflow = false;
// after we update the height check if we are still in overflow
- if (tabBar.updateVerticalTabStrip() == "scrollbar") {
- tabBar.overflow = true;
+ if (Tabmix.tabsUtils.updateVerticalTabStrip() == "scrollbar") {
+ Tabmix.tabsUtils.overflow = true;
tabBar.mTabstrip._updateScrollButtonsDisabledState();
if (isVisible)
gBrowser.ensureTabIsVisible(gBrowser.selectedTab, false);
@@ -926,7 +1447,7 @@ var gTMPprefObserver = {
// multi-rows total heights can be diffrent when tabs are on top
if (TabmixTabbar.visibleRows > 1) {
TabmixTabbar.setHeight(1, true);
- gBrowser.tabContainer.updateVerticalTabStrip();
+ Tabmix.tabsUtils.updateVerticalTabStrip();
}
break;
case "extensions.tabmix.hideTabBarButton":
@@ -1456,7 +1977,7 @@ var gTMPprefObserver = {
setShowNewTabButtonAttr: function(aShow, aPosition) {
// check new tab button visibility when we are in multi-row and the
// preference is to show new-tab-button after last tab
- gBrowser.tabContainer._checkNewtabButtonVisibility =
+ Tabmix.tabsUtils.checkNewtabButtonVisibility =
TabmixTabbar.isMultiRow && ((aShow && aPosition == 2) ||
!!TabmixTabbar.newPrivateTabButton());
@@ -1478,11 +1999,11 @@ var gTMPprefObserver = {
else
attrValue = "aftertabs";
// we use this value in disAllowNewtabbutton and overflow setters
- Tabmix._show_newtabbutton = attrValue;
+ Tabmix.tabsUtils._show_newtabbutton = attrValue;
if (aShow) {
- if (gBrowser.tabContainer.overflow)
+ if (Tabmix.tabsUtils.overflow)
attrValue = "right-side";
- else if (gBrowser.tabContainer.disAllowNewtabbutton)
+ else if (Tabmix.tabsUtils.disAllowNewtabbutton)
attrValue = "temporary-right-side";
}
Tabmix.setItem("TabsToolbar", "tabmix-show-newtabbutton", attrValue);
@@ -1779,7 +2300,7 @@ var gTMPprefObserver = {
let str = Cc["@mozilla.org/supports-string;1"].createInstance(nsISupportsString);
str.data = Services.prefs.getComplexValue(oldPref, nsISupportsString).data;
// only updtae new preference value if the old control preference is New Tab Page
- let control = controlPref === null || Tabmix.prefs.prefHasUserValue(controlPref) &&
+ let control = controlPref === undefined || Tabmix.prefs.prefHasUserValue(controlPref) &&
Tabmix.prefs.getIntPref(controlPref) == 4;
if (str.data !== "" && control)
Services.prefs.setComplexValue(newPref, nsISupportsString, str);
@@ -2041,10 +2562,15 @@ var TabmixProgressListener = {
aStateFlags & nsIWebProgressListener.STATE_IS_NETWORK) {
let uri = aRequest.QueryInterface(Ci.nsIChannel).URI.spec;
// remove blank tab that created by downloading a file.
- if (Tabmix.prefs.getBoolPref("enablefiletype") &&
+ let isDownLoading;
+ try {
+ // nsIWebProgress.DOMWindow can throw NS_NOINTERFACE
+ isDownLoading = Tabmix.prefs.getBoolPref("enablefiletype") &&
aWebProgress.DOMWindow.document.documentURI == "about:blank" &&
uri != "about:blank" && aStatus === 0 &&
- this.mTabBrowser.isBlankTab(tab)) {
+ this.mTabBrowser.isBlankTab(tab);
+ } catch(ex) { }
+ if (isDownLoading) {
if (tab.selected)
this.mTabBrowser.previousTab(tab);
this.mTabBrowser.hideTab(tab);
diff --git a/chrome/content/tab/tabbrowser_4.xml b/chrome/content/tab/tabbrowser_4.xml
index 527b039..960504a 100644
--- a/chrome/content/tab/tabbrowser_4.xml
+++ b/chrome/content/tab/tabbrowser_4.xml
@@ -228,7 +228,7 @@
if (TabmixSvc.australis) {
clearTimeout(this.tabmix_mouseover);
- let positionalTabs = this.parentNode._tabmixPositionalTabs;
+ let positionalTabs = Tabmix.tabsUtils._tabmixPositionalTabs;
if (positionalTabs.beforeHoveredTab) {
positionalTabs.beforeHoveredTab.removeAttribute("tabmix-removed-beforehovered");
positionalTabs.beforeHoveredTab = null;
@@ -263,12 +263,14 @@
<method name="onMouseCommand">
<parameter name="aEvent"/>
<body><![CDATA[
- if ( this == this.parentNode.selectedItem ) {
- if (aEvent.detail == 1)
- this.setAttribute("clickOnCurrent","true");
- }
+ let isSelected = this == this.parentNode.selectedItem;
+ Tabmix.setItem(this, "clickOnCurrent",
+ isSelected && aEvent.detail == 1 || null);
+ if (isSelected)
+ return;
+
// don't allow mouse click/down with modifiers to select tab
- else if (aEvent.shiftKey || aEvent.ctrlKey || aEvent.altKey || aEvent.metaKey)
+ if (aEvent.shiftKey || aEvent.ctrlKey || aEvent.altKey || aEvent.metaKey)
aEvent.stopPropagation();
else {
this.parentNode._selectNewTab(this);
@@ -342,414 +344,19 @@
extends="chrome://tabmixplus/content/tab/tabbrowser_proxy.xml#tabmix-tabbrowser-tabs-proxy">
<implementation implements="nsIDOMEventListener">
- <field name="tabstripInnerbox" readonly="true">
- document.getAnonymousElementByAttribute(this.mTabstrip._scrollbox, "class", "box-inherit scrollbox-innerbox");
- </field>
-
<constructor>
<![CDATA[
- // add dragover event handler to TabsToolbar to capture dragging over
- // tabbar margin area filter out events that are out of the tabbar
- this.parentNode.tabmix_handleDragover = function (aEvent) {
- let target = aEvent.target.localName;
- if (target != "tab" && target != "tabs")
- return;
- if (gBrowser.tabContainer.useTabmixDnD(aEvent))
- TMP_tabDNDObserver.onDragOver(aEvent);
- }
- this.parentNode.addEventListener("dragover", this.parentNode.tabmix_handleDragover, true);
- if (!Tabmix.isVersion(310))
- Services.prefs.removeObserver("browser.tabs.closeButtons", this._prefObserver);
-
- if (this.tabmix_inited) {
- Tabmix.log("initializeTabmixUI - some extension initialize tabbrowser-tabs binding again");
- this.initializeTabmixUI();
- return;
- }
- this.tabmix_inited = true;
-
- var tabbrowser = this.tabbrowser;
-
- XPCOMUtils.defineLazyGetter(Tabmix, "rtl", function () {
- return window.getComputedStyle(tabbrowser, null).direction == "rtl";
- });
- XPCOMUtils.defineLazyGetter(Tabmix, "ltr", function () !Tabmix.rtl);
-
- // don't set button to left side if it is not inside tab-content
- let button = document.getAnonymousElementByAttribute(this.firstChild, "anonid", "tmp-close-button") ||
- document.getAnonymousElementByAttribute(this.firstChild, "anonid", "close-button");
- Tabmix.defaultCloseButtons = button && button.parentNode.className == "tab-content";
- let onLeft = Tabmix.defaultCloseButtons && Tabmix.prefs.getBoolPref("tabs.closeButtons.onLeft");
- this.setAttribute("closebuttons-side", onLeft ? "left" : "right");
-
- this._keepLastTab = Tabmix.prefs.getBoolPref("keepLastTab");
- this.closeButtonsEnabled = Tabmix.prefs.getBoolPref("tabs.closeButtons.enable");
- this.mCloseButtons = Tabmix.prefs.getIntPref("tabs.closeButtons");
- this._tabmixPositionalTabs = {beforeSelectedTab: null, afterSelectedTab: null,
- beforeHoveredTab: null, afterHoveredTab: null}
-
- /**
- * if we set this in field[s] they will reset each time the tabbar binding construct
- * by tabbar position change
- */
- Tabmix.afterTabsButtonsWidth = [Tabmix.isVersion(280) ? 51.6 : 28];
- Tabmix.tabsNewtabButton =
- document.getAnonymousElementByAttribute(this, "command", "cmd_newNavigatorTab");
- Tabmix._show_newtabbutton = "aftertabs";
-
- Tabmix._nextSelectedID = 1;
- let tab = this.firstChild;
- TMP_eventListener.setTabAttribute(tab);
- tab.setAttribute("tabmix_selectedID", Tabmix._nextSelectedID++);
- tab.setAttribute("visited", true);
- Tabmix.setTabStyle(tab);
- TabmixTabbar.lockallTabs = Tabmix.prefs.getBoolPref("lockallTabs");
- if (TabmixTabbar.lockallTabs) {
- tab.setAttribute("locked", true);
- tab.tabmix_allowLoad = false;
- }
-
- let attr = ["notpinned", "autoreload", "protected", "locked"]
- .filter(function(att) Tabmix.prefs.getBoolPref("extraIcons." + att));
- if (attr.length)
- this.setAttribute("tabmix_icons", attr.join(" "));
-
- Tabmix._debugMode = TabmixSvc.debugMode();
-
- if ("linkedBrowser" in tab)
- tablib.setLoadURIWithFlags(tab.linkedBrowser);
-
- Tabmix.initialization.run("beforeStartup", tabbrowser, this);
+ Tabmix.initialization.run("init", this);
]]>
</constructor>
- <destructor>
- <![CDATA[
- if (this.parentNode)
- this.parentNode.removeEventListener("dragover", this.parentNode.tabmix_handleDragover, true);
- delete this.tabstripInnerbox;
- ]]>
- </destructor>
-
- <method name="updateVerticalTabStrip">
- <parameter name="aReset"/>
- <body><![CDATA[
- if (Tabmix.extensions.verticalTabBar || gInPrintPreviewMode || FullScreen._isChromeCollapsed ||
- !this.visible && TabmixTabbar.visibleRows == 1)
- return null;
- if (this._inUpdateVerticalTabStrip)
- return this.getAttribute("multibar");
- this._inUpdateVerticalTabStrip = true;
-
- // we must adjustNewtabButtonvisibility before get lastTabRowNumber
- this.adjustNewtabButtonvisibility();
- let visibleRows = TabmixTabbar.visibleRows;
- // this.lastTabRowNumber is null when we hide the tabbar
- let rows = aReset || this.childNodes.length == 1 ? 1 : (this.lastTabRowNumber || 1);
-
- let currentMultibar = this.getAttribute("multibar") || null;
- let maxRow = this.maxRow;
- // we need to check for the case that last row of tabs is empty and we still have hidden row on top
- // this can occur when we close last tab in the last row or when some tab changed width
- if (rows > 1 && rows - maxRow < 0 && this.overflow && this.canScrollTabsLeft) {
- // try to scroll all the way up
- this.mTabstrip.scrollByPixels((rows - maxRow) * this.mTabstrip.singleRowHeight);
- // get lastTabRowNumber after the scroll
- rows = this.lastTabRowNumber;
- }
-
- let multibar;
- if (rows == 1)
- multibar = null; // removeAttribute "multibar"
- else if (rows > maxRow)
- [multibar, rows] = ["scrollbar", maxRow];
- else
- multibar = "true"
-
- if (currentMultibar != multibar) {
- Tabmix.setItem(this, "multibar", multibar);
- Tabmix.setItem("TabsToolbar", "multibar", multibar);
- }
-
- this.setTabStripOrient();
- TabmixTabbar.setHeight(rows, aReset);
-
- if (this.mTabstrip.orient == "vertical")
- this.overflow = multibar == "scrollbar";
-
- if (!this.overflow) {
- // prevent new-tab-button on the right from flickering when new tabs animate is on.
- if (this.disAllowNewtabbutton && Services.prefs.getBoolPref("browser.tabs.animate")) {
- // after 250ms new tab is fully opened
- if (!this.adjustNewtabButtonTimeout) {
- let timeout = 250, callerName = Tabmix.callerName();
- if (callerName == "onxbloverflow") {
- let timeFromLastTabOpenedTime = Date.now() - Tabmix._lastTabOpenedTime;
- if (timeFromLastTabOpenedTime < 250)
- timeout = 0;
- }
- /**
- no need to change newTabButton visibility in order to calculate
- its position
- // Don't reset adjustNewtabButtonvisibility if multibar or rows
- // didn't changed or when we get here from _enterVerticalMode
- if (callerName != "_enterVerticalMode" &&
- (multibar != currentMultibar || rows != visibleRows))
- this.disAllowNewtabbutton = false;
- */
- let self = this;
- this.adjustNewtabButtonTimeout = setTimeout(function() {
- self.adjustNewtabButtonvisibility();
- self.adjustNewtabButtonTimeout = null;
- }, timeout);
- }
- }
- else
- this.adjustNewtabButtonvisibility();
- }
-
- this._inUpdateVerticalTabStrip = false;
- return multibar;
- ]]></body>
- </method>
-
- <method name="setTabStripOrient">
- <body><![CDATA[
- // we can't set dispaly:block and orient=vertical when widthFitTitle is false
- // and we are in one row.
- let vertical = TabmixTabbar.isMultiRow &&
- (TabmixTabbar.widthFitTitle || this.hasAttribute("multibar"));
- Tabmix.setItem(this.mTabstrip, "orient", vertical ? "vertical" : "horizontal");
- this.mTabstrip._isRTLScrollbox = !vertical && Tabmix.rtl;
- ]]></body>
- </method>
-
- <property name="overflow">
- <getter><![CDATA[
- return this.hasAttribute("overflow");
- ]]></getter>
- <setter><![CDATA[
- // don't do anything if other extensions set orient to vertical
- // when we arn't use it.
- if (!TabmixTabbar.isMultiRow && this.mTabstrip.orient == "vertical")
- return val;
-
- if (val != this.overflow) {
- if (val)
- this.setAttribute("overflow", "true");
- else
- this.removeAttribute("overflow");
- TabmixTabbar.showNewTabButtonOnSide(val, "right-side");
- this.mTabstrip.updateOverflow(val);
- }
- return val;
- ]]></setter>
- </property>
-
- <property name="canScrollTabsLeft" readonly="true"
- onget="return !this.mTabstrip._scrollButtonUp.disabled;"/>
-
- <property name="canScrollTabsRight" readonly="true"
- onget="return !this.mTabstrip._scrollButtonDown.disabled;"/>
-
- <property name="maxRow" readonly="true">
- <getter><![CDATA[
- var row = Tabmix.prefs.getIntPref("tabBarMaxRow");
- Tabmix.setItem(this.mTabstrip._scrollButtonDown, "notonbottom", (row > 2) || null);
- return row;
- ]]></getter>
- </property>
-
- <property name="visibleTabsFirstChild" readonly="true">
- <getter><![CDATA[
- var tabs = this.childNodes;
- for (let i = 0; i < tabs.length; i++){
- let tab = tabs[i];
- if (!tab.hidden && !tab.closing)
- return tab;
- }
- return this.selectedItem;
- ]]></getter>
- </property>
-
- <property name="visibleTabsLastChild" readonly="true">
- <getter><![CDATA[
- // we only need the last visible tab,
- // find it directly instead of using this.visibleTabs
- var tabs = this.childNodes;
- for (let i = tabs.length - 1; i >= 0; i--){
- let tab = tabs[i];
- if (!tab.hidden && !tab.closing)
- return tab;
- }
- return this.selectedItem;
- ]]></getter>
- </property>
-
- <!--
- check that we have enough room to show new tab button after the last tab in the current row
- we don't want the button to be on the next row when the tab is on the current row
- -->
- <method name="adjustNewtabButtonvisibility">
- <body><![CDATA[
- if (!TabmixTabbar.isMultiRow && this.mTabstrip.orient == "vertical")
- return;
-
- if (!this._checkNewtabButtonVisibility) {
- TabmixTabbar.showNewTabButtonOnSide(this.overflow, "right-side");
- return;
- }
-
- // when Private-tab enabled/disabled we need to reset
- // tabsNewtabButton and afterTabsButtonsWidth
- if (!Tabmix.tabsNewtabButton)
- Tabmix.getAfterTabsButtonsWidth();
-
- var lastTab = this.visibleTabsLastChild;
- // button is visible
- // A: last tab and the button are in the same row - check if we have room for the button in this row
- // B: last tab and the button are NOT in the same row - NG - hide the button
- if (!this.disAllowNewtabbutton) {
- let sameRow = TabmixTabbar.inSameRow(lastTab, Tabmix.tabsNewtabButton);
- if (sameRow) {
- let tabstripEnd = this.mTabstrip.scrollBoxObject.screenX + this.mTabstrip.scrollBoxObject.width;
- let buttonEnd = Tabmix.tabsNewtabButton.boxObject.screenX + Tabmix.tabsNewtabButton.boxObject.width
- this.disAllowNewtabbutton = buttonEnd > tabstripEnd;
- }
- else
- this.disAllowNewtabbutton = true;
- return;
- }
- // button is NOT visible
- // A: 2 last tabs are in the same row - check if we have room for the button in this row
- // B: 2 last tabs are NOT in the same row - check if we have room for the last tab + button
- // after previous to last tab.
- else {
- // ignor the case that this tab width is larger then the tabbar
- let previousTab = TMP_TabView.previousVisibleSibling(lastTab);
- if (!previousTab) {
- this.disAllowNewtabbutton = false;
- return;
- }
-
- // buttons that are not on TabsToolbar or not visible are null
- let newTabButtonWidth = function(aOnSide) {
- let width = 0, privatTabButton = TabmixTabbar.newPrivateTabButton();
- if (privatTabButton)
- width += aOnSide ? privatTabButton.boxObject.width : Tabmix.afterTabsButtonsWidth[1];
- if (Tabmix.sideNewTabButton)
- width += aOnSide ? Tabmix.sideNewTabButton.boxObject.width : Tabmix.afterTabsButtonsWidth[0];
- return width;
- }
- let tsbo = this.mTabstrip.scrollBoxObject;
- let tsboEnd = tsbo.screenX + tsbo.width + newTabButtonWidth(true);
- if (TabmixTabbar.inSameRow(lastTab, previousTab)) {
- let buttonEnd = lastTab.boxObject.screenX + lastTab.boxObject.width + newTabButtonWidth();
- this.disAllowNewtabbutton = buttonEnd > tsboEnd;
- return;
- }
- else {
- let lastTabEnd = previousTab.boxObject.screenX + previousTab.boxObject.width
- + lastTab.boxObject.width;
- // both last tab and new tab button are in the next row
- if (lastTabEnd > tsboEnd)
- this.disAllowNewtabbutton = false;
- else
- this.disAllowNewtabbutton = lastTabEnd + newTabButtonWidth() > tsboEnd;
- return;
- }
- }
- ]]></body>
- </method>
-
- <property name="disAllowNewtabbutton">
- <getter><![CDATA[
- return document.getElementById("TabsToolbar").getAttribute("tabmix-show-newtabbutton") == "temporary-right-side";
- ]]></getter>
- <setter><![CDATA[
- let newVal = this.overflow || val;
- TabmixTabbar.showNewTabButtonOnSide(this.overflow || val, "temporary-right-side");
- return newVal;
- ]]></setter>
- </property>
-
- <property name="topTabY" readonly="true">
- <getter><![CDATA[
- return this.tabstripInnerbox.boxObject.y + Tabmix.getStyle(this.tabstripInnerbox, "paddingTop");
- ]]></getter>
- </property>
-
- <property name="lastTabRowNumber" readonly="true">
- <getter><![CDATA[
- return this.getTabRowNumber(this.visibleTabsLastChild, this.topTabY);
- ]]></getter>
- </property>
-
- <method name="getTabRowNumber">
- <parameter name="aTab"/>
- <parameter name="aTop"/>
- <body><![CDATA[
-/*XXX we can use aTab.getBoundingClientRect().top if we do the same in topTabY */
- var height = aTab ? aTab.boxObject.height : 0;
- if (height == 0) // don't panic
- return 1;
- // some theme add marginTop/marginBottom to tabs
- var cStyle = window.getComputedStyle(aTab, null);
- var marginTop = parseInt(cStyle["marginTop"]) || 0;
- var marginBottom = parseInt(cStyle["marginBottom"]) || 0;
- height += marginTop + marginBottom;
-
- var tabBottom = aTab.boxObject.y - marginTop + height;
- return Math.round((tabBottom - aTop)/height);
- ]]></body>
- </method>
-
- <method name="initializeTabmixUI">
- <body><![CDATA[
- // https://addons.mozilla.org/EN-US/firefox/addon/vertical-tabs/
- // verticalTabs 0.9.1+ is restartless.
- if (typeof VerticalTabs == "object" && !Tabmix.extensions.verticalTabs) {
- Tabmix.setItem("TabsToolbar", "collapsed", null);
- Tabmix.extensions.verticalTabs = true;
- Tabmix.extensions.verticalTabBar = true;
- TabmixTabbar.updateSettings();
- }
-
- // tabbrowser-tabs constructor reset first tab label to New Tab
- this.tabbrowser.setTabTitle(this.firstChild);
- let position = Tabmix.prefs.getIntPref("newTabButton.position");
- if (position != 0)
- gTMPprefObserver.changeNewTabButtonSide(position);
-
- // need to add TabScope eventListener
- // need to find a way to do it for all extensions that add event to the tabstrip
- if ("TabScope" in window ) {
- TabScope.uninit();
- TabScope.init();
- }
-
- TabmixTabbar.flowing = this.getAttribute("flowing");
- this.setTabStripOrient();
- Tabmix.navToolbox.setScrollButtons(true);
-
- // fix incompatibility with Personal Titlebar extension
- // the extensions trigger tabbar binding reset on toolbars customize
- // we need to init our ui settings from here and again after customization
- if (Tabmix.navToolbox.customizeStarted) {
- TabmixTabbar.visibleRows = 1;
- TabmixTabbar.updateSettings(false);
- Tabmix.navToolbox.resetUI = true;
- }
- ]]></body>
- </method>
-
<method name="_notifyBackgroundTab">
<parameter name="aTab"/>
<body><![CDATA[
if (aTab.pinned)
return;
// Is the new tab already completely visible?
- if (this.mTabstrip.isElementVisible(aTab))
+ if (Tabmix.tabsUtils.isElementVisible(aTab))
return;
var scrollRect = this.mTabstrip.scrollClientRect;
@@ -779,7 +386,7 @@
if (!selected ||
!TabmixTabbar.isMultiRow && Math.max(tab.right - selected.left, selected.right - tab.left) <= scrollRect.width ||
TabmixTabbar.isMultiRow && Math.max(tab.bottom - selected.top, selected.bottom - tab.top) <= scrollRect.height) {
- if (this.overflow)
+ if (Tabmix.tabsUtils.overflow)
this.mTabstrip.ensureElementIsVisible(aTab);
return;
}
@@ -805,7 +412,7 @@
<method name="isTabVisible">
<parameter name="aIndex"/>
<body><![CDATA[
- return this.mTabstrip.isElementVisible(this.childNodes.item(aIndex));
+ return Tabmix.tabsUtils.isElementVisible(this.childNodes.item(aIndex));
]]></body>
</method>
<method name="ensureTabIsVisible">
@@ -818,7 +425,7 @@
</method>
<property name="lastTabVisible" readonly="true">
<getter><![CDATA[
- return this.mTabstrip.isElementVisible(this.visibleTabsLastChild);
+ return Tabmix.tabsUtils.isElementVisible(Tabmix.visibleTabs.last);
]]></getter>
</property>
@@ -826,51 +433,6 @@
<property name="realCollapsedTabs" readonly="true" onget="return 0;"/>
</implementation>
-
- <handlers>
- <handler event="MozMouseHittest" button="0" phase="capturing"><![CDATA[
- if (Tabmix.keyModifierDown || event.detail > 0)
- event.stopPropagation();
- ]]></handler>
-
- <handler event="dblclick" phase="capturing"><![CDATA[
- if (Tabmix.prefs.getBoolPref("tabbar.click_dragwindow") &&
- Tabmix.prefs.getBoolPref("tabbar.dblclick_changesize") &&
- !TabmixSvc.isMac && event.target.localName == "tabs") {
- let displayAppButton = !(document.getElementById("titlebar") || document.getElementById("appmenu-toolbar-button")).hidden;
- let tabsOnTop = !window.TabsOnTop || TabsOnTop.enabled;
- if (TabsInTitlebar.enabled ||
- (displayAppButton && tabsOnTop && this.parentNode._dragBindingAlive))
- return;
- }
- TabmixTabClickOptions.onTabBarDblClick(event);
- ]]></handler>
-
- <handler event="click" phase="capturing"><![CDATA[
- TabmixTabClickOptions.onTabClick(event);
- ]]></handler>
-
- <handler event="dragstart" phase="capturing"><![CDATA[
- if (this.useTabmixDragstart(event))
- TMP_tabDNDObserver.onDragStart(event);
- ]]></handler>
-
- <handler event="drop" phase="capturing"><![CDATA[
- if (this.useTabmixDnD(event))
- TMP_tabDNDObserver.onDrop(event);
- ]]></handler>
-
- <handler event="dragend" phase="capturing"><![CDATA[
- if (this.orient == "horizontal")
- TMP_tabDNDObserver.onDragEnd(event);
- ]]></handler>
-
- <handler event="dragexit" phase="capturing"><![CDATA[
- if (this.useTabmixDnD(event))
- TMP_tabDNDObserver.onDragExit(event);
- ]]></handler>
- </handlers>
-
</binding>
</bindings>
diff --git a/chrome/content/tabmix.js b/chrome/content/tabmix.js
index 8058982..003d241 100644
--- a/chrome/content/tabmix.js
+++ b/chrome/content/tabmix.js
@@ -128,8 +128,7 @@ Tabmix.getButtonsHeight = function() {
let stripIsHidden = TabmixTabbar.hideMode !== 0 && !tabBar.visible;
if (stripIsHidden)
tabBar.visible = true;
- this._buttonsHeight =
- tabBar.visibleTabsFirstChild.getBoundingClientRect().height;
+ this._buttonsHeight = Tabmix.visibleTabs.first.getBoundingClientRect().height;
if (stripIsHidden)
tabBar.visible = false;
}
@@ -637,6 +636,13 @@ var TMP_eventListener = {
if (!TabmixTabbar.widthFitTitle)
return;
+ // when browser.tabs.animate is true and a new tab is still opening we wait
+ // until onTabOpen_delayUpdateTabBar call updateScrollStatus
+ let lastTab = Services.prefs.getBoolPref("browser.tabs.animate") &&
+ gBrowser.getTabForLastPanel();
+ if (lastTab && !lastTab._fullyOpen)
+ return;
+
// catch tab width changed when label attribute changed
// or when busy attribute changed hide/show image
var tab = aEvent.target;
@@ -742,7 +748,7 @@ var TMP_eventListener = {
if (aReset)
Tabmix.tabsNewtabButton = null;
if (TabmixTabbar.isMultiRow) {
- gBrowser.tabContainer.updateVerticalTabStrip();
+ Tabmix.tabsUtils.updateVerticalTabStrip();
TabmixTabbar.setFirstTabInRow();
TabmixTabbar.updateBeforeAndAfter();
}
@@ -769,13 +775,13 @@ var TMP_eventListener = {
lastTimeTabOpened: 0,
onTabOpen_delayUpdateTabBar: function TMP_EL_onTabOpen_delayUpdateTabBar(aTab) {
let newTime = Date.now();
- if (gBrowser.tabContainer.overflow || newTime - this.lastTimeTabOpened > 200) {
+ if (Tabmix.tabsUtils.overflow || newTime - this.lastTimeTabOpened > 200) {
this.onTabOpen_updateTabBar(aTab);
this.lastTimeTabOpened = newTime;
}
else if (!this._onOpenTimeout) {
let self = this;
- let timeout = gBrowser.tabContainer.disAllowNewtabbutton &&
+ let timeout = Tabmix.tabsUtils.disAllowNewtabbutton &&
Services.prefs.getBoolPref("browser.tabs.animate") ? 0 : 200;
this._onOpenTimeout = window.setTimeout( function TMP_onOpenTimeout(tab) {
if (self._onOpenTimeout) {
@@ -794,7 +800,7 @@ var TMP_eventListener = {
return;
}
var tabBar = gBrowser.tabContainer;
- if (!tabBar.overflow) {
+ if (!Tabmix.tabsUtils.overflow) {
// we use it as a backup for overflow event and for the case that we have
// pinned tabs in multi-row
if (TabmixTabbar.isMultiRow && tabBar.mTabstrip.orient != "vertical")
@@ -832,8 +838,8 @@ var TMP_eventListener = {
// we would like to get early respond when row height is going to change.
var updateNow = !Services.prefs.getBoolPref("browser.tabs.animate");
if (!updateNow && tabBar.hasAttribute("multibar")) {
- let lastTab = tabBar.visibleTabsLastChild;
- if (!TabmixTabbar.inSameRow(lastTab, TMP_TabView.previousVisibleSibling(lastTab))) {
+ let lastTab = Tabmix.visibleTabs.last;
+ if (!TabmixTabbar.inSameRow(lastTab, Tabmix.visibleTabs.previous(lastTab))) {
updateNow = true;
// if the removed tab is single in its row hide it
if (lastTab == tab)
@@ -868,18 +874,18 @@ var TMP_eventListener = {
var tabBar = gBrowser.tabContainer;
function _updateTabstrip() {
if (tabBar.getAttribute("multibar") == "true" &&
- tabBar.lastTabRowNumber < TabmixTabbar.visibleRows)
- tabBar.updateVerticalTabStrip();
+ Tabmix.tabsUtils.lastTabRowNumber < TabmixTabbar.visibleRows)
+ Tabmix.tabsUtils.updateVerticalTabStrip();
TabmixTabbar.updateBeforeAndAfter();
}
// workaround when we remove last visible tab
- if (tabBar.firstChild.pinned && TabmixTabbar.isMultiRow && tabBar.overflow &&
- aTab._tPos >= tabBar.visibleTabsLastChild._tPos)
+ if (tabBar.firstChild.pinned && TabmixTabbar.isMultiRow && Tabmix.tabsUtils.overflow &&
+ aTab._tPos >= Tabmix.visibleTabs.last._tPos)
tabBar.mTabstrip.ensureElementIsVisible(gBrowser.selectedTab, false);
- if (tabBar.disAllowNewtabbutton)
- tabBar.adjustNewtabButtonvisibility();
+ if (Tabmix.tabsUtils.disAllowNewtabbutton)
+ Tabmix.tabsUtils.adjustNewtabButtonvisibility();
if (TabmixTabbar.isMultiRow && tabBar.hasAttribute("multibar")) {
_updateTabstrip();
setTimeout(function(){_updateTabstrip();}, 0);
@@ -1051,7 +1057,6 @@ var TMP_eventListener = {
}
this.toggleEventListener(gBrowser.tabContainer, this._tabEvents, false);
- gBrowser.tabContainer._tabmixPositionalTabs = null;
let alltabsPopup = document.getElementById("alltabs-popup");
if (alltabsPopup && alltabsPopup._tabmix_inited)
@@ -1079,6 +1084,8 @@ var TMP_eventListener = {
let mm = window.getGroupMessageManager("browsers");
mm.removeMessageListener("Tabmix:SetSyncHandler", this);
}
+
+ Tabmix.tabsUtils.onUnload();
},
// some theme not useing up to date Tabmix tab binding
@@ -1115,11 +1122,12 @@ var TMP_eventListener = {
* initialized yet
*/
Tabmix.initialization = {
- beforeStartup: {id: 0, obj: "Tabmix"},
- onContentLoaded: {id: 1, obj: "TMP_eventListener"},
- beforeBrowserInitOnLoad: {id: 2, obj: "Tabmix"},
- onWindowOpen: {id: 3, obj: "TMP_eventListener"},
- delayedStartup: {id: 4, obj: "Tabmix"},
+ init: {id: 0, obj: "Tabmix.tabsUtils"},
+ beforeStartup: {id: 1, obj: "Tabmix"},
+ onContentLoaded: {id: 2, obj: "TMP_eventListener"},
+ beforeBrowserInitOnLoad: {id: 3, obj: "Tabmix"},
+ onWindowOpen: {id: 4, obj: "TMP_eventListener"},
+ delayedStartup: {id: 5, obj: "Tabmix"},
get isValidWindow() {
/**
@@ -1136,11 +1144,6 @@ Tabmix.initialization = {
stopInitialization = tmp.SingleWindowModeUtils.newWindow(window);
}
- if (!stopInitialization) {
- let tabBrowser = arguments.length > 1 ? arguments[1] : gBrowser;
- stopInitialization = typeof tabBrowser.tabContainer.updateVerticalTabStrip != "function";
- }
-
if (stopInitialization) {
this.run = function() {};
window.removeEventListener("DOMContentLoaded", TMP_eventListener, false);
@@ -1158,6 +1161,11 @@ Tabmix.initialization = {
if (!this.isValidWindow)
return null;
let result, currentPhase = this[aPhase].id;
+ let getObj = function(list) {
+ let obj = window;
+ list.split(".").forEach(function(prop) {obj = obj[prop];});
+ return obj;
+ };
for (let key of Object.keys(this)) {
let phase = this[key];
if (phase.id > currentPhase)
@@ -1165,7 +1173,7 @@ Tabmix.initialization = {
if (!phase.initialized) {
phase.initialized = true;
try {
- let obj = window[phase.obj];
+ let obj = getObj(phase.obj);
result = obj[key].apply(obj, Array.slice(arguments, 1));
} catch (ex) {
Tabmix.assert(ex, phase.obj + "." + key + " failed");
diff --git a/chrome/content/utils.js b/chrome/content/utils.js
index f78d90d..0f1f145 100644
--- a/chrome/content/utils.js
+++ b/chrome/content/utils.js
@@ -31,7 +31,7 @@ var Tabmix = { // jshint ignore:line
setItem: function(aItemOrId, aAttr, aVal) {
var elem = typeof(aItemOrId) == "string" ? document.getElementById(aItemOrId) : aItemOrId;
if (elem) {
- if (aVal == null) {
+ if (aVal === null) {
elem.removeAttribute(aAttr);
return;
}
diff --git a/chrome/locale/ar/misc.dtd b/chrome/locale/ar/misc.dtd
new file mode 100644
index 0000000..28f324d
--- /dev/null
+++ b/chrome/locale/ar/misc.dtd
@@ -0,0 +1,17 @@
+<!ENTITY searchTabFocus.label "Load in background">
+<!ENTITY searchTabFocus.accesskey "B">
+<!ENTITY renametab.panel.title "تعديل عنوان اللسان">
+<!ENTITY renametab.reset.label "إعادة العنوان الأصلي">
+<!ENTITY title.label "العنوان">
+<!ENTITY default.label "الأصلي">
+<!ENTITY renametab.permanently.label "تغيير اسم هذا اللسان بغض النظر عن عنوانه">
+<!ENTITY renametab.permanently.tooltip "tab with history - the new name will remain when address changes">
+<!ENTITY forum.label "Forum">
+<!ENTITY faq.label "الأسئلة الشائعة">
+<!ENTITY help.label "مساعدة">
+<!ENTITY tabmix.label "تاب مٍكس بلس">
+<!ENTITY reloadtime.label1 "اختر الوقت من القوائم أدناه أو أدخِل الوقت مباشرة من لوحة المفاتيح">
+<!ENTITY specifyreload.label "حدد وقت إعادة التحميل">
+<!ENTITY sanitizer.entry "جلسات تاب مِكس بلس المحفوظة">
+<!ENTITY sanitizer.entry.accesskey "ت">
+<!ENTITY sanitizer.entry.confirm "هل أنت متأكد من رغبتك في مسح جميع بيانات جلساتك المحفوظة متضمنة النُسَخ الإحتياطية؟">
diff --git a/chrome/locale/ar/pref-appearance.dtd b/chrome/locale/ar/pref-appearance.dtd
new file mode 100644
index 0000000..78984b8
--- /dev/null
+++ b/chrome/locale/ar/pref-appearance.dtd
@@ -0,0 +1,18 @@
+<!ENTITY styles.label "أنماط مخصّصة">
+<!ENTITY currentTab.label "اللسان المختار">
+<!ENTITY unloadedTabs.label "الألسنة غير المحمّلة">
+<!ENTITY unreadTab.label "الألسنة غير المقروءة">
+<!ENTITY hideRGB.label "Hide RGB">
+<!ENTITY showRGB.label "Show RGB">
+<!ENTITY unreadAfterReload.label "set tab as unread after reload">
+<!ENTITY squaredTabs.label "Apply background color for squared tabs">
+<!ENTITY otherTabs.label "الألسنة الأخرى">
+<!ENTITY italic.label "مائل">
+<!ENTITY bold.label "عريض">
+<!ENTITY underline.label "خط سفلي">
+<!ENTITY textcolor.label "لون النص">
+<!ENTITY bgColor.label "لون الخلفية">
+<!ENTITY bgTopColor.label "top">
+<!ENTITY bgBottomColor.label "bottom">
+<!ENTITY useThis.label "استخدام هذا النمط لـ">
+<!ENTITY opacity.label "الإعتام">
diff --git a/chrome/locale/ar/pref-filetype.dtd b/chrome/locale/ar/pref-filetype.dtd
new file mode 100644
index 0000000..b72f2fb
--- /dev/null
+++ b/chrome/locale/ar/pref-filetype.dtd
@@ -0,0 +1,5 @@
+<!ENTITY filetype.options "محرّر أنواع الملفات">
+<!ENTITY filetype.add "أضِف">
+<!ENTITY filetype.edit "عدّل">
+<!ENTITY filetype.delete "احذف">
+<!ENTITY filetype.new "نوع ملف جديد:">
diff --git a/chrome/locale/en-US/pref-tabmix.dtd b/chrome/locale/ar/pref-tabmix.dtd
similarity index 52%
copy from chrome/locale/en-US/pref-tabmix.dtd
copy to chrome/locale/ar/pref-tabmix.dtd
index 36992f7..98c2ac6 100644
--- a/chrome/locale/en-US/pref-tabmix.dtd
+++ b/chrome/locale/ar/pref-tabmix.dtd
@@ -1,310 +1,308 @@
-<!ENTITY tab.links "Links">
-<!ENTITY tab.events "Events">
-<!ENTITY tab.mouse "Mouse">
-<!ENTITY tab.appearance "Display">
-<!ENTITY tab.menu "Menu">
-<!ENTITY tab.session "Session">
-<!ENTITY tab.incompatible "Error">
-<!ENTITY apply.label "Apply">
-<!ENTITY settings.export "Export Preferences">
-<!ENTITY settings.import "Import Preferences">
-<!ENTITY settings.sync "Sync Preferences">
-<!ENTITY settings.default "Restore Defaults">
-<!ENTITY generalWindowOpen.label "Open links that open in a new window in:">
-<!ENTITY externalLink.useSeparate.label "Use separate preference for links from other applications">
-<!ENTITY externalLinkTarget.label "Open links from other applications in:">
-<!ENTITY linkTarget.tab "New Tab">
-<!ENTITY linkTarget.window "New Window">
-<!ENTITY linkTarget.current "Current Tab">
-<!ENTITY linkTarget.accesskey "C">
-<!ENTITY divertedWindowOpen.label "JavaScript & Popup restriction:">
-<!ENTITY divertedWindowOpen.all "Open all popups in tabs">
-<!ENTITY divertedWindowOpen.some "Allows resized popups">
-<!ENTITY divertedWindowOpen.none "Allows all popups">
-<!ENTITY linkTarget.label "Open links with a target attribute in current tab">
-<!ENTITY download.label "Prevent blank tabs when downloading files">
-<!ENTITY edit.label "Edit">
-<!ENTITY speLink.label "Force to open in new tab:">
-<!ENTITY speLink.none "Nothing">
-<!ENTITY speLink.allLinks "All links">
-<!ENTITY speLink.external "Links to other sites">
-<!ENTITY singleWindow.label "Enable Single Window Mode">
-<!ENTITY newTabs.label "New Tabs">
-<!ENTITY tabOpen.label "Tab Opening">
-<!ENTITY tabFocus.label "Tab Focus">
-<!ENTITY tabClose.label "Tab Closing">
-<!ENTITY tabMerge.label "Tab Merging">
-<!ENTITY tabFeature.label "Tab Features">
-<!ENTITY newtab.label "Load on new tabs:">
-<!ENTITY replaceLastTabWith.label "When I close last tab replace it with">
-<!ENTITY newtab.blank "Blank Page">
-<!ENTITY newtab.home "Home Page">
-<!ENTITY newtab.current "Current Page">
-<!ENTITY newtab.duplicate "Duplicate Tab with history">
-<!ENTITY newtab.location.1 "New Tab Page">
-<!ENTITY newtab.placeholder.label "Default New Tab Page">
-<!ENTITY location.label.1 "Address">
-<!ENTITY focusContent.label "Focus content when loading non blank page">
-<!ENTITY openTabNext.label "Open new tabs next to current one">
-<!ENTITY openOtherTabNext.label "Open other tabs next to current one">
-<!ENTITY relatedAfterCurrent.label "Only if related to current tab">
-<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
-<!ENTITY openDuplicateNext.label "Open duplicated tabs next to original">
-<!ENTITY openTabNext.tooltip "[a][b][c][1][2][3] -> [a][3][2][1][b][c]">
-<!ENTITY openTabNextInverse.label "Change opening order">
-<!ENTITY openTabNextInverse.tooltip "[a][3][2][1][b][c] -> [a][1][2][3][b][c]">
-<!ENTITY openTabNextInverse.tooltip1 "Open new tab next to the tab last opened from the current tab (since it was last selected)">
-<!ENTITY lockTabs.label "Lock tabs">
-<!ENTITY lockNewTabs.label "Lock New tabs">
-<!ENTITY lockAppTabs.label "Lock App tabs">
-<!ENTITY updateLockState.label "Apply changes to open tabs">
-<!ENTITY openNewTab.label "Open tabs from:">
-<!ENTITY openBookmarks.label "Bookmarks">
-<!ENTITY openBMKGroups.label "Groups of bookmarks">
-<!ENTITY openBMKGroups.tooltip "Don't override tabs when opening a group of bookmarks">
-<!ENTITY openHistory.label "History">
-<!ENTITY openUrl.label "Address bar">
-<!ENTITY openSearch.label "Search bar">
-<!ENTITY middlecurrent1.label "Middle-click or Control-click opens items in current tab">
-<!ENTITY middlecurrent.tooltip "Only for bookmarks, history, links forced to open in new tab">
-<!ENTITY tabFocus.caption "Focus/Select tabs that open from:">
-<!ENTITY selectTab.label "Links">
-<!ENTITY selectDivertedTab.label "Diverted windows">
-<!ENTITY selectTabFromExternal.label "Other applications">
-<!ENTITY selectTabCommand.label "New tab commands">
-<!ENTITY contextMenuSearch.label "Context menu search for">
-<!ENTITY selectTabBH.label "Bookmarks/History">
-<!ENTITY duplicateTab.label "Duplicate Tab">
-<!ENTITY inversefocus1.label "Inverse Middle-click or Control-click focus of:">
-<!ENTITY warning.caption.label "Warning">
-<!ENTITY warnOnCloseProtected.label "Warn me when closing window with protected tabs">
-<!ENTITY warnOnCloseWindow.label "Warn me when closing window with multiple tabs">
-<!ENTITY lasttab.caption.label "Closing last tab">
-<!ENTITY keepWindow.label.3.1 "Do not close window when closing last tab">
-<!ENTITY keeptab.label "Prevent last tab from closing">
-<!ENTITY closeOnMerge.label "Close windows once they have merged">
-<!ENTITY warnOnMerge.label "Warn when closing tabs that aren't being merged">
-<!ENTITY currenttab.caption.label "Closing current tab">
-<!ENTITY focusTab.labelBegin "When closing current tab, focus:">
-<!ENTITY focusTab.firstTab "First tab">
-<!ENTITY focusTab.leftTab "Left tab">
-<!ENTITY focusTab.rightTab "Right tab">
-<!ENTITY focusTab.lastTab "Last tab">
-<!ENTITY focusTab.lastSelectedTab "Last selected tab">
-<!ENTITY focusTab.openerTab "Opener/right tab">
-<!ENTITY focusTab.openerTab.rtl "Opener/left tab">
-<!ENTITY focusTab.lastOpenedTab "Last opened tab">
-<!ENTITY undoClose.label "Enable undo close tabs">
-<!ENTITY undoCloseCache.label "Max number of closed tabs to remember:">
-<!ENTITY undoClosepos.label "Restore the tab's original position">
-<!ENTITY menuonlybutton.label "Make the toolbar button display only a list">
-<!ENTITY ctrltab.label "Ctrl-Tab navigates tabs in the most recently used order">
-<!ENTITY cmdtab.label "Cmd-Tab navigates tabs in the most recently used order">
-<!ENTITY ctrltab.tabPreviews "Show tab previews">
-<!ENTITY ctrltab.popup "Ctrl-Tab displays a tab list popup menu">
-<!ENTITY cmdtab.popup "Cmd-Tab displays a tab list popup menu">
-<!ENTITY tabpopup.mouse "Tab list responds to the mouse">
-<!ENTITY mergeNoTabSelection.label "Merge windows when no tabs are selected">
-<!ENTITY mergeTabSelection.label "Merging after selecting tabs">
-<!ENTITY mergeall.label "Merge all windows into one">
-<!ENTITY mergelastfocused.label "Merge only current window with last focused">
-<!ENTITY mergePopups.label "Also take popup windows">
-<!ENTITY popupNextToOpener.label "Place popups next to their openers">
-<!ENTITY activateSlideshow.label "Pressing #1 rotates tabs every">
-<!ENTITY toggleAnimation.label "Disable Open/Close tab animation">
-<!ENTITY reloadEvery.matchAddress.label "Reload a tab regardless of its address">
-<!ENTITY reloadEvery.onReloadButton.label "Show Reload Every menu on Reload button">
-<!ENTITY seconds.label "seconds">
-<!ENTITY minutes.label "min">
-<!ENTITY tabBarAppearance.label "Tab Bar">
-<!ENTITY tabAppearance.label "Tab">
-<!ENTITY toolBarAppearance.label "ToolBar">
-<!ENTITY show.ontabbar.label "Show on Tab bar">
-<!ENTITY show.ontab.label "Show on Tab">
-<!ENTITY dragNewTabButton.tooltip "Drag 'New Tab' button to your tab-bar to enable this option.">
-<!ENTITY hideTabBarButton.label "Close tab button">
-<!ENTITY newTabButton.label "New tab button">
-<!ENTITY newTabButton.posiotion.left.label "on Left side">
-<!ENTITY newTabButton.posiotion.right.label "on Right side">
-<!ENTITY newTabButton.posiotion.afterlast.label "After last tab">
-<!ENTITY allTabsButton.label "All tabs button">
-<!ENTITY tabBarSpace.label "Extra spaces on both sides">
-<!ENTITY tabBarSpace.tooltip "For clicking and dropping something on tab bar">
-<!ENTITY tabbar.label "Hide tab bar when only one tab is open">
-<!ENTITY moveTabOnDragging.label "When dragging a tab move it directly">
-<!ENTITY dropIndicator.label "Drop indicator">
-<!ENTITY dropIndicator-native.label "Native style">
-<!ENTITY dropIndicator-builtin.label "Built-in style">
-<!ENTITY verticalTabbar.description "Use treeStyleTab or VerticalTab extension to control these preferences.">
-<!ENTITY tabBarPosition.label "Position:">
-<!ENTITY tabBarPosition.top.label "Top (above content)">
-<!ENTITY tabBarPosition.bottom.label "Bottom (below content)">
-<!ENTITY tabScroll.label "When tabs don't fit width:">
-<!ENTITY tabScroll.none "Scrollable without buttons">
-<!ENTITY tabScroll.leftRightButtons "Scrollable with buttons on both sides">
-<!ENTITY tabScroll.rightButtons "Scrollable with buttons on right side">
-<!ENTITY tabScroll.rightButtons.rtl "Scrollable with buttons on left side">
-<!ENTITY tabScroll.multibar "Multi-row">
-<!ENTITY maxrow.label "Max number of rows to display:">
-<!ENTITY offsetAmountToScroll.label "When scrolling show part of next out-of-sight tab">
-<!ENTITY smoothScroll.label "Enable smooth scroll">
-<!ENTITY scrolldelay.label "Scroll Delay (time between scroll repetition)">
-<!ENTITY highlight.label "Highlight">
-<!ENTITY currenttab.style.label "Current tab">
-<!ENTITY unloadedtabs.style.label "Unloaded tabs">
-<!ENTITY unreadtabs.style.label "Unread tabs">
-<!ENTITY othertabs.style.label "Other tabs">
-<!ENTITY setstyles.label "Customize Styles">
-<!ENTITY extraIcons.label1 "Icons for">
-<!ENTITY extraIcons.locked "Locked">
-<!ENTITY extraIcons.protected "Protected">
-<!ENTITY extraIcons.autoreload "Auto Reload">
-<!ENTITY extraIcons.hideonpinned "Hide on pinned tabs">
-<!ENTITY progressMeter.label "Progress meter on tabs">
-<!ENTITY showTabX.labelBegin "Close tab button">
-<!ENTITY showTabX.left "Place on left side">
-<!ENTITY showTabX.rtl "Place on right side">
-<!ENTITY milliseconds.label "msec">
-<!-- LOCALIZATION NOTE
- change this only if you need to change the width -->
-<!ENTITY showTabX.popup.width "13em">
-<!ENTITY showTabX.always "on all">
-<!ENTITY showTabX.current "on current">
-<!ENTITY showTabX.hover "on pointed for">
-<!ENTITY showTabX.alwaysExeption "on all tabs wider than">
-<!ENTITY showTabX.currentHover "on current & pointed for">
-<!ENTITY minWidth.label "Tab Width:">
-<!ENTITY widthTo.label "to">
-<!ENTITY widthPixels.label "pixels">
-<!ENTITY flexTabs.label "Tab width fits to tab title">
-<!ENTITY bookastitle.label "Use bookmark name as tab title">
-<!-- LOCALIZATION NOTE:
- change this only if you need to change the width -->
-<!ENTITY toolbar.description.width "21em">
-<!ENTITY toolbar.description "You can customize which Tab Mix Plus buttons to show in your Toolbar">
-<!ENTITY toolbar.button.label "Customize">
-<!ENTITY toolbar.visible.caption "Visible buttons">
-<!ENTITY toolbar.novisible.label "There are no visible buttons">
-<!ENTITY toolbar.hidden.caption "Hidden buttons">
-<!ENTITY toolbar.nohidden.label "There are no hidden buttons">
-<!ENTITY mouseGesture.label "Mouse Gestures">
-<!ENTITY mouseClick.label "Mouse Clicking">
-<!ENTITY mouseHoverSelect.labelBegin "Select tab pointed for">
-<!ENTITY tabFlip.label "Switch to last selected tab when clicking current one">
-<!ENTITY tabFlip.delay "Use a delay of">
-<!ENTITY clickFocus.label "Mouse click (down and release) to select a tab">
-<!ENTITY removeEntries.label "Remove Tab Mix Plus menu list entries using middle-click">
-<!ENTITY lockTabSizingOnClose.label "When closing a tab, other tabs should not resize until cursor leaves toolbar region">
-<!ENTITY removeEntries.tooltip "Includes closed tabs, closed windows, and saved sessions">
-<!ENTITY tabbarscrolling.caption "When scrolling over the tab-bar">
-<!ENTITY tabbarscrolling.holdShift.label "Hold Shift while scrolling to switch between these options">
-<!ENTITY tabbarscrolling.selectTab.label "Change selected tab">
-<!ENTITY tabbarscrolling.scrollAllTabs.label "Scroll all tabs">
-<!ENTITY tabbarscrolling.inverse.label "Inverse scroll direction">
-<!ENTITY double.label "Double-click">
-<!ENTITY middle.label "Middle-click">
-<!ENTITY ctrl.label "Ctrl-click">
-<!ENTITY cmd.label "Cmd-Click">
-<!ENTITY shift.label "Shift-click">
-<!ENTITY alt.label "Alt-Click">
-<!ENTITY ontab.label "on a tab:">
-<!ENTITY ontabbar.label "on the tabbar:">
-<!ENTITY clicktab.label "Choose command to perform when clicking on tab or tabbar">
-<!ENTITY ontabbar.dblClick.label "Prevent double click on Tab-bar from changing window size.">
-<!ENTITY ontabbar.click.label "Prevent clicking on Tab-bar from dragging the window.">
-<!ENTITY clicktab.default "Firefox default or other extension">
-<!ENTITY clicktab.nothing "Does nothing">
-<!ENTITY clicktab.addtab "Open a new tab">
-<!ENTITY clicktab.duplicatetab "Duplicates the tab">
-<!ENTITY clicktab.duplicatetabw "Duplicates the tab in a new window">
-<!ENTITY clicktab.detachtab "Move the tab to a new window">
-<!ENTITY clicktab.protecttab "Protects the tab">
-<!ENTITY clicktab.locktab "Locks the tab">
-<!ENTITY clicktab.freezetab "Protects and Locks the tab">
-<!ENTITY clicktab.renametab "Renames the tab">
-<!ENTITY clicktab.copyTabUrl "Copies the tab's URL to the clipboard">
-<!ENTITY clicktab.copyUrlFromClipboard "Load URL from clipboard">
-<!ENTITY clicktab.selectMerge "Selects the tab for merging">
-<!ENTITY clicktab.mergeTabs "Merges windows together">
-<!ENTITY clicktab.bookTab "Bookmarks the tab">
-<!ENTITY clicktab.bookTabs "Bookmarks all tabs">
-<!ENTITY clicktab.reloadtab "Reloads the tab">
-<!ENTITY clicktab.reloadtabs "Reloads all tabs">
-<!ENTITY clicktab.reloadothertabs "Reloads other tabs">
-<!ENTITY clicktab.reloadlefttabs "Reloads left tabs">
-<!ENTITY clicktab.reloadrighttabs "Reloads right tabs">
-<!ENTITY clicktab.autoReloadTab "Activate/Deactivate tab auto reload">
-<!ENTITY clicktab.removeall "Close all tabs">
-<!ENTITY clicktab.removeother "Close other tabs">
-<!ENTITY clicktab.removesimilar "Close tabs from similar domain">
-<!ENTITY clicktab.removetoLeft "Close Tabs to the Left">
-<!ENTITY clicktab.removetoRight "Close Tabs to the Right">
-<!ENTITY clicktab.uctab "Reopens last closed tab">
-<!ENTITY clicktab.ucatab "Reopens all closed tabs">
-<!ENTITY clicktab.snapback "SnapBack Tab">
-<!ENTITY clicktab.ietab "Opens the tab in IE">
-<!ENTITY contentLoad "Middle-click loads url from clipboard">
-<!ENTITY context.tab "Tab Context Menu">
-<!ENTITY context.main "Main Context Menu">
-<!ENTITY context.tools "Tools Menu">
-<!ENTITY showtabBarContext.label "Show in Tab Context Menu">
-<!ENTITY showContentAreaContext.label "Show in Main Context Menu">
-<!ENTITY showToolsMenu.label "Show in Tools Menu">
-<!ENTITY startupHomePage.label "Show my home page">
-<!ENTITY startupBlankPage.label "Show a blank page">
-<!ENTITY startupLastSession.label "Show my windows and tabs from last time">
-<!ENTITY sm.extension.description1 "Tab Mix Plus detect that Session Manager Extension is installed">
-<!ENTITY sm.extension.description2 "Tab Mix Plus session manager will be disabled">
-<!ENTITY sm.extension.description3 "You can click the button on the right to open Session Manager Options dialog">
-<!ENTITY sm.extension.description4 "Convert My sessions data from Tab Mix Plus format to Session Manager extension format">
-<!ENTITY sm.extension.convert.label "Convert">
-<!ENTITY sm.extension.chooseFile.label0 "Let me choose which data file to convert">
-<!ENTITY sm.extension.chooseFile.label1 "Convert Tab Mix Plus sessions from the current profile">
-<!ENTITY ss.enable.label "Use Firefox's built-in Session Restore feature">
-<!ENTITY ss.enable.tooltip "Uncheck to allow the use with Tab Mix Plus Session Manager">
-<!ENTITY ss.advanced_setting "Advanced Setting">
-<!ENTITY ss.advanced_setting.warning "Don't change these, unless you know what you're doing">
-<!ENTITY ss.interval "Minimum time interval between two state saves">
-<!ENTITY ss.interval.seconds "(in milliseconds)">
-<!ENTITY ss.privacy_level "Save sensitive data (form data, POSTDATA and cookies) for">
-<!ENTITY ss.privacy_level.allsites "All sites">
-<!ENTITY ss.privacy_level.unencrypted "Unencrypted sites only">
-<!ENTITY ss.privacy_level.nosites "No sites at all">
-<!ENTITY ss.postdata.label1 "Maximum amount of POSTDATA to be stored">
-<!ENTITY ss.postdata.label2 "(in bytes, -1 = all of it)">
-<!ENTITY sessionManger.enable "Enable Session Manager">
-<!ENTITY crashRecovery.enable "Enable Crash Recovery">
-<!ENTITY sm.StartExit "Start/Exit">
-<!ENTITY sm.restore "Restore">
-<!ENTITY sm.preserve "Preserve">
-<!ENTITY sm.start "When Browser Starts:">
-<!ENTITY sm.start.restore "Restore">
-<!ENTITY sm.start.ask "Ask Before Restoring">
-<!ENTITY sm.start.nothing "Don't Restore">
-<!ENTITY sm.exit "When Browser Exits:">
-<!ENTITY sm.exit.save "Save Session">
-<!ENTITY sm.exit.ask "Ask Before Saving">
-<!ENTITY sm.exit.nothing "Don't Save">
-<!ENTITY sm.startup "Startup Session:">
-<!ENTITY sm.lastsession "Last Session">
-<!ENTITY sm.previouslast "Previous to Last">
-<!ENTITY sm.chooseifempty "Choose another if empty">
-<!ENTITY sm.restore.options "When Restoring Sessions:">
-<!ENTITY sm.restore.overwrite "Overwrite existing windows">
-<!ENTITY sm.restore.overwriteTabs "And tabs">
-<!ENTITY sm.restore.closedWinList "Save windows in closed windows list">
-<!ENTITY sm.restore.merge "Join multiple windows into one">
-<!ENTITY sm.restore.bypassCache "Bypass cache when restoring">
-<!ENTITY sm.notrestore.label "When not restoring on start">
-<!ENTITY sm.restorePinned.label "Restore my pinned tabs from last time">
-<!ENTITY sm.preserve.options "Preserve Tabs:">
-<!ENTITY sm.preserve.history "History">
-<!ENTITY sm.preserve.protect "Protect Status">
-<!ENTITY sm.preserve.locked "Lock Status">
-<!ENTITY sm.preserve.permission "Permissions">
-<!ENTITY sm.preserve.scroll1 "Scroll Position">
-<!ENTITY sm.restore.winOptions "Preserve Windows:">
-<!ENTITY sm.restore.selectedTab "Selected tab">
-<!ENTITY sm.restore.closedTabs "Closed tabs list">
-<!ENTITY incompatible.extensions "Some of your extensions are incompatible with Tab Mix Plus, it is recommended that you will disable or uninstall those extensions.">
-<!ENTITY incompatible.button.label "Show List">
+<!ENTITY tab.links "الروابط">
+<!ENTITY tab.events "الأحداث">
+<!ENTITY tab.mouse "الفأرة">
+<!ENTITY tab.appearance "العرض">
+<!ENTITY tab.menu "القوائم">
+<!ENTITY tab.session "الجلسة">
+<!ENTITY tab.incompatible "خطأ">
+<!ENTITY apply.label "طبّق">
+<!ENTITY settings.export "صدّر الإعدادات">
+<!ENTITY settings.import "استورد الإعدادات">
+<!ENTITY settings.sync "Sync Preferences">
+<!ENTITY settings.default "استعد الإعدادات المبدئية">
+<!ENTITY generalWindowOpen.label "فتح الروابط التي تُفتح في نافذة جديدة في:">
+<!ENTITY externalLink.useSeparate.label "استخدام تفضيل منفصل للروابط القادمة من تطبيقات أخرى">
+<!ENTITY externalLinkTarget.label "فتح الروابط القادمة من تطبيقات أخرى في:">
+<!ENTITY linkTarget.tab "لسان جديد">
+<!ENTITY linkTarget.window "نافذة جديدة">
+<!ENTITY linkTarget.current "اللسان الحالي">
+<!ENTITY linkTarget.accesskey "ح">
+<!ENTITY divertedWindowOpen.label "JavaScript & Popup restriction:">
+<!ENTITY divertedWindowOpen.all "فتح جميع النوافذ المنبثقة في ألسنة">
+<!ENTITY divertedWindowOpen.some "السماح بتحجيم النوافذ المنبثقة">
+<!ENTITY divertedWindowOpen.none "السماح بجميع النوافذ المنبثقة">
+<!ENTITY linkTarget.label "Open links with a target attribute in current tab">
+<!ENTITY download.label "منع الألسنة الفارغة عند تنزيل ملفات">
+<!ENTITY edit.label "عدّل">
+<!ENTITY speLink.label "الإجبار على الفتح في لسان جديد:">
+<!ENTITY speLink.none "لا شيء">
+<!ENTITY speLink.allLinks "جميع الروابط">
+<!ENTITY speLink.external "الروابط المؤدية لمواقع أخرى">
+<!ENTITY singleWindow.label "تفعيل نمط النافذة الموحدة">
+<!ENTITY newTabs.label "الألسنة الجديدة">
+<!ENTITY tabOpen.label "فتح الألسنة">
+<!ENTITY tabFocus.label "Tab Focus">
+<!ENTITY tabClose.label "إغلاق الألسنة">
+<!ENTITY tabMerge.label "دمج الألسنة">
+<!ENTITY tabFeature.label "ميزات الألسنة">
+<!ENTITY newtab.label "تحميل في اللسان الجديد:">
+<!ENTITY replaceLastTabWith.label "عندما أقوم بإغلاق آخر لسان استبدله بـ">
+<!ENTITY newtab.blank "صفحة فارغة">
+<!ENTITY newtab.home "صفحة بداية فيرفكس">
+<!ENTITY newtab.current "الصفحة المُختارة">
+<!ENTITY newtab.duplicate "تكرار الصفحة المختارة مع تأريخها">
+<!ENTITY newtab.location.1 "صفحة لسان جديد">
+<!ENTITY newtab.placeholder.label "Default New Tab Page">
+<!ENTITY location.label.1 "العنوان">
+<!ENTITY focusContent.label "Focus content when loading non blank page">
+<!ENTITY openTabNext.label "فتح اللسان الجديد بجوار اللسان المختار">
+<!ENTITY openOtherTabNext.label "فتح الألسنة الأخرى بجوار اللسان المختار">
+<!ENTITY relatedAfterCurrent.label "فقط إذا كان له علاقة باللسان المختار">
+<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
+<!ENTITY openDuplicateNext.label "فتح الألسنة المكرّرة بجوار الأصلية">
+<!ENTITY openTabNext.tooltip "[a][b][c][1][2][3] -> [a][3][2][1][b][c]">
+<!ENTITY openTabNextInverse.label "تغيير ترتيب الفتح">
+<!ENTITY openTabNextInverse.tooltip "[a][3][2][1][b][c] -> [a][1][2][3][b][c]">
+<!ENTITY openTabNextInverse.tooltip1 "فتح اللسان الجديد بجوار اللسان المفتوح مؤخرا من اللسان الحالي">
+<!ENTITY lockTabs.label "إيصاد الألسنة">
+<!ENTITY lockNewTabs.label "إيصاد الألسنة الجديدة">
+<!ENTITY lockAppTabs.label "إيصاد الألسنة المُثبّتة">
+<!ENTITY updateLockState.label "Apply changes to open tabs">
+<!ENTITY openNewTab.label "فتح ألسنة من:">
+<!ENTITY openBookmarks.label "العلامات">
+<!ENTITY openBMKGroups.label "مجموعات من العلامات">
+<!ENTITY openBMKGroups.tooltip "عدم تجاهل ألسنة عند فتح مجموعة من العلامات">
+<!ENTITY openHistory.label "التأريخ">
+<!ENTITY openUrl.label "شريط العنوان">
+<!ENTITY openSearch.label "شريط البحث">
+<!ENTITY middlecurrent1.label "Middle-click or Control-click opens items in current tab">
+<!ENTITY middlecurrent.tooltip "Only for bookmarks, history, links forced to open in new tab">
+<!ENTITY tabFocus.caption "Focus/Select tabs that open from:">
+<!ENTITY selectTab.label "الروابط">
+<!ENTITY selectDivertedTab.label "Diverted windows">
+<!ENTITY selectTabFromExternal.label "Other applications">
+<!ENTITY selectTabCommand.label "New tab commands">
+<!ENTITY contextMenuSearch.label "Context menu search for">
+<!ENTITY selectTabBH.label "العلامات/التأريخ">
+<!ENTITY duplicateTab.label "Duplicate Tab">
+<!ENTITY inversefocus1.label "Inverse Middle-click or Control-click focus of:">
+<!ENTITY warning.caption.label "التنبيه">
+<!ENTITY warnOnCloseProtected.label "نبهني عند إغلاق نافذة تحتوي ألسنة محمية">
+<!ENTITY warnOnCloseWindow.label "نبهني عند إغلاق نافذة تحتوي عدة ألسنة">
+<!ENTITY lasttab.caption.label "إغلاق اللسان الأخير">
+<!ENTITY keepWindow.label.3.1 "لا تغلق النافذة عند إغلاق اللسان الأخير">
+<!ENTITY keeptab.label "منع اللسان الأخير من الانغلاق">
+<!ENTITY closeOnMerge.label "إغلاق النوافذ بمجرد دمجها">
+<!ENTITY warnOnMerge.label "التنبيه عند إغلاق ألسنة غير مُدمجة">
+<!ENTITY currenttab.caption.label "إغلاق اللسان الحالي">
+<!ENTITY focusTab.labelBegin "عند إغلاق اللسان الحالي، انتقل إلى:">
+<!ENTITY focusTab.firstTab "اللسان الأول">
+<!ENTITY focusTab.leftTab "اللسان الأيسر">
+<!ENTITY focusTab.rightTab "اللسان الأيمن">
+<!ENTITY focusTab.lastTab "اللسان الأخير">
+<!ENTITY focusTab.lastSelectedTab "آخر لسان مختار">
+<!ENTITY focusTab.openerTab "Opener/right tab">
+<!ENTITY focusTab.openerTab.rtl "Opener/left tab">
+<!ENTITY focusTab.lastOpenedTab "أخر لسان مفتوح">
+<!ENTITY undoClose.label "Enable undo close tabs">
+<!ENTITY undoCloseCache.label "Max number of closed tabs to remember:">
+<!ENTITY undoClosepos.label "Restore the tab's original position">
+<!ENTITY menuonlybutton.label "Make the toolbar button display only a list">
+<!ENTITY ctrltab.label "Ctrl-Tab navigates tabs in the most recently used order">
+<!ENTITY cmdtab.label "Cmd-Tab navigates tabs in the most recently used order">
+<!ENTITY ctrltab.tabPreviews "عرض معاينة للسان">
+<!ENTITY ctrltab.popup "Ctrl-Tab displays a tab list popup menu">
+<!ENTITY cmdtab.popup "Cmd-Tab displays a tab list popup menu">
+<!ENTITY tabpopup.mouse "Tab list responds to the mouse">
+<!ENTITY mergeNoTabSelection.label "Merge windows when no tabs are selected">
+<!ENTITY mergeTabSelection.label "Merging after selecting tabs">
+<!ENTITY mergeall.label "دمج جميع النوافذ في نافذة واحدة">
+<!ENTITY mergelastfocused.label "دمج النافذة الحالية فقط مع آخر نافذة مختارة">
+<!ENTITY mergePopups.label "Also take popup windows">
+<!ENTITY popupNextToOpener.label "Place popups next to their openers">
+<!ENTITY activateSlideshow.label "Pressing #1 rotates tabs every">
+<!ENTITY toggleAnimation.label "Disable Open/Close tab animation">
+<!ENTITY reloadEvery.matchAddress.label "Reload a tab regardless of its address">
+<!ENTITY reloadEvery.onReloadButton.label "Show Reload Every menu on Reload button">
+<!ENTITY seconds.label "ثانية\ثوان">
+<!ENTITY minutes.label "دقيقة\دقائق">
+<!ENTITY tabBarAppearance.label "شريط الألسنة">
+<!ENTITY tabAppearance.label "اللسان">
+<!ENTITY toolBarAppearance.label "شريط الأدوات">
+<!ENTITY show.ontabbar.label "اعرض في شريط الألسنة">
+<!ENTITY show.ontab.label "اعرض في اللسان">
+<!ENTITY dragNewTabButton.tooltip "Drag 'New Tab' button to your tab-bar to enable this option.">
+<!ENTITY hideTabBarButton.label "زر غلق اللسان">
+<!ENTITY newTabButton.label "زر فتح لسان جديد">
+<!ENTITY newTabButton.posiotion.left.label "في الجانب الأيسر">
+<!ENTITY newTabButton.posiotion.right.label "في الجانب الأيمن">
+<!ENTITY newTabButton.posiotion.afterlast.label "بعد اللسان الأخير">
+<!ENTITY allTabsButton.label "جميع أزرار الألسنة">
+<!ENTITY tabBarSpace.label "مساحة إضافية في كلا الجانبين">
+<!ENTITY tabBarSpace.tooltip "For clicking and dropping something on tab bar">
+<!ENTITY tabbar.label "Hide tab bar when only one tab is open">
+<!ENTITY moveTabOnDragging.label "When dragging a tab move it directly">
+<!ENTITY dropIndicator.label "Drop indicator">
+<!ENTITY dropIndicator-native.label "Native style">
+<!ENTITY dropIndicator-builtin.label "Built-in style">
+<!ENTITY verticalTabbar.description "Use treeStyleTab or VerticalTab extension to control these preferences.">
+<!ENTITY tabBarPosition.label "الموضع:">
+<!ENTITY tabBarPosition.top.label "علوي (فوق المحتوى)">
+<!ENTITY tabBarPosition.bottom.label "سفلي (تحت المحتوى)">
+<!ENTITY tabScroll.label "عندما لا تلائم الألسنة العرض:">
+<!ENTITY tabScroll.none "يمكن تمريرها دون ظهور أزرار">
+<!ENTITY tabScroll.leftRightButtons "يمكن تمريرها مع ظهور أزرار">
+<!ENTITY tabScroll.rightButtons "يمكن تمريرها مع ظهور أزرار على اليمين">
+<!ENTITY tabScroll.rightButtons.rtl "يمكن تمريرها مع ظهور أزرار على اليسار">
+<!ENTITY tabScroll.multibar "أظهر الألسنة في صفوف متعددة">
+<!ENTITY maxrow.label "أقصى عدد صفوف يمكن عرضه:">
+<!ENTITY offsetAmountToScroll.label "When scrolling show part of next out-of-sight tab">
+<!ENTITY smoothScroll.label "تفعيل التمرير السلس">
+<!ENTITY scrolldelay.label "مُهلة التمرير (الوقت بين تكرار التمرير)">
+<!ENTITY highlight.label "الإبراز والتمييز">
+<!ENTITY currenttab.style.label "اللسان المختار">
+<!ENTITY unloadedtabs.style.label "الألسنة غير المحملة">
+<!ENTITY unreadtabs.style.label "الألسنة غير المقروءة">
+<!ENTITY othertabs.style.label "الألسنة الأخرى">
+<!ENTITY setstyles.label "تخصيص الأنماط">
+<!ENTITY extraIcons.label1 "أيقونات">
+<!ENTITY extraIcons.locked "القفل">
+<!ENTITY extraIcons.protected "الحماية">
+<!ENTITY extraIcons.autoreload "إعادة التحميل التلقائي">
+<!ENTITY extraIcons.hideonpinned "Hide on pinned tabs">
+<!ENTITY progressMeter.label "شريط التحميل على الألسنة">
+<!ENTITY showTabX.labelBegin "زر إغلاق اللسان">
+<!ENTITY showTabX.left "إظهار زر الإغلاق في اليسار">
+<!ENTITY showTabX.rtl "إظهار زر الإغلاق في اليمين">
+<!ENTITY milliseconds.label "مللي ثانية">
+<!-- LOCALIZATION NOTE change this only if you need to change the width -->
+<!ENTITY showTabX.popup.width "13em">
+<!ENTITY showTabX.always "على الكل">
+<!ENTITY showTabX.current "على المختار">
+<!ENTITY showTabX.hover "on pointed for">
+<!ENTITY showTabX.alwaysExeption "on all tabs wider than">
+<!ENTITY showTabX.currentHover "on current & pointed for">
+<!ENTITY minWidth.label "عرض اللسان:">
+<!ENTITY widthTo.label "إلى">
+<!ENTITY widthPixels.label "بكسل">
+<!ENTITY flexTabs.label "عرض اللسان يلائم عنوان اللسان">
+<!ENTITY bookastitle.label "استخدام اسم العلامة كعنوان للسان">
+<!-- LOCALIZATION NOTE: change this only if you need to change the width -->
+<!ENTITY toolbar.description.width "21em">
+<!ENTITY toolbar.description "You can customize which Tab Mix Plus buttons to show in your Toolbar">
+<!ENTITY toolbar.button.label "تخصيص">
+<!ENTITY toolbar.visible.caption "الأزرار الظاهرة">
+<!ENTITY toolbar.novisible.label "ليس هناك أزرار ظاهرة">
+<!ENTITY toolbar.hidden.caption "الأزرار المخفية">
+<!ENTITY toolbar.nohidden.label "ليس هناك أزرار مخفية">
+<!ENTITY mouseGesture.label "إيماءات الفأرة">
+<!ENTITY mouseClick.label "النقر بالفأرة">
+<!ENTITY mouseHoverSelect.labelBegin "Select tab pointed for">
+<!ENTITY tabFlip.label "Switch to last selected tab when clicking current one">
+<!ENTITY tabFlip.delay "Use a delay of">
+<!ENTITY clickFocus.label "Mouse click (down and release) to select a tab">
+<!ENTITY removeEntries.label "Remove Tab Mix Plus menu list entries using middle-click">
+<!ENTITY lockTabSizingOnClose.label "When closing a tab, other tabs should not resize until cursor leaves toolbar region">
+<!ENTITY removeEntries.tooltip "Includes closed tabs, closed windows, and saved sessions">
+<!ENTITY tabbarscrolling.caption "When scrolling over the tab-bar">
+<!ENTITY tabbarscrolling.holdShift.label "Hold Shift while scrolling to switch between these options">
+<!ENTITY tabbarscrolling.selectTab.label "Change selected tab">
+<!ENTITY tabbarscrolling.scrollAllTabs.label "Scroll all tabs">
+<!ENTITY tabbarscrolling.inverse.label "عكس اتجاه التمرير">
+<!ENTITY double.label "نقر مزدوج">
+<!ENTITY middle.label "نقر بالزر الأوسط">
+<!ENTITY ctrl.label "Ctrl-click">
+<!ENTITY cmd.label "Cmd-Click">
+<!ENTITY shift.label "Shift-click">
+<!ENTITY alt.label "Alt-Click">
+<!ENTITY ontab.label "on a tab:">
+<!ENTITY ontabbar.label "on the tabbar:">
+<!ENTITY clicktab.label "Choose command to perform when clicking on tab or tabbar">
+<!ENTITY ontabbar.dblClick.label "Prevent double click on Tab-bar from changing window size.">
+<!ENTITY ontabbar.click.label "Prevent clicking on Tab-bar from dragging the window.">
+<!ENTITY clicktab.default "Firefox default or other extension">
+<!ENTITY clicktab.nothing "Does nothing">
+<!ENTITY clicktab.addtab "Open a new tab">
+<!ENTITY clicktab.duplicatetab "Duplicates the tab">
+<!ENTITY clicktab.duplicatetabw "Duplicates the tab in a new window">
+<!ENTITY clicktab.detachtab "Move the tab to a new window">
+<!ENTITY clicktab.protecttab "Protects the tab">
+<!ENTITY clicktab.locktab "Locks the tab">
+<!ENTITY clicktab.freezetab "Protects and Locks the tab">
+<!ENTITY clicktab.renametab "Renames the tab">
+<!ENTITY clicktab.copyTabUrl "Copies the tab's URL to the clipboard">
+<!ENTITY clicktab.copyUrlFromClipboard "Load URL from clipboard">
+<!ENTITY clicktab.selectMerge "Selects the tab for merging">
+<!ENTITY clicktab.mergeTabs "Merges windows together">
+<!ENTITY clicktab.bookTab "Bookmarks the tab">
+<!ENTITY clicktab.bookTabs "Bookmarks all tabs">
+<!ENTITY clicktab.reloadtab "Reloads the tab">
+<!ENTITY clicktab.reloadtabs "Reloads all tabs">
+<!ENTITY clicktab.reloadothertabs "Reloads other tabs">
+<!ENTITY clicktab.reloadlefttabs "Reloads left tabs">
+<!ENTITY clicktab.reloadrighttabs "Reloads right tabs">
+<!ENTITY clicktab.autoReloadTab "Activate/Deactivate tab auto reload">
+<!ENTITY clicktab.removeall "Close all tabs">
+<!ENTITY clicktab.removeother "Close other tabs">
+<!ENTITY clicktab.removesimilar "Close tabs from similar domain">
+<!ENTITY clicktab.removetoLeft "Close Tabs to the Left">
+<!ENTITY clicktab.removetoRight "Close Tabs to the Right">
+<!ENTITY clicktab.uctab "Reopens last closed tab">
+<!ENTITY clicktab.ucatab "Reopens all closed tabs">
+<!ENTITY clicktab.snapback "SnapBack Tab">
+<!ENTITY clicktab.ietab "Opens the tab in IE">
+<!ENTITY contentLoad "Middle-click loads url from clipboard">
+<!ENTITY context.tab "Tab Context Menu">
+<!ENTITY context.main "Main Context Menu">
+<!ENTITY context.tools "Tools Menu">
+<!ENTITY showtabBarContext.label "Show in Tab Context Menu">
+<!ENTITY showContentAreaContext.label "Show in Main Context Menu">
+<!ENTITY showToolsMenu.label "Show in Tools Menu">
+<!ENTITY startupHomePage.label "Show my home page">
+<!ENTITY startupBlankPage.label "Show a blank page">
+<!ENTITY startupLastSession.label "Show my windows and tabs from last time">
+<!ENTITY sm.extension.description1 "Tab Mix Plus detect that Session Manager Extension is installed">
+<!ENTITY sm.extension.description2 "Tab Mix Plus session manager will be disabled">
+<!ENTITY sm.extension.description3 "You can click the button on the right to open Session Manager Options dialog">
+<!ENTITY sm.extension.description4 "Convert My sessions data from Tab Mix Plus format to Session Manager extension format">
+<!ENTITY sm.extension.convert.label "Convert">
+<!ENTITY sm.extension.chooseFile.label0 "Let me choose which data file to convert">
+<!ENTITY sm.extension.chooseFile.label1 "Convert Tab Mix Plus sessions from the current profile">
+<!ENTITY ss.enable.label "Use Firefox's built-in Session Restore feature">
+<!ENTITY ss.enable.tooltip "Uncheck to allow the use with Tab Mix Plus Session Manager">
+<!ENTITY ss.advanced_setting "Advanced Setting">
+<!ENTITY ss.advanced_setting.warning "Don't change these, unless you know what you're doing">
+<!ENTITY ss.interval "Minimum time interval between two state saves">
+<!ENTITY ss.interval.seconds "(in milliseconds)">
+<!ENTITY ss.privacy_level "Save sensitive data (form data, POSTDATA and cookies) for">
+<!ENTITY ss.privacy_level.allsites "All sites">
+<!ENTITY ss.privacy_level.unencrypted "Unencrypted sites only">
+<!ENTITY ss.privacy_level.nosites "No sites at all">
+<!ENTITY ss.postdata.label1 "Maximum amount of POSTDATA to be stored">
+<!ENTITY ss.postdata.label2 "(in bytes, -1 = all of it)">
+<!ENTITY sessionManger.enable "Enable Session Manager">
+<!ENTITY crashRecovery.enable "Enable Crash Recovery">
+<!ENTITY sm.StartExit "Start/Exit">
+<!ENTITY sm.restore "Restore">
+<!ENTITY sm.preserve "Preserve">
+<!ENTITY sm.start "When Browser Starts:">
+<!ENTITY sm.start.restore "Restore">
+<!ENTITY sm.start.ask "Ask Before Restoring">
+<!ENTITY sm.start.nothing "Don't Restore">
+<!ENTITY sm.exit "When Browser Exits:">
+<!ENTITY sm.exit.save "Save Session">
+<!ENTITY sm.exit.ask "Ask Before Saving">
+<!ENTITY sm.exit.nothing "Don't Save">
+<!ENTITY sm.startup "Startup Session:">
+<!ENTITY sm.lastsession "Last Session">
+<!ENTITY sm.previouslast "Previous to Last">
+<!ENTITY sm.chooseifempty "Choose another if empty">
+<!ENTITY sm.restore.options "When Restoring Sessions:">
+<!ENTITY sm.restore.overwrite "Overwrite existing windows">
+<!ENTITY sm.restore.overwriteTabs "And tabs">
+<!ENTITY sm.restore.closedWinList "Save windows in closed windows list">
+<!ENTITY sm.restore.merge "Join multiple windows into one">
+<!ENTITY sm.restore.bypassCache "Bypass cache when restoring">
+<!ENTITY sm.notrestore.label "When not restoring on start">
+<!ENTITY sm.restorePinned.label "Restore my pinned tabs from last time">
+<!ENTITY sm.preserve.options "Preserve Tabs:">
+<!ENTITY sm.preserve.history "History">
+<!ENTITY sm.preserve.protect "Protect Status">
+<!ENTITY sm.preserve.locked "Lock Status">
+<!ENTITY sm.preserve.permission "Permissions">
+<!ENTITY sm.preserve.scroll1 "Scroll Position">
+<!ENTITY sm.restore.winOptions "Preserve Windows:">
+<!ENTITY sm.restore.selectedTab "Selected tab">
+<!ENTITY sm.restore.closedTabs "Closed tabs list">
+<!ENTITY incompatible.extensions "Some of your extensions are incompatible with Tab Mix Plus, it is recommended that you will disable or uninstall those extensions.">
+<!ENTITY incompatible.button.label "Show List">
diff --git a/chrome/locale/ar/session-manager.properties b/chrome/locale/ar/session-manager.properties
new file mode 100644
index 0000000..5f825c6
--- /dev/null
+++ b/chrome/locale/ar/session-manager.properties
@@ -0,0 +1,107 @@
+sm.saveClosedTab.chkbox.label=Save closed tabs list with this session
+sm.button.continue.label=Continue
+sm.button.continue.accesskey=C
+sm.askBeforSave.title=Session Manager - Save Session
+sm.askBeforSave.msg0=Would you like to save your session?
+sm.askBeforSave.msg2=Only non-private windows will be save to disk
+sm.askBeforSave.msg1=If you don\'t save, next time you start the browser the \'Last Session\' will be empty.
+sm.askBeforSave.button0.label=Save Session
+sm.askBeforSave.button0.accesskey=S
+sm.askBeforSave.button1.label=Don\'t Save
+sm.askBeforSave.button1.accesskey=D
+sm.corrupted.title=Session Manager - Corrupted Database
+sm.corrupted.msg0=Session Manager cannot load its database from corrupted session.rdf.
+sm.corrupted.msg1=The file session.rdf will be deleted, a copy can be found in session.old in your profile. sessions backups are in <profile>/sessionbackups
+sm.areYouSure.msg=Are you sure you want to continue?
+sm.canChooseStartup.msg=You can choose a session to be your new startup session from the list:
+sm.addtoStartup.title=Session Manager - Add to Startup Session
+sm.addtoStartup.msg.windows=You are about to add window(s) to your startup session:
+sm.addtoStartup.msg.tabs=You are about to add tab(s) to your startup session:
+sm.addtoStartup.button0.label=Add to Session
+sm.addtoStartup.button0.accesskey=A
+sm.addtoStartup.button1.label=Don\'t Add
+sm.addtoStartup.button1.accesskey=D
+sm.replaceStartup.title=Session Manager - Override Startup Session
+sm.replaceStartup.msg=You are about to replace your startup session:
+sm.replaceStartup.button0.label=Replace Session
+sm.replaceStartup.button0.accesskey=R
+sm.replaceStartup.button1.label=Don\'t Replace
+sm.replaceStartup.button1.accesskey=D
+sm.removeStartup.title=Session Manager - Delete Startup Session
+sm.removeStartup.msg0=You are about to delete your startup session:
+sm.removeStartup.msg1=Choose a session to be your new startup session from the list:
+sm.removeStartup.button0.label=Delete
+sm.removeStartup.button0.accesskey=D
+sm.removeStartup.button1.label=Don\'t Delete
+sm.removeStartup.button1.accesskey=T
+sm.title=Session Manager
+sm.dontSaveBlank.msg=Session Manager doesn\'t save blank windows
+sm.sessoinSave.error=Error in Session Manager, session didn\'t save
+sm.sessionName.title.rename=Session Manager - Rename Session
+sm.sessionName.title.saveprevious=Session Manager - Save Session
+sm.sessionName.title.savethiswindow=Session Manager - Save This Window
+sm.sessionName.title.saveallwindows=Session Manager - Save All Windows
+sm.sessionName.msg0=Enter Session Name:
+sm.sessionName.msg1=Name must be at least one letter or number.
+sm.sessionName.msg2=This name is already in use!
+sm.sessionName.msg3=Are you sure you want to replace the session?
+sm.sessionName.button0.label=Rename Session
+sm.sessionName.button0.accesskey=R
+sm.sessionName.button1.label=Don\'t Rename
+sm.sessionName.button1.accesskey=D
+sm.session.empty=empty
+sm.session.tabs=T
+sm.session.windows=W
+sm.removeAll.title.session=Session Manager - Delete All Saved Sessions
+sm.removeAll.title.closedwindow=Session Manager - Delete All Closed Windows
+sm.removeAll.msg0=Are you sure you want to delete all your saved sessions?
+sm.removeAll.msg1=If you choose \'Delete\' your startup session will be the \'Last Session\'.
+sm.removeAll.msg2=Are you sure you want to delete all your closed windows?
+sm.sessionMenu.last=Last Session
+sm.sessionMenu.lastDefault=Last Session - Default
+sm.sessionMenu.lastgood=Last Good Session
+sm.sessionMenu.previous=Previous to Last
+sm.sessionMenu.crashed=Crashed Session
+sm.afterCrash.title=Session Manager - Restore after Crash
+sm.afterCrash.chkbox.label=Enable Session Manager
+sm.afterCrash.msg0=Your last session Crashed!
+sm.afterCrash.msg0.again=Your last Crashed session Crashed again!
+sm.afterCrash.msg1=Choose session to restore from the list:
+sm.afterCrash.msg2=Choose how to continue
+sm.afterCrash.msg3=Session Manager is currently disabled, if you enable Session Manager, you will be able to restore crashed sessions, closed sessions, saved sessions and closed windows from the Session Manager menu.
+sm.afterCrash.msg4=You can also restore the crashed session later from the Session Manager menu.
+sm.afterCrash.msg5=but nothing was saved.
+sm.afterCrash.msg6=but there isn\'t any open window in your Crashed session
+sm.afterCrash.msg7=Choose window to restore from Closed Windows list
+sm.afterCrash.msg8=(you can also restore closed windows later from the Closed Windows menu)
+sm.afterCrash.msg9=Your Crashed session is empty!
+sm.afterCrash.msg10=Session Manager did not find any sessions to restore from.
+sm.afterCrash.button0.label=Restore Session
+sm.afterCrash.button0.accesskey=R
+sm.afterCrash.button0.crashed.label=Restore Crashed Session
+sm.afterCrash.button0.crashed.accesskey=R
+sm.afterCrash.button1.label=Don\'t Restore
+sm.afterCrash.button1.accesskey=D
+sm.start.title=Session Manager - Restore Session
+sm.start.chkbox.label=Enable Crash Recovery
+sm.start.msg0=Your Startup session is empty!
+sm.start.msg1=Crash Recovery is currently disabled, if you enable Crash Recovery, you will be able to restore crashed sessions.
+sm.start.msg2=Error while looking for your startup session, your saved startup session does not exist.
+sm.restoreError.msg0=Error in session manager file!
+sm.restoreError.msg1=Delete the session you tried to restore
+sm.disable.msg=Firefox has a built-in session restore feature.
+sm.disable.msg1=Would you like to enable built-in session restore and disable the Tab Mix Plus Session Manager?
+sm.disable.msg2=Would you like to enable Tab Mix Plus Session Manager and disable the built-in session restore?
+sm.extension.convert.msg1=Would you like to convert your sessions data from Tab Mix Plus format to Session Manager extension format?
+sm.extension.convert.msg2=You can do it later from Tab Mix Plus session options window.
+sm.extension.convert.nosessions=There is no session in this file.
+sm.extension.convert.alreadyconverted=This session file have already been converted to Session Manager extension format.
+sm.extension.convert.doitagain=Do you wish to convert them again?
+sm.extension.convert.unable=Unable to convert from session.rdf
+sm.extension.convert.many=sessions converted, would you like to delete any of them?
+sm.extension.convert.one=one session converted, would you like to delete it?
+sm.extension.convert.rename=You will be able to rename the session(s) later from Session Manager menu
+sm.extension.convert.selectfile=Select session.rdf file to convert
+sm.extension.convert.rdffiles=RDF Files
+sm.extension.convert.sessionfiles=Session Files
+sm.tabview.hiddengroups=More tabs restored into hidden groups.
diff --git a/chrome/locale/ar/tabmix.dtd b/chrome/locale/ar/tabmix.dtd
new file mode 100644
index 0000000..8fa796c
--- /dev/null
+++ b/chrome/locale/ar/tabmix.dtd
@@ -0,0 +1,131 @@
+<!ENTITY closedtabsbtn.label "الألسنة المغلقة">
+<!ENTITY closedtabsbtn.tooltip "عرض قائمة الألسنة المغلقة">
+<!ENTITY sessionbtn.tooltip "عرض وإدارة جلساتك">
+<!ENTITY tabslistbtn.label "الألسنة المفتوحة">
+<!ENTITY tabslistbtn.tooltip "عرض قائمة الألسنة المفتوحة">
+<!ENTITY closedwindowsbtn.label "النوافذ المغلقة">
+<!ENTITY closedwindowsbtn.tooltip "عرض قائمة النوافذ المغلقة">
+<!ENTITY page.header.title "Tab Mix Plus Options">
+<!ENTITY options.main.sessionbutton.label "Tab Mix Plus Session Manager">
+<!ENTITY session.Tools "Session Manager">
+<!ENTITY closedWin.label "قائمة النوافذ المغلقة">
+<!ENTITY duplicateTabMenu.label "كرّر اللسان">
+<!ENTITY duplicateTabMenu.accesskey "ر">
+<!ENTITY duplicateinWin.label "كرّر في نافذة جديدة">
+<!ENTITY duplicateinWin.accesskey "ف">
+<!ENTITY detachTab.label "انقل إلى نافذة جديدة">
+<!ENTITY detachTab.accesskey "ذ">
+<!ENTITY mergeContext.label "دمج النوافذ">
+<!ENTITY mergeContext.accesskey "ج">
+<!ENTITY renametab.label "غيّر تسمية اللسان">
+<!ENTITY renametab.accesskey "س">
+<!ENTITY copytaburl.label "انسخ رابط اللسان">
+<!ENTITY copytaburl.accesskey "خ">
+<!ENTITY reloadother.label "أعِد تحميل الألسنة الأخرى">
+<!ENTITY reloadother.accesskey "م">
+<!ENTITY reloadleft.label "أعِد تحميل الألسنة اليسرى">
+<!ENTITY reloadleft.accesskey "س">
+<!ENTITY reloadright.label "أعِد تحميل الألسنة اليمنى">
+<!ENTITY reloadright.accesskey "م">
+<!ENTITY autoReloadTab.label "أعِد تحميل اللسان كل">
+<!ENTITY autoReloadTab.accesskey "ك">
+<!ENTITY autoReloadSite.label "أعِد تحميل هذا الموقع كل">
+<!ENTITY autoReloadSite.accesskey "ك">
+<!ENTITY afterthis.label "بعد هذا اللسان">
+<!ENTITY bookmarktab.label "علّم هذا اللسان">
+<!ENTITY undoCloseListMenu.label "قائمة الألسنة المغلقة">
+<!ENTITY undoCloseListMenu.accesskey "ق">
+<!ENTITY closeAllTabsMenu.label "أغلق كل الألسنة">
+<!ENTITY closeall.accesskey "غ">
+<!ENTITY closeSimilarTab.label "أغلق الألسنة المشابهة">
+<!ENTITY closeSimilarTab.accesskey "ش">
+<!ENTITY closeTabsToLeft.label "Close Tabs to the Left">
+<!ENTITY closeleft.accesskey "س">
+<!ENTITY closeTabstoRight.label "Close Tabs to the Right">
+<!ENTITY closeright.accesskey "م">
+<!ENTITY docShellMenu.label "الأذونات">
+<!ENTITY docShellMenu.accesskey "ذ">
+<!ENTITY freezeTabMenu.label "جمّد اللسان">
+<!ENTITY freezeTabMenu.accesskey "ج">
+<!ENTITY protectTabMenu.label "Protect Tab">
+<!ENTITY protectTabMenu.tooltip "Protect tabs from being closed">
+<!ENTITY protectTabMenu.accesskey "P">
+<!ENTITY lockTabMenu.label "Lock Tab">
+<!ENTITY lockTabMenu.tooltip "All links open in new tab">
+<!ENTITY lockTabMenu.accesskey "K">
+<!ENTITY bookmarktabs.label "علّم كل الألسنة">
+<!ENTITY linkhere.label "افتح الرابط في هذا اللسان">
+<!ENTITY linkhere.accesskey "ف">
+<!ENTITY linkBackgroundTab.label "Open Link in Background Tab">
+<!ENTITY linkForegroundTab.label "Open Link in Foreground Tab">
+<!ENTITY linkBackgroundTab.accesskey "B">
+<!ENTITY linkForegroundTab.accesskey "F">
+<!ENTITY openalllinks.label "افتح الروابط في ألسنة جديدة">
+<!ENTITY openalllinks.accesskey "ج">
+<!ENTITY linkwithhistory.label "افتح الرابط في اللسان المكرّر">
+<!ENTITY linkwithhistory.accesskey "ك">
+<!ENTITY tabsList.label "قائمة الألسنة المفتوحة">
+<!ENTITY tabsList.accesskey "م">
+<!ENTITY allowImage.label "Image">
+<!ENTITY allowJavascript.label "JavaScript">
+<!ENTITY allowRedirect.label "Redirect">
+<!ENTITY allowPlugin.label "Plug-in">
+<!ENTITY allowFrame.label "Frame">
+<!ENTITY restoreincurrent.label "Restore to Current Tab">
+<!ENTITY restoreincurrent.accesskey "C">
+<!ENTITY restoreinwin.label "Restore to New Window">
+<!ENTITY restoreinwin.accesskey "W">
+<!ENTITY restoreintab.label "Restore to New Tab">
+<!ENTITY restoreintab.accesskey "T">
+<!ENTITY restoretab.label "Restore Tab">
+<!ENTITY restoretab.accesskey "R">
+<!ENTITY bookmark.label "علّم هذا الرابط...">
+<!ENTITY bookmark.accesskey "ع">
+<!ENTITY deletelist.label "احذف من القائمة">
+<!ENTITY deletelist.accesskey "ح">
+<!ENTITY settings.label "إعدادات">
+<!ENTITY saveWindow.label "Save This Window">
+<!ENTITY saveAllWindows.label "Save All Windows">
+<!ENTITY sm.context.overwrite "Restore, Overwrite Existing Window(s)">
+<!ENTITY sm.context.overwrite.key "O">
+<!ENTITY sm.context.restore.new "Restore to New Window(s)">
+<!ENTITY sm.context.restore.newkey "N">
+<!ENTITY sm.context.replacethis "Replace, With This Window">
+<!ENTITY sm.context.replacethis.key "T">
+<!ENTITY sm.context.replaceall "Replace, With All Windows">
+<!ENTITY sm.context.replaceall.key "A">
+<!ENTITY sm.context.add "Add This Window">
+<!ENTITY sm.context.add.key "W">
+<!ENTITY sm.context.addall "Add All Windows">
+<!ENTITY sm.context.addall.key "I">
+<!ENTITY sm.context.save "Save">
+<!ENTITY sm.context.save.key "S">
+<!ENTITY sm.context.rename "Rename">
+<!ENTITY sm.context.rename.key "R">
+<!ENTITY sm.context.delete "Delete">
+<!ENTITY sm.context.delete.key "D">
+<!ENTITY sm.context.deleteall "Delete All">
+<!ENTITY sm.context.deleteall.key "L">
+<!ENTITY sm.context.startup "Set as Startup Session">
+<!ENTITY sm.context.startup.key "P">
+<!ENTITY sm.context.details "Show Counters, Date and Time in Session Menu">
+<!ENTITY sm.context.details.key "C">
+<!ENTITY tab.key "T">
+<!ENTITY window.key "N">
+<!ENTITY merge.key "M">
+<!ENTITY sortedTabs.label "Sorted Tabs">
+<!ENTITY sortedTabs.tooltip "Check to show the list sorted alphabetically">
+<!ENTITY enable.label "Enable">
+<!ENTITY custom.label "Custom">
+<!ENTITY enableTabs.label "Enable All Tabs">
+<!ENTITY disableTabs.label "Disable All Tabs">
+<!ENTITY seconds.label "seconds">
+<!ENTITY minutes.label "minutes">
+<!ENTITY minute.label "minute">
+<!ENTITY hideTabBar.label "Hide the tab bar">
+<!ENTITY hideTabBar.never.label "Never">
+<!ENTITY hideTabBar.never.key "N">
+<!ENTITY hideTabBar.onOneTab.label "When I have only one tab">
+<!ENTITY hideTabBar.onOneTab.key "E">
+<!ENTITY hideTabBar.always.label "Always">
+<!ENTITY hideTabBar.always.key "A">
diff --git a/chrome/locale/ar/tabmix.properties b/chrome/locale/ar/tabmix.properties
new file mode 100644
index 0000000..171b159
--- /dev/null
+++ b/chrome/locale/ar/tabmix.properties
@@ -0,0 +1,40 @@
+extensions.{dc572301-7619-498c-a57d-39143191b318}.description= Tab browsing with an added boost.
+tmp.merge.warning.title= Closing window with non-merged tabs
+tmp.merge.warning.message= The selected tabs will be merged with another window, but the other tabs will now be closed with the current window.
+tmp.merge.warning.checkboxLabel= Always warn me when closing a window with tabs that aren\'t merging.
+tmp.merge.error= At least 2 windows have to be opened before you can merge them
+tmp.merge.private= You can not merge private window with non-private window.
+tmp.importPref.error1= Can not import because it is not a valid file.
+tmp.importPref.error2= Failed to import settings.
+tmp.sessionempty= Next time you start the browser, \'Last Session\' will be empty.
+droptoclose.label= Drop a tab to close it
+droplink.label=Drop at the center to replace the tab or at the sides to create a new tab
+flstOn.label= Tabs Focus to Last Selected - Press F9 to swap preference
+flstOff.label= Tabs Focus to Right - Press F9 to swap preference
+slideshowOn.label=الانتقال التلقائي بين الألسنة يعمل - اضغط F8 لإيقافه
+slideshowOff.label=الانتقال التلقائي بين الأسنة متوقف - اضغط F8 لتشغيله
+undoclosetab.clear.label=نظّف قائمة الألسنة المغلقة
+undoclosetab.clear.accesskey=ظ
+undoClosedWindows.clear.label=نظّف قائمة النوافذ المغلقة
+undoClosedWindows.clear.accesskey=ظ
+protectedtabs.closeWarning.1=You are about to close %S protected tab. Are you sure you want to continue?
+protectedtabs.closeWarning.2=You are about to close %S protected tabs. Are you sure you want to continue?
+protectedtabs.closeWarning.3=You are about to close %S tabs, %S of them protected. Are you sure you want to continue?
+protectedtabs.closeWarning.4=نبهني عند محاولتي إغلاق نافذة تحتوي ألسنة محمية
+window.closeWarning.1=نبهني عند محاولتي إغلاق نافذة تحتوي عدة ألسنة
+closeWindow.label=أغلق النافذة
+confirm_autoreloadPostData_title=تحذير!
+confirm_autoreloadPostData=The page on which you tried to enable Auto Reload contains POSTDATA.\nIf you enable Auto Reload, any action the form carries out (such as an online purchase) will be repeated.\n\nAre you sure that you want to enable Auto Reload?
+incompatible.title= Tab Mix Plus
+incompatible.msg0= The following extensions are integrated or incompatible with Tab Mix Plus.
+incompatible.msg1=هل ترغب في تعطيل هذه الامتدادات؟
+incompatible.msg2=الامتدادات غير المتوافقة ستتعطل بعد إعادة تشغيل المتصفح.
+incompatible.button0.label=عطّل
+incompatible.button0.accesskey=ع
+incompatible.button1.label=لا تعطّل
+incompatible.button1.accesskey=ل
+incompatible.button2.label=عطّل وأعِد التشغيل
+incompatible.button2.accesskey=و
+incompatible.chkbox.label=عرض هذا التنبيه عند بدء المتصفح
+tabmixoption.error.title= Tab Mix Plus Error
+tabmixoption.error.msg= You must have one browser window to use Tab Mix Plus Options
diff --git a/chrome/locale/en-US/pref-tabmix.dtd b/chrome/locale/en-US/pref-tabmix.dtd
index 36992f7..432e6e8 100644
--- a/chrome/locale/en-US/pref-tabmix.dtd
+++ b/chrome/locale/en-US/pref-tabmix.dtd
@@ -35,7 +35,7 @@
<!ENTITY tabClose.label "Tab Closing">
<!ENTITY tabMerge.label "Tab Merging">
<!ENTITY tabFeature.label "Tab Features">
-<!ENTITY newtab.label "Load on new tabs:">
+<!ENTITY newtab.label "Load on New Tab:">
<!ENTITY replaceLastTabWith.label "When I close last tab replace it with">
<!ENTITY newtab.blank "Blank Page">
<!ENTITY newtab.home "Home Page">
@@ -45,7 +45,7 @@
<!ENTITY newtab.placeholder.label "Default New Tab Page">
<!ENTITY location.label.1 "Address">
<!ENTITY focusContent.label "Focus content when loading non blank page">
-<!ENTITY openTabNext.label "Open new tabs next to current one">
+<!ENTITY openTabNext.label "Open New Tab next to current one">
<!ENTITY openOtherTabNext.label "Open other tabs next to current one">
<!ENTITY relatedAfterCurrent.label "Only if related to current tab">
<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
diff --git a/chrome/locale/eu/misc.dtd b/chrome/locale/eu/misc.dtd
new file mode 100644
index 0000000..089e509
--- /dev/null
+++ b/chrome/locale/eu/misc.dtd
@@ -0,0 +1,17 @@
+<!ENTITY searchTabFocus.label "Load in background">
+<!ENTITY searchTabFocus.accesskey "B">
+<!ENTITY renametab.panel.title "Edit Tab Title">
+<!ENTITY renametab.reset.label "Reset to default title">
+<!ENTITY title.label "Title">
+<!ENTITY default.label "Default">
+<!ENTITY renametab.permanently.label "Rename this tab regardless of its address">
+<!ENTITY renametab.permanently.tooltip "tab with history - the new name will remain when address changes">
+<!ENTITY forum.label "Forum">
+<!ENTITY faq.label "FAQ">
+<!ENTITY help.label "Help">
+<!ENTITY tabmix.label "Tab Mix Plus">
+<!ENTITY reloadtime.label1 "Choose time from the list or enter your own time">
+<!ENTITY specifyreload.label "Specify Reload Time">
+<!ENTITY sanitizer.entry "Tab Mix Plus Saved Sessions">
+<!ENTITY sanitizer.entry.accesskey "T">
+<!ENTITY sanitizer.entry.confirm "Are you sure you want to erase ALL your saved sessions data including backups ?">
diff --git a/chrome/locale/eu/pref-appearance.dtd b/chrome/locale/eu/pref-appearance.dtd
new file mode 100644
index 0000000..d4bc391
--- /dev/null
+++ b/chrome/locale/eu/pref-appearance.dtd
@@ -0,0 +1,18 @@
+<!ENTITY styles.label "Customize Styles">
+<!ENTITY currentTab.label "Current Tab">
+<!ENTITY unloadedTabs.label "Unloaded Tabs">
+<!ENTITY unreadTab.label "Unread Tabs">
+<!ENTITY hideRGB.label "Hide RGB">
+<!ENTITY showRGB.label "Show RGB">
+<!ENTITY unreadAfterReload.label "set tab as unread after reload">
+<!ENTITY squaredTabs.label "Apply background color for squared tabs">
+<!ENTITY otherTabs.label "Other Tabs">
+<!ENTITY italic.label "Italic">
+<!ENTITY bold.label "Bold">
+<!ENTITY underline.label "Underline">
+<!ENTITY textcolor.label "Text Color">
+<!ENTITY bgColor.label "Background Color">
+<!ENTITY bgTopColor.label "top">
+<!ENTITY bgBottomColor.label "bottom">
+<!ENTITY useThis.label "use this style for">
+<!ENTITY opacity.label "opacity">
diff --git a/chrome/locale/eu/pref-filetype.dtd b/chrome/locale/eu/pref-filetype.dtd
new file mode 100644
index 0000000..4661544
--- /dev/null
+++ b/chrome/locale/eu/pref-filetype.dtd
@@ -0,0 +1,5 @@
+<!ENTITY filetype.options "File Type Editor">
+<!ENTITY filetype.add "Add">
+<!ENTITY filetype.edit "Modify">
+<!ENTITY filetype.delete "Delete">
+<!ENTITY filetype.new "New file type:">
diff --git a/chrome/locale/en-US/pref-tabmix.dtd b/chrome/locale/eu/pref-tabmix.dtd
similarity index 70%
copy from chrome/locale/en-US/pref-tabmix.dtd
copy to chrome/locale/eu/pref-tabmix.dtd
index 36992f7..cb2003d 100644
--- a/chrome/locale/en-US/pref-tabmix.dtd
+++ b/chrome/locale/eu/pref-tabmix.dtd
@@ -1,310 +1,308 @@
-<!ENTITY tab.links "Links">
-<!ENTITY tab.events "Events">
-<!ENTITY tab.mouse "Mouse">
-<!ENTITY tab.appearance "Display">
-<!ENTITY tab.menu "Menu">
-<!ENTITY tab.session "Session">
-<!ENTITY tab.incompatible "Error">
-<!ENTITY apply.label "Apply">
-<!ENTITY settings.export "Export Preferences">
-<!ENTITY settings.import "Import Preferences">
-<!ENTITY settings.sync "Sync Preferences">
-<!ENTITY settings.default "Restore Defaults">
-<!ENTITY generalWindowOpen.label "Open links that open in a new window in:">
-<!ENTITY externalLink.useSeparate.label "Use separate preference for links from other applications">
-<!ENTITY externalLinkTarget.label "Open links from other applications in:">
-<!ENTITY linkTarget.tab "New Tab">
-<!ENTITY linkTarget.window "New Window">
-<!ENTITY linkTarget.current "Current Tab">
-<!ENTITY linkTarget.accesskey "C">
-<!ENTITY divertedWindowOpen.label "JavaScript & Popup restriction:">
-<!ENTITY divertedWindowOpen.all "Open all popups in tabs">
-<!ENTITY divertedWindowOpen.some "Allows resized popups">
-<!ENTITY divertedWindowOpen.none "Allows all popups">
-<!ENTITY linkTarget.label "Open links with a target attribute in current tab">
-<!ENTITY download.label "Prevent blank tabs when downloading files">
-<!ENTITY edit.label "Edit">
-<!ENTITY speLink.label "Force to open in new tab:">
-<!ENTITY speLink.none "Nothing">
-<!ENTITY speLink.allLinks "All links">
-<!ENTITY speLink.external "Links to other sites">
-<!ENTITY singleWindow.label "Enable Single Window Mode">
-<!ENTITY newTabs.label "New Tabs">
-<!ENTITY tabOpen.label "Tab Opening">
-<!ENTITY tabFocus.label "Tab Focus">
-<!ENTITY tabClose.label "Tab Closing">
-<!ENTITY tabMerge.label "Tab Merging">
-<!ENTITY tabFeature.label "Tab Features">
-<!ENTITY newtab.label "Load on new tabs:">
-<!ENTITY replaceLastTabWith.label "When I close last tab replace it with">
-<!ENTITY newtab.blank "Blank Page">
-<!ENTITY newtab.home "Home Page">
-<!ENTITY newtab.current "Current Page">
-<!ENTITY newtab.duplicate "Duplicate Tab with history">
-<!ENTITY newtab.location.1 "New Tab Page">
-<!ENTITY newtab.placeholder.label "Default New Tab Page">
-<!ENTITY location.label.1 "Address">
-<!ENTITY focusContent.label "Focus content when loading non blank page">
-<!ENTITY openTabNext.label "Open new tabs next to current one">
-<!ENTITY openOtherTabNext.label "Open other tabs next to current one">
-<!ENTITY relatedAfterCurrent.label "Only if related to current tab">
-<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
-<!ENTITY openDuplicateNext.label "Open duplicated tabs next to original">
-<!ENTITY openTabNext.tooltip "[a][b][c][1][2][3] -> [a][3][2][1][b][c]">
-<!ENTITY openTabNextInverse.label "Change opening order">
-<!ENTITY openTabNextInverse.tooltip "[a][3][2][1][b][c] -> [a][1][2][3][b][c]">
-<!ENTITY openTabNextInverse.tooltip1 "Open new tab next to the tab last opened from the current tab (since it was last selected)">
-<!ENTITY lockTabs.label "Lock tabs">
-<!ENTITY lockNewTabs.label "Lock New tabs">
-<!ENTITY lockAppTabs.label "Lock App tabs">
-<!ENTITY updateLockState.label "Apply changes to open tabs">
-<!ENTITY openNewTab.label "Open tabs from:">
-<!ENTITY openBookmarks.label "Bookmarks">
-<!ENTITY openBMKGroups.label "Groups of bookmarks">
-<!ENTITY openBMKGroups.tooltip "Don't override tabs when opening a group of bookmarks">
-<!ENTITY openHistory.label "History">
-<!ENTITY openUrl.label "Address bar">
-<!ENTITY openSearch.label "Search bar">
-<!ENTITY middlecurrent1.label "Middle-click or Control-click opens items in current tab">
-<!ENTITY middlecurrent.tooltip "Only for bookmarks, history, links forced to open in new tab">
-<!ENTITY tabFocus.caption "Focus/Select tabs that open from:">
-<!ENTITY selectTab.label "Links">
-<!ENTITY selectDivertedTab.label "Diverted windows">
-<!ENTITY selectTabFromExternal.label "Other applications">
-<!ENTITY selectTabCommand.label "New tab commands">
-<!ENTITY contextMenuSearch.label "Context menu search for">
-<!ENTITY selectTabBH.label "Bookmarks/History">
-<!ENTITY duplicateTab.label "Duplicate Tab">
-<!ENTITY inversefocus1.label "Inverse Middle-click or Control-click focus of:">
-<!ENTITY warning.caption.label "Warning">
-<!ENTITY warnOnCloseProtected.label "Warn me when closing window with protected tabs">
-<!ENTITY warnOnCloseWindow.label "Warn me when closing window with multiple tabs">
-<!ENTITY lasttab.caption.label "Closing last tab">
-<!ENTITY keepWindow.label.3.1 "Do not close window when closing last tab">
-<!ENTITY keeptab.label "Prevent last tab from closing">
-<!ENTITY closeOnMerge.label "Close windows once they have merged">
-<!ENTITY warnOnMerge.label "Warn when closing tabs that aren't being merged">
-<!ENTITY currenttab.caption.label "Closing current tab">
-<!ENTITY focusTab.labelBegin "When closing current tab, focus:">
-<!ENTITY focusTab.firstTab "First tab">
-<!ENTITY focusTab.leftTab "Left tab">
-<!ENTITY focusTab.rightTab "Right tab">
-<!ENTITY focusTab.lastTab "Last tab">
-<!ENTITY focusTab.lastSelectedTab "Last selected tab">
-<!ENTITY focusTab.openerTab "Opener/right tab">
-<!ENTITY focusTab.openerTab.rtl "Opener/left tab">
-<!ENTITY focusTab.lastOpenedTab "Last opened tab">
-<!ENTITY undoClose.label "Enable undo close tabs">
-<!ENTITY undoCloseCache.label "Max number of closed tabs to remember:">
-<!ENTITY undoClosepos.label "Restore the tab's original position">
-<!ENTITY menuonlybutton.label "Make the toolbar button display only a list">
-<!ENTITY ctrltab.label "Ctrl-Tab navigates tabs in the most recently used order">
-<!ENTITY cmdtab.label "Cmd-Tab navigates tabs in the most recently used order">
-<!ENTITY ctrltab.tabPreviews "Show tab previews">
-<!ENTITY ctrltab.popup "Ctrl-Tab displays a tab list popup menu">
-<!ENTITY cmdtab.popup "Cmd-Tab displays a tab list popup menu">
-<!ENTITY tabpopup.mouse "Tab list responds to the mouse">
-<!ENTITY mergeNoTabSelection.label "Merge windows when no tabs are selected">
-<!ENTITY mergeTabSelection.label "Merging after selecting tabs">
-<!ENTITY mergeall.label "Merge all windows into one">
-<!ENTITY mergelastfocused.label "Merge only current window with last focused">
-<!ENTITY mergePopups.label "Also take popup windows">
-<!ENTITY popupNextToOpener.label "Place popups next to their openers">
-<!ENTITY activateSlideshow.label "Pressing #1 rotates tabs every">
-<!ENTITY toggleAnimation.label "Disable Open/Close tab animation">
-<!ENTITY reloadEvery.matchAddress.label "Reload a tab regardless of its address">
-<!ENTITY reloadEvery.onReloadButton.label "Show Reload Every menu on Reload button">
-<!ENTITY seconds.label "seconds">
-<!ENTITY minutes.label "min">
-<!ENTITY tabBarAppearance.label "Tab Bar">
-<!ENTITY tabAppearance.label "Tab">
-<!ENTITY toolBarAppearance.label "ToolBar">
-<!ENTITY show.ontabbar.label "Show on Tab bar">
-<!ENTITY show.ontab.label "Show on Tab">
-<!ENTITY dragNewTabButton.tooltip "Drag 'New Tab' button to your tab-bar to enable this option.">
-<!ENTITY hideTabBarButton.label "Close tab button">
-<!ENTITY newTabButton.label "New tab button">
-<!ENTITY newTabButton.posiotion.left.label "on Left side">
-<!ENTITY newTabButton.posiotion.right.label "on Right side">
-<!ENTITY newTabButton.posiotion.afterlast.label "After last tab">
-<!ENTITY allTabsButton.label "All tabs button">
-<!ENTITY tabBarSpace.label "Extra spaces on both sides">
-<!ENTITY tabBarSpace.tooltip "For clicking and dropping something on tab bar">
-<!ENTITY tabbar.label "Hide tab bar when only one tab is open">
-<!ENTITY moveTabOnDragging.label "When dragging a tab move it directly">
-<!ENTITY dropIndicator.label "Drop indicator">
-<!ENTITY dropIndicator-native.label "Native style">
-<!ENTITY dropIndicator-builtin.label "Built-in style">
-<!ENTITY verticalTabbar.description "Use treeStyleTab or VerticalTab extension to control these preferences.">
-<!ENTITY tabBarPosition.label "Position:">
-<!ENTITY tabBarPosition.top.label "Top (above content)">
-<!ENTITY tabBarPosition.bottom.label "Bottom (below content)">
-<!ENTITY tabScroll.label "When tabs don't fit width:">
-<!ENTITY tabScroll.none "Scrollable without buttons">
-<!ENTITY tabScroll.leftRightButtons "Scrollable with buttons on both sides">
-<!ENTITY tabScroll.rightButtons "Scrollable with buttons on right side">
-<!ENTITY tabScroll.rightButtons.rtl "Scrollable with buttons on left side">
-<!ENTITY tabScroll.multibar "Multi-row">
-<!ENTITY maxrow.label "Max number of rows to display:">
-<!ENTITY offsetAmountToScroll.label "When scrolling show part of next out-of-sight tab">
-<!ENTITY smoothScroll.label "Enable smooth scroll">
-<!ENTITY scrolldelay.label "Scroll Delay (time between scroll repetition)">
-<!ENTITY highlight.label "Highlight">
-<!ENTITY currenttab.style.label "Current tab">
-<!ENTITY unloadedtabs.style.label "Unloaded tabs">
-<!ENTITY unreadtabs.style.label "Unread tabs">
-<!ENTITY othertabs.style.label "Other tabs">
-<!ENTITY setstyles.label "Customize Styles">
-<!ENTITY extraIcons.label1 "Icons for">
-<!ENTITY extraIcons.locked "Locked">
-<!ENTITY extraIcons.protected "Protected">
-<!ENTITY extraIcons.autoreload "Auto Reload">
-<!ENTITY extraIcons.hideonpinned "Hide on pinned tabs">
-<!ENTITY progressMeter.label "Progress meter on tabs">
-<!ENTITY showTabX.labelBegin "Close tab button">
-<!ENTITY showTabX.left "Place on left side">
-<!ENTITY showTabX.rtl "Place on right side">
-<!ENTITY milliseconds.label "msec">
-<!-- LOCALIZATION NOTE
- change this only if you need to change the width -->
-<!ENTITY showTabX.popup.width "13em">
-<!ENTITY showTabX.always "on all">
-<!ENTITY showTabX.current "on current">
-<!ENTITY showTabX.hover "on pointed for">
-<!ENTITY showTabX.alwaysExeption "on all tabs wider than">
-<!ENTITY showTabX.currentHover "on current & pointed for">
-<!ENTITY minWidth.label "Tab Width:">
-<!ENTITY widthTo.label "to">
-<!ENTITY widthPixels.label "pixels">
-<!ENTITY flexTabs.label "Tab width fits to tab title">
-<!ENTITY bookastitle.label "Use bookmark name as tab title">
-<!-- LOCALIZATION NOTE:
- change this only if you need to change the width -->
-<!ENTITY toolbar.description.width "21em">
-<!ENTITY toolbar.description "You can customize which Tab Mix Plus buttons to show in your Toolbar">
-<!ENTITY toolbar.button.label "Customize">
-<!ENTITY toolbar.visible.caption "Visible buttons">
-<!ENTITY toolbar.novisible.label "There are no visible buttons">
-<!ENTITY toolbar.hidden.caption "Hidden buttons">
-<!ENTITY toolbar.nohidden.label "There are no hidden buttons">
-<!ENTITY mouseGesture.label "Mouse Gestures">
-<!ENTITY mouseClick.label "Mouse Clicking">
-<!ENTITY mouseHoverSelect.labelBegin "Select tab pointed for">
-<!ENTITY tabFlip.label "Switch to last selected tab when clicking current one">
-<!ENTITY tabFlip.delay "Use a delay of">
-<!ENTITY clickFocus.label "Mouse click (down and release) to select a tab">
-<!ENTITY removeEntries.label "Remove Tab Mix Plus menu list entries using middle-click">
-<!ENTITY lockTabSizingOnClose.label "When closing a tab, other tabs should not resize until cursor leaves toolbar region">
-<!ENTITY removeEntries.tooltip "Includes closed tabs, closed windows, and saved sessions">
-<!ENTITY tabbarscrolling.caption "When scrolling over the tab-bar">
-<!ENTITY tabbarscrolling.holdShift.label "Hold Shift while scrolling to switch between these options">
-<!ENTITY tabbarscrolling.selectTab.label "Change selected tab">
-<!ENTITY tabbarscrolling.scrollAllTabs.label "Scroll all tabs">
-<!ENTITY tabbarscrolling.inverse.label "Inverse scroll direction">
-<!ENTITY double.label "Double-click">
-<!ENTITY middle.label "Middle-click">
-<!ENTITY ctrl.label "Ctrl-click">
-<!ENTITY cmd.label "Cmd-Click">
-<!ENTITY shift.label "Shift-click">
-<!ENTITY alt.label "Alt-Click">
-<!ENTITY ontab.label "on a tab:">
-<!ENTITY ontabbar.label "on the tabbar:">
-<!ENTITY clicktab.label "Choose command to perform when clicking on tab or tabbar">
-<!ENTITY ontabbar.dblClick.label "Prevent double click on Tab-bar from changing window size.">
-<!ENTITY ontabbar.click.label "Prevent clicking on Tab-bar from dragging the window.">
-<!ENTITY clicktab.default "Firefox default or other extension">
-<!ENTITY clicktab.nothing "Does nothing">
-<!ENTITY clicktab.addtab "Open a new tab">
-<!ENTITY clicktab.duplicatetab "Duplicates the tab">
-<!ENTITY clicktab.duplicatetabw "Duplicates the tab in a new window">
-<!ENTITY clicktab.detachtab "Move the tab to a new window">
-<!ENTITY clicktab.protecttab "Protects the tab">
-<!ENTITY clicktab.locktab "Locks the tab">
-<!ENTITY clicktab.freezetab "Protects and Locks the tab">
-<!ENTITY clicktab.renametab "Renames the tab">
-<!ENTITY clicktab.copyTabUrl "Copies the tab's URL to the clipboard">
-<!ENTITY clicktab.copyUrlFromClipboard "Load URL from clipboard">
-<!ENTITY clicktab.selectMerge "Selects the tab for merging">
-<!ENTITY clicktab.mergeTabs "Merges windows together">
-<!ENTITY clicktab.bookTab "Bookmarks the tab">
-<!ENTITY clicktab.bookTabs "Bookmarks all tabs">
-<!ENTITY clicktab.reloadtab "Reloads the tab">
-<!ENTITY clicktab.reloadtabs "Reloads all tabs">
-<!ENTITY clicktab.reloadothertabs "Reloads other tabs">
-<!ENTITY clicktab.reloadlefttabs "Reloads left tabs">
-<!ENTITY clicktab.reloadrighttabs "Reloads right tabs">
-<!ENTITY clicktab.autoReloadTab "Activate/Deactivate tab auto reload">
-<!ENTITY clicktab.removeall "Close all tabs">
-<!ENTITY clicktab.removeother "Close other tabs">
-<!ENTITY clicktab.removesimilar "Close tabs from similar domain">
-<!ENTITY clicktab.removetoLeft "Close Tabs to the Left">
-<!ENTITY clicktab.removetoRight "Close Tabs to the Right">
-<!ENTITY clicktab.uctab "Reopens last closed tab">
-<!ENTITY clicktab.ucatab "Reopens all closed tabs">
-<!ENTITY clicktab.snapback "SnapBack Tab">
-<!ENTITY clicktab.ietab "Opens the tab in IE">
-<!ENTITY contentLoad "Middle-click loads url from clipboard">
-<!ENTITY context.tab "Tab Context Menu">
-<!ENTITY context.main "Main Context Menu">
-<!ENTITY context.tools "Tools Menu">
-<!ENTITY showtabBarContext.label "Show in Tab Context Menu">
-<!ENTITY showContentAreaContext.label "Show in Main Context Menu">
-<!ENTITY showToolsMenu.label "Show in Tools Menu">
-<!ENTITY startupHomePage.label "Show my home page">
-<!ENTITY startupBlankPage.label "Show a blank page">
-<!ENTITY startupLastSession.label "Show my windows and tabs from last time">
-<!ENTITY sm.extension.description1 "Tab Mix Plus detect that Session Manager Extension is installed">
-<!ENTITY sm.extension.description2 "Tab Mix Plus session manager will be disabled">
-<!ENTITY sm.extension.description3 "You can click the button on the right to open Session Manager Options dialog">
-<!ENTITY sm.extension.description4 "Convert My sessions data from Tab Mix Plus format to Session Manager extension format">
-<!ENTITY sm.extension.convert.label "Convert">
-<!ENTITY sm.extension.chooseFile.label0 "Let me choose which data file to convert">
-<!ENTITY sm.extension.chooseFile.label1 "Convert Tab Mix Plus sessions from the current profile">
-<!ENTITY ss.enable.label "Use Firefox's built-in Session Restore feature">
-<!ENTITY ss.enable.tooltip "Uncheck to allow the use with Tab Mix Plus Session Manager">
-<!ENTITY ss.advanced_setting "Advanced Setting">
-<!ENTITY ss.advanced_setting.warning "Don't change these, unless you know what you're doing">
-<!ENTITY ss.interval "Minimum time interval between two state saves">
-<!ENTITY ss.interval.seconds "(in milliseconds)">
-<!ENTITY ss.privacy_level "Save sensitive data (form data, POSTDATA and cookies) for">
-<!ENTITY ss.privacy_level.allsites "All sites">
-<!ENTITY ss.privacy_level.unencrypted "Unencrypted sites only">
-<!ENTITY ss.privacy_level.nosites "No sites at all">
-<!ENTITY ss.postdata.label1 "Maximum amount of POSTDATA to be stored">
-<!ENTITY ss.postdata.label2 "(in bytes, -1 = all of it)">
-<!ENTITY sessionManger.enable "Enable Session Manager">
-<!ENTITY crashRecovery.enable "Enable Crash Recovery">
-<!ENTITY sm.StartExit "Start/Exit">
-<!ENTITY sm.restore "Restore">
-<!ENTITY sm.preserve "Preserve">
-<!ENTITY sm.start "When Browser Starts:">
-<!ENTITY sm.start.restore "Restore">
-<!ENTITY sm.start.ask "Ask Before Restoring">
-<!ENTITY sm.start.nothing "Don't Restore">
-<!ENTITY sm.exit "When Browser Exits:">
-<!ENTITY sm.exit.save "Save Session">
-<!ENTITY sm.exit.ask "Ask Before Saving">
-<!ENTITY sm.exit.nothing "Don't Save">
-<!ENTITY sm.startup "Startup Session:">
-<!ENTITY sm.lastsession "Last Session">
-<!ENTITY sm.previouslast "Previous to Last">
-<!ENTITY sm.chooseifempty "Choose another if empty">
-<!ENTITY sm.restore.options "When Restoring Sessions:">
-<!ENTITY sm.restore.overwrite "Overwrite existing windows">
-<!ENTITY sm.restore.overwriteTabs "And tabs">
-<!ENTITY sm.restore.closedWinList "Save windows in closed windows list">
-<!ENTITY sm.restore.merge "Join multiple windows into one">
-<!ENTITY sm.restore.bypassCache "Bypass cache when restoring">
-<!ENTITY sm.notrestore.label "When not restoring on start">
-<!ENTITY sm.restorePinned.label "Restore my pinned tabs from last time">
-<!ENTITY sm.preserve.options "Preserve Tabs:">
-<!ENTITY sm.preserve.history "History">
-<!ENTITY sm.preserve.protect "Protect Status">
-<!ENTITY sm.preserve.locked "Lock Status">
-<!ENTITY sm.preserve.permission "Permissions">
-<!ENTITY sm.preserve.scroll1 "Scroll Position">
-<!ENTITY sm.restore.winOptions "Preserve Windows:">
-<!ENTITY sm.restore.selectedTab "Selected tab">
-<!ENTITY sm.restore.closedTabs "Closed tabs list">
-<!ENTITY incompatible.extensions "Some of your extensions are incompatible with Tab Mix Plus, it is recommended that you will disable or uninstall those extensions.">
-<!ENTITY incompatible.button.label "Show List">
+<!ENTITY tab.links "Laserbideak">
+<!ENTITY tab.events "Ekintzak">
+<!ENTITY tab.mouse "Sagua">
+<!ENTITY tab.appearance "Erakutsi">
+<!ENTITY tab.menu "Aukerak">
+<!ENTITY tab.session "Saioa">
+<!ENTITY tab.incompatible "Errorea">
+<!ENTITY apply.label "Aplikatu">
+<!ENTITY settings.export "Exportatze Aukerak">
+<!ENTITY settings.import "Importatze Aukerak">
+<!ENTITY settings.sync "Sync Preferences">
+<!ENTITY settings.default "Berrezarri lehenetsiak">
+<!ENTITY generalWindowOpen.label "Ireki "leiho berri" linkak horrela:">
+<!ENTITY externalLink.useSeparate.label "Use separate preference for links from other applications">
+<!ENTITY externalLinkTarget.label "Ireki beste aplikazioetatiko linkak horrela:">
+<!ENTITY linkTarget.tab "Fitxa Berria">
+<!ENTITY linkTarget.window "Leiho Berria">
+<!ENTITY linkTarget.current "Gaineko Fitxa">
+<!ENTITY linkTarget.accesskey "C">
+<!ENTITY divertedWindowOpen.label "Mugatu JavaScript eta Popup:">
+<!ENTITY divertedWindowOpen.all "Popup guztiak fitxa gisa ireki">
+<!ENTITY divertedWindowOpen.some "Baimendu edozein popup-leiho neurri">
+<!ENTITY divertedWindowOpen.none "Baimendu edozein popup">
+<!ENTITY linkTarget.label "Ireki fitxategi batera bidaltzen duten linkak gaineko fitxan">
+<!ENTITY download.label "Saihest fitxa zuriak fitxategiak deskargatzean">
+<!ENTITY edit.label "Editatu">
+<!ENTITY speLink.label "Fitxa berri gisa irekiarazi:">
+<!ENTITY speLink.none "Ezer ez">
+<!ENTITY speLink.allLinks "Link guztiak">
+<!ENTITY speLink.external "Beste orri baterako linkak">
+<!ENTITY singleWindow.label "Fitxa guztiak leiho bakar batean beti">
+<!ENTITY newTabs.label "Fitxa berriak">
+<!ENTITY tabOpen.label "Fitxak irekitzea">
+<!ENTITY tabFocus.label "Fitxen Hurrenkera">
+<!ENTITY tabClose.label "Fitxak ixtea">
+<!ENTITY tabMerge.label "Fitxak bateratzea">
+<!ENTITY tabFeature.label "Fitxen ezaugarriak">
+<!ENTITY newtab.label "Ireki fitxa berrian:">
+<!ENTITY replaceLastTabWith.label "Azken fitxa itxiz gero, honekin ordeztu:">
+<!ENTITY newtab.blank "Orri zuria">
+<!ENTITY newtab.home "Etxeko orria">
+<!ENTITY newtab.current "Gaineko orria">
+<!ENTITY newtab.duplicate "Bikoiztu orria">
+<!ENTITY newtab.location.1 "New Tab Page">
+<!ENTITY newtab.placeholder.label "Default New Tab Page">
+<!ENTITY location.label.1 "Address">
+<!ENTITY focusContent.label "Focus content when loading non blank page">
+<!ENTITY openTabNext.label "Ireki fitxa berriak gainekoaren ondoan">
+<!ENTITY openOtherTabNext.label "Ireki bestelako fitxak gainekoaren ondoan">
+<!ENTITY relatedAfterCurrent.label "Gaineko fitxarekiko zerikusia badu bakarrik">
+<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3]->[a][1][2][3][b][c]">
+<!ENTITY openDuplicateNext.label "Ireki bikoiztutako fitxak originalaren ondoan">
+<!ENTITY openTabNext.tooltip "[a][b][c][1][2][3]->[a][3][2][1][b][c]">
+<!ENTITY openTabNextInverse.label "Aldatu irekitzeko hurrenkera">
+<!ENTITY openTabNextInverse.tooltip "[æ][3][2][1][b][c]->[a][1][2][3][b][c]">
+<!ENTITY openTabNextInverse.tooltip1 "Ireki fitxa berrian gainekoaren aurrekoaren ondoan">
+<!ENTITY lockTabs.label "Kateatu fitxak">
+<!ENTITY lockNewTabs.label "Kateatu fitxa berriak">
+<!ENTITY lockAppTabs.label "Kateatu aplikazioen fitxak">
+<!ENTITY updateLockState.label "Apply changes to open tabs">
+<!ENTITY openNewTab.label "Ireki fitxak hortik:">
+<!ENTITY openBookmarks.label "Lastermarkak">
+<!ENTITY openBMKGroups.label "Taldekako Lastermarkak">
+<!ENTITY openBMKGroups.tooltip "Ez ezabatu fitxarik taldekako bookmarkak irekitzean">
+<!ENTITY openHistory.label "Historia">
+<!ENTITY openUrl.label "Helbide barra">
+<!ENTITY openSearch.label "Bilatzaile barra">
+<!ENTITY middlecurrent1.label "Erdiko klikak edo CTRL-klikak gaineko fitxan irekitzen du">
+<!ENTITY middlecurrent.tooltip "Lastermarkak, historia eta derrigorrezko "leiho berri"-linkak bakarrik">
+<!ENTITY tabFocus.caption "Honelako fitxa berriak gainean jarri/hautatu:">
+<!ENTITY selectTab.label "Linkak">
+<!ENTITY selectDivertedTab.label "Leiho besteratuak">
+<!ENTITY selectTabFromExternal.label "Other applications">
+<!ENTITY selectTabCommand.label ""Fitxa berri" komandoak">
+<!ENTITY contextMenuSearch.label "Context menu search for">
+<!ENTITY selectTabBH.label "Lastermarkak/Historia">
+<!ENTITY duplicateTab.label "Bikoiztu fitxa">
+<!ENTITY inversefocus1.label "Erdiko klikak edo CTRL-klikak hautatzen du:">
+<!ENTITY warning.caption.label "Iragarpenak">
+<!ENTITY warnOnCloseProtected.label "Iragarri babestutako fitxak ixtekotan">
+<!ENTITY warnOnCloseWindow.label "Iragarri fitxa bat baino gehiagoko leihoa ixtekoan">
+<!ENTITY lasttab.caption.label "Azken fitxa ixtekotan">
+<!ENTITY keepWindow.label.3.1 "Ez itxi leihoa azken fitxa itxiz gero">
+<!ENTITY keeptab.label "Azken fitxa ezingo da itxi">
+<!ENTITY closeOnMerge.label "Itxi leiho zuriak leihoak bateratuz gero">
+<!ENTITY warnOnMerge.label "Iragarri bateratuko ez diren fitxak ixtekotan">
+<!ENTITY currenttab.caption.label "Gaineko fitxa ixtea">
+<!ENTITY focusTab.labelBegin "Gaineko fitxa ixtean, honako hau hautatu:">
+<!ENTITY focusTab.firstTab "Lehenengo fitxa">
+<!ENTITY focusTab.leftTab "Ezkerreko fitxa">
+<!ENTITY focusTab.rightTab "Eskuineko fitxa">
+<!ENTITY focusTab.lastTab "Azken fitxa">
+<!ENTITY focusTab.lastSelectedTab "Aurretik hautatutako fitxa">
+<!ENTITY focusTab.openerTab "Irekitzailea/eskuineko fitxa">
+<!ENTITY focusTab.openerTab.rtl "Irekitzailea/ezkerreko fitxa">
+<!ENTITY focusTab.lastOpenedTab "Aurretik irekitako fitxa">
+<!ENTITY undoClose.label "Piztu "itxitako fitxa berriz ireki" funtzioa">
+<!ENTITY undoCloseCache.label "Zenbat itxitako fitxak gogoratu:">
+<!ENTITY undoClosepos.label "Birrireki leju berdinean">
+<!ENTITY menuonlybutton.label "Make the toolbar button display only a list">
+<!ENTITY ctrltab.label "Ctrl-Tab navigates tabs in the most recently used order">
+<!ENTITY cmdtab.label "Cmd-Tab navigates tabs in the most recently used order">
+<!ENTITY ctrltab.tabPreviews "Show tab previews">
+<!ENTITY ctrltab.popup "Ctrl-Tab displays a tab list popup menu">
+<!ENTITY cmdtab.popup "Cmd-Tab displays a tab list popup menu">
+<!ENTITY tabpopup.mouse "Tab list responds to the mouse">
+<!ENTITY mergeNoTabSelection.label "Merge windows when no tabs are selected">
+<!ENTITY mergeTabSelection.label "Merging after selecting tabs">
+<!ENTITY mergeall.label "Merge all windows into one">
+<!ENTITY mergelastfocused.label "Merge only current window with last focused">
+<!ENTITY mergePopups.label "Also take popup windows">
+<!ENTITY popupNextToOpener.label "Place popups next to their openers">
+<!ENTITY activateSlideshow.label "Pressing #1 rotates tabs every">
+<!ENTITY toggleAnimation.label "Disable Open/Close tab animation">
+<!ENTITY reloadEvery.matchAddress.label "Reload a tab regardless of its address">
+<!ENTITY reloadEvery.onReloadButton.label "Show Reload Every menu on Reload button">
+<!ENTITY seconds.label "seconds">
+<!ENTITY minutes.label "min">
+<!ENTITY tabBarAppearance.label "Tab Bar">
+<!ENTITY tabAppearance.label "Tab">
+<!ENTITY toolBarAppearance.label "ToolBar">
+<!ENTITY show.ontabbar.label "Show on Tab bar">
+<!ENTITY show.ontab.label "Show on Tab">
+<!ENTITY dragNewTabButton.tooltip "Drag 'New Tab' button to your tab-bar to enable this option.">
+<!ENTITY hideTabBarButton.label "Close tab button">
+<!ENTITY newTabButton.label "New tab button">
+<!ENTITY newTabButton.posiotion.left.label "on Left side">
+<!ENTITY newTabButton.posiotion.right.label "on Right side">
+<!ENTITY newTabButton.posiotion.afterlast.label "After last tab">
+<!ENTITY allTabsButton.label "All tabs button">
+<!ENTITY tabBarSpace.label "Extra spaces on both sides">
+<!ENTITY tabBarSpace.tooltip "For clicking and dropping something on tab bar">
+<!ENTITY tabbar.label "Hide tab bar when only one tab is open">
+<!ENTITY moveTabOnDragging.label "When dragging a tab move it directly">
+<!ENTITY dropIndicator.label "Drop indicator">
+<!ENTITY dropIndicator-native.label "Native style">
+<!ENTITY dropIndicator-builtin.label "Built-in style">
+<!ENTITY verticalTabbar.description "Use treeStyleTab or VerticalTab extension to control these preferences.">
+<!ENTITY tabBarPosition.label "Position:">
+<!ENTITY tabBarPosition.top.label "Top (above content)">
+<!ENTITY tabBarPosition.bottom.label "Bottom (below content)">
+<!ENTITY tabScroll.label "When tabs don't fit width:">
+<!ENTITY tabScroll.none "Scrollable without buttons">
+<!ENTITY tabScroll.leftRightButtons "Scrollable with buttons on both sides">
+<!ENTITY tabScroll.rightButtons "Scrollable with buttons on right side">
+<!ENTITY tabScroll.rightButtons.rtl "Scrollable with buttons on left side">
+<!ENTITY tabScroll.multibar "Multi-row">
+<!ENTITY maxrow.label "Max number of rows to display:">
+<!ENTITY offsetAmountToScroll.label "When scrolling show part of next out-of-sight tab">
+<!ENTITY smoothScroll.label "Enable smooth scroll">
+<!ENTITY scrolldelay.label "Scroll Delay (time between scroll repetition)">
+<!ENTITY highlight.label "Highlight">
+<!ENTITY currenttab.style.label "Current tab">
+<!ENTITY unloadedtabs.style.label "Unloaded tabs">
+<!ENTITY unreadtabs.style.label "Unread tabs">
+<!ENTITY othertabs.style.label "Other tabs">
+<!ENTITY setstyles.label "Customize Styles">
+<!ENTITY extraIcons.label1 "Icons for">
+<!ENTITY extraIcons.locked "Locked">
+<!ENTITY extraIcons.protected "Protected">
+<!ENTITY extraIcons.autoreload "Auto Reload">
+<!ENTITY extraIcons.hideonpinned "Hide on pinned tabs">
+<!ENTITY progressMeter.label "Progress meter on tabs">
+<!ENTITY showTabX.labelBegin "Close tab button">
+<!ENTITY showTabX.left "Place on left side">
+<!ENTITY showTabX.rtl "Place on right side">
+<!ENTITY milliseconds.label "msec">
+<!-- LOCALIZATION NOTE change this only if you need to change the width -->
+<!ENTITY showTabX.popup.width "13em">
+<!ENTITY showTabX.always "on all">
+<!ENTITY showTabX.current "on current">
+<!ENTITY showTabX.hover "on pointed for">
+<!ENTITY showTabX.alwaysExeption "on all tabs wider than">
+<!ENTITY showTabX.currentHover "on current & pointed for">
+<!ENTITY minWidth.label "Tab Width:">
+<!ENTITY widthTo.label "to">
+<!ENTITY widthPixels.label "pixels">
+<!ENTITY flexTabs.label "Tab width fits to tab title">
+<!ENTITY bookastitle.label "Use bookmark name as tab title">
+<!-- LOCALIZATION NOTE: change this only if you need to change the width -->
+<!ENTITY toolbar.description.width "21em">
+<!ENTITY toolbar.description "You can customize which Tab Mix Plus buttons to show in your Toolbar">
+<!ENTITY toolbar.button.label "Customize">
+<!ENTITY toolbar.visible.caption "Visible buttons">
+<!ENTITY toolbar.novisible.label "There are no visible buttons">
+<!ENTITY toolbar.hidden.caption "Hidden buttons">
+<!ENTITY toolbar.nohidden.label "There are no hidden buttons">
+<!ENTITY mouseGesture.label "Mouse Gestures">
+<!ENTITY mouseClick.label "Mouse Clicking">
+<!ENTITY mouseHoverSelect.labelBegin "Select tab pointed for">
+<!ENTITY tabFlip.label "Switch to last selected tab when clicking current one">
+<!ENTITY tabFlip.delay "Use a delay of">
+<!ENTITY clickFocus.label "Mouse click (down and release) to select a tab">
+<!ENTITY removeEntries.label "Remove Tab Mix Plus menu list entries using middle-click">
+<!ENTITY lockTabSizingOnClose.label "When closing a tab, other tabs should not resize until cursor leaves toolbar region">
+<!ENTITY removeEntries.tooltip "Includes closed tabs, closed windows, and saved sessions">
+<!ENTITY tabbarscrolling.caption "When scrolling over the tab-bar">
+<!ENTITY tabbarscrolling.holdShift.label "Hold Shift while scrolling to switch between these options">
+<!ENTITY tabbarscrolling.selectTab.label "Change selected tab">
+<!ENTITY tabbarscrolling.scrollAllTabs.label "Scroll all tabs">
+<!ENTITY tabbarscrolling.inverse.label "Inverse scroll direction">
+<!ENTITY double.label "Double-click">
+<!ENTITY middle.label "Middle-click">
+<!ENTITY ctrl.label "Ctrl-click">
+<!ENTITY cmd.label "Cmd-Click">
+<!ENTITY shift.label "Shift-click">
+<!ENTITY alt.label "Alt-Click">
+<!ENTITY ontab.label "on a tab:">
+<!ENTITY ontabbar.label "on the tabbar:">
+<!ENTITY clicktab.label "Choose command to perform when clicking on tab or tabbar">
+<!ENTITY ontabbar.dblClick.label "Prevent double click on Tab-bar from changing window size.">
+<!ENTITY ontabbar.click.label "Prevent clicking on Tab-bar from dragging the window.">
+<!ENTITY clicktab.default "Firefox default or other extension">
+<!ENTITY clicktab.nothing "Does nothing">
+<!ENTITY clicktab.addtab "Open a new tab">
+<!ENTITY clicktab.duplicatetab "Duplicates the tab">
+<!ENTITY clicktab.duplicatetabw "Duplicates the tab in a new window">
+<!ENTITY clicktab.detachtab "Move the tab to a new window">
+<!ENTITY clicktab.protecttab "Protects the tab">
+<!ENTITY clicktab.locktab "Locks the tab">
+<!ENTITY clicktab.freezetab "Protects and Locks the tab">
+<!ENTITY clicktab.renametab "Renames the tab">
+<!ENTITY clicktab.copyTabUrl "Copies the tab's URL to the clipboard">
+<!ENTITY clicktab.copyUrlFromClipboard "Load URL from clipboard">
+<!ENTITY clicktab.selectMerge "Selects the tab for merging">
+<!ENTITY clicktab.mergeTabs "Merges windows together">
+<!ENTITY clicktab.bookTab "Bookmarks the tab">
+<!ENTITY clicktab.bookTabs "Bookmarks all tabs">
+<!ENTITY clicktab.reloadtab "Reloads the tab">
+<!ENTITY clicktab.reloadtabs "Reloads all tabs">
+<!ENTITY clicktab.reloadothertabs "Reloads other tabs">
+<!ENTITY clicktab.reloadlefttabs "Reloads left tabs">
+<!ENTITY clicktab.reloadrighttabs "Reloads right tabs">
+<!ENTITY clicktab.autoReloadTab "Activate/Deactivate tab auto reload">
+<!ENTITY clicktab.removeall "Close all tabs">
+<!ENTITY clicktab.removeother "Close other tabs">
+<!ENTITY clicktab.removesimilar "Close tabs from similar domain">
+<!ENTITY clicktab.removetoLeft "Close Tabs to the Left">
+<!ENTITY clicktab.removetoRight "Close Tabs to the Right">
+<!ENTITY clicktab.uctab "Reopens last closed tab">
+<!ENTITY clicktab.ucatab "Reopens all closed tabs">
+<!ENTITY clicktab.snapback "SnapBack Tab">
+<!ENTITY clicktab.ietab "Opens the tab in IE">
+<!ENTITY contentLoad "Middle-click loads url from clipboard">
+<!ENTITY context.tab "Tab Context Menu">
+<!ENTITY context.main "Main Context Menu">
+<!ENTITY context.tools "Tools Menu">
+<!ENTITY showtabBarContext.label "Show in Tab Context Menu">
+<!ENTITY showContentAreaContext.label "Show in Main Context Menu">
+<!ENTITY showToolsMenu.label "Show in Tools Menu">
+<!ENTITY startupHomePage.label "Show my home page">
+<!ENTITY startupBlankPage.label "Show a blank page">
+<!ENTITY startupLastSession.label "Show my windows and tabs from last time">
+<!ENTITY sm.extension.description1 "Tab Mix Plus detect that Session Manager Extension is installed">
+<!ENTITY sm.extension.description2 "Tab Mix Plus session manager will be disabled">
+<!ENTITY sm.extension.description3 "You can click the button on the right to open Session Manager Options dialog">
+<!ENTITY sm.extension.description4 "Convert My sessions data from Tab Mix Plus format to Session Manager extension format">
+<!ENTITY sm.extension.convert.label "Convert">
+<!ENTITY sm.extension.chooseFile.label0 "Let me choose which data file to convert">
+<!ENTITY sm.extension.chooseFile.label1 "Convert Tab Mix Plus sessions from the current profile">
+<!ENTITY ss.enable.label "Use Firefox's built-in Session Restore feature">
+<!ENTITY ss.enable.tooltip "Uncheck to allow the use with Tab Mix Plus Session Manager">
+<!ENTITY ss.advanced_setting "Advanced Setting">
+<!ENTITY ss.advanced_setting.warning "Don't change these, unless you know what you're doing">
+<!ENTITY ss.interval "Minimum time interval between two state saves">
+<!ENTITY ss.interval.seconds "(in milliseconds)">
+<!ENTITY ss.privacy_level "Save sensitive data (form data, POSTDATA and cookies) for">
+<!ENTITY ss.privacy_level.allsites "All sites">
+<!ENTITY ss.privacy_level.unencrypted "Unencrypted sites only">
+<!ENTITY ss.privacy_level.nosites "No sites at all">
+<!ENTITY ss.postdata.label1 "Maximum amount of POSTDATA to be stored">
+<!ENTITY ss.postdata.label2 "(in bytes, -1 = all of it)">
+<!ENTITY sessionManger.enable "Enable Session Manager">
+<!ENTITY crashRecovery.enable "Enable Crash Recovery">
+<!ENTITY sm.StartExit "Start/Exit">
+<!ENTITY sm.restore "Restore">
+<!ENTITY sm.preserve "Preserve">
+<!ENTITY sm.start "When Browser Starts:">
+<!ENTITY sm.start.restore "Restore">
+<!ENTITY sm.start.ask "Ask Before Restoring">
+<!ENTITY sm.start.nothing "Don't Restore">
+<!ENTITY sm.exit "When Browser Exits:">
+<!ENTITY sm.exit.save "Save Session">
+<!ENTITY sm.exit.ask "Ask Before Saving">
+<!ENTITY sm.exit.nothing "Don't Save">
+<!ENTITY sm.startup "Startup Session:">
+<!ENTITY sm.lastsession "Last Session">
+<!ENTITY sm.previouslast "Previous to Last">
+<!ENTITY sm.chooseifempty "Choose another if empty">
+<!ENTITY sm.restore.options "When Restoring Sessions:">
+<!ENTITY sm.restore.overwrite "Overwrite existing windows">
+<!ENTITY sm.restore.overwriteTabs "And tabs">
+<!ENTITY sm.restore.closedWinList "Save windows in closed windows list">
+<!ENTITY sm.restore.merge "Join multiple windows into one">
+<!ENTITY sm.restore.bypassCache "Bypass cache when restoring">
+<!ENTITY sm.notrestore.label "When not restoring on start">
+<!ENTITY sm.restorePinned.label "Restore my pinned tabs from last time">
+<!ENTITY sm.preserve.options "Preserve Tabs:">
+<!ENTITY sm.preserve.history "History">
+<!ENTITY sm.preserve.protect "Protect Status">
+<!ENTITY sm.preserve.locked "Lock Status">
+<!ENTITY sm.preserve.permission "Permissions">
+<!ENTITY sm.preserve.scroll1 "Scroll Position">
+<!ENTITY sm.restore.winOptions "Preserve Windows:">
+<!ENTITY sm.restore.selectedTab "Selected tab">
+<!ENTITY sm.restore.closedTabs "Closed tabs list">
+<!ENTITY incompatible.extensions "Some of your extensions are incompatible with Tab Mix Plus, it is recommended that you will disable or uninstall those extensions.">
+<!ENTITY incompatible.button.label "Show List">
diff --git a/chrome/locale/eu/session-manager.properties b/chrome/locale/eu/session-manager.properties
new file mode 100644
index 0000000..5f825c6
--- /dev/null
+++ b/chrome/locale/eu/session-manager.properties
@@ -0,0 +1,107 @@
+sm.saveClosedTab.chkbox.label=Save closed tabs list with this session
+sm.button.continue.label=Continue
+sm.button.continue.accesskey=C
+sm.askBeforSave.title=Session Manager - Save Session
+sm.askBeforSave.msg0=Would you like to save your session?
+sm.askBeforSave.msg2=Only non-private windows will be save to disk
+sm.askBeforSave.msg1=If you don\'t save, next time you start the browser the \'Last Session\' will be empty.
+sm.askBeforSave.button0.label=Save Session
+sm.askBeforSave.button0.accesskey=S
+sm.askBeforSave.button1.label=Don\'t Save
+sm.askBeforSave.button1.accesskey=D
+sm.corrupted.title=Session Manager - Corrupted Database
+sm.corrupted.msg0=Session Manager cannot load its database from corrupted session.rdf.
+sm.corrupted.msg1=The file session.rdf will be deleted, a copy can be found in session.old in your profile. sessions backups are in <profile>/sessionbackups
+sm.areYouSure.msg=Are you sure you want to continue?
+sm.canChooseStartup.msg=You can choose a session to be your new startup session from the list:
+sm.addtoStartup.title=Session Manager - Add to Startup Session
+sm.addtoStartup.msg.windows=You are about to add window(s) to your startup session:
+sm.addtoStartup.msg.tabs=You are about to add tab(s) to your startup session:
+sm.addtoStartup.button0.label=Add to Session
+sm.addtoStartup.button0.accesskey=A
+sm.addtoStartup.button1.label=Don\'t Add
+sm.addtoStartup.button1.accesskey=D
+sm.replaceStartup.title=Session Manager - Override Startup Session
+sm.replaceStartup.msg=You are about to replace your startup session:
+sm.replaceStartup.button0.label=Replace Session
+sm.replaceStartup.button0.accesskey=R
+sm.replaceStartup.button1.label=Don\'t Replace
+sm.replaceStartup.button1.accesskey=D
+sm.removeStartup.title=Session Manager - Delete Startup Session
+sm.removeStartup.msg0=You are about to delete your startup session:
+sm.removeStartup.msg1=Choose a session to be your new startup session from the list:
+sm.removeStartup.button0.label=Delete
+sm.removeStartup.button0.accesskey=D
+sm.removeStartup.button1.label=Don\'t Delete
+sm.removeStartup.button1.accesskey=T
+sm.title=Session Manager
+sm.dontSaveBlank.msg=Session Manager doesn\'t save blank windows
+sm.sessoinSave.error=Error in Session Manager, session didn\'t save
+sm.sessionName.title.rename=Session Manager - Rename Session
+sm.sessionName.title.saveprevious=Session Manager - Save Session
+sm.sessionName.title.savethiswindow=Session Manager - Save This Window
+sm.sessionName.title.saveallwindows=Session Manager - Save All Windows
+sm.sessionName.msg0=Enter Session Name:
+sm.sessionName.msg1=Name must be at least one letter or number.
+sm.sessionName.msg2=This name is already in use!
+sm.sessionName.msg3=Are you sure you want to replace the session?
+sm.sessionName.button0.label=Rename Session
+sm.sessionName.button0.accesskey=R
+sm.sessionName.button1.label=Don\'t Rename
+sm.sessionName.button1.accesskey=D
+sm.session.empty=empty
+sm.session.tabs=T
+sm.session.windows=W
+sm.removeAll.title.session=Session Manager - Delete All Saved Sessions
+sm.removeAll.title.closedwindow=Session Manager - Delete All Closed Windows
+sm.removeAll.msg0=Are you sure you want to delete all your saved sessions?
+sm.removeAll.msg1=If you choose \'Delete\' your startup session will be the \'Last Session\'.
+sm.removeAll.msg2=Are you sure you want to delete all your closed windows?
+sm.sessionMenu.last=Last Session
+sm.sessionMenu.lastDefault=Last Session - Default
+sm.sessionMenu.lastgood=Last Good Session
+sm.sessionMenu.previous=Previous to Last
+sm.sessionMenu.crashed=Crashed Session
+sm.afterCrash.title=Session Manager - Restore after Crash
+sm.afterCrash.chkbox.label=Enable Session Manager
+sm.afterCrash.msg0=Your last session Crashed!
+sm.afterCrash.msg0.again=Your last Crashed session Crashed again!
+sm.afterCrash.msg1=Choose session to restore from the list:
+sm.afterCrash.msg2=Choose how to continue
+sm.afterCrash.msg3=Session Manager is currently disabled, if you enable Session Manager, you will be able to restore crashed sessions, closed sessions, saved sessions and closed windows from the Session Manager menu.
+sm.afterCrash.msg4=You can also restore the crashed session later from the Session Manager menu.
+sm.afterCrash.msg5=but nothing was saved.
+sm.afterCrash.msg6=but there isn\'t any open window in your Crashed session
+sm.afterCrash.msg7=Choose window to restore from Closed Windows list
+sm.afterCrash.msg8=(you can also restore closed windows later from the Closed Windows menu)
+sm.afterCrash.msg9=Your Crashed session is empty!
+sm.afterCrash.msg10=Session Manager did not find any sessions to restore from.
+sm.afterCrash.button0.label=Restore Session
+sm.afterCrash.button0.accesskey=R
+sm.afterCrash.button0.crashed.label=Restore Crashed Session
+sm.afterCrash.button0.crashed.accesskey=R
+sm.afterCrash.button1.label=Don\'t Restore
+sm.afterCrash.button1.accesskey=D
+sm.start.title=Session Manager - Restore Session
+sm.start.chkbox.label=Enable Crash Recovery
+sm.start.msg0=Your Startup session is empty!
+sm.start.msg1=Crash Recovery is currently disabled, if you enable Crash Recovery, you will be able to restore crashed sessions.
+sm.start.msg2=Error while looking for your startup session, your saved startup session does not exist.
+sm.restoreError.msg0=Error in session manager file!
+sm.restoreError.msg1=Delete the session you tried to restore
+sm.disable.msg=Firefox has a built-in session restore feature.
+sm.disable.msg1=Would you like to enable built-in session restore and disable the Tab Mix Plus Session Manager?
+sm.disable.msg2=Would you like to enable Tab Mix Plus Session Manager and disable the built-in session restore?
+sm.extension.convert.msg1=Would you like to convert your sessions data from Tab Mix Plus format to Session Manager extension format?
+sm.extension.convert.msg2=You can do it later from Tab Mix Plus session options window.
+sm.extension.convert.nosessions=There is no session in this file.
+sm.extension.convert.alreadyconverted=This session file have already been converted to Session Manager extension format.
+sm.extension.convert.doitagain=Do you wish to convert them again?
+sm.extension.convert.unable=Unable to convert from session.rdf
+sm.extension.convert.many=sessions converted, would you like to delete any of them?
+sm.extension.convert.one=one session converted, would you like to delete it?
+sm.extension.convert.rename=You will be able to rename the session(s) later from Session Manager menu
+sm.extension.convert.selectfile=Select session.rdf file to convert
+sm.extension.convert.rdffiles=RDF Files
+sm.extension.convert.sessionfiles=Session Files
+sm.tabview.hiddengroups=More tabs restored into hidden groups.
diff --git a/chrome/locale/eu/tabmix.dtd b/chrome/locale/eu/tabmix.dtd
new file mode 100644
index 0000000..4b629a2
--- /dev/null
+++ b/chrome/locale/eu/tabmix.dtd
@@ -0,0 +1,131 @@
+<!ENTITY closedtabsbtn.label "Arestian itxitako fitxak">
+<!ENTITY closedtabsbtn.tooltip "Erakutsi itxitako fitxen zerrenda">
+<!ENTITY sessionbtn.tooltip "Display and Manage your Sessions">
+<!ENTITY tabslistbtn.label "Fitxa irekiak">
+<!ENTITY tabslistbtn.tooltip "Erakutsi fitxa irekien zerrenda">
+<!ENTITY closedwindowsbtn.label "Arestian itxitako leihoak">
+<!ENTITY closedwindowsbtn.tooltip "Erakutsi itxitako leihoen zerrenda">
+<!ENTITY page.header.title "Tab Mix Plus Hobespenak">
+<!ENTITY options.main.sessionbutton.label "Tab Mix Plus Session Manager">
+<!ENTITY session.Tools "Session Manager">
+<!ENTITY closedWin.label "Itxitako leihoen zerrenda">
+<!ENTITY duplicateTabMenu.label "Fitxa bikoiztu">
+<!ENTITY duplicateTabMenu.accesskey "Z">
+<!ENTITY duplicateinWin.label "Bikoiztu leiho berri batean">
+<!ENTITY duplicateinWin.accesskey "L">
+<!ENTITY detachTab.label "Mugitu leiho berri batera">
+<!ENTITY detachTab.accesskey "M">
+<!ENTITY mergeContext.label "Batu leihoak">
+<!ENTITY mergeContext.accesskey "B">
+<!ENTITY renametab.label "Aldatu fitxaren izena">
+<!ENTITY renametab.accesskey "M">
+<!ENTITY copytaburl.label "Kopiatu fitxaren URL">
+<!ENTITY copytaburl.accesskey "U">
+<!ENTITY reloadother.label "Birkargatu beste fitxak">
+<!ENTITY reloadother.accesskey "F">
+<!ENTITY reloadleft.label "Birkargatu ezkerreko fitxak">
+<!ENTITY reloadleft.accesskey "E">
+<!ENTITY reloadright.label "Birkargatu eskuineko fitxak">
+<!ENTITY reloadright.accesskey "R">
+<!ENTITY autoReloadTab.label "Birkargatu behin eta berriz">
+<!ENTITY autoReloadTab.accesskey "D">
+<!ENTITY autoReloadSite.label "Reload This Site Every">
+<!ENTITY autoReloadSite.accesskey "E">
+<!ENTITY afterthis.label "Fitxa honen ondoren">
+<!ENTITY bookmarktab.label "Egin fitxa honen laster-marka">
+<!ENTITY undoCloseListMenu.label "Itxitako fitxen zerrenda">
+<!ENTITY undoCloseListMenu.accesskey "X">
+<!ENTITY closeAllTabsMenu.label "Itxi fitxa oro">
+<!ENTITY closeall.accesskey "O">
+<!ENTITY closeSimilarTab.label "Itxi antzeko fitxak">
+<!ENTITY closeSimilarTab.accesskey "Z">
+<!ENTITY closeTabsToLeft.label "Close Tabs to the Left">
+<!ENTITY closeleft.accesskey "E">
+<!ENTITY closeTabstoRight.label "Close Tabs to the Right">
+<!ENTITY closeright.accesskey "R">
+<!ENTITY docShellMenu.label "Baimenak">
+<!ENTITY docShellMenu.accesskey "P">
+<!ENTITY freezeTabMenu.label "Izoztu fitxa">
+<!ENTITY freezeTabMenu.accesskey "F">
+<!ENTITY protectTabMenu.label "Babestu fitxa">
+<!ENTITY protectTabMenu.tooltip "Babestu fitxak itxi ez daitezen">
+<!ENTITY protectTabMenu.accesskey "B">
+<!ENTITY lockTabMenu.label "Lotu Fitxa">
+<!ENTITY lockTabMenu.tooltip "Lotura oro fitxa berri batean ireki">
+<!ENTITY lockTabMenu.accesskey "L">
+<!ENTITY bookmarktabs.label "Egin fitxa guztien laster-markak">
+<!ENTITY linkhere.label "Ireki lotura fitxa honetan">
+<!ENTITY linkhere.accesskey "h">
+<!ENTITY linkBackgroundTab.label "Ireki lotura atzeko planoan">
+<!ENTITY linkForegroundTab.label "Ireki lotura aurreko planoan">
+<!ENTITY linkBackgroundTab.accesskey "a">
+<!ENTITY linkForegroundTab.accesskey "u">
+<!ENTITY openalllinks.label "Ireki loturak fitxa berri batzuetan">
+<!ENTITY openalllinks.accesskey "x">
+<!ENTITY linkwithhistory.label "Ireki lotura bikoiztutako fitxa batean">
+<!ENTITY linkwithhistory.accesskey "z">
+<!ENTITY tabsList.label "Fitxa irekien zerrenda">
+<!ENTITY tabsList.accesskey "i">
+<!ENTITY allowImage.label "Irudia">
+<!ENTITY allowJavascript.label "JavaScript">
+<!ENTITY allowRedirect.label "Redirect">
+<!ENTITY allowPlugin.label "Plug-in">
+<!ENTITY allowFrame.label "Frame">
+<!ENTITY restoreincurrent.label "Birkargatu fitxa honetan">
+<!ENTITY restoreincurrent.accesskey "h">
+<!ENTITY restoreinwin.label "Birkargatu leiho berri batean">
+<!ENTITY restoreinwin.accesskey "b">
+<!ENTITY restoreintab.label "Birkargatu fitxa berri batean">
+<!ENTITY restoreintab.accesskey "f">
+<!ENTITY restoretab.label "Berreskuratu fitxa">
+<!ENTITY restoretab.accesskey "R">
+<!ENTITY bookmark.label "Egin lotura honen laster-marka">
+<!ENTITY bookmark.accesskey "l">
+<!ENTITY deletelist.label "Kendu zerrendatik">
+<!ENTITY deletelist.accesskey "k">
+<!ENTITY settings.label "Hobespenak">
+<!ENTITY saveWindow.label "Gorde leiho hau">
+<!ENTITY saveAllWindows.label "Gorde leiho guztiak">
+<!ENTITY sm.context.overwrite "Berreskuratu, Gainidatzi dagoen leiho(ak)">
+<!ENTITY sm.context.overwrite.key "G">
+<!ENTITY sm.context.restore.new "Berreskuratu leiho berri batzuetan">
+<!ENTITY sm.context.restore.newkey "b">
+<!ENTITY sm.context.replacethis "Replace, With This Window">
+<!ENTITY sm.context.replacethis.key "T">
+<!ENTITY sm.context.replaceall "Replace, With All Windows">
+<!ENTITY sm.context.replaceall.key "A">
+<!ENTITY sm.context.add "Gehitu leiho hau">
+<!ENTITY sm.context.add.key "h">
+<!ENTITY sm.context.addall "Gehitu leiho guztiak">
+<!ENTITY sm.context.addall.key "z">
+<!ENTITY sm.context.save "Gorde">
+<!ENTITY sm.context.save.key "G">
+<!ENTITY sm.context.rename "Aldatu izena">
+<!ENTITY sm.context.rename.key "d">
+<!ENTITY sm.context.delete "Ezabatu">
+<!ENTITY sm.context.delete.key "E">
+<!ENTITY sm.context.deleteall "Ezabatu dena">
+<!ENTITY sm.context.deleteall.key "n">
+<!ENTITY sm.context.startup "Set as Startup Session">
+<!ENTITY sm.context.startup.key "P">
+<!ENTITY sm.context.details "Show Counters, Date and Time in Session Menu">
+<!ENTITY sm.context.details.key "C">
+<!ENTITY tab.key "T">
+<!ENTITY window.key "N">
+<!ENTITY merge.key "M">
+<!ENTITY sortedTabs.label "Sorted Tabs">
+<!ENTITY sortedTabs.tooltip "Check to show the list sorted alphabetically">
+<!ENTITY enable.label "Enable">
+<!ENTITY custom.label "Custom">
+<!ENTITY enableTabs.label "Enable All Tabs">
+<!ENTITY disableTabs.label "Disable All Tabs">
+<!ENTITY seconds.label "seconds">
+<!ENTITY minutes.label "minutes">
+<!ENTITY minute.label "minute">
+<!ENTITY hideTabBar.label "Hide the tab bar">
+<!ENTITY hideTabBar.never.label "Never">
+<!ENTITY hideTabBar.never.key "N">
+<!ENTITY hideTabBar.onOneTab.label "When I have only one tab">
+<!ENTITY hideTabBar.onOneTab.key "E">
+<!ENTITY hideTabBar.always.label "Always">
+<!ENTITY hideTabBar.always.key "A">
diff --git a/chrome/locale/eu/tabmix.properties b/chrome/locale/eu/tabmix.properties
new file mode 100644
index 0000000..a1db12b
--- /dev/null
+++ b/chrome/locale/eu/tabmix.properties
@@ -0,0 +1,40 @@
+extensions.{dc572301-7619-498c-a57d-39143191b318}.description= Tab browsing with an added boost.
+tmp.merge.warning.title= Closing window with non-merged tabs
+tmp.merge.warning.message= The selected tabs will be merged with another window, but the other tabs will now be closed with the current window.
+tmp.merge.warning.checkboxLabel= Always warn me when closing a window with tabs that aren\'t merging.
+tmp.merge.error= At least 2 windows have to be opened before you can merge them
+tmp.merge.private= You can not merge private window with non-private window.
+tmp.importPref.error1= Can not import because it is not a valid file.
+tmp.importPref.error2= Failed to import settings.
+tmp.sessionempty= Next time you start the browser, \'Last Session\' will be empty.
+droptoclose.label= Drop a tab to close it
+droplink.label=Drop at the center to replace the tab or at the sides to create a new tab
+flstOn.label= Tabs Focus to Last Selected - Press F9 to swap preference
+flstOff.label= Tabs Focus to Right - Press F9 to swap preference
+slideshowOn.label= Tab Rotation is On - Press F8 to turn off
+slideshowOff.label= Tab Rotation Off - Press F8 to turn on
+undoclosetab.clear.label= Clear Closed Tabs List
+undoclosetab.clear.accesskey= C
+undoClosedWindows.clear.label= Clear Closed Windows List
+undoClosedWindows.clear.accesskey= C
+protectedtabs.closeWarning.1=You are about to close %S protected tab. Are you sure you want to continue?
+protectedtabs.closeWarning.2=You are about to close %S protected tabs. Are you sure you want to continue?
+protectedtabs.closeWarning.3=You are about to close %S tabs, %S of them protected. Are you sure you want to continue?
+protectedtabs.closeWarning.4=Warn me when I attempt to close window with protected tabs
+window.closeWarning.1=Warn me when I attempt to close window with multiple tabs
+closeWindow.label=Close window
+confirm_autoreloadPostData_title=Warning!
+confirm_autoreloadPostData=The page on which you tried to enable Auto Reload contains POSTDATA.\nIf you enable Auto Reload, any action the form carries out (such as an online purchase) will be repeated.\n\nAre you sure that you want to enable Auto Reload?
+incompatible.title= Tab Mix Plus
+incompatible.msg0= The following extensions are integrated or incompatible with Tab Mix Plus.
+incompatible.msg1= Would you like to disable these extensions?
+incompatible.msg2= The incompatible extensions will be disabled after you restart your browser.
+incompatible.button0.label= Disable
+incompatible.button0.accesskey= D
+incompatible.button1.label= Don\'t Disable
+incompatible.button1.accesskey= O
+incompatible.button2.label= Disable and Restart
+incompatible.button2.accesskey= E
+incompatible.chkbox.label= Show this alert when browser starts
+tabmixoption.error.title= Tab Mix Plus Error
+tabmixoption.error.msg= You must have one browser window to use Tab Mix Plus Options
diff --git a/chrome/locale/fi/misc.dtd b/chrome/locale/fi/misc.dtd
new file mode 100644
index 0000000..b9d909a
--- /dev/null
+++ b/chrome/locale/fi/misc.dtd
@@ -0,0 +1,17 @@
+<!ENTITY searchTabFocus.label "Lataa taustalla">
+<!ENTITY searchTabFocus.accesskey "B">
+<!ENTITY renametab.panel.title "Muokkaa välilehden nimeä">
+<!ENTITY renametab.reset.label "Palauta oletusnimi">
+<!ENTITY title.label "Nimike">
+<!ENTITY default.label "Oletus">
+<!ENTITY renametab.permanently.label "Muuta tämän välilehden nimi sen osoitteesta huolimatta">
+<!ENTITY renametab.permanently.tooltip "Välilehti historian kera - uusi nimi säilyy kun osoite muuttuu">
+<!ENTITY forum.label "Foorumi">
+<!ENTITY faq.label "UKK">
+<!ENTITY help.label "Apua">
+<!ENTITY tabmix.label "Tab Mix Plus">
+<!ENTITY reloadtime.label1 "Valitse aika listalta tai määritä itse">
+<!ENTITY specifyreload.label "Määritä uudelleenlatauksen aikaväli">
+<!ENTITY sanitizer.entry "Tallenneteut Tab Mix Plus -istunnot">
+<!ENTITY sanitizer.entry.accesskey "T">
+<!ENTITY sanitizer.entry.confirm "Oletko varma että haluat poistaa KAIKKI tallennetut tiedot mukaanlukien varmuuskopiot?">
diff --git a/chrome/locale/fi/pref-appearance.dtd b/chrome/locale/fi/pref-appearance.dtd
new file mode 100644
index 0000000..6eb5442
--- /dev/null
+++ b/chrome/locale/fi/pref-appearance.dtd
@@ -0,0 +1,18 @@
+<!ENTITY styles.label "Mukauta tyylejä">
+<!ENTITY currentTab.label "Nykyinen välilehti">
+<!ENTITY unloadedTabs.label "Suljetut välilehdet">
+<!ENTITY unreadTab.label "Lukemamattoman välilehdet">
+<!ENTITY hideRGB.label "Hide RGB">
+<!ENTITY showRGB.label "Show RGB">
+<!ENTITY unreadAfterReload.label "set tab as unread after reload">
+<!ENTITY squaredTabs.label "Apply background color for squared tabs">
+<!ENTITY otherTabs.label "Muut välilehdet">
+<!ENTITY italic.label "Kursiivi">
+<!ENTITY bold.label "Lihavoitu">
+<!ENTITY underline.label "Alleviivattu">
+<!ENTITY textcolor.label "Tekstin väri">
+<!ENTITY bgColor.label "Taustan väri">
+<!ENTITY bgTopColor.label "top">
+<!ENTITY bgBottomColor.label "bottom">
+<!ENTITY useThis.label "Käytä tätä tyyliä">
+<!ENTITY opacity.label "Läpikuultavuus">
diff --git a/chrome/locale/fi/pref-filetype.dtd b/chrome/locale/fi/pref-filetype.dtd
new file mode 100644
index 0000000..fcdd20e
--- /dev/null
+++ b/chrome/locale/fi/pref-filetype.dtd
@@ -0,0 +1,5 @@
+<!ENTITY filetype.options "Tiedostotyyppien muokkaus">
+<!ENTITY filetype.add "Lisää">
+<!ENTITY filetype.edit "Muokkaa">
+<!ENTITY filetype.delete "Poista">
+<!ENTITY filetype.new "Uusi tiedostotyyppi:">
diff --git a/chrome/locale/en-US/pref-tabmix.dtd b/chrome/locale/fi/pref-tabmix.dtd
similarity index 80%
copy from chrome/locale/en-US/pref-tabmix.dtd
copy to chrome/locale/fi/pref-tabmix.dtd
index 36992f7..8ea7629 100644
--- a/chrome/locale/en-US/pref-tabmix.dtd
+++ b/chrome/locale/fi/pref-tabmix.dtd
@@ -1,51 +1,51 @@
-<!ENTITY tab.links "Links">
-<!ENTITY tab.events "Events">
-<!ENTITY tab.mouse "Mouse">
-<!ENTITY tab.appearance "Display">
-<!ENTITY tab.menu "Menu">
-<!ENTITY tab.session "Session">
+<!ENTITY tab.links "Linkit">
+<!ENTITY tab.events "Tapahtumat">
+<!ENTITY tab.mouse "Hiiri">
+<!ENTITY tab.appearance "Näyttö">
+<!ENTITY tab.menu "Valikko">
+<!ENTITY tab.session "Istunto">
<!ENTITY tab.incompatible "Error">
-<!ENTITY apply.label "Apply">
-<!ENTITY settings.export "Export Preferences">
-<!ENTITY settings.import "Import Preferences">
+<!ENTITY apply.label "Käytä">
+<!ENTITY settings.export "Vie asetukset">
+<!ENTITY settings.import "Tuo asetukset">
<!ENTITY settings.sync "Sync Preferences">
-<!ENTITY settings.default "Restore Defaults">
-<!ENTITY generalWindowOpen.label "Open links that open in a new window in:">
+<!ENTITY settings.default "Palauta oletusasetukset">
+<!ENTITY generalWindowOpen.label "Avaa uusissa ikkunoissa avautuvat linkit:">
<!ENTITY externalLink.useSeparate.label "Use separate preference for links from other applications">
-<!ENTITY externalLinkTarget.label "Open links from other applications in:">
-<!ENTITY linkTarget.tab "New Tab">
-<!ENTITY linkTarget.window "New Window">
-<!ENTITY linkTarget.current "Current Tab">
+<!ENTITY externalLinkTarget.label "Avaa muista ohjelmista avatut linkit:">
+<!ENTITY linkTarget.tab "Uudella välilehdellä">
+<!ENTITY linkTarget.window "Uuteen ikkunaan">
+<!ENTITY linkTarget.current "Nykyiseen välilehteen">
<!ENTITY linkTarget.accesskey "C">
-<!ENTITY divertedWindowOpen.label "JavaScript & Popup restriction:">
-<!ENTITY divertedWindowOpen.all "Open all popups in tabs">
-<!ENTITY divertedWindowOpen.some "Allows resized popups">
-<!ENTITY divertedWindowOpen.none "Allows all popups">
-<!ENTITY linkTarget.label "Open links with a target attribute in current tab">
-<!ENTITY download.label "Prevent blank tabs when downloading files">
-<!ENTITY edit.label "Edit">
-<!ENTITY speLink.label "Force to open in new tab:">
-<!ENTITY speLink.none "Nothing">
+<!ENTITY divertedWindowOpen.label "JavaScript-ponnahdusikkunat:">
+<!ENTITY divertedWindowOpen.all "Avaan kaikki ponnahdusikkunat välilehtiin">
+<!ENTITY divertedWindowOpen.some "Salli kiinteäkokoiset ponnahdusikkunat">
+<!ENTITY divertedWindowOpen.none "Salli kaikki ponnahdusikkunat">
+<!ENTITY linkTarget.label "Avaa linkit, joissa on target-attribuutti, nykyiseen välilehteen">
+<!ENTITY download.label "Estä tyhjät välilehdet tiedostoja ladattaessa">
+<!ENTITY edit.label "Muokkaa">
+<!ENTITY speLink.label "Pakota avaus uuteen välilehteen:">
+<!ENTITY speLink.none "Ei käytössä">
<!ENTITY speLink.allLinks "All links">
-<!ENTITY speLink.external "Links to other sites">
-<!ENTITY singleWindow.label "Enable Single Window Mode">
+<!ENTITY speLink.external "Linkit muille sivustoille">
+<!ENTITY singleWindow.label "Ota käyttöön yhden ikkunan tila">
<!ENTITY newTabs.label "New Tabs">
-<!ENTITY tabOpen.label "Tab Opening">
-<!ENTITY tabFocus.label "Tab Focus">
-<!ENTITY tabClose.label "Tab Closing">
-<!ENTITY tabMerge.label "Tab Merging">
-<!ENTITY tabFeature.label "Tab Features">
-<!ENTITY newtab.label "Load on new tabs:">
-<!ENTITY replaceLastTabWith.label "When I close last tab replace it with">
-<!ENTITY newtab.blank "Blank Page">
-<!ENTITY newtab.home "Home Page">
-<!ENTITY newtab.current "Current Page">
-<!ENTITY newtab.duplicate "Duplicate Tab with history">
-<!ENTITY newtab.location.1 "New Tab Page">
+<!ENTITY tabOpen.label "Välilehtien avaus">
+<!ENTITY tabFocus.label "Välilehtien kohdistus">
+<!ENTITY tabClose.label "Välilehtien sulkeminen">
+<!ENTITY tabMerge.label "Välilehtien yhdistäminen">
+<!ENTITY tabFeature.label "Välilehtien ominaisuudet">
+<!ENTITY newtab.label "Lataa uusiin välilehtiin">
+<!ENTITY replaceLastTabWith.label "Suljettaessa viimeinen välilehti, korvaa se">
+<!ENTITY newtab.blank "tyhjällä sivulla">
+<!ENTITY newtab.home "kotisivulla">
+<!ENTITY newtab.current "Nykyisellä sivulla">
+<!ENTITY newtab.duplicate "Duplicate Page">
+<!ENTITY newtab.location.1 "Uusi välilehtisivu">
<!ENTITY newtab.placeholder.label "Default New Tab Page">
-<!ENTITY location.label.1 "Address">
+<!ENTITY location.label.1 "Osoite">
<!ENTITY focusContent.label "Focus content when loading non blank page">
-<!ENTITY openTabNext.label "Open new tabs next to current one">
+<!ENTITY openTabNext.label "Open New Tab next to current one">
<!ENTITY openOtherTabNext.label "Open other tabs next to current one">
<!ENTITY relatedAfterCurrent.label "Only if related to current tab">
<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
@@ -72,7 +72,7 @@
<!ENTITY selectDivertedTab.label "Diverted windows">
<!ENTITY selectTabFromExternal.label "Other applications">
<!ENTITY selectTabCommand.label "New tab commands">
-<!ENTITY contextMenuSearch.label "Context menu search for">
+<!ENTITY contextMenuSearch.label "Ponnahdusvalikkohaku:">
<!ENTITY selectTabBH.label "Bookmarks/History">
<!ENTITY duplicateTab.label "Duplicate Tab">
<!ENTITY inversefocus1.label "Inverse Middle-click or Control-click focus of:">
@@ -112,7 +112,7 @@
<!ENTITY popupNextToOpener.label "Place popups next to their openers">
<!ENTITY activateSlideshow.label "Pressing #1 rotates tabs every">
<!ENTITY toggleAnimation.label "Disable Open/Close tab animation">
-<!ENTITY reloadEvery.matchAddress.label "Reload a tab regardless of its address">
+<!ENTITY reloadEvery.matchAddress.label "Lataa välilehti uudelleen riippumatta sen osoitteesta">
<!ENTITY reloadEvery.onReloadButton.label "Show Reload Every menu on Reload button">
<!ENTITY seconds.label "seconds">
<!ENTITY minutes.label "min">
@@ -141,32 +141,31 @@
<!ENTITY tabBarPosition.bottom.label "Bottom (below content)">
<!ENTITY tabScroll.label "When tabs don't fit width:">
<!ENTITY tabScroll.none "Scrollable without buttons">
-<!ENTITY tabScroll.leftRightButtons "Scrollable with buttons on both sides">
+<!ENTITY tabScroll.leftRightButtons "Scrollable with buttons on left and right sides">
<!ENTITY tabScroll.rightButtons "Scrollable with buttons on right side">
<!ENTITY tabScroll.rightButtons.rtl "Scrollable with buttons on left side">
<!ENTITY tabScroll.multibar "Multi-row">
<!ENTITY maxrow.label "Max number of rows to display:">
-<!ENTITY offsetAmountToScroll.label "When scrolling show part of next out-of-sight tab">
-<!ENTITY smoothScroll.label "Enable smooth scroll">
+<!ENTITY offsetAmountToScroll.label "Vieritettäessä näytä osa seuraavasta piiloon jäävästä välilehdestä">
+<!ENTITY smoothScroll.label "Käytä pehmeää vieritystä">
<!ENTITY scrolldelay.label "Scroll Delay (time between scroll repetition)">
<!ENTITY highlight.label "Highlight">
<!ENTITY currenttab.style.label "Current tab">
-<!ENTITY unloadedtabs.style.label "Unloaded tabs">
+<!ENTITY unloadedtabs.style.label "Suljetut välilehdet">
<!ENTITY unreadtabs.style.label "Unread tabs">
-<!ENTITY othertabs.style.label "Other tabs">
+<!ENTITY othertabs.style.label "Other Tabs">
<!ENTITY setstyles.label "Customize Styles">
<!ENTITY extraIcons.label1 "Icons for">
<!ENTITY extraIcons.locked "Locked">
<!ENTITY extraIcons.protected "Protected">
-<!ENTITY extraIcons.autoreload "Auto Reload">
+<!ENTITY extraIcons.autoreload "Auto-Reload">
<!ENTITY extraIcons.hideonpinned "Hide on pinned tabs">
<!ENTITY progressMeter.label "Progress meter on tabs">
<!ENTITY showTabX.labelBegin "Close tab button">
<!ENTITY showTabX.left "Place on left side">
<!ENTITY showTabX.rtl "Place on right side">
<!ENTITY milliseconds.label "msec">
-<!-- LOCALIZATION NOTE
- change this only if you need to change the width -->
+<!-- LOCALIZATION NOTE change this only if you need to change the width -->
<!ENTITY showTabX.popup.width "13em">
<!ENTITY showTabX.always "on all">
<!ENTITY showTabX.current "on current">
@@ -178,8 +177,7 @@
<!ENTITY widthPixels.label "pixels">
<!ENTITY flexTabs.label "Tab width fits to tab title">
<!ENTITY bookastitle.label "Use bookmark name as tab title">
-<!-- LOCALIZATION NOTE:
- change this only if you need to change the width -->
+<!-- LOCALIZATION NOTE: change this only if you need to change the width -->
<!ENTITY toolbar.description.width "21em">
<!ENTITY toolbar.description "You can customize which Tab Mix Plus buttons to show in your Toolbar">
<!ENTITY toolbar.button.label "Customize">
@@ -194,13 +192,13 @@
<!ENTITY tabFlip.delay "Use a delay of">
<!ENTITY clickFocus.label "Mouse click (down and release) to select a tab">
<!ENTITY removeEntries.label "Remove Tab Mix Plus menu list entries using middle-click">
-<!ENTITY lockTabSizingOnClose.label "When closing a tab, other tabs should not resize until cursor leaves toolbar region">
+<!ENTITY lockTabSizingOnClose.label "Suljettaessa välilehteä, säilytä muiden välilehtien koko kunnes kursori poistuu työkalupalkin alueelta">
<!ENTITY removeEntries.tooltip "Includes closed tabs, closed windows, and saved sessions">
-<!ENTITY tabbarscrolling.caption "When scrolling over the tab-bar">
-<!ENTITY tabbarscrolling.holdShift.label "Hold Shift while scrolling to switch between these options">
-<!ENTITY tabbarscrolling.selectTab.label "Change selected tab">
-<!ENTITY tabbarscrolling.scrollAllTabs.label "Scroll all tabs">
-<!ENTITY tabbarscrolling.inverse.label "Inverse scroll direction">
+<!ENTITY tabbarscrolling.caption "Vieritettäessä välilehtipalkin päällä">
+<!ENTITY tabbarscrolling.holdShift.label "Pidä Shift pohjassa vieritettäessä vaihtaaksesi näiden valintojen välillä">
+<!ENTITY tabbarscrolling.selectTab.label "Vaihda valittu välilehti">
+<!ENTITY tabbarscrolling.scrollAllTabs.label "Vieritä kaikki välilehdet">
+<!ENTITY tabbarscrolling.inverse.label "Käännä vierityksen suunta">
<!ENTITY double.label "Double-click">
<!ENTITY middle.label "Middle-click">
<!ENTITY ctrl.label "Ctrl-click">
diff --git a/chrome/locale/fi/session-manager.properties b/chrome/locale/fi/session-manager.properties
new file mode 100644
index 0000000..5f825c6
--- /dev/null
+++ b/chrome/locale/fi/session-manager.properties
@@ -0,0 +1,107 @@
+sm.saveClosedTab.chkbox.label=Save closed tabs list with this session
+sm.button.continue.label=Continue
+sm.button.continue.accesskey=C
+sm.askBeforSave.title=Session Manager - Save Session
+sm.askBeforSave.msg0=Would you like to save your session?
+sm.askBeforSave.msg2=Only non-private windows will be save to disk
+sm.askBeforSave.msg1=If you don\'t save, next time you start the browser the \'Last Session\' will be empty.
+sm.askBeforSave.button0.label=Save Session
+sm.askBeforSave.button0.accesskey=S
+sm.askBeforSave.button1.label=Don\'t Save
+sm.askBeforSave.button1.accesskey=D
+sm.corrupted.title=Session Manager - Corrupted Database
+sm.corrupted.msg0=Session Manager cannot load its database from corrupted session.rdf.
+sm.corrupted.msg1=The file session.rdf will be deleted, a copy can be found in session.old in your profile. sessions backups are in <profile>/sessionbackups
+sm.areYouSure.msg=Are you sure you want to continue?
+sm.canChooseStartup.msg=You can choose a session to be your new startup session from the list:
+sm.addtoStartup.title=Session Manager - Add to Startup Session
+sm.addtoStartup.msg.windows=You are about to add window(s) to your startup session:
+sm.addtoStartup.msg.tabs=You are about to add tab(s) to your startup session:
+sm.addtoStartup.button0.label=Add to Session
+sm.addtoStartup.button0.accesskey=A
+sm.addtoStartup.button1.label=Don\'t Add
+sm.addtoStartup.button1.accesskey=D
+sm.replaceStartup.title=Session Manager - Override Startup Session
+sm.replaceStartup.msg=You are about to replace your startup session:
+sm.replaceStartup.button0.label=Replace Session
+sm.replaceStartup.button0.accesskey=R
+sm.replaceStartup.button1.label=Don\'t Replace
+sm.replaceStartup.button1.accesskey=D
+sm.removeStartup.title=Session Manager - Delete Startup Session
+sm.removeStartup.msg0=You are about to delete your startup session:
+sm.removeStartup.msg1=Choose a session to be your new startup session from the list:
+sm.removeStartup.button0.label=Delete
+sm.removeStartup.button0.accesskey=D
+sm.removeStartup.button1.label=Don\'t Delete
+sm.removeStartup.button1.accesskey=T
+sm.title=Session Manager
+sm.dontSaveBlank.msg=Session Manager doesn\'t save blank windows
+sm.sessoinSave.error=Error in Session Manager, session didn\'t save
+sm.sessionName.title.rename=Session Manager - Rename Session
+sm.sessionName.title.saveprevious=Session Manager - Save Session
+sm.sessionName.title.savethiswindow=Session Manager - Save This Window
+sm.sessionName.title.saveallwindows=Session Manager - Save All Windows
+sm.sessionName.msg0=Enter Session Name:
+sm.sessionName.msg1=Name must be at least one letter or number.
+sm.sessionName.msg2=This name is already in use!
+sm.sessionName.msg3=Are you sure you want to replace the session?
+sm.sessionName.button0.label=Rename Session
+sm.sessionName.button0.accesskey=R
+sm.sessionName.button1.label=Don\'t Rename
+sm.sessionName.button1.accesskey=D
+sm.session.empty=empty
+sm.session.tabs=T
+sm.session.windows=W
+sm.removeAll.title.session=Session Manager - Delete All Saved Sessions
+sm.removeAll.title.closedwindow=Session Manager - Delete All Closed Windows
+sm.removeAll.msg0=Are you sure you want to delete all your saved sessions?
+sm.removeAll.msg1=If you choose \'Delete\' your startup session will be the \'Last Session\'.
+sm.removeAll.msg2=Are you sure you want to delete all your closed windows?
+sm.sessionMenu.last=Last Session
+sm.sessionMenu.lastDefault=Last Session - Default
+sm.sessionMenu.lastgood=Last Good Session
+sm.sessionMenu.previous=Previous to Last
+sm.sessionMenu.crashed=Crashed Session
+sm.afterCrash.title=Session Manager - Restore after Crash
+sm.afterCrash.chkbox.label=Enable Session Manager
+sm.afterCrash.msg0=Your last session Crashed!
+sm.afterCrash.msg0.again=Your last Crashed session Crashed again!
+sm.afterCrash.msg1=Choose session to restore from the list:
+sm.afterCrash.msg2=Choose how to continue
+sm.afterCrash.msg3=Session Manager is currently disabled, if you enable Session Manager, you will be able to restore crashed sessions, closed sessions, saved sessions and closed windows from the Session Manager menu.
+sm.afterCrash.msg4=You can also restore the crashed session later from the Session Manager menu.
+sm.afterCrash.msg5=but nothing was saved.
+sm.afterCrash.msg6=but there isn\'t any open window in your Crashed session
+sm.afterCrash.msg7=Choose window to restore from Closed Windows list
+sm.afterCrash.msg8=(you can also restore closed windows later from the Closed Windows menu)
+sm.afterCrash.msg9=Your Crashed session is empty!
+sm.afterCrash.msg10=Session Manager did not find any sessions to restore from.
+sm.afterCrash.button0.label=Restore Session
+sm.afterCrash.button0.accesskey=R
+sm.afterCrash.button0.crashed.label=Restore Crashed Session
+sm.afterCrash.button0.crashed.accesskey=R
+sm.afterCrash.button1.label=Don\'t Restore
+sm.afterCrash.button1.accesskey=D
+sm.start.title=Session Manager - Restore Session
+sm.start.chkbox.label=Enable Crash Recovery
+sm.start.msg0=Your Startup session is empty!
+sm.start.msg1=Crash Recovery is currently disabled, if you enable Crash Recovery, you will be able to restore crashed sessions.
+sm.start.msg2=Error while looking for your startup session, your saved startup session does not exist.
+sm.restoreError.msg0=Error in session manager file!
+sm.restoreError.msg1=Delete the session you tried to restore
+sm.disable.msg=Firefox has a built-in session restore feature.
+sm.disable.msg1=Would you like to enable built-in session restore and disable the Tab Mix Plus Session Manager?
+sm.disable.msg2=Would you like to enable Tab Mix Plus Session Manager and disable the built-in session restore?
+sm.extension.convert.msg1=Would you like to convert your sessions data from Tab Mix Plus format to Session Manager extension format?
+sm.extension.convert.msg2=You can do it later from Tab Mix Plus session options window.
+sm.extension.convert.nosessions=There is no session in this file.
+sm.extension.convert.alreadyconverted=This session file have already been converted to Session Manager extension format.
+sm.extension.convert.doitagain=Do you wish to convert them again?
+sm.extension.convert.unable=Unable to convert from session.rdf
+sm.extension.convert.many=sessions converted, would you like to delete any of them?
+sm.extension.convert.one=one session converted, would you like to delete it?
+sm.extension.convert.rename=You will be able to rename the session(s) later from Session Manager menu
+sm.extension.convert.selectfile=Select session.rdf file to convert
+sm.extension.convert.rdffiles=RDF Files
+sm.extension.convert.sessionfiles=Session Files
+sm.tabview.hiddengroups=More tabs restored into hidden groups.
diff --git a/chrome/locale/fi/tabmix.dtd b/chrome/locale/fi/tabmix.dtd
new file mode 100644
index 0000000..2498299
--- /dev/null
+++ b/chrome/locale/fi/tabmix.dtd
@@ -0,0 +1,131 @@
+<!ENTITY closedtabsbtn.label "Suljetut välilehdet">
+<!ENTITY closedtabsbtn.tooltip "Näytä lista suljetuista välilehdistä">
+<!ENTITY sessionbtn.tooltip "Katsele ja hallinnoi istuntojasi">
+<!ENTITY tabslistbtn.label "Avatut välilehdet">
+<!ENTITY tabslistbtn.tooltip "Näytä lista avatuista välilehdistä">
+<!ENTITY closedwindowsbtn.label "Suljetut ikkunat">
+<!ENTITY closedwindowsbtn.tooltip "Näytä lista suljetuista ikkunoista">
+<!ENTITY page.header.title "Tab Mix Plus - Asetukset">
+<!ENTITY options.main.sessionbutton.label "Tab Mix Plus Istuntojenhallinta">
+<!ENTITY session.Tools "Istuntojenhallinta">
+<!ENTITY closedWin.label "Lista suljetuista ikkunoista">
+<!ENTITY duplicateTabMenu.label "Monista välilehti">
+<!ENTITY duplicateTabMenu.accesskey "M">
+<!ENTITY duplicateinWin.label "Monista uuteen ikkunaan">
+<!ENTITY duplicateinWin.accesskey "I">
+<!ENTITY detachTab.label "Siirrä uuteen ikkunaan">
+<!ENTITY detachTab.accesskey "S">
+<!ENTITY mergeContext.label "Yhdistä ikkunat">
+<!ENTITY mergeContext.accesskey "Y">
+<!ENTITY renametab.label "Uudelleennimeä välilehti">
+<!ENTITY renametab.accesskey "N">
+<!ENTITY copytaburl.label "Kopioi välilehden URL-osoite">
+<!ENTITY copytaburl.accesskey "K">
+<!ENTITY reloadother.label "Päivitä muut välilehdet">
+<!ENTITY reloadother.accesskey "P">
+<!ENTITY reloadleft.label "Päivitä vasenmanpuoleiset välilehdet">
+<!ENTITY reloadleft.accesskey "V">
+<!ENTITY reloadright.label "Päivitä oikeanpuoleiset välilehdet">
+<!ENTITY reloadright.accesskey "O">
+<!ENTITY autoReloadTab.label "Välilehden päivitysväli">
+<!ENTITY autoReloadTab.accesskey "L">
+<!ENTITY autoReloadSite.label "Lataa tämä sivusto joka">
+<!ENTITY autoReloadSite.accesskey "E">
+<!ENTITY afterthis.label "Tämän välilehden jälkeen">
+<!ENTITY bookmarktab.label "Lisää tämä välilehti kirjanmerkkeihin">
+<!ENTITY undoCloseListMenu.label "Lista suljetuista välilehdistä">
+<!ENTITY undoCloseListMenu.accesskey "U">
+<!ENTITY closeAllTabsMenu.label "Sulje kaikki välilehdet">
+<!ENTITY closeall.accesskey "A">
+<!ENTITY closeSimilarTab.label "Sulje samankaltaiset ikkunat">
+<!ENTITY closeSimilarTab.accesskey "M">
+<!ENTITY closeTabsToLeft.label "Close Tabs to the Left">
+<!ENTITY closeleft.accesskey "V">
+<!ENTITY closeTabstoRight.label "Close Tabs to the Right">
+<!ENTITY closeright.accesskey "O">
+<!ENTITY docShellMenu.label "Oikeudet">
+<!ENTITY docShellMenu.accesskey "O">
+<!ENTITY freezeTabMenu.label "Jäädytä välilehti">
+<!ENTITY freezeTabMenu.accesskey "J">
+<!ENTITY protectTabMenu.label "Suojaa välilehti">
+<!ENTITY protectTabMenu.tooltip "Protect tabs from being closed">
+<!ENTITY protectTabMenu.accesskey "P">
+<!ENTITY lockTabMenu.label "Lock Tab">
+<!ENTITY lockTabMenu.tooltip "All links open in new tab">
+<!ENTITY lockTabMenu.accesskey "K">
+<!ENTITY bookmarktabs.label "Bookmark All Tabs">
+<!ENTITY linkhere.label "Open Link in This Tab">
+<!ENTITY linkhere.accesskey "O">
+<!ENTITY linkBackgroundTab.label "Open Link in Background Tab">
+<!ENTITY linkForegroundTab.label "Open Link in Foreground Tab">
+<!ENTITY linkBackgroundTab.accesskey "B">
+<!ENTITY linkForegroundTab.accesskey "F">
+<!ENTITY openalllinks.label "Open Links in New Tabs">
+<!ENTITY openalllinks.accesskey "S">
+<!ENTITY linkwithhistory.label "Open Link in Duplicated Tab">
+<!ENTITY linkwithhistory.accesskey "D">
+<!ENTITY tabsList.label "Opened Tabs List">
+<!ENTITY tabsList.accesskey "L">
+<!ENTITY allowImage.label "Image">
+<!ENTITY allowJavascript.label "JavaScript">
+<!ENTITY allowRedirect.label "Redirect">
+<!ENTITY allowPlugin.label "Plug-in">
+<!ENTITY allowFrame.label "Frame">
+<!ENTITY restoreincurrent.label "Restore to Current Tab">
+<!ENTITY restoreincurrent.accesskey "C">
+<!ENTITY restoreinwin.label "Restore to New Window">
+<!ENTITY restoreinwin.accesskey "W">
+<!ENTITY restoreintab.label "Restore to New Tab">
+<!ENTITY restoreintab.accesskey "T">
+<!ENTITY restoretab.label "Restore Tab">
+<!ENTITY restoretab.accesskey "R">
+<!ENTITY bookmark.label "Bookmark This Link...">
+<!ENTITY bookmark.accesskey "B">
+<!ENTITY deletelist.label "Delete from the list">
+<!ENTITY deletelist.accesskey "D">
+<!ENTITY settings.label "Settings">
+<!ENTITY saveWindow.label "Save This Window">
+<!ENTITY saveAllWindows.label "Save All Windows">
+<!ENTITY sm.context.overwrite "Restore, Overwrite Existing Window(s)">
+<!ENTITY sm.context.overwrite.key "O">
+<!ENTITY sm.context.restore.new "Restore to New Window(s)">
+<!ENTITY sm.context.restore.newkey "N">
+<!ENTITY sm.context.replacethis "Replace, With This Window">
+<!ENTITY sm.context.replacethis.key "T">
+<!ENTITY sm.context.replaceall "Replace, With All Windows">
+<!ENTITY sm.context.replaceall.key "A">
+<!ENTITY sm.context.add "Add This Window">
+<!ENTITY sm.context.add.key "W">
+<!ENTITY sm.context.addall "Add All Windows">
+<!ENTITY sm.context.addall.key "I">
+<!ENTITY sm.context.save "Save">
+<!ENTITY sm.context.save.key "S">
+<!ENTITY sm.context.rename "Rename">
+<!ENTITY sm.context.rename.key "R">
+<!ENTITY sm.context.delete "Delete">
+<!ENTITY sm.context.delete.key "D">
+<!ENTITY sm.context.deleteall "Delete All">
+<!ENTITY sm.context.deleteall.key "L">
+<!ENTITY sm.context.startup "Set as Startup Session">
+<!ENTITY sm.context.startup.key "P">
+<!ENTITY sm.context.details "Show Counters, Date and Time in Session Menu">
+<!ENTITY sm.context.details.key "C">
+<!ENTITY tab.key "T">
+<!ENTITY window.key "N">
+<!ENTITY merge.key "M">
+<!ENTITY sortedTabs.label "Sorted Tabs">
+<!ENTITY sortedTabs.tooltip "Check to show the list sorted alphabetically">
+<!ENTITY enable.label "Enable">
+<!ENTITY custom.label "Custom">
+<!ENTITY enableTabs.label "Enable All Tabs">
+<!ENTITY disableTabs.label "Disable All Tabs">
+<!ENTITY seconds.label "seconds">
+<!ENTITY minutes.label "minutes">
+<!ENTITY minute.label "minute">
+<!ENTITY hideTabBar.label "Hide the tab bar">
+<!ENTITY hideTabBar.never.label "Never">
+<!ENTITY hideTabBar.never.key "N">
+<!ENTITY hideTabBar.onOneTab.label "When I have only one tab">
+<!ENTITY hideTabBar.onOneTab.key "E">
+<!ENTITY hideTabBar.always.label "Always">
+<!ENTITY hideTabBar.always.key "A">
diff --git a/chrome/locale/fi/tabmix.properties b/chrome/locale/fi/tabmix.properties
new file mode 100644
index 0000000..6235eed
--- /dev/null
+++ b/chrome/locale/fi/tabmix.properties
@@ -0,0 +1,40 @@
+extensions.{dc572301-7619-498c-a57d-39143191b318}.description=Vauhditettua välilehtiselausta.
+tmp.merge.warning.title=Irralliset välilehdet suljettavassa ikkunassa
+tmp.merge.warning.message=Valitut välilehdet yhdistetään toiseen ikkunaan, mutta muut suljetaan ikkunan mukana.
+tmp.merge.warning.checkboxLabel=Varoita minua aina kun suljettavassa ikkunassa on irrallisia välilehtiä.
+tmp.merge.error=Vähintään 2 ikkunaa täytyy olla auki ennen kuin voit yhdistää niitä
+tmp.merge.private= You can not merge private window with non-private window.
+tmp.importPref.error1=Tuonti epäonnistui koska tiedosto ei ole kelvollinen.
+tmp.importPref.error2=Asetusten tuonti epäonnistui.
+tmp.sessionempty=Seuraavan kerran kun käynnistät selaimen \"Edellinen istunto\" on tyhjä.
+droptoclose.label=Pudota välilehti sulkeaksesi sen
+droplink.label=Pudota keskelle korvataksesi välilehden tai reunoille luodaksesi uuden välilehden
+flstOn.label=Valitse viimeksi valittu välilehti - Vaihda valintaa painamalla F9
+flstOff.label=Valitse oikeanpuoleinen välilehti - Vaihda valintaa painamalla F9
+slideshowOn.label=Välilehtien kierrätys on päällä - Käännä pois päältä painamalla F8
+slideshowOff.label=Välilehtien kierrätys on pois päältä - Käännä päälle painamalla F8
+undoclosetab.clear.label=Tyhjennä suljettujen välilehtien lista
+undoclosetab.clear.accesskey=T
+undoClosedWindows.clear.label=Tyhjennä suljettujen ikkunoiden lista
+undoClosedWindows.clear.accesskey=T
+protectedtabs.closeWarning.1=Olet sulkemassa suojatun välilehden. Oletko varma että haluat jatkaa?
+protectedtabs.closeWarning.2=Olet sulkemassa %S suojattua välilehteä. Oletko varma että haluat jatkaa?
+protectedtabs.closeWarning.3=Olet sulkamassa %S välilehteä, joista %S on suojattuja. Oletko varma että haluat jatkaa?
+protectedtabs.closeWarning.4=Varoita, kun yritän sulkea ikkunan, jossa on suojattuja välilehtiä
+window.closeWarning.1=Varoita, kun yritän sulkea ikkunan, jossa on useita välilehtiä
+closeWindow.label=Sulje ikkuna
+confirm_autoreloadPostData_title=Varoitus!
+confirm_autoreloadPostData=Yrität ottaa käyttöön automaattisen päivityksen sivulla, jolla on lomaketietoja.nJos otat automaattisen päivityksen käyttöön, lomaketietojen lähetyksestä seuraavat tapahtumat (esim. maksutapahtumat) tullaan toistamaan.nnOletko varma että haluat ottaa automaattisen päivityksen käyttöön?
+incompatible.title=Tab Mix Plus
+incompatible.msg0=Seuraavat laajennukset eivät ole yhteensopivia Tab Mix Plussan kanssa tai ne ovat osa toiminnallisuutta.
+incompatible.msg1=Haluatko poistaa nämä laajennukset käytöstä?
+incompatible.msg2=Yhteensopimattomat laajennukset otetaan pois käytöstä, kun käynnistät selaimen uudelleen.
+incompatible.button0.label=Poista käytöstä
+incompatible.button0.accesskey=P
+incompatible.button1.label=Älä poista
+incompatible.button1.accesskey=Ä
+incompatible.button2.label=Poista käytöstä ja käynnistä uudelleen
+incompatible.button2.accesskey=K
+incompatible.chkbox.label=Näytä tämä hälytys kun selain käynnistyy
+tabmixoption.error.title=Tab Mix Plus - Virhe
+tabmixoption.error.msg=Sinulla täytyy olla vähintään yksi ikkuna jotta voit käyttää Tab Mix Plussan asetuksia.
diff --git a/chrome/locale/lv-LV/misc.dtd b/chrome/locale/lv-LV/misc.dtd
new file mode 100644
index 0000000..69cffa0
--- /dev/null
+++ b/chrome/locale/lv-LV/misc.dtd
@@ -0,0 +1,17 @@
+<!ENTITY searchTabFocus.label "Ielādēt fonā">
+<!ENTITY searchTabFocus.accesskey "L">
+<!ENTITY renametab.panel.title "Rediģēt cilnes nosaukumu">
+<!ENTITY renametab.reset.label "Atstatīt uz noklusēto nosaukumu">
+<!ENTITY title.label "Nosaukums">
+<!ENTITY default.label "Noklusētais">
+<!ENTITY renametab.permanently.label "Pārdēvēt šo cilni neatkarīgi no tās adreses">
+<!ENTITY renametab.permanently.tooltip "cilne ar vēsturi - jaunais nosaukums arī adresei izmainoties">
+<!ENTITY forum.label "Forums">
+<!ENTITY faq.label "BUJ">
+<!ENTITY help.label "Palīdzība">
+<!ENTITY tabmix.label "Tab Mix Plus">
+<!ENTITY reloadtime.label1 "Izvēlieties laiku no saraksta vai arī ievadiet savu laiku">
+<!ENTITY specifyreload.label "Norādīt pārlādēšanas laiku">
+<!ENTITY sanitizer.entry "Tab Mix Plus saglabātās sesijas">
+<!ENTITY sanitizer.entry.accesskey "T">
+<!ENTITY sanitizer.entry.confirm "Vai esat pārliecināts, ka vēlaties izdzēst VISAS jūsu saglabātās sesijas, ieskaitot rezerves kopijas?">
diff --git a/chrome/locale/lv-LV/pref-appearance.dtd b/chrome/locale/lv-LV/pref-appearance.dtd
new file mode 100644
index 0000000..ac69b16
--- /dev/null
+++ b/chrome/locale/lv-LV/pref-appearance.dtd
@@ -0,0 +1,18 @@
+<!ENTITY styles.label "Pielāgot stilus">
+<!ENTITY currentTab.label "Pašreizējā cilne">
+<!ENTITY unloadedTabs.label "Neielādētās cilnes">
+<!ENTITY unreadTab.label "Nelasītās cilnes">
+<!ENTITY hideRGB.label "Paslēpt RGB">
+<!ENTITY showRGB.label "Rādīt RGB">
+<!ENTITY unreadAfterReload.label "pēc pārlādēšanas iestatīt cilni kā nelasītu">
+<!ENTITY squaredTabs.label "Pielietot fona krāsu kvadrātveida cilnēm">
+<!ENTITY otherTabs.label "Citas cilnes">
+<!ENTITY italic.label "Slīpraksts">
+<!ENTITY bold.label "Treknraksts">
+<!ENTITY underline.label "Pasvītrots">
+<!ENTITY textcolor.label "Teksta krāsa">
+<!ENTITY bgColor.label "Fona krāsa">
+<!ENTITY bgTopColor.label "augša">
+<!ENTITY bgBottomColor.label "apakša">
+<!ENTITY useThis.label "izmantot šo stilu priekš">
+<!ENTITY opacity.label "caurspīdība">
diff --git a/chrome/locale/lv-LV/pref-filetype.dtd b/chrome/locale/lv-LV/pref-filetype.dtd
new file mode 100644
index 0000000..5c3b681
--- /dev/null
+++ b/chrome/locale/lv-LV/pref-filetype.dtd
@@ -0,0 +1,5 @@
+<!ENTITY filetype.options "Failu tipu redaktors">
+<!ENTITY filetype.add "Pievienot">
+<!ENTITY filetype.edit "Mainīt">
+<!ENTITY filetype.delete "Dzēst">
+<!ENTITY filetype.new "Jauns faila tips:">
diff --git a/chrome/locale/lv-LV/pref-tabmix.dtd b/chrome/locale/lv-LV/pref-tabmix.dtd
new file mode 100644
index 0000000..c59c6c1
--- /dev/null
+++ b/chrome/locale/lv-LV/pref-tabmix.dtd
@@ -0,0 +1,308 @@
+<!ENTITY tab.links "Saites">
+<!ENTITY tab.events "Notikumi">
+<!ENTITY tab.mouse "Pele">
+<!ENTITY tab.appearance "Izskats">
+<!ENTITY tab.menu "Izvēlne">
+<!ENTITY tab.session "Sesija">
+<!ENTITY tab.incompatible "Kļūda">
+<!ENTITY apply.label "Pielietot">
+<!ENTITY settings.export "Eksportēt iestatījumus">
+<!ENTITY settings.import "Importēt iestatījumus">
+<!ENTITY settings.sync "Sinhronizēt iestatījumus">
+<!ENTITY settings.default "Atjaunot noklusējumus">
+<!ENTITY generalWindowOpen.label "Saites, kas atveras jaunā logā, atvērt:">
+<!ENTITY externalLink.useSeparate.label "Saitēm no citām lietotnēm izmantot atsevišķu iestatījumu">
+<!ENTITY externalLinkTarget.label "Saites no citām lietotnēm atvērt:">
+<!ENTITY linkTarget.tab "Jaunā cilnē">
+<!ENTITY linkTarget.window "Jaunā logā">
+<!ENTITY linkTarget.current "Pašreizējā cilnē">
+<!ENTITY linkTarget.accesskey "C">
+<!ENTITY divertedWindowOpen.label "JavaScript uzlecošie logi:">
+<!ENTITY divertedWindowOpen.all "Atvērt visus uzlecošos logus cilnēs">
+<!ENTITY divertedWindowOpen.some "Atļaut uzlecošos logus ar mainītu izmēru">
+<!ENTITY divertedWindowOpen.none "Atļaut visus uzlecošos logus">
+<!ENTITY linkTarget.label "Atvērt saites ar mērķa atribūtu pašreizējā cilnē">
+<!ENTITY download.label "Nepieļaut tukšas cilnes, lejupielādējot failus">
+<!ENTITY edit.label "Rediģēt">
+<!ENTITY speLink.label "Piespiest atvērt jaunā cilnē:">
+<!ENTITY speLink.none "Neko">
+<!ENTITY speLink.allLinks "Visas saites">
+<!ENTITY speLink.external "Saites uz citām vietnēm">
+<!ENTITY singleWindow.label "Ieslēgt viena loga režīmu">
+<!ENTITY newTabs.label "Jaunas cilnes">
+<!ENTITY tabOpen.label "Ciļņu atvēršana">
+<!ENTITY tabFocus.label "Ciļņu fokuss">
+<!ENTITY tabClose.label "Ciļņu aizvēršana">
+<!ENTITY tabMerge.label "Ciļņu apvienošana">
+<!ENTITY tabFeature.label "Ciļņu iespējas">
+<!ENTITY newtab.label "Jaunajās cilnēs ielādēt:">
+<!ENTITY replaceLastTabWith.label "Aizverot pēdējo cilni, aizvietot to ar">
+<!ENTITY newtab.blank "Tukšu lapu">
+<!ENTITY newtab.home "Mājas lapu">
+<!ENTITY newtab.current "Pašreizējo lapu">
+<!ENTITY newtab.duplicate "Dublikāta lapu">
+<!ENTITY newtab.location.1 "Jaunas cilnes lapa">
+<!ENTITY newtab.placeholder.label "Noklusētā jaunas cilnes lapa">
+<!ENTITY location.label.1 "Adrese">
+<!ENTITY focusContent.label "Ielādējot ne-tukšu lapu, fokusēties uz saturu">
+<!ENTITY openTabNext.label "Jaunas cilnes atvērt pēc pašreizējās">
+<!ENTITY openOtherTabNext.label "Citas cilnes atvērt pēc pašreizējās">
+<!ENTITY relatedAfterCurrent.label "Tikai, ja attiecas uz pašreizējo cilni">
+<!ENTITY openTabNext.tooltip1 "[a][b][c][1][2][3] -> [a][1][2][3][b][c]">
+<!ENTITY openDuplicateNext.label "Dublicētās cilnes atvērt blakus oriģinālajai">
+<!ENTITY openTabNext.tooltip "[a][b][c][1][2][3] -> [a][3][2][1][b][c]">
+<!ENTITY openTabNextInverse.label "Mainīt atvēršanas kārtību">
+<!ENTITY openTabNextInverse.tooltip "[a][3][2][1][b][c] -> [a][1][2][3][b][c]">
+<!ENTITY openTabNextInverse.tooltip1 "Jaunu cilni atvērt aiz cilnes, kas atvērta no pašreizējās cilnes (kopš tā pēdējo reizi tika izvēlēta)">
+<!ENTITY lockTabs.label "Noslēgt cilnes">
+<!ENTITY lockNewTabs.label "Noslēgt jaunās cilnes">
+<!ENTITY lockAppTabs.label "Noslēgt lietotņu cilnes">
+<!ENTITY updateLockState.label "Pielietot izmaiņas atvērtajām cilnēm">
+<!ENTITY openNewTab.label "Atvērt cilnes no:">
+<!ENTITY openBookmarks.label "Grāmatzīmes">
+<!ENTITY openBMKGroups.label "Grāmatzīmju grupas">
+<!ENTITY openBMKGroups.tooltip "Neaizstāt cilnes, kad tiek atvērta grāmatzīmju grupa">
+<!ENTITY openHistory.label "Vēsture">
+<!ENTITY openUrl.label "Adrešu josla">
+<!ENTITY openSearch.label "Meklēšanas josla">
+<!ENTITY middlecurrent1.label "Vidējais klikšķis vai Control-klikšķis atver vienumus pašreizējā cilnē">
+<!ENTITY middlecurrent.tooltip "Jaunā cilnē piespiedu kārtā atvērt tikai grāmatzīmes, vēsturi un saites">
+<!ENTITY tabFocus.caption "Fokusēt/Izvēlēties cilnes, kas atvērtas no:">
+<!ENTITY selectTab.label "Saitēm">
+<!ENTITY selectDivertedTab.label "Novirzīta loga">
+<!ENTITY selectTabFromExternal.label "Citām lietotnēm">
+<!ENTITY selectTabCommand.label "Jaunas cilnes komandām">
+<!ENTITY contextMenuSearch.label "Konteksta izvēles meklēšana">
+<!ENTITY selectTabBH.label "Grāmatzīmes/Vēsture">
+<!ENTITY duplicateTab.label "Dublicēt cilni">
+<!ENTITY inversefocus1.label "Apgriezt vidējā klikšķa vai Control-klikšķa fokusu:">
+<!ENTITY warning.caption.label "Brīdinājums">
+<!ENTITY warnOnCloseProtected.label "Brīdināt mani, kad tiek aizvērts logs ar aizsargātām cilnēm">
+<!ENTITY warnOnCloseWindow.label "Brīdināt mani, kad tiek aizvērts logs ar vairākām cilnēm">
+<!ENTITY lasttab.caption.label "Aizverot pēdējo cilni">
+<!ENTITY keepWindow.label.3.1 "Neaizvērt logu, kad tiek aizvērta pēdējā cilne">
+<!ENTITY keeptab.label "Novērst pēdējās cilnes aizvēršanu">
+<!ENTITY closeOnMerge.label "Aizvērt logus, tiklīdz tie tiek apvienoti">
+<!ENTITY warnOnMerge.label "Brīdināt, kad aizver cilnes, kuras netiek apvienotas">
+<!ENTITY currenttab.caption.label "Aizverot pašreizējo cilni">
+<!ENTITY focusTab.labelBegin "Aizverot pašreizējo cilni, fokusēties:">
+<!ENTITY focusTab.firstTab "Pirmo cilni">
+<!ENTITY focusTab.leftTab "Cilni pa kreisi">
+<!ENTITY focusTab.rightTab "Cilni pa labi">
+<!ENTITY focusTab.lastTab "Pēdējo cilni">
+<!ENTITY focusTab.lastSelectedTab "Pēdējo izvēlēto cilni">
+<!ENTITY focusTab.openerTab "Atvērēju/labo cilni">
+<!ENTITY focusTab.openerTab.rtl "Atvērēju/kreiso cilni">
+<!ENTITY focusTab.lastOpenedTab "Pēdējo atvērto cilni">
+<!ENTITY undoClose.label "Ieslēgt aizvērto ciļņu atsaukšanu">
+<!ENTITY undoCloseCache.label "Maksimālais skaits aizvērto ciļņu, ko atcerēties:">
+<!ENTITY undoClosepos.label "Atjaunot cilnes oriģinālo pozīciju">
+<!ENTITY menuonlybutton.label "Rīkjoslas pogā parāda tikai sarakstu">
+<!ENTITY ctrltab.label "Ctrl-Tab pārslēdz cilnes nesenās izmantošanas kārtībā">
+<!ENTITY cmdtab.label "Cmd-Tab pārslēdz cilnes nesenās izmantošanas kārtībā">
+<!ENTITY ctrltab.tabPreviews "Rādīt ciļņu priekšskatījumus">
+<!ENTITY ctrltab.popup "Ctrl-Tab parāda ciļņu saraksta uzlecošo izvēlni">
+<!ENTITY cmdtab.popup "Cmd-Tab parāda ciļņu saraksta uzlecošo izvēlni">
+<!ENTITY tabpopup.mouse "Ciļņu saraksts reaģē uz peli">
+<!ENTITY mergeNoTabSelection.label "Apvienot logus, kad nav izvēlēta neviena cilne">
+<!ENTITY mergeTabSelection.label "Apvienošana pēc ciļņu atlases">
+<!ENTITY mergeall.label "Apvienot visus logus vienā">
+<!ENTITY mergelastfocused.label "Apvienot tikai pašreizējo logu ar pēdējo fokusēto">
+<!ENTITY mergePopups.label "Paņemt arī uzlecošos logus">
+<!ENTITY popupNextToOpener.label "Novietot uzlecošos logus aiz to atvērējiem">
+<!ENTITY activateSlideshow.label "#1 nospiešana rotē cilnes katras">
+<!ENTITY toggleAnimation.label "Atslēgt atvēršanas/aizvēršanas animāciju">
+<!ENTITY reloadEvery.matchAddress.label "Pārlādēt cilni neatkarīgi no tās adreses">
+<!ENTITY reloadEvery.onReloadButton.label "Rādīt izvēlni 'Pārlādēt katras' uz pogas 'Pārlādēt'">
+<!ENTITY seconds.label "sekundes">
+<!ENTITY minutes.label "minūtes">
+<!ENTITY tabBarAppearance.label "Ciļņu josla">
+<!ENTITY tabAppearance.label "Cilne">
+<!ENTITY toolBarAppearance.label "Rīkjosla">
+<!ENTITY show.ontabbar.label "Rādīt uz ciļņu joslas">
+<!ENTITY show.ontab.label "Rādīt uz cilnes">
+<!ENTITY dragNewTabButton.tooltip "Lai ieslēgtu šo opciju, pārnesiet pogu 'Jauna cilne' uz ciļņu joslas.">
+<!ENTITY hideTabBarButton.label "Poga 'Aizvērt cilni'">
+<!ENTITY newTabButton.label "Poga 'Jauna cilne'">
+<!ENTITY newTabButton.posiotion.left.label "kreisajā pusē">
+<!ENTITY newTabButton.posiotion.right.label "labajā pusē">
+<!ENTITY newTabButton.posiotion.afterlast.label "Pēc pēdējās cilnes">
+<!ENTITY allTabsButton.label "Poga 'Visas cilnes'">
+<!ENTITY tabBarSpace.label "Papildu atstarpe abās pusēs">
+<!ENTITY tabBarSpace.tooltip "Klikšķināšanai un kaut kā nomešanai uz ciļņu joslas">
+<!ENTITY tabbar.label "Paslēpt ciļņu joslu, ja ir atvērta tikai viena cilne">
+<!ENTITY moveTabOnDragging.label "Pārnesot cilni, darīt to tieši">
+<!ENTITY dropIndicator.label "Nomešanas indikators">
+<!ENTITY dropIndicator-native.label "Natīvais stils">
+<!ENTITY dropIndicator-builtin.label "Iebūvētais stils">
+<!ENTITY verticalTabbar.description "Lietot treeStyleTab vai VerticalTab paplašinājumu, lai regulētu šos iestatījumus.">
+<!ENTITY tabBarPosition.label "Pozīcija:">
+<!ENTITY tabBarPosition.top.label "Augšā (virs satura)">
+<!ENTITY tabBarPosition.bottom.label "Apakšā (zem satura)">
+<!ENTITY tabScroll.label "Kad cilnes nesatilpst platumā:">
+<!ENTITY tabScroll.none "Ritināmas bez pogām">
+<!ENTITY tabScroll.leftRightButtons "Ritināmas ar pogām abās pusēs">
+<!ENTITY tabScroll.rightButtons "Ritināmas ar pogām labajā pusē">
+<!ENTITY tabScroll.rightButtons.rtl "Ritināmas ar pogām kreisajā pusē">
+<!ENTITY tabScroll.multibar "Vairākās rindās">
+<!ENTITY maxrow.label "Maksimālais rādāmo rindu skaits:">
+<!ENTITY offsetAmountToScroll.label "Ritinot rādīt daļu no nākamās neredzamās cilnes">
+<!ENTITY smoothScroll.label "Ieslēgt gludo ritināšanu">
+<!ENTITY scrolldelay.label "Ritināšanas aizture (laiks starp ritināšanas atkārtošanu)">
+<!ENTITY highlight.label "Izcelšana">
+<!ENTITY currenttab.style.label "Pašreizējā cilne">
+<!ENTITY unloadedtabs.style.label "Neielādētās cilnes">
+<!ENTITY unreadtabs.style.label "Nelasītās cilnes">
+<!ENTITY othertabs.style.label "Citas cilnes">
+<!ENTITY setstyles.label "Pielāgot stilus">
+<!ENTITY extraIcons.label1 "Ikonas priekš">
+<!ENTITY extraIcons.locked "Slēgts">
+<!ENTITY extraIcons.protected "Aizsargāts">
+<!ENTITY extraIcons.autoreload "Automātiski pārlādēt">
+<!ENTITY extraIcons.hideonpinned "Uz piespraustām cilnēm paslēpt">
+<!ENTITY progressMeter.label "Progresa josla uz cilnēm">
+<!ENTITY showTabX.labelBegin "Cilnes aizvēršanas poga">
+<!ENTITY showTabX.left "Novietot kreisajā pusē">
+<!ENTITY showTabX.rtl "Novietot labajā pusē">
+<!ENTITY milliseconds.label "msek.">
+<!-- LOCALIZATION NOTE change this only if you need to change the width -->
+<!ENTITY showTabX.popup.width "13em">
+<!ENTITY showTabX.always "uz visām">
+<!ENTITY showTabX.current "uz pašreizējās">
+<!ENTITY showTabX.hover "zem kursora esošās">
+<!ENTITY showTabX.alwaysExeption "uz visām cilnēm, kas platākas nekā">
+<!ENTITY showTabX.currentHover "uz pašreizējās un zem kursora esošās">
+<!ENTITY minWidth.label "Cilnes platums:">
+<!ENTITY widthTo.label "līdz">
+<!ENTITY widthPixels.label "pikseļi">
+<!ENTITY flexTabs.label "Cilnes platums pielāgojas cilnes nosaukumam">
+<!ENTITY bookastitle.label "Lietot grāmatzīmju nosaukumu kā cilnes nosaukumu">
+<!-- LOCALIZATION NOTE: change this only if you need to change the width -->
+<!ENTITY toolbar.description.width "21em">
+<!ENTITY toolbar.description "Varat izvēlēties, kuras Tab Mix Plus pogas rādīt savā rīkjoslā">
+<!ENTITY toolbar.button.label "Pielāgot">
+<!ENTITY toolbar.visible.caption "Redzamas pogas">
+<!ENTITY toolbar.novisible.label "Nav redzamu pogu">
+<!ENTITY toolbar.hidden.caption "Slēptās pogas">
+<!ENTITY toolbar.nohidden.label "Nav slēpto pogu">
+<!ENTITY mouseGesture.label "Peles žesti">
+<!ENTITY mouseClick.label "Peles klikšķināšana">
+<!ENTITY mouseHoverSelect.labelBegin "Izvēlēties zem kursora esošo cilni">
+<!ENTITY tabFlip.label "Pārslēgties uz pēdējo izvēlēto cilni, noklikšķinot uz pašreizējās">
+<!ENTITY tabFlip.delay "Lietot aizturi">
+<!ENTITY clickFocus.label "Peles klikšķis (nospiest un atlaist), lai izvēlētos cilni">
+<!ENTITY removeEntries.label "Izņemt Tab Mix Plus izvēlnes ierakstus, izmantojot vidējo klikšķi">
+<!ENTITY lockTabSizingOnClose.label "Aizverot cilni, citām cilnēm nemainīt izmēru līdz kursors neatstāj rīkjoslas apgabalu">
+<!ENTITY removeEntries.tooltip "Ieskaitot aizvērtās cilnes, aizvērtos logus un saglabātās sesijas">
+<!ENTITY tabbarscrolling.caption "Ritinot virs ciļņu joslas">
+<!ENTITY tabbarscrolling.holdShift.label "Ritinot turiet nospiestu Shift, lai pārslēgtos starp šīm opcijām">
+<!ENTITY tabbarscrolling.selectTab.label "Mainīt izvēlēto cilni">
+<!ENTITY tabbarscrolling.scrollAllTabs.label "Ritināt visas cilnes">
+<!ENTITY tabbarscrolling.inverse.label "Apgriezt ritināšanas virzienu">
+<!ENTITY double.label "Dubultklikšķis">
+<!ENTITY middle.label "Vidējais klikšķis">
+<!ENTITY ctrl.label "Ctrl-klikšķis">
+<!ENTITY cmd.label "Cmd-klikšķis">
+<!ENTITY shift.label "Shift-klikšķis">
+<!ENTITY alt.label "Alt-klikšķis">
+<!ENTITY ontab.label "uz cilnes:">
+<!ENTITY ontabbar.label "uz ciļņu joslas:">
+<!ENTITY clicktab.label "Izvēlieties komandu, ko izpildīt, noklikšķinot uz ciļņu joslas">
+<!ENTITY ontabbar.dblClick.label "Neļaut loga izmēra maiņu, kad tiek noklikšķināts uz ciļņu joslas.">
+<!ENTITY ontabbar.click.label "Novērst loga pārnešanu, noklikšķinot uz ciļņu joslas.">
+<!ENTITY clicktab.default "Firefox noklusētais vai cits paplašinājums">
+<!ENTITY clicktab.nothing "Nedara neko">
+<!ENTITY clicktab.addtab "Atvērt jaunu cilni">
+<!ENTITY clicktab.duplicatetab "Dublicē cilni">
+<!ENTITY clicktab.duplicatetabw "Dublicē cilni jaunā logā">
+<!ENTITY clicktab.detachtab "Pārvietot cilni uz jaunu logu">
+<!ENTITY clicktab.protecttab "Aizsargā cilni">
+<!ENTITY clicktab.locktab "Noslēdz cilni">
+<!ENTITY clicktab.freezetab "Aizsargā un noslēdz cilni">
+<!ENTITY clicktab.renametab "Pārdēvē cilni">
+<!ENTITY clicktab.copyTabUrl "Kopē cilnes URL uz starpliktuvi">
+<!ENTITY clicktab.copyUrlFromClipboard "Ielādēt URL no starpliktuves">
+<!ENTITY clicktab.selectMerge "Izvēlas cilni apvienošanai">
+<!ENTITY clicktab.mergeTabs "Apvieno logus">
+<!ENTITY clicktab.bookTab "Pievieno cilni grāmatzīmēm">
+<!ENTITY clicktab.bookTabs "Pievieno gŗāmatzīmēm visas cilnes">
+<!ENTITY clicktab.reloadtab "Pārlādē cilni">
+<!ENTITY clicktab.reloadtabs "Pārlādē visas cilnes">
+<!ENTITY clicktab.reloadothertabs "Pārlādē citas cilnes">
+<!ENTITY clicktab.reloadlefttabs "Pārlādē kreisās cilnes">
+<!ENTITY clicktab.reloadrighttabs "Pārlāde labās cilnes">
+<!ENTITY clicktab.autoReloadTab "Ieslēgt/Atslēgt ciļņu automātisko pārlādēšanu">
+<!ENTITY clicktab.removeall "Aizvērt visas cilnes">
+<!ENTITY clicktab.removeother "Aizvērt citas cilnes">
+<!ENTITY clicktab.removesimilar "Aizvērt cilnes no līdzīga domēna">
+<!ENTITY clicktab.removetoLeft "Aizvērt cilnes pa kreisi">
+<!ENTITY clicktab.removetoRight "Aizvērt cilnes pa labi">
+<!ENTITY clicktab.uctab "Atkārtoti atvērt pēdējo aizvērto cilni">
+<!ENTITY clicktab.ucatab "Atkārtoti atvērt visas aizvērtās cilnes">
+<!ENTITY clicktab.snapback "SnapBack cilne">
+<!ENTITY clicktab.ietab "Atver cilni pārlūkā IE">
+<!ENTITY contentLoad "Vidējais klikšķis ielādē cilni no starpliktuves">
+<!ENTITY context.tab "Cilnes konteksta izvēlne">
+<!ENTITY context.main "Galvenā konteksta izvēlne">
+<!ENTITY context.tools "Rīku izvēlne">
+<!ENTITY showtabBarContext.label "Rādīt cilnes konteksta izvēlnē">
+<!ENTITY showContentAreaContext.label "Rādīt galvenajā konteksta izvēlnē">
+<!ENTITY showToolsMenu.label "Rādīt rīku izvēlnē">
+<!ENTITY startupHomePage.label "Rādīt manu mājas lapu">
+<!ENTITY startupBlankPage.label "Rādīt tukšu lapu">
+<!ENTITY startupLastSession.label "Rādīt manus logus un cilnes no iepriekšējās reizes">
+<!ENTITY sm.extension.description1 "Tab Mix Plus konstatēja, ka ir instalēts paplašinājums Session Manager">
+<!ENTITY sm.extension.description2 "Tab Mix Plus sesiju pārvaldnieks tiks atslēgts">
+<!ENTITY sm.extension.description3 "Lai atvērtu Session Manager opciju logu, varat noklikšķināt uz pogas pa labi">
+<!ENTITY sm.extension.description4 "Pārveidot manu sesiju datus no Tab Mix Plus formāta uz Session Manager paplašinājuma formātu">
+<!ENTITY sm.extension.convert.label "Pārveidot">
+<!ENTITY sm.extension.chooseFile.label0 "Ļaut man izvēlēties, kuru datu failu pārveidot">
+<!ENTITY sm.extension.chooseFile.label1 "Pārveidot Tab Mix Plus sesijas no pašreizējā profila">
+<!ENTITY ss.enable.label "Lietot Firefox iebūvēto sesijas atjaunošanas iespēju">
+<!ENTITY ss.enable.tooltip "Neatzīmējiet, lai ļautu izmantot Tab Mix Plus sesiju pārvaldnieku">
+<!ENTITY ss.advanced_setting "Paplašinātie iestatījumi">
+<!ENTITY ss.advanced_setting.warning "Nemainiet šos, ja vien nezinat, ko darat">
+<!ENTITY ss.interval "Minimālais laika intervāls starp divām stāvokļa saglabāšanas reizēm">
+<!ENTITY ss.interval.seconds "(milisekundēs)">
+<!ENTITY ss.privacy_level "Saglabāt jutīgus datus (formu dati, POSTDATA un sīkdatnes)">
+<!ENTITY ss.privacy_level.allsites "Visām vietnēm">
+<!ENTITY ss.privacy_level.unencrypted "Tikai nešifrētām vietnēm">
+<!ENTITY ss.privacy_level.nosites "Nevienai vietnei">
+<!ENTITY ss.postdata.label1 "Maksimālais glabājamais POSTDATA datu apjoms">
+<!ENTITY ss.postdata.label2 "(baitos, -1=visi)">
+<!ENTITY sessionManger.enable "Ieslēgt sesiju pārvaldnieku">
+<!ENTITY crashRecovery.enable "Ieslēgt pēcavārijas atkopšanu">
+<!ENTITY sm.StartExit "Palaist/Iziet">
+<!ENTITY sm.restore "Atjaunot">
+<!ENTITY sm.preserve "Saglabāt">
+<!ENTITY sm.start "Kad tiek palaists pārlūks:">
+<!ENTITY sm.start.restore "Atjaunot">
+<!ENTITY sm.start.ask "Jautāt pirms atjaunošanas">
+<!ENTITY sm.start.nothing "Neatjaunot">
+<!ENTITY sm.exit "Kad pārlūks tiek aizvērts">
+<!ENTITY sm.exit.save "Saglabāt sesiju">
+<!ENTITY sm.exit.ask "Jautāt pirms saglabāšanas">
+<!ENTITY sm.exit.nothing "Nesaglabāt">
+<!ENTITY sm.startup "Palaižamā sesija:">
+<!ENTITY sm.lastsession "Pēdējā sesija">
+<!ENTITY sm.previouslast "Priekšpēdējā">
+<!ENTITY sm.chooseifempty "Izvēlēties citu, jau tukša">
+<!ENTITY sm.restore.options "Atjaunojot sesijas:">
+<!ENTITY sm.restore.overwrite "Pārrakstīt esošos logus">
+<!ENTITY sm.restore.overwriteTabs "Un cilnes">
+<!ENTITY sm.restore.closedWinList "Saglabāt logus aizvērto logu sarakstā">
+<!ENTITY sm.restore.merge "Apvienot vairākus logus vienā">
+<!ENTITY sm.restore.bypassCache "Atjaunojot apiet kešatmiņu">
+<!ENTITY sm.notrestore.label "Kad neatjauno palaižot">
+<!ENTITY sm.restorePinned.label "Restore my pinned tabs from last time">
+<!ENTITY sm.preserve.options "Saglabāt ciļņu:">
+<!ENTITY sm.preserve.history "Vēsturi">
+<!ENTITY sm.preserve.protect "Aizsargāšanas statusu">
+<!ENTITY sm.preserve.locked "Noslēgšanas statusu">
+<!ENTITY sm.preserve.permission "Atļaujas">
+<!ENTITY sm.preserve.scroll1 "Ritināšanas pozīciju">
+<!ENTITY sm.restore.winOptions "Saglabāt logu:">
+<!ENTITY sm.restore.selectedTab "Izvēlēto cilni">
+<!ENTITY sm.restore.closedTabs "Aizvērto ciļņu sarakstu">
+<!ENTITY incompatible.extensions "Daži no jūsu paplašinājumiem nav savietojami ar Tab Mix Plus, vēlams šos paplašinājumus atslēgt vai atinstalēt.">
+<!ENTITY incompatible.button.label "Rādīt sarakstu">
diff --git a/chrome/locale/lv-LV/session-manager.properties b/chrome/locale/lv-LV/session-manager.properties
new file mode 100644
index 0000000..9957e99
--- /dev/null
+++ b/chrome/locale/lv-LV/session-manager.properties
@@ -0,0 +1,107 @@
+sm.saveClosedTab.chkbox.label=Saglabāt aizvērto ciļņu sarakstu ar šo sesiju
+sm.button.continue.label=Turpināt
+sm.button.continue.accesskey=C
+sm.askBeforSave.title=Sesiju pārvaldnieks – saglabāt sesiju
+sm.askBeforSave.msg0=Vai vēlaties saglabāt savu sesiju?
+sm.askBeforSave.msg2=Uz diska tiks saglabāti tikai ne-privātie logi
+sm.askBeforSave.msg1=Ja nesaglabāsiet, nākamreiz, palaižot pārlūku, \'Pēdējā sesija\' būs tukšs.
+sm.askBeforSave.button0.label=Saglabāt sesiju
+sm.askBeforSave.button0.accesskey=S
+sm.askBeforSave.button1.label=Nesaglabāt
+sm.askBeforSave.button1.accesskey=N
+sm.corrupted.title=Sesiju pārvaldnieks – bojāta datubāze
+sm.corrupted.msg0=Sesiju pārvaldnieks nevar ielādēt tā datubāzi no bojātā faila sesion.rdf.
+sm.corrupted.msg1=Fails session.rdf tiks dzēsts, kopija ir atrodama failā session.old jūsu profila mapē. Sesiju rezerves kopijas ir mapē <profils>/sessionbackups
+sm.areYouSure.msg=Vai tiešām vēlaties turpināt?
+sm.canChooseStartup.msg=Sarakstā varat izvēlēties sesiju, kura būt jūsu jaunā sākuma sesija:
+sm.addtoStartup.title=Sesiju pārvaldnieks – pievienot sākuma sesijai
+sm.addtoStartup.msg.windows=Jūs gatavojaties pievienot logu(s) savai sākuma sesijai:
+sm.addtoStartup.msg.tabs=Jūs gatavojaties pievienot cilni(es) savai sākuma sesijai:
+sm.addtoStartup.button0.label=Pievienot sesijai
+sm.addtoStartup.button0.accesskey=P
+sm.addtoStartup.button1.label=Nepievienot
+sm.addtoStartup.button1.accesskey=N
+sm.replaceStartup.title=Sesiju pārvaldnieks – aizstāt sākuma sesiju
+sm.replaceStartup.msg=Jūs gatavojaties aizvietot savu sākuma sesiju:
+sm.replaceStartup.button0.label=Aizvietot sesiju
+sm.replaceStartup.button0.accesskey=A
+sm.replaceStartup.button1.label=Neaizvietot
+sm.replaceStartup.button1.accesskey=V
+sm.removeStartup.title=Sesiju pārvaldnieks – dzēst sākuma sesiju
+sm.removeStartup.msg0=Jūs gatavojaties dzēst savu sākuma sesiju:
+sm.removeStartup.msg1=Izvēlieties savu jauno sākuma sesiju no saraksta:
+sm.removeStartup.button0.label=Dzēst
+sm.removeStartup.button0.accesskey=D
+sm.removeStartup.button1.label=Nedzēst
+sm.removeStartup.button1.accesskey=N
+sm.title=Sesiju pārvaldnieks
+sm.dontSaveBlank.msg=Sesiju pārvadnieks nesaglabā tukšus logus
+sm.sessoinSave.error=Kļūda sesiju pārvadniekā, sesija netika saglabāta
+sm.sessionName.title.rename=Sesiju pārvadnieks – pārdēvēt sesiju
+sm.sessionName.title.saveprevious=Sesiju pārvadnieks – saglabāt sesiju
+sm.sessionName.title.savethiswindow=Sesiju pārvadnieks – saglabāt šo logu
+sm.sessionName.title.saveallwindows=Sesiju pārvadnieks – saglabāt visus logus
+sm.sessionName.msg0=Ievadiet sesijas nosaukumu:
+sm.sessionName.msg1=Nosaukumā jābūt vismaz vienam burtam vai ciparam.
+sm.sessionName.msg2=Šis nosaukums jau tiek izmantots!
+sm.sessionName.msg3=Vai tiešām vēlaties aizvietot šo sesiju?
+sm.sessionName.button0.label=Pārdēvēt sesiju
+sm.sessionName.button0.accesskey=P
+sm.sessionName.button1.label=Nepārdēvēt
+sm.sessionName.button1.accesskey=D
+sm.session.empty=tukšs
+sm.session.tabs=C
+sm.session.windows=L
+sm.removeAll.title.session=Sesiju pārvaldnieks - dzēst visas saglabātās sesijas
+sm.removeAll.title.closedwindow=Sesiju pārvaldnieks - dzēst visus aizvērtos logus
+sm.removeAll.msg0=Vai tiešām vēlaties dzēst visas jūsu saglabātās sesijas?
+sm.removeAll.msg1=Ja izvēlēsieties \'Dzēst\', jūsu palaišanas sesija būs \'Pēdējā sesija\'.
+sm.removeAll.msg2=Vai tiešām vēlaties dzēst visus jūsu aizvērtos logus?
+sm.sessionMenu.last=Pēdējā sesija
+sm.sessionMenu.lastDefault=Pēdējā sesija - noklusējums
+sm.sessionMenu.lastgood=Pēdējā labā sesija
+sm.sessionMenu.previous=Priekšpēdējā
+sm.sessionMenu.crashed=Avarējusī sesija
+sm.afterCrash.title=Sesiju pārvaldnieks - atjaunot pēc avārijas
+sm.afterCrash.chkbox.label=Ieslēgt sesiju pārvaldnieku
+sm.afterCrash.msg0=Jūsu pēdējā sesija avarēja!
+sm.afterCrash.msg0.again=Jūsu pēdējā avarējusī sesija atkal avarēja!
+sm.afterCrash.msg1=Izvēlieties atjaunojamo sesiju no saraksta:
+sm.afterCrash.msg2=Izvēlieties, kā turpināt
+sm.afterCrash.msg3=Sesiju pārvaldnieks pašreiz ir atslēgts, ja to ieslēgsiet, sesiju pārvaldnieka izvēlnē varēsiet atjaunot avarējušas sesijas, aizvērtas sesijas, saglabātas sesijas, kā arī aizvērtus logus.
+sm.afterCrash.msg4=Avarējušo sesiju varat arī atjaunot vēlāk no sesiju pārvaldnieka izvēlnes.
+sm.afterCrash.msg5=bet nekas netika saglabāts.
+sm.afterCrash.msg6=bet jūsu avarējušajā sesijā nav atvērtu logu
+sm.afterCrash.msg7=No aizvērto logu saraksta izvēlieties logu, ko atjaunot
+sm.afterCrash.msg8=(aizvērtos logus varat atjaunot arī vēlāk no aizvērto logu izvēlnes)
+sm.afterCrash.msg9=Jūsu avarējusī sesija ir tukša!
+sm.afterCrash.msg10=Sesiju pārvaldnieks neatrada sesijas, no kurām atjaunot.
+sm.afterCrash.button0.label=Atjaunot sesiju
+sm.afterCrash.button0.accesskey=A
+sm.afterCrash.button0.crashed.label=Atjaunot avarējušo sesiju
+sm.afterCrash.button0.crashed.accesskey=A
+sm.afterCrash.button1.label=Neajaunot
+sm.afterCrash.button1.accesskey=N
+sm.start.title=Sesiju pārvaldnieks - atjaunot sesiju
+sm.start.chkbox.label=Ieslēgt pēcavārijas atjaunošanu
+sm.start.msg0=Jūsu palaišanas sesija ir tukša!
+sm.start.msg1=Pēcavārijas apkope pašreiz ir atslēgta; ja to ieslēgsiet, varēsiet atjaunot avarējušas sesijas.
+sm.start.msg2=Kļūda meklējot jūsu palaišanas sesiju, jūsu saglabātā palaišanas sesija neeksistē.
+sm.restoreError.msg0=Kļūda sesiju pārvaldnieka failā!
+sm.restoreError.msg1=Dzēst sesiju, ko mēģinājāt atjaunot
+sm.disable.msg=Firefox ir iebūvētā sesiju atjaunošanas iespēja.
+sm.disable.msg1=Vai vēlaties ieslēgt iebūvēto sesiju atjaunošanu un atslēgt Tab Mix Plus sesiju pārvaldnieku?
+sm.disable.msg2=Vai vēlaties ieslēgt Tab Mix Plus sesiju pārvaldnieku un atslēgt iebūvēto sesiju atjaunošanu?
+sm.extension.convert.msg1=Vai vēlaties pārveidot savu sesiju datus no Tab Mix Plus formātu uz Session Manager paplašinājuma formātu?
+sm.extension.convert.msg2=Varat izdarīt to vēlāk no Tab Mix Plus sesiju opciju loga.
+sm.extension.convert.nosessions=Šajā failā nav sesiju.
+sm.extension.convert.alreadyconverted=Šis sesiju fails jau ir pārveidots Session Manager paplašinājuma formātā.
+sm.extension.convert.doitagain=Vai vēlaties to pārveidot vēlreiz?
+sm.extension.convert.unable=Neizdevās pārveidot no session.rdf
+sm.extension.convert.many=sesijas pārveidotas, vai kādu no tām vēlaties dzēst?
+sm.extension.convert.one=viena sesija pārveidota, vai vēlaties to dzēst?
+sm.extension.convert.rename=Sesijas varēsiet pārdēvēt vēlāk no sesiju pārvaldnieka izvēlnes
+sm.extension.convert.selectfile=Izvēlieties pārveidojamo session.rdf failu
+sm.extension.convert.rdffiles=RDF faili
+sm.extension.convert.sessionfiles=Sesiju faili
+sm.tabview.hiddengroups=Vairāk ciļņu atjaunots slēptajās grupās.
diff --git a/chrome/locale/lv-LV/tabmix.dtd b/chrome/locale/lv-LV/tabmix.dtd
new file mode 100644
index 0000000..da2deab
--- /dev/null
+++ b/chrome/locale/lv-LV/tabmix.dtd
@@ -0,0 +1,131 @@
+<!ENTITY closedtabsbtn.label "Aizvērtās cilnes">
+<!ENTITY closedtabsbtn.tooltip "Parādīt aizvērto ciļņu sarakstu">
+<!ENTITY sessionbtn.tooltip "Parādīt un pārvaldīt jūsu sesijas">
+<!ENTITY tabslistbtn.label "Atvērtās cilnes">
+<!ENTITY tabslistbtn.tooltip "Parādīt atvērto ciļņu sarakstu">
+<!ENTITY closedwindowsbtn.label "Aizvērtie logi">
+<!ENTITY closedwindowsbtn.tooltip "Parādīt aizvērto logu sarakstu">
+<!ENTITY page.header.title "Tab Mix Plus opcijas">
+<!ENTITY options.main.sessionbutton.label "Tab Mix Plus sesiju pārvaldnieks">
+<!ENTITY session.Tools "Sesiju pārvaldnieks">
+<!ENTITY closedWin.label "Aizvērto logu saraksts">
+<!ENTITY duplicateTabMenu.label "Dublicēt cilni">
+<!ENTITY duplicateTabMenu.accesskey "D">
+<!ENTITY duplicateinWin.label "Dublicēt uz jaunu logu">
+<!ENTITY duplicateinWin.accesskey "L">
+<!ENTITY detachTab.label "Pārvietot uz jaunu logu">
+<!ENTITY detachTab.accesskey "P">
+<!ENTITY mergeContext.label "Apvienot logus">
+<!ENTITY mergeContext.accesskey "A">
+<!ENTITY renametab.label "Pārdēvēt cilni">
+<!ENTITY renametab.accesskey "C">
+<!ENTITY copytaburl.label "Kopēt cilnes URL">
+<!ENTITY copytaburl.accesskey "O">
+<!ENTITY reloadother.label "Pārlādēt citas cilnes">
+<!ENTITY reloadother.accesskey "R">
+<!ENTITY reloadleft.label "Pārlādēt kreisās cilnes">
+<!ENTITY reloadleft.accesskey "K">
+<!ENTITY reloadright.label "Pārlādēt labās cilnes">
+<!ENTITY reloadright.accesskey "L">
+<!ENTITY autoReloadTab.label "Pārlādēt cilni katras">
+<!ENTITY autoReloadTab.accesskey "P">
+<!ENTITY autoReloadSite.label "Pārlādēt šo vietni katras">
+<!ENTITY autoReloadSite.accesskey "V">
+<!ENTITY afterthis.label "Pēc šīs cilnes">
+<!ENTITY bookmarktab.label "Pievienot šo cilni grāmatzīmēm">
+<!ENTITY undoCloseListMenu.label "Aizvērto ciļņu saraksts">
+<!ENTITY undoCloseListMenu.accesskey "S">
+<!ENTITY closeAllTabsMenu.label "Aizvērt visas cilnes">
+<!ENTITY closeall.accesskey "Z">
+<!ENTITY closeSimilarTab.label "Aizvērt līdzīgās cilnes">
+<!ENTITY closeSimilarTab.accesskey "L">
+<!ENTITY closeTabsToLeft.label "Aizvērt cilnes pa kreisi">
+<!ENTITY closeleft.accesskey "K">
+<!ENTITY closeTabstoRight.label "Aizvērt cilnes pa labi">
+<!ENTITY closeright.accesskey "L">
+<!ENTITY docShellMenu.label "Atļaujas">
+<!ENTITY docShellMenu.accesskey "J">
+<!ENTITY freezeTabMenu.label "Sasaldēt cilni">
+<!ENTITY freezeTabMenu.accesskey "S">
+<!ENTITY protectTabMenu.label "Aizsargāt cilni">
+<!ENTITY protectTabMenu.tooltip "Aizsargāt cilnes no aizvēršanas">
+<!ENTITY protectTabMenu.accesskey "Z">
+<!ENTITY lockTabMenu.label "Noslēgt cilni">
+<!ENTITY lockTabMenu.tooltip "Visas saites atvērt jaunā cilnē">
+<!ENTITY lockTabMenu.accesskey "K">
+<!ENTITY bookmarktabs.label "Pievienot grāmatzīmēm visas cilnes">
+<!ENTITY linkhere.label "Atvērt saiti šajā cilnē">
+<!ENTITY linkhere.accesskey "T">
+<!ENTITY linkBackgroundTab.label "Atvērt saiti fona cilnē">
+<!ENTITY linkForegroundTab.label "Atvērt saiti priekšplāna cilnē">
+<!ENTITY linkBackgroundTab.accesskey "F">
+<!ENTITY linkForegroundTab.accesskey "P">
+<!ENTITY openalllinks.label "Atvērt saites jaunās cilnēs">
+<!ENTITY openalllinks.accesskey "J">
+<!ENTITY linkwithhistory.label "Atvērt saiti dublicētā cilnē">
+<!ENTITY linkwithhistory.accesskey "D">
+<!ENTITY tabsList.label "Atvērto ciļņu saraksts">
+<!ENTITY tabsList.accesskey "K">
+<!ENTITY allowImage.label "Attēls">
+<!ENTITY allowJavascript.label "JavaScript">
+<!ENTITY allowRedirect.label "Pārvirzīt">
+<!ENTITY allowPlugin.label "Spraudnis">
+<!ENTITY allowFrame.label "Rāmis">
+<!ENTITY restoreincurrent.label "Atjaunot uz pašreizējo cilni">
+<!ENTITY restoreincurrent.accesskey "T">
+<!ENTITY restoreinwin.label "Atjaunot uz jaunu logu">
+<!ENTITY restoreinwin.accesskey "L">
+<!ENTITY restoreintab.label "Atjaunot uz jaunu cilni">
+<!ENTITY restoreintab.accesskey "U">
+<!ENTITY restoretab.label "Atjaunot cilni">
+<!ENTITY restoretab.accesskey "N">
+<!ENTITY bookmark.label "Pievienot grāmatzīmēm šo saiti">
+<!ENTITY bookmark.accesskey "G">
+<!ENTITY deletelist.label "Dzēst no saraksta">
+<!ENTITY deletelist.accesskey "D">
+<!ENTITY settings.label "Iestatījumi">
+<!ENTITY saveWindow.label "Saglabāt šo logu">
+<!ENTITY saveAllWindows.label "Saglabāt visus logus">
+<!ENTITY sm.context.overwrite "Atjaunot, pārrakstīt esošos logus">
+<!ENTITY sm.context.overwrite.key "P">
+<!ENTITY sm.context.restore.new "Atjaunot uz jaunu logu">
+<!ENTITY sm.context.restore.newkey "J">
+<!ENTITY sm.context.replacethis "Aizvietot ar šo logu">
+<!ENTITY sm.context.replacethis.key "A">
+<!ENTITY sm.context.replaceall "Aizvietot ar visiem logiem">
+<!ENTITY sm.context.replaceall.key "V">
+<!ENTITY sm.context.add "Pievienot šo logu">
+<!ENTITY sm.context.add.key "L">
+<!ENTITY sm.context.addall "Pievienot visus logus">
+<!ENTITY sm.context.addall.key "I">
+<!ENTITY sm.context.save "Saglabāt">
+<!ENTITY sm.context.save.key "S">
+<!ENTITY sm.context.rename "Pārdēvēt">
+<!ENTITY sm.context.rename.key "P">
+<!ENTITY sm.context.delete "Dzēst">
+<!ENTITY sm.context.delete.key "D">
+<!ENTITY sm.context.deleteall "Dzēst visu">
+<!ENTITY sm.context.deleteall.key "V">
+<!ENTITY sm.context.startup "Iestatīt kā palaišanas sesiju">
+<!ENTITY sm.context.startup.key "P">
+<!ENTITY sm.context.details "Rādīt skaitītājus, datumu un laiku sesiju izvēlnē">
+<!ENTITY sm.context.details.key "S">
+<!ENTITY tab.key "C">
+<!ENTITY window.key "L">
+<!ENTITY merge.key "A">
+<!ENTITY sortedTabs.label "Sakārtotās cilnes">
+<!ENTITY sortedTabs.tooltip "Atzīmējiet, lai sarakstu rādītu alfabētiski sakārtotu">
+<!ENTITY enable.label "Ieslēgt">
+<!ENTITY custom.label "Pielāgots">
+<!ENTITY enableTabs.label "Ieslēgt visas cilnes">
+<!ENTITY disableTabs.label "Atslēgt visas cilnes">
+<!ENTITY seconds.label "sekundes">
+<!ENTITY minutes.label "minūtes">
+<!ENTITY minute.label "minūte">
+<!ENTITY hideTabBar.label "Paslēpt ciļņu joslu">
+<!ENTITY hideTabBar.never.label "Nekad">
+<!ENTITY hideTabBar.never.key "N">
+<!ENTITY hideTabBar.onOneTab.label "Kad atvērta tikai viena cilne">
+<!ENTITY hideTabBar.onOneTab.key "E">
+<!ENTITY hideTabBar.always.label "Vienmēr">
+<!ENTITY hideTabBar.always.key "V">
diff --git a/chrome/locale/lv-LV/tabmix.properties b/chrome/locale/lv-LV/tabmix.properties
new file mode 100644
index 0000000..20ecf61
--- /dev/null
+++ b/chrome/locale/lv-LV/tabmix.properties
@@ -0,0 +1,40 @@
+extensions.{dc572301-7619-498c-a57d-39143191b318}.description=Uzlabota pārlūkošana ar cilnēm
+tmp.merge.warning.title=Aizver logus ar neapvienotajām cilnēm
+tmp.merge.warning.message=Izvēlētās cilnes tiks apvienotas ar citu logu, bet citas cilnes tagad tiks aizvērtas līdz ar pašreizējo logu.
+tmp.merge.warning.checkboxLabel=Vienmēr brīdināt mani, kad aizver logu ar cilnēm, kas netiek apvienotas.
+tmp.merge.error=Jābūt atvērtiem vismaz diviem logiem, pirms varat tos apvienot
+tmp.merge.private=Jūs nevarat apvienot privāto ar ne-privāto logu.
+tmp.importPref.error1=Nevar importēt, jo tas nav derīgs fails.
+tmp.importPref.error2=Iestatījumus neizdevās importēt.
+tmp.sessionempty=Nākamreiz, kad palaidīsiet pārlūku, \'Iepriekšējā sesija\' būs tukša.
+droptoclose.label=Nometiet cilni, lai to aizvērtu
+droplink.label=Nometiet centrā, lai cilni aizvietotu, vai sānos, lai izveidotu jaunu cilni
+flstOn.label=Cilnes fokuss uz pēdējo izvēlēto - nospiediet F9, lai apmainītu iestatījumu
+flstOff.label=Cilnes fokuss pa labi - nospiediet F9, lai apmainītu iestatījumu
+slideshowOn.label=Ciļņu rotācija ir ieslēgta - nospiediet F8, lai izslēgtu
+slideshowOff.label=Ciļņu rotācija ir izslēgta - nospiediet F8, lai ieslēgtu
+undoclosetab.clear.label=Notīrīt aizvērto ciļņu sarakstu
+undoclosetab.clear.accesskey=C
+undoClosedWindows.clear.label=Notīrīt aizvērto logu sarakstu
+undoClosedWindows.clear.accesskey=C
+protectedtabs.closeWarning.1=Jūs gatavojaties aizvērt %S aizsargātu cilni. Vai tiešām vēlaties turpināt?
+protectedtabs.closeWarning.2=Jūs gatavojaties aizvērt %S aizsargātas cilnes. Vai tiešām vēlaties turpināt?
+protectedtabs.closeWarning.3=Jūs gatavojaties aizvērt %S cilnes, %S no tām aizsargātas. Vai tiešām vēlaties turpināt?
+protectedtabs.closeWarning.4=Brīdināt mani, kad mēģinu aizvērtu logu ar aizsargātām cilnēm
+window.closeWarning.1=Brīdināt mani, kad mēģinu aizvērtu logu ar vairākām cilnēm
+closeWindow.label=Aizvērt logu
+confirm_autoreloadPostData_title=Brīdinājums!
+confirm_autoreloadPostData=Vietne, kurā mēģinājāt ieslēgt automātisko pārlādēšanu, satur POSTDATA.\nJa ieslēgsiet automātisko pārlādēšanu, jebkāda darbība, ko ievades forma izpilda (piem., tiešsaistes pirkums), tiks atkārtota.\n\nVai tiešām vēlaties ieslēgt automātisko pārlādēšanu?
+incompatible.title=Tab Mix Plus
+incompatible.msg0=Sekojošie paplašinājumu ir iekļauti Tab Mix Plus vai nav ar to saderīgi.
+incompatible.msg1=Vai vēlaties atslēgt šos paplašinājumus?
+incompatible.msg2=Nesaderīgie paplašinājumi tiks atslēgti pēc tam, kad pārstartēsiet savu pārlūku.
+incompatible.button0.label=Atslēgt
+incompatible.button0.accesskey=A
+incompatible.button1.label=Neatslēgt
+incompatible.button1.accesskey=N
+incompatible.button2.label=Atslēgt un pārstartēt
+incompatible.button2.accesskey=T
+incompatible.chkbox.label=Parādīt šo brīdinājumu, palaižot pārlūku
+tabmixoption.error.title=Tab Mix Plus kļūda
+tabmixoption.error.msg=Lai lietotu Tab Mix Plus opcijas, jābūt vienam pārlūka logam
diff --git a/install.rdf b/install.rdf
index 6346dc7..305bb4c 100644
--- a/install.rdf
+++ b/install.rdf
@@ -5,8 +5,8 @@
<RDF:Description RDF:about="urn:mozilla:install-manifest"
NS1:id="{dc572301-7619-498c-a57d-39143191b318}"
NS1:name="Tab Mix Plus"
- NS1:version="0.4.1.6"
- NS1:type="2"
+ NS1:version="0.4.1.7pre.150112a1"
+ NS1:type="2"
NS1:multiprocessCompatible="true"
NS1:description="Tab browsing with an added boost."
NS1:iconURL="chrome://tabmixplus/skin/tmp.png"
@@ -15,15 +15,15 @@
NS1:aboutURL="chrome://tabmixplus/content/about.xul"
NS1:creator="ONEMEN (tabmix.onemen at gmail.com)"
NS1:developer="ONEMEN">
- <NS1:targetApplication RDF:resource="rdf:#$n83In3"/>
- <NS1:targetApplication RDF:resource="rdf:#$n74Pm2"/>
- </RDF:Description>
- <RDF:Description RDF:about="rdf:#$n83In3"
- NS1:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
- NS1:minVersion="17.0"
- NS1:maxVersion="35.*" />
- <RDF:Description RDF:about="rdf:#$n74Pm2"
- NS1:id="{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}"
- NS1:minVersion="25.0"
- NS1:maxVersion="25.*" />
-</RDF:RDF>
+ <NS1:targetApplication RDF:resource="rdf:#$n83In3"/>
+ <NS1:targetApplication RDF:resource="rdf:#$n74Pm2"/>
+ </RDF:Description>
+ <RDF:Description RDF:about="rdf:#$n83In3"
+ NS1:id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+ NS1:minVersion="17.0"
+ NS1:maxVersion="37.0a1" />
+ <RDF:Description RDF:about="rdf:#$n74Pm2"
+ NS1:id="{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}"
+ NS1:minVersion="25.0"
+ NS1:maxVersion="25.*" />
+</RDF:RDF>
diff --git a/modules/AutoReload.jsm b/modules/AutoReload.jsm
index 7f9a0b5..342c7cc 100644
--- a/modules/AutoReload.jsm
+++ b/modules/AutoReload.jsm
@@ -50,7 +50,7 @@ let AutoReload = {
this.addClonePopup(aPopup, aTab);
aPopup._tab = aTab;
- if (aPopup._tab.autoReloadEnabled == null)
+ if (aPopup._tab.autoReloadEnabled === undefined)
this.initTab(aPopup._tab);
var enableItem = menuItems[2];
@@ -149,7 +149,7 @@ let AutoReload = {
var tabs = aTabBrowser.visibleTabs;
for(let i=0; i<tabs.length; i++) {
let tab = tabs[i];
- if (tab.autoReloadEnabled == null)
+ if (tab.autoReloadEnabled === undefined)
this.initTab(tab);
if (!tab.autoReloadEnabled || tab.autoReloadURI != tab.linkedBrowser.currentURI.spec)
@@ -250,7 +250,7 @@ let AutoReload = {
function _setItem () {}
function _reloadTab(aTab) {
- if (aTab == null || !aTab.parentNode)
+ if (!aTab || !aTab.parentNode)
return;
if (aTab.autoReloadEnabled === false ) {
diff --git a/modules/ContentClick.jsm b/modules/ContentClick.jsm
index abedbec..0ca480a 100644
--- a/modules/ContentClick.jsm
+++ b/modules/ContentClick.jsm
@@ -407,7 +407,7 @@ var ContentClickInternal = {
if (this.currentTabLocked || this.targetPref == 1) { // tab is locked
let openNewTab = this.openTabfromLink();
- if (openNewTab != null)
+ if (openNewTab !== null)
return [(openNewTab ? TMP_tabshifted(event) : "default") + "@16"];
}
return ["default at 17"];
@@ -815,6 +815,9 @@ var ContentClickInternal = {
if (this.targetPref != 2 || this._window.Tabmix.isNewTabUrls(this._data.currentURL))
return false;
+ if (this.GoogleComLink())
+ return false;
+
if (this.checkOnClick())
return false;
diff --git a/modules/ContextMenu.jsm b/modules/ContextMenu.jsm
index a567e33..1ec8025 100644
--- a/modules/ContextMenu.jsm
+++ b/modules/ContextMenu.jsm
@@ -55,7 +55,7 @@ this.ContextMenu = {
Ci.nsIDOMNodeFilter.SHOW_ELEMENT, filter, true);
let nextEpisode = treeWalker.nextNode();
let urls = [];
- while (nextEpisode != null) {
+ while (nextEpisode !== null) {
let url;
if (nextEpisode.nodeName == "li") {
let node = nextEpisode.firstChild;
diff --git a/modules/DynamicRules.jsm b/modules/DynamicRules.jsm
index 0c696c6..40f536b 100644
--- a/modules/DynamicRules.jsm
+++ b/modules/DynamicRules.jsm
@@ -285,7 +285,7 @@ this.DynamicRules = {
let prefString = Prefs.getCharPref(ruleName);
try {
currentPrefValues = TabmixSvc.JSON.parse(prefString);
- if (currentPrefValues == null)
+ if (currentPrefValues === null)
throw Error(ruleName + " value is invalid\n" + prefString);
}
catch (ex) {
@@ -313,13 +313,13 @@ this.DynamicRules = {
let opacityValue = opacity in currentPrefValues ? currentPrefValues[opacity] : null;
value = getRGBcolor(value, opacityValue);
}
- else if (value != null && typeof(value) != "boolean") {
+ else if (value !== undefined && typeof value != "boolean") {
if (/^true$|^false$/.test(value.replace(/[\s]/g,"")))
value = value == "true" ? true : false;
else
- value = null;
+ value = undefined;
}
- if (value == null)
+ if (value === undefined)
prefValues[item] = item == "bgTopColor" ? prefValues["bgColor"] :
defaultPrefValues[item];
else
@@ -363,9 +363,9 @@ function getRGBcolor(aColorCode, aOpacity) {
else
return null;
- if (aOpacity != null)
+ if (aOpacity !== null)
newRGB[3] = aOpacity;
- else if (newRGB[3] == null || newRGB[3] < 0 || newRGB[3] > 1)
+ else if (newRGB[3] === undefined || newRGB[3] < 0 || newRGB[3] > 1)
newRGB[3] = 1;
return "rgba(" + newRGB.join(",") + ")";
}
diff --git a/modules/RenameTab.jsm b/modules/RenameTab.jsm
index 7ca7f65..153a7cf 100644
--- a/modules/RenameTab.jsm
+++ b/modules/RenameTab.jsm
@@ -80,7 +80,7 @@ this.RenameTab = {
popup.addEventListener("keypress", this, false);
// dock the panel to the tab icon when possible, otherwise show the panel
// at screen center
- if (this.window.gBrowser.tabContainer.mTabstrip.isElementVisible(this.data.tab))
+ if (this.window.Tabmix.tabsUtils.isElementVisible(this.data.tab))
popup.openPopup(this.data.tab, "bottomcenter topleft");
else {
let screen = this.window.screen;
diff --git a/modules/Shortcuts.jsm b/modules/Shortcuts.jsm
index abcd47d..39fd9a5 100644
--- a/modules/Shortcuts.jsm
+++ b/modules/Shortcuts.jsm
@@ -8,7 +8,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://tabmixplus/Services.jsm");
-let Shortcuts = {
+this.Shortcuts = {
keys: {
newTab: {id: "key_newNavigatorTab", default: "T accel"},
dupTab: {default: "T accel,alt"},
@@ -43,6 +43,7 @@ let Shortcuts = {
ucatab: {command: 13},
saveWindow: {id: "key_tm-sm-saveone", default: "VK_F1 accel", sessionKey: true},
saveSession: {id: "key_tm-sm-saveall", default: "VK_F9 accel", sessionKey: true},
+ switchToLast: {command: 32},
slideShow: {id: "key_tm_slideShow", default: "d&VK_F8"},
toggleFLST: {id: "key_tm_toggleFLST", default: "d&VK_F9"}
},
@@ -74,17 +75,28 @@ let Shortcuts = {
getService(Ci.nsIPrivateBrowsingService).autoStarted;
// update keys initial value and label
- let labels = aWindow.Tabmix.shortcutsLabels;
+ // get our key labels from shortcutsLabels.xml
+ let $ = function(id) id && aWindow.document.getElementById(id);
+ let container = $("tabmixScrollBox") || $("tabbrowser-tabs");
+ let labels = {};
+ if (container) {
+ let box = aWindow.document.createElement("vbox");
+ box.setAttribute("shortcutsLabels", true);
+ container.appendChild(box);
+ Array.slice(box.attributes).forEach(function(a) labels[a.name] = a.value);
+ container.removeChild(box);
+ }
labels.togglePinTab =
- aWindow.document.getElementById("context_pinTab").getAttribute("label") + "/" +
- aWindow.document.getElementById("context_unpinTab").getAttribute("label");
+ $("context_pinTab").getAttribute("label") + "/" +
+ $("context_unpinTab").getAttribute("label");
for (let key of Object.keys(this.keys)) {
let keyData = this.keys[key];
keyData.value = keyData.default || "";
- if (key in labels)
+ if (container && key in labels)
keyData.label = labels[key];
+ else if (!container && !key.id)
+ keyData.label = "tabmix_key_" + key;
}
- delete aWindow.Tabmix.shortcutsLabels;
if (aWindow.keyconfig) {
this.keyConfigInstalled = true;
@@ -284,7 +296,7 @@ let Shortcuts = {
try {
shortcuts = JSON.parse(getPref("extensions.tabmix.shortcuts"));
} catch (ex) {}
- if (shortcuts == null) {
+ if (shortcuts === null) {
TabmixSvc.console.log("failed to read shortcuts preference.\nAll shortcuts was resets to default");
shortcuts = {};
updatePreference = true;
diff --git a/modules/extensions/TabGroupsManager.jsm b/modules/extensions/TabGroupsManager.jsm
index 63a5f3e..4c3a2b7 100644
--- a/modules/extensions/TabGroupsManager.jsm
+++ b/modules/extensions/TabGroupsManager.jsm
@@ -71,7 +71,7 @@ this.TMP_TabGroupsManager = {
sessionStore.deleteTabValue(tab, "__tabmixTGM");
TGM.moveTabToGroupBySessionStore(tab);
}
- }
+ };
this.changeCode(sessionManager, "TabmixSessionManager.loadOneWindow")._replace(
// get saved group data and repalce ids with new one
@@ -105,7 +105,8 @@ this.TMP_TabGroupsManager = {
)._replace(
'TMP_ClosedTabs.setButtonDisableState();',
' if (_restoreSelect && (overwrite || (!concatenate && !currentTabIsBalnk)))' +
- ' this.updateSelected(newIndex + _lastSelectedIndex, overwrite || caller=="firstwindowopen" || caller=="windowopenedbytabmix");' +
+ ' this.updateSelected(newIndex + _lastSelectedIndex, overwrite ||' +
+ ' caller=="firstwindowopen" || caller=="windowopenedbytabmix");' +
' $&'
)._replace(
'this.SessionStore[fnName](window, tabs, tabsData, 0);',
@@ -114,7 +115,7 @@ this.TMP_TabGroupsManager = {
).toCode();
// for TabGroupsManager use - don't change function name from tabmixSessionsManager
- aWindow.TMP_TabGroupsManager = {}
+ aWindow.TMP_TabGroupsManager = {};
aWindow.TMP_TabGroupsManager.tabmixSessionsManager = this.tabmixSessionsManager.bind(aWindow);
this.changeCode(this, "TMP_TabGroupsManager._saveAllGroupsData", {forceUpdate: true})
.toCode(false, aWindow.TabmixSessionManager, "saveAllGroupsData");
@@ -127,7 +128,7 @@ this.TMP_TabGroupsManager = {
return false;
return this.Tabmix.prefs.getBoolPref("sessions.manager") &&
- (!this.Tabmix.isWindowAfterSessionRestore || "tabmixdata" in this)
+ (!this.Tabmix.isWindowAfterSessionRestore || "tabmixdata" in this);
},
// for TabGroupsManager use
@@ -145,4 +146,4 @@ this.TMP_TabGroupsManager = {
}
}
-}
+};
diff --git a/modules/log.jsm b/modules/log.jsm
index 533e8bb..17e6792 100644
--- a/modules/log.jsm
+++ b/modules/log.jsm
@@ -216,7 +216,7 @@ options = {
val = val.substr(0, val.indexOf("(")) + "() { " + code + " }";
}
objS += offset + prop + "[" + type + "]" + " = " + val + "\n";
- if (type == "object" && val != null && level && typeof level == "boolean")
+ if (type == "object" && val !== null && level && typeof level == "boolean")
objS += this.obj(val, "", true, "deep") + "\n";
} catch (ex) {
objS += offset + prop + " = " + "[!!error retrieving property]" + "\n";
diff --git a/test.manifest b/test.manifest
new file mode 100644
index 0000000..e69de29
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/tabmixplus.git
More information about the Pkg-mozext-commits
mailing list