[Pkg-mozext-commits] [mozilla-password-editor] 02/05: New upstream version 2.10

Ximin Luo infinity0 at debian.org
Wed Sep 7 12:22:23 UTC 2016


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch master
in repository mozilla-password-editor.

commit 8f0bf3dac196ecd4876ad5ba93775a4296613e01
Author: Ximin Luo <infinity0 at debian.org>
Date:   Wed Sep 7 14:08:28 2016 +0200

    New upstream version 2.10
---
 META-INF/manifest.mf                  | 110 ++++++++++++-----------
 META-INF/mozilla.rsa                  | Bin 4191 -> 4191 bytes
 META-INF/mozilla.sf                   |   4 +-
 content/SavedPasswordEditor-frame.jsm | 158 ++++++++++++++++++++++++++++++++++
 content/SavedPasswordEditor.jsm       |  59 ++-----------
 content/contextmenuOverlay.js         |  41 +++++----
 content/firstrun.jsm                  |  10 +--
 content/frame-script.js               |  42 +++++++++
 content/menubarOverlay.js             |   4 +-
 content/prefwindow.js                 |   4 +-
 content/pwdedit.js                    | 138 +++++++++--------------------
 content/pwdmgrOverlay-sm.js           |   2 +
 content/pwdmgrOverlay.js              |   2 +
 content/toolbarOverlay.js             |   4 +-
 content/welcome.js                    |   4 +-
 install.rdf                           |  25 +++---
 locale/fr/browserOverlay.dtd          |  10 +--
 locale/fr/prefwindow.dtd              |  44 +++++-----
 locale/fr/pwdedit.dtd                 |  32 +++----
 locale/fr/pwdedit.properties          |  12 +--
 locale/fr/pwdmgrOverlay.dtd           |   8 +-
 locale/fr/pwdmgrOverlay.properties    |   6 +-
 locale/fr/spe.properties              |  10 +--
 locale/fr/welcome.dtd                 |  12 +--
 locale/hu/prefwindow.dtd              |   4 +-
 locale/hu/spe.properties              |   6 +-
 locale/id-ID/prefwindow.dtd           |  18 ++--
 locale/id-ID/pwdmgrOverlay.dtd        |   2 +-
 locale/id-ID/pwdmgrOverlay.properties |   4 +-
 locale/id-ID/spe.properties           |   6 +-
 30 files changed, 448 insertions(+), 333 deletions(-)

diff --git a/META-INF/manifest.mf b/META-INF/manifest.mf
index b9d1ae7..8e699d3 100644
--- a/META-INF/manifest.mf
+++ b/META-INF/manifest.mf
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
 
 Name: install.rdf
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Ym78NLmvgcN26nOpljVo3w==
-SHA1-Digest: aP3//7ULukcmQr50TwGCsR0c7K0=
+MD5-Digest: in+QbDCJ2q17A5mt1ArjYA==
+SHA1-Digest: xYsHaUHD52OxPGtuJ0bgA4i6tC0=
 
 Name: chrome.manifest
 Digest-Algorithms: MD5 SHA1
@@ -22,8 +22,8 @@ SHA1-Digest: pOjlFhlU9GBa8oRcbyh+SI3JEQg=
 
 Name: content/contextmenuOverlay.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: eSwL/knU4kDJfBDFMJ7/uQ==
-SHA1-Digest: Kl+ZqXhqKiP219FvKl+swvLwuDs=
+MD5-Digest: X1GeOXH4T5qH0boyYddu2Q==
+SHA1-Digest: Ru3R35rQd57bA0S2gZSq9cT4enY=
 
 Name: content/contextmenuOverlay.xul
 Digest-Algorithms: MD5 SHA1
@@ -32,14 +32,19 @@ SHA1-Digest: 6IOSRy3YT635dTSdu/4CrRb3uv8=
 
 Name: content/firstrun.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: GZfXHlBOgyL85QwOV14RSg==
-SHA1-Digest: ePaydcPJtQLgw5ydKvzXgZaIpBI=
+MD5-Digest: vnZOF7YZiuIz7RbTgDHinw==
+SHA1-Digest: i07bpc92MfVfJ9xnbiXkaA7ohA4=
 
 Name: content/firstrunOverlay.xul
 Digest-Algorithms: MD5 SHA1
 MD5-Digest: sINSIqxRt4bBiwEiYBo1WA==
 SHA1-Digest: 40ZYv10HQrTBLXFyjm8J7vH6F5Q=
 
+Name: content/frame-script.js
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: rPuB1E/HxZaKS7TjdRVaAg==
+SHA1-Digest: DR8uBolBGMBmApsjgzbbpTRUNdk=
+
 Name: content/mailMenubarOverlay.xul
 Digest-Algorithms: MD5 SHA1
 MD5-Digest: Tw3qzcGyXjzEg89ctsYxXg==
@@ -47,13 +52,13 @@ SHA1-Digest: wnntmx8PcUzLZIT4ajCOfTFdSu0=
 
 Name: content/menubarOverlay.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: whdwtV3CK65OK0OtLtOvSA==
-SHA1-Digest: LG9de+cGOIKAF+VTCMMWt+/EKkg=
+MD5-Digest: 8onvo6nXFcesuXjOsLRWLw==
+SHA1-Digest: Xd8N6fNB8EvjHV6jIfUXLDx/h2s=
 
 Name: content/prefwindow.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: x43OGK3M22wV8QDxLHrCVA==
-SHA1-Digest: JLxbmvSLiWE9xklESIPH6dp9Guo=
+MD5-Digest: ND+LUpl1zTo+aGbrWoo9Yg==
+SHA1-Digest: CVGmytMby6OrL/Y75G3YUhYtzdE=
 
 Name: content/prefwindow.xul
 Digest-Algorithms: MD5 SHA1
@@ -62,8 +67,8 @@ SHA1-Digest: IzwFhNbpGQZ/yoAbmhPM2duK1+0=
 
 Name: content/pwdedit.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: zfrrFEFJI/t/SaW0h6gsZw==
-SHA1-Digest: T5OIDS8WVPQoYhLM7LPO2eCEWQI=
+MD5-Digest: inspCqgYV7xZqFkxysooGA==
+SHA1-Digest: lBmGNUMrJaD2aL4IIlj+JxvTYPI=
 
 Name: content/pwdedit.xul
 Digest-Algorithms: MD5 SHA1
@@ -72,8 +77,8 @@ SHA1-Digest: h/k5R1hp9PJ38jgKZPAh0cxOTSI=
 
 Name: content/pwdmgrOverlay-sm.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: X/CjFu21Rts4eHA+IPU3mw==
-SHA1-Digest: fCMlnLuWsQbC6Zgw5v3wqmnT10U=
+MD5-Digest: mvH9iIlgsjTaO2ReCALK2A==
+SHA1-Digest: 3ks93531wb5V4lurD4H2kGNHEQs=
 
 Name: content/pwdmgrOverlay-sm.xul
 Digest-Algorithms: MD5 SHA1
@@ -82,8 +87,8 @@ SHA1-Digest: GebkbtrypupEChVN9zeiJ3eyPUY=
 
 Name: content/pwdmgrOverlay.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: ay077Rr0K0mp4lPBpVFLJA==
-SHA1-Digest: bO0DdhUGYCVz/2ou0mIW7RlO8Y4=
+MD5-Digest: yimlT4TEtW3f58Qwfd/4wA==
+SHA1-Digest: gXR35qg+uoFt7H2GXg7R2lZmFp0=
 
 Name: content/pwdmgrOverlay.xul
 Digest-Algorithms: MD5 SHA1
@@ -95,15 +100,20 @@ Digest-Algorithms: MD5 SHA1
 MD5-Digest: WV7pjKx/Hrmwhn39Bvwy4g==
 SHA1-Digest: WDPyL1hA8Qf3uqAtXUShwDxR/74=
 
+Name: content/SavedPasswordEditor-frame.jsm
+Digest-Algorithms: MD5 SHA1
+MD5-Digest: /D5j2kGUPYGyXGvEgt5w5w==
+SHA1-Digest: Xlyl0lPTNzWWQbUSuyEmmCd8nTk=
+
 Name: content/SavedPasswordEditor.jsm
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: UvScBrP3MEUmJp5E7IwzOQ==
-SHA1-Digest: WRb8MsvUXXGoUP81Dl5dbRtOQvU=
+MD5-Digest: /oJtROagn4jh4S0qdvGOhA==
+SHA1-Digest: TaOn2JWaRCMiaNkyEra9dSTBz+4=
 
 Name: content/toolbarOverlay.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: vMtD8l2hnc5bHZchvpRp9Q==
-SHA1-Digest: IEC6fuoRySK47xeoesKGpOgZBwU=
+MD5-Digest: PQTsqlcgJa3LLPrnjRZXxw==
+SHA1-Digest: R1xzSErRfDTH1uKbe4st1Nu/x8E=
 
 Name: content/toolbarOverlay.xul
 Digest-Algorithms: MD5 SHA1
@@ -112,8 +122,8 @@ SHA1-Digest: 4pwU/ZTymtSPuaee8GzlUA2Ti98=
 
 Name: content/welcome.js
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: aJLt0nOAApDN9f8bioozUQ==
-SHA1-Digest: 3JSlzEoC9T8PIuts0H/+pIcxPCs=
+MD5-Digest: KkpP8pV9VLR5hNmu/2lpwA==
+SHA1-Digest: Z1WAhrWbUXfubdBCohCiug9Alo0=
 
 Name: content/welcome.xhtml
 Digest-Algorithms: MD5 SHA1
@@ -452,43 +462,43 @@ SHA1-Digest: eHjLpPZGpS/E1Y0w3AvzQMhStxg=
 
 Name: locale/fr/browserOverlay.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: gJxg4ORhx/+RfniGmuApsA==
-SHA1-Digest: wyjMViEfK0kIJIzLGU56gf67qY8=
+MD5-Digest: Emkt+t13IV1WLB0dJAbYuA==
+SHA1-Digest: 38wcykgABMyMDcWYo4xb42qIrq0=
 
 Name: locale/fr/prefwindow.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: rzTSXYcfgfj3n07sm4h0Sw==
-SHA1-Digest: GSQXWOun8I5nqotxtu2cTtXwJ7g=
+MD5-Digest: 45lzp2G+FjZl9kDD93X8mA==
+SHA1-Digest: ki3XbG4kAFOi7JDuziNVCpCrj4c=
 
 Name: locale/fr/pwdedit.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Uj+L7hT3jqT2wCl8oaiXCw==
-SHA1-Digest: X7pVsHO7Vsbjnen5KVCSUJ+znQw=
+MD5-Digest: yLW/Ey3M0HO3GZfvWqEjuQ==
+SHA1-Digest: etg6niN9ucG5xSDYRxokD09XRp0=
 
 Name: locale/fr/pwdedit.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: ZJ3mSE8pd3K82bNdc7l2Pw==
-SHA1-Digest: BQF7/KlwTojhv2V0gDkc4yn0gNo=
+MD5-Digest: +QU/W//7wWO3rhRZgOSl1w==
+SHA1-Digest: aXGHBoj7n7bd01FVL/OQBfZ47BU=
 
 Name: locale/fr/pwdmgrOverlay.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: dr1dgsXdSGfUcTVcfG/sYg==
-SHA1-Digest: kqYM7d6vrjb49gIu1DyyXwGXPWU=
+MD5-Digest: co5KYR+4lFRB0qO9hDmGow==
+SHA1-Digest: /MSj/giumqBfFyaiJKAVijnFar4=
 
 Name: locale/fr/pwdmgrOverlay.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: tug8oUlFngdUFiaEEk8c2Q==
-SHA1-Digest: xd5DRzxEDl5+HyKJ/shQcE0IYno=
+MD5-Digest: kxgYZjf/FmD1rQaEoSNVEA==
+SHA1-Digest: 48CoPyoogNno/wiVKORYh3uRJRk=
 
 Name: locale/fr/spe.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: kxI3EApkwEY4SeBZIcl98g==
-SHA1-Digest: S+gFz9OBB6es4NcpMLXsmNgXVjw=
+MD5-Digest: M8OL49OmGSOc+DguK4mDmw==
+SHA1-Digest: +y92iSnfbP6ggxD2GuD453pTtuA=
 
 Name: locale/fr/welcome.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: S4FMTjw88rgaKuFAzzG2jQ==
-SHA1-Digest: 54aRE4kDYUzd67doHA1dwb9QPQs=
+MD5-Digest: dHcbT5YPBrtyxV0qevWbGA==
+SHA1-Digest: gorUlIxonJ1BWPtwjzyvxgqvbmA=
 
 Name: locale/hsb/browserOverlay.dtd
 Digest-Algorithms: MD5 SHA1
@@ -537,8 +547,8 @@ SHA1-Digest: YJi2rbofT4xmuQxbuf4vLa/BZgI=
 
 Name: locale/hu/prefwindow.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: P2v7ossRr+JPXrTw3Uo78g==
-SHA1-Digest: ogcAYTqLSm6DTpISrB/FNpRSv7I=
+MD5-Digest: 20FOQoJ6yR7mESulsaeCVA==
+SHA1-Digest: me6mwiyJQdGz8gzC1qoaTkI3VPU=
 
 Name: locale/hu/pwdedit.dtd
 Digest-Algorithms: MD5 SHA1
@@ -562,8 +572,8 @@ SHA1-Digest: 3QVxTct/zb8pNa7g8H2AkACK7xI=
 
 Name: locale/hu/spe.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: WxHH9cJeeanUSETaOZu++A==
-SHA1-Digest: ffxAqys1VrMhsystOL5slFk0/8I=
+MD5-Digest: rAJ8zAZn6QAF8u1W6w5KcQ==
+SHA1-Digest: OGx+9J7Lsw7XBI05BO3wo9+b4i8=
 
 Name: locale/hu/welcome.dtd
 Digest-Algorithms: MD5 SHA1
@@ -577,8 +587,8 @@ SHA1-Digest: FIzw/QMgQOXuUH4YfqBiTerfIBQ=
 
 Name: locale/id-ID/prefwindow.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: Nl4ilxdVAmsRrgIlPVQn4w==
-SHA1-Digest: Hc5+7NmfjZfvLnYUK1AD1QM/FUE=
+MD5-Digest: XAtCTSAwdF1QMqx6EjxJ5A==
+SHA1-Digest: f5DXQrabnA4QztLgmWOAjCGL/aI=
 
 Name: locale/id-ID/pwdedit.dtd
 Digest-Algorithms: MD5 SHA1
@@ -592,18 +602,18 @@ SHA1-Digest: QayyPW5GLP3bTqjOAgErH/1B9Gk=
 
 Name: locale/id-ID/pwdmgrOverlay.dtd
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: LHNNx8SMMdbGgSCwcygPaw==
-SHA1-Digest: 0ZRhPn99bR1c/5T6a4NQhOJYe0Y=
+MD5-Digest: 3bwh+KUku3QSfaAXTsijYA==
+SHA1-Digest: ppXzNaD0hlO7CfqO5BaN0du1XZU=
 
 Name: locale/id-ID/pwdmgrOverlay.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: WLcyC7HkgQTWcX1qPFl4DA==
-SHA1-Digest: PcRHD7E6un0ppfYc1SBUxkAVvuc=
+MD5-Digest: 9QDlPlSFraqO0X5gesUIZw==
+SHA1-Digest: ukeMRg+5OQ713Njtu4ulAYsyJnU=
 
 Name: locale/id-ID/spe.properties
 Digest-Algorithms: MD5 SHA1
-MD5-Digest: abhVSzTGXYar9hqLZ9Vw9Q==
-SHA1-Digest: k/krCEzdk2xp6uChASWJl9TB7VY=
+MD5-Digest: SvV/vATVLnvnh5Tt+mXiUA==
+SHA1-Digest: Mcqh/HvewzZZZ37lSGl7P5lpjDw=
 
 Name: locale/id-ID/welcome.dtd
 Digest-Algorithms: MD5 SHA1
diff --git a/META-INF/mozilla.rsa b/META-INF/mozilla.rsa
index 60e8066..bdf558f 100644
Binary files a/META-INF/mozilla.rsa and b/META-INF/mozilla.rsa differ
diff --git a/META-INF/mozilla.sf b/META-INF/mozilla.sf
index 83f5a2c..6a05016 100644
--- a/META-INF/mozilla.sf
+++ b/META-INF/mozilla.sf
@@ -1,4 +1,4 @@
 Signature-Version: 1.0
-MD5-Digest-Manifest: Y3cM8lwFKv2nj/1WAce9DA==
-SHA1-Digest-Manifest: 5VFPMLAZvog5FxGUTIrsnwwBiYM=
+MD5-Digest-Manifest: mKpYdkjVIKBojjaOkWS/MQ==
+SHA1-Digest-Manifest: CDTCM7U1YEoTS6pkfebElBYu9qY=
 
diff --git a/content/SavedPasswordEditor-frame.jsm b/content/SavedPasswordEditor-frame.jsm
new file mode 100644
index 0000000..ba0d6b5
--- /dev/null
+++ b/content/SavedPasswordEditor-frame.jsm
@@ -0,0 +1,158 @@
+/*
+    Saved Password Editor, extension for Gecko applications
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+"use strict";
+
+var EXPORTED_SYMBOLS = ["SavedPasswordEditor"];
+
+const htmlNamespaceResolver =
+  aPrefix => aPrefix == "xhtml" ? "http://www.w3.org/1999/xhtml" : null;
+
+var SavedPasswordEditor = {
+  getFormData (aElement) {
+    const HTMLInputElement =
+      aElement.ownerDocument.defaultView.HTMLInputElement;
+
+    if (aElement instanceof HTMLInputElement && aElement.form) {
+      var form = aElement.form;
+    } else
+      return null;
+
+    var curDoc = aElement.ownerDocument;
+    var curLocation = curDoc.defaultView.location;
+    var hostname = `${curLocation.protocol}//${curLocation.host}`;
+    var passwordField = null;
+    for (var i = 0; i < form.elements.length; i++) {
+      let element = form.elements[i];
+      if (element instanceof HTMLInputElement
+          && element.type.toLowerCase() == "password") {
+        passwordField = element;
+        break;
+      }
+    }
+    if (!passwordField) return null;
+
+    var usernameField = null;
+    for (i = i - 1; i >= 0; i--) {
+      let element = form.elements[i];
+      if (!element instanceof HTMLInputElement) continue;
+      let elType = (element.getAttribute("type") || "").toLowerCase();
+      if (!elType || elType == "text" || elType == "email" || elType == "url"
+          || elType == "tel" || elType == "number") {
+        usernameField = element;
+        break;
+      }
+    }
+    if (!usernameField) return null;
+
+    var formAction = form.action;
+    var res;
+    if (formAction && formAction.startsWith("javascript:"))
+      res = "javascript:";
+    else {
+      res = formAction ? /^([0-9-_A-Za-z]+:\/\/[^/]+)\//.exec(formAction)
+                           : [ null, hostname ];
+      if (!res) return null;
+      res = res[1];
+    }
+
+    return {
+      hostname,
+      formSubmitURL: res,
+      username: usernameField.value,
+      password: passwordField.value,
+      usernameField: usernameField.name,
+      passwordField: passwordField.name,
+    };
+  },
+
+  scanForLoginForms ({ target: aMM }) {
+    const HTMLDocument = aMM.content.HTMLDocument,
+          HTMLInputElement = aMM.content.HTMLInputElement;
+
+    function walkTree (aWindow) {
+      var curDoc = aWindow.document;
+      if (!(curDoc instanceof HTMLDocument)) return [];
+
+      // Get the host prefix;
+      var curLocation = aWindow.location;
+      var hostname = curLocation.protocol + "//" + curLocation.host;
+
+      // Locate likely login forms and their fields
+      var loginForms = [];
+      var forms = curDoc.evaluate(
+        "//xhtml:form", curDoc, htmlNamespaceResolver,
+        aWindow.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+      for (var i = 0; i < forms.snapshotLength; i++) {
+        let form = forms.snapshotItem(i), pwdField = null, j;
+        for (j = 0; j < form.elements.length; j++) {
+          let element = form.elements[j];
+          if (element instanceof HTMLInputElement
+              && element.type == "password") {
+            pwdField = element;
+            break;
+          }
+        }
+        if (!pwdField) continue;
+
+        let unameField = null;
+        for (j = j - 1; j >= 0; j--) {
+          let element = form.elements[j];
+          if (!element instanceof HTMLInputElement) continue;
+          let elType = (element.getAttribute("type") || "").toLowerCase();
+          if (!elType || elType == "text" || elType == "email"
+              || elType == "url" || elType == "tel" || elType == "number") {
+            unameField = element;
+            break;
+          }
+        }
+        if (!unameField) continue;
+
+        // Construct the submit prefix
+        let formAction = form.action;
+        let res;
+        if (formAction && formAction.startsWith("javascript:"))
+          res = "javascript:";
+        else {
+          res = formAction ? /^([0-9-_A-Za-z]+:\/\/[^/]+)\//.exec(formAction)
+                           : [ null, hostname ];
+          if (!res) continue;
+          res = res[1];
+        }
+
+        loginForms.push({
+          hostname, formSubmitURL: res,
+          username: unameField.value, password: pwdField.value,
+          usernameField: unameField.getAttribute("name"),
+          passwordField: pwdField.getAttribute("name"),
+        });
+      }
+
+      // See if any frame or iframe contains a login form
+      var frames = aWindow.frames;
+      for (var i = 0; i < frames.length; i++) {
+        loginForms.push(...walkTree(frames[i]));
+      }
+
+      return loginForms;
+    }
+
+    aMM.sendAsyncMessage(
+      "SavedPasswordEditor:loginformsresults", walkTree(aMM.content));
+  },
+};
diff --git a/content/SavedPasswordEditor.jsm b/content/SavedPasswordEditor.jsm
index fd32619..8175cf2 100644
--- a/content/SavedPasswordEditor.jsm
+++ b/content/SavedPasswordEditor.jsm
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2015  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 const Cc = Components.classes,
       Ci = Components.interfaces,
       Cu = Components.utils;
@@ -75,59 +77,8 @@ var SavedPasswordEditor = {
           "chrome,titlebar,toolbar,centerscreen,resizable", null);
   },
 
-  contextMenuShowing: function (aElement) {
-    if (aElement instanceof Ci.nsIDOMHTMLInputElement && aElement.form) {
-      var form = aElement.form;
-    } else
-      return false;
-
-    var curDoc = aElement.ownerDocument;
-    var curLocation = curDoc.defaultView.location;
-    var hostname = curLocation.protocol + "//" + curLocation.host;
-    var passwordField = null;
-    for (var i = 0; i < form.elements.length; i++) {
-      let element = form.elements[i];
-      if (element instanceof Ci.nsIDOMHTMLInputElement
-          && element.type.toLowerCase() == "password") {
-        passwordField = element;
-        break;
-      }
-    }
-    if (!passwordField) return false;
-
-    var usernameField = null;
-    for (i = i - 1; i >= 0; i--) {
-      let element = form.elements[i];
-      if (!element instanceof Ci.nsIDOMHTMLInputElement) continue;
-      let elType = (element.getAttribute("type") || "").toLowerCase();
-      if (!elType || elType == "text" || elType == "email" || elType == "url"
-          || elType == "tel" || elType == "number") {
-        usernameField = element;
-        break;
-      }
-    }
-    if (!usernameField) return false;
-
-    var formAction = form.action;
-    var res;
-    if (formAction && formAction.startsWith("javascript:"))
-      res = "javascript:";
-    else {
-      res = formAction ? /^([0-9-_A-Za-z]+:\/\/[^/]+)\//.exec(formAction)
-                           : [ null, hostname ];
-      if (!res) return false;
-      res = res[1];
-    }
-
-    this.curInfo = {
-      hostname: hostname,
-      formSubmitURL: res,
-      username: usernameField.value,
-      password: passwordField.value,
-      usernameField: usernameField.name,
-      passwordField: passwordField.name,
-    };
-    return true;
+  updateLoginInfo (aLoginInfo) {
+    this.curInfo = aLoginInfo;
   },
 
   saveLoginInfo: function (aWindow, aEvt) {
diff --git a/content/contextmenuOverlay.js b/content/contextmenuOverlay.js
index aa60e42..9358882 100644
--- a/content/contextmenuOverlay.js
+++ b/content/contextmenuOverlay.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2012  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,13 +16,18 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-Components.utils.import(
-  "resource://savedpasswordeditor/SavedPasswordEditor.jsm");
+"use strict";
+
+const Cu = Components.utils;
+Cu.import("resource://savedpasswordeditor/SavedPasswordEditor.jsm");
+
+window.messageManager.loadFrameScript(
+  "chrome://savedpasswordeditor/content/frame-script.js", true);
 
 addEventListener(
   "load",
-  function () {
-    var prefix = "savedpasswordeditor-";
+  function _loadHandler () {
+    const prefix = "savedpasswordeditor-";
 
     function showItem (aId) {
       document.getElementById(prefix + aId).hidden = false;
@@ -32,19 +37,17 @@ addEventListener(
       document.getElementById(prefix + aId).hidden = true;
     }
 
-    function popupshowingHandler () {
-      let idList = ["ctxmenuseparator",
-                    "savelogininfo", "editlogininfo", "deletelogininfo"];
-      let target = gContextMenu.target;
-      idList.forEach(
-        SavedPasswordEditor.contextMenuShowing(target) ? showItem : hideItem);
-    }
-
-    function popuphiddenHandler () {
-      SavedPasswordEditor.contextMenuHidden();
-    }
-
-    var ctxMenu = document.getElementById("contentAreaContextMenu");
-    ctxMenu.addEventListener("popupshowing", popupshowingHandler, false);
+    var contextshowingHandler = {
+      receiveMessage ({ data }) {
+        SavedPasswordEditor.updateLoginInfo(data);
+        let idList = ["ctxmenuseparator",
+                      "savelogininfo", "editlogininfo", "deletelogininfo"];
+        idList.forEach(data ? showItem : hideItem);
+      },
+    };
+
+    window.messageManager.addMessageListener(
+      "SavedPasswordEditor:contextshowing", contextshowingHandler);
+    removeEventListener("load", _loadHandler, false);
   },
   false);
diff --git a/content/firstrun.jsm b/content/firstrun.jsm
index b79f49d..08bb71e 100644
--- a/content/firstrun.jsm
+++ b/content/firstrun.jsm
@@ -16,16 +16,17 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 var EXPORTED_SYMBOLS = [];
 
 const Cc = Components.classes,
       Ci = Components.interfaces,
       Cu = Components.utils,
-      FIREFOX = "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}",
       SEAMONKEY = "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}",
       THUNDERBIRD = "{3550f703-e582-4d05-9a08-453d09bdfdc6}",
       PREFNAME = "currentVersion",
-      THISVERSION = "2.9.6",
+      THISVERSION = "2.10",
       WELCOMEVERSION = "2.5pre1",
       CONTENT = "chrome://savedpasswordeditor/content/",
       WELCOMEURL = CONTENT + "welcome.xhtml",
@@ -40,11 +41,6 @@ function welcome () {
               getService(Ci.nsIXULAppInfo).ID;
 
   switch (appId) {
-  case FIREFOX:
-    var curWin = wm.getMostRecentWindow("navigator:browser");
-    curWin.gBrowser.selectedTab = curWin.gBrowser.addTab(WELCOMEURL);
-    break;
-
   case SEAMONKEY:
     var curWin = wm.getMostRecentWindow("navigator:browser");
 
diff --git a/content/frame-script.js b/content/frame-script.js
new file mode 100644
index 0000000..26f157a
--- /dev/null
+++ b/content/frame-script.js
@@ -0,0 +1,42 @@
+/*
+     Saved Password Editor, extension for Gecko applications
+     Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
+
+     This program is free software: you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation, either version 3 of the License, or
+     (at your option) any later version.
+
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+"use strict";
+
+const Ci = Components.interfaces, Cu = Components.utils;
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://savedpasswordeditor/SavedPasswordEditor-frame.jsm");
+
+Services.obs.addObserver(
+  function (aSubject) {
+    if (aSubject.wrappedJSObject) aSubject = aSubject.wrappedJSObject;
+    var target = aSubject.event.target;
+    if (Ci.nsIDOMXULElement
+        && target instanceof Ci.nsIDOMXULElement)  // SeaMonkey, why?
+      target = target.triggerNode;
+
+    sendSyncMessage(
+      "SavedPasswordEditor:contextshowing",
+      SavedPasswordEditor.getFormData(target));
+  },
+  "content-contextmenu",
+  false);
+
+addMessageListener(
+  "SavedPasswordEditor:scanforloginforms",
+  SavedPasswordEditor.scanForLoginForms);
diff --git a/content/menubarOverlay.js b/content/menubarOverlay.js
index 04b01e1..cbf86af 100644
--- a/content/menubarOverlay.js
+++ b/content/menubarOverlay.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2015  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 {
   let shortcutKey, shortcutKeycode, shortcutModifiers;
   let Cc = Components.classes, Ci = Components.interfaces;
diff --git a/content/prefwindow.js b/content/prefwindow.js
index c92f918..a7d633a 100644
--- a/content/prefwindow.js
+++ b/content/prefwindow.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2015  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 const Cc = Components.classes, Ci = Components.interfaces,
   Cu = Components.utils;
 Cu.import("resource://gre/modules/Services.jsm");
diff --git a/content/pwdedit.js b/content/pwdedit.js
index 7e01467..1370ca7 100644
--- a/content/pwdedit.js
+++ b/content/pwdedit.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2015  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 function el (name) document.getElementById(name);
 
 const Cc = Components.classes,
@@ -67,8 +69,8 @@ window.addEventListener(
 
     var props = [ "hostname", "formSubmitURL", "httpRealm",
                   "username", "password", "usernameField", "passwordField" ];
-    for (let i in props) {
-      let propName = props[i], tbox = el(propName + "_text");
+    for (let propName of props) {
+      let tbox = el(propName + "_text");
       if (compositeSignon[propName] !== undefined) {
         tbox.indefinite = false;
         tbox.autoreindef = false;
@@ -159,10 +161,8 @@ function intersectSignonProps (signons) {
   var intersection = new Object();
   var propList = [ "hostname", "formSubmitURL", "httpRealm", "username",
                    "password", "usernameField", "passwordField" ];
-  for (var i = 0; i < signons.length; i++) {
-    let signon = signons[i];
-    for (var j = 0; j < propList.length; j++) {
-      let prop = propList[j];
+  for (let signon of signons) {
+    for (let prop of propList) {
       if (!intersection.hasOwnProperty(prop))
         intersection[prop] = signon[prop] !== undefined ? signon[prop] : null;
       else if (signon[prop] != intersection[prop])
@@ -225,101 +225,47 @@ function togglePasswordView () {
 }
 
 function guessParameters () {
-  function walkTree (win) {
-    var curDoc = win.document;
-    if (!(curDoc instanceof HTMLDocument)) return;
-
-    // Get the host prefix;
-    var curLocation = win.location;
-    var hostname = curLocation.protocol + "//" + curLocation.host;
-
-    // Locate likely login forms and their fields
-    var forms = curDoc.evaluate("//xhtml:form", curDoc, _htmlNamespaceResolver,
-                                XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
-    for (var i = 0; i < forms.snapshotLength; i++) {
-      let form = forms.snapshotItem(i), pwdField = null, j;
-      for (j = 0; j < form.elements.length; j++) {
-        let element = form.elements[j];
-        if (element instanceof HTMLInputElement
-            && element.type == "password") {
-          pwdField = element;
-          break;
-        }
-      }
-      if (!pwdField) continue;
-
-      let unameField = null;
-      for (j = j - 1; j >= 0; j--) {
-        let element = form.elements[j];
-        if (!element instanceof HTMLInputElement) continue;
-        let elType = (element.getAttribute("type") || "").toLowerCase();
-        if (!elType || elType == "text" || elType == "email" || elType == "url"
-            || elType == "tel" || elType == "number") {
-          unameField = element;
-          break;
-        }
-      }
-      if (!unameField) continue;
-
-      // Construct the submit prefix
-      let formAction = form.action;
-      let res;
-      if (formAction && formAction.startsWith("javascript:"))
-        res = "javascript:";
-      else {
-        res = formAction ? /^([0-9-_A-Za-z]+:\/\/[^/]+)\//.exec(formAction)
-                         : [ null, hostname ];
-        if (!res) return false;
-        res = res[1];
-      }
-
-      loginForms.push({
-        hostname: hostname, formSubmitURL: res,
-        username: unameField.value, password: pwdField.value,
-        usernameField: unameField.getAttribute("name"),
-        passwordField: pwdField.getAttribute("name") });
-    }
+  // Locate the message manager for the last seen tab
+  var browserMM =
+    Cc["@mozilla.org/appshell/window-mediator;1"]
+    .getService(Ci.nsIWindowMediator).getMostRecentWindow("navigator:browser")
+    .gBrowser.selectedBrowser.messageManager;
 
-    // See if any frame or iframe contains a login form
-    var frames = win.frames;
-    for (var i = 0; i < frames.length; i++) {
-      walkTree(frames[i]);
-    }
-  }
-
-  // Locate the browser object for the last seen tab
-  var curWin =
-      Cc["@mozilla.org/appshell/window-mediator;1"].
-      getService(Ci.nsIWindowMediator).
-      getMostRecentWindow("navigator:browser").gBrowser.contentWindow;
-
-  // Attempt to find login form(s)
-  loginForms = [];
+  // Save existing username and password in editor
   oldUsername = el("username_text").value;
   oldPassword = el("password_text").value;
 
-  walkTree(curWin);
-  if (loginForms.length == 0) {
-    Cc["@mozilla.org/embedcomp/prompt-service;1"].
-      getService(Ci.nsIPromptService).
-      alert(window, genStrBundle.getString("error"),
-            peStrBundle.getString("nologinform"));
-    return;
-  }
+  // Ask frame script to find login form(s)
+  var resultHandler = {
+    receiveMessage ({ data: aLoginForms }) {
+      browserMM.removeMessageListener(
+        "SavedPasswordEditor.loginformsresults", resultHandler);
+
+      if (aLoginForms.length == 0) {
+        Cc["@mozilla.org/embedcomp/prompt-service;1"].
+          getService(Ci.nsIPromptService).
+          alert(window, genStrBundle.getString("error"),
+                peStrBundle.getString("nologinform"));
+        return;
+      }
 
-  if (loginForms.length > 1) {
-    el("prevForm_btn").hidden = false;
-    el("nextForm_btn").hidden = false;
-  } else {
-    el("prevForm_btn").hidden = true;
-    el("nextForm_btn").hidden = true;
-  }
+      if (aLoginForms.length > 1) {
+        el("prevForm_btn").hidden = false;
+        el("nextForm_btn").hidden = false;
+      } else {
+        el("prevForm_btn").hidden = true;
+        el("nextForm_btn").hidden = true;
+      }
 
-  _fillFromForm(0);
-}
+      loginForms = aLoginForms;
+      _fillFromForm(0);
+    },
+  };
 
-function _htmlNamespaceResolver (aPrefix)
-  aPrefix == "xhtml" ? "http://www.w3.org/1999/xhtml" : null
+  browserMM.addMessageListener(
+    "SavedPasswordEditor:loginformsresults", resultHandler);
+  browserMM.sendAsyncMessage("SavedPasswordEditor:scanforloginforms");
+}
 
 function _fillFromForm (aIdx) {
   curLoginIdx = aIdx;
@@ -336,7 +282,7 @@ function _fillFromForm (aIdx) {
     el("password_text").value = loginForm.password;
   }
 
-  for each (let prfx in ["hostname", "formSubmitURL", "username", "password",
+  for (let prfx of ["hostname", "formSubmitURL", "username", "password",
                          "usernameField", "passwordField"]) {
     let chgEvt = document.createEvent("Event");
     chgEvt.initEvent("change", true, true);
diff --git a/content/pwdmgrOverlay-sm.js b/content/pwdmgrOverlay-sm.js
index 7602854..95e36e1 100644
--- a/content/pwdmgrOverlay-sm.js
+++ b/content/pwdmgrOverlay-sm.js
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 document.addEventListener(
   "DOMContentLoaded",
   function dclHandler (ev) {
diff --git a/content/pwdmgrOverlay.js b/content/pwdmgrOverlay.js
index ec2018b..45758e5 100644
--- a/content/pwdmgrOverlay.js
+++ b/content/pwdmgrOverlay.js
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 document.addEventListener(
   "DOMContentLoaded",
   function dclHandler (ev) {
diff --git a/content/toolbarOverlay.js b/content/toolbarOverlay.js
index 2a02b4c..8563467 100644
--- a/content/toolbarOverlay.js
+++ b/content/toolbarOverlay.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2014  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 Components.utils.import(
   "resource://savedpasswordeditor/SavedPasswordEditor.jsm");
 
diff --git a/content/welcome.js b/content/welcome.js
index 04ea6f8..3eeb1a5 100644
--- a/content/welcome.js
+++ b/content/welcome.js
@@ -1,6 +1,6 @@
 /*
     Saved Password Editor, extension for Gecko applications
-    Copyright (C) 2014  Daniel Dawson <danielcdawson at gmail.com>
+    Copyright (C) 2016  Daniel Dawson <danielcdawson at gmail.com>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -16,6 +16,8 @@
     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+"use strict";
+
 const SEAMONKEY = "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}",
       THUNDERBIRD = "{3550f703-e582-4d05-9a08-453d09bdfdc6}";
 
diff --git a/install.rdf b/install.rdf
index 8199e70..7bfad48 100644
--- a/install.rdf
+++ b/install.rdf
@@ -4,8 +4,9 @@
   <RDF:Description about="urn:mozilla:install-manifest">
     <id>savedpasswordeditor at daniel.dawson</id>
     <type>2</type>
+    <multiprocessCompatible>true</multiprocessCompatible>
     <name>Saved Password Editor</name>
-    <version>2.9.6</version>
+    <version>2.10</version>
     <description>Adds the ability to create and edit entries in the password manager.</description>
     <creator>Daniel Dawson <danielcdawson at gmail.com></creator>
     <contributor>PlastikManiac (key icon) - http://plastikmaniac.deviantart.com/</contributor>
@@ -18,34 +19,29 @@
     <targetApplication>
       <RDF:Description>
         <id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</id> <!-- Firefox -->
-        <minVersion>38.0</minVersion>
-        <maxVersion>47.0</maxVersion>
+        <minVersion>45.0</minVersion>
+        <maxVersion>51.0</maxVersion>
       </RDF:Description>
     </targetApplication>
 
     <targetApplication>
       <RDF:Description>
         <id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</id> <!-- SeaMonkey -->
-        <minVersion>2.30</minVersion>
-        <maxVersion>2.43</maxVersion>
+        <minVersion>2.39</minVersion>
+        <maxVersion>2.48</maxVersion>
       </RDF:Description>
     </targetApplication>
 
     <targetApplication>
       <RDF:Description>
         <id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</id> <!-- Thunderbird -->
-        <minVersion>38.0</minVersion>
-        <maxVersion>45.*</maxVersion>
+        <minVersion>45.0</minVersion>
+        <maxVersion>51.0</maxVersion>
       </RDF:Description>
     </targetApplication>
 
-    <targetApplication>
-      <RDF:Description>
-        <id>{a79fe89b-6662-4ff4-8e88-09950ad4dfde}</id> <!-- Conkeror -->
-        <minVersion>0.9</minVersion>
-        <maxVersion>1.0.*</maxVersion>
-      </RDF:Description>
-    </targetApplication>
+    <!-- Conkeror dropped for now, until I can get it working and figure out a
+	 solution. I don't even know whether it supports message managers. -->
 
     <localized>
       <RDF:Description>
@@ -126,6 +122,7 @@
         <creator>Daniel Dawson <danielcdawson at gmail.com></creator>
         <contributor>PlastikManiac (key icon)</contributor>
         <translator>Goofy</translator>
+	<translator>BlackJack "boblosthisphone"</translator>
         <description>Vous permet de créer et modifier vos identifiants dans le gestionnaire de mots de passe.</description>
       </RDF:Description>
     </localized>
diff --git a/locale/fr/browserOverlay.dtd b/locale/fr/browserOverlay.dtd
index 098f907..43cb2a7 100644
--- a/locale/fr/browserOverlay.dtd
+++ b/locale/fr/browserOverlay.dtd
@@ -1,13 +1,13 @@
 <!-- Open Saved Passwords -->
-<!ENTITY savedpasswords.label "Mots de passe enregistrés">
-<!ENTITY savedpasswords.accesskey "p">
-<!ENTITY savedpasswords.tooltip "Ouvre la fenêtre de dialogue des mots de passe enregistrés">
+<!ENTITY savedpasswords.label "Identifiants enregistrés">
+<!ENTITY savedpasswords.accesskey "I">
+<!ENTITY savedpasswords.tooltip "Ouvre la fenêtre des identifiants enregistrés">
 <!-- Context menu -->
 <!ENTITY ctx_savelogininfo.label "Enregistrer les informations de connexion">
 <!ENTITY ctx_savelogininfo.accesskey "E">
 <!ENTITY ctx_savelogininfo.tooltip "Ajoute un mot de passe enregistré à ce formulaire">
-<!ENTITY ctx_editlogininfo.label "Modifier les informations de connexion">
-<!ENTITY ctx_editlogininfo.accesskey "M">
+<!ENTITY ctx_editlogininfo.label "Éditer les informations de connexion">
+<!ENTITY ctx_editlogininfo.accesskey "D">
 <!ENTITY ctx_editlogininfo.tooltip "Modifie un mot de passe enregistré pour ce formulaire">
 <!ENTITY ctx_deletelogininfo.label "Supprimer les informations de connexion">
 <!ENTITY ctx_deletelogininfo.accesskey "S">
diff --git a/locale/fr/prefwindow.dtd b/locale/fr/prefwindow.dtd
index 6ef9509..49f87db 100644
--- a/locale/fr/prefwindow.dtd
+++ b/locale/fr/prefwindow.dtd
@@ -1,30 +1,30 @@
-<!ENTITY prefwindow.title "Préférences de l'extension Save Password Editor">
-<!ENTITY opensp_group.caption "Raccourci de l'extension Saved Passwords">
+<!ENTITY prefwindow.title "Paramètres de Save Password Editor">
+<!ENTITY opensp_group.caption "Raccourci du gestionnaire des identifiants">
 <!ENTITY displayMenuitem.label "Inclure le raccourci dans les menus">
-<!ENTITY displayMenuitem.tooltip "Ajoute « Mots de passe enregistrés » au menu Outils et au menu des applications Windows comme raccourci pour accéder au gestionnaire de mots de passe">
-<!ENTITY renameMenuitemTo.label "Renommer le raccourci en :">
-<!ENTITY renameMenuitemTo.tooltip "Saisissez ici un autre nom de raccourci que ;Saved Passwords" si vous voulez le rendre moins évident pour les intrus. Effacer cette valeur si vous voulez revenir à ;Saved Passwords". Attention : ceci n'assure nullement une sécurité particulière. vous devriez utiliser un mot de passe principal autant que possible si vous avez besoin de protéger vos mots de passe.">
+<!ENTITY displayMenuitem.tooltip "Ajoute « Identifiants enregistrés » au menu Outils et au menu Firefox de Windows/Linux en tant que raccourci pour accéder au gestionnaire des identifiants.">
+<!ENTITY renameMenuitemTo.label "Renommer le raccourci en :">
+<!ENTITY renameMenuitemTo.tooltip "Saisissez ici un autre nom de raccourci que « Identifiants enregistrés » si vous voulez le rendre moins évident pour les intrus. Effacez cette valeur pour revenir à « Identifiants enregistrés ». Attention : ceci n'assure nullement une sécurité particulière ; vous devriez utiliser un mot de passe principal autant que possible si vous avez besoin de protéger vos mots de passe.">
 <!ENTITY opensp_shortcut.label "Raccourci clavier">
-<!ENTITY opensp_shortcut.tooltip "Combinaison de touches pour ouvrir Saved Passwords">
+<!ENTITY opensp_shortcut.tooltip "Combinaison de touches pour ouvrir le gestionnaire des identifiants.">
 <!-- TRANSLATORS: "shift", "alt", "meta", and "control" must be copied exactly (excluding quotes). Please do not try to translate them. -->
-<!ENTITY opensp_shortcut_modifiers.tooltip "Les touches de sélection doivent être maintenues quand on enfonce la touche principale (liste d'éléments séparés par une virgule ou un espace pour : shift alt meta control). L'utilisation de "shift" doit être conforme à la configuration de votre clavier.">
-<!ENTITY opensp_shortcut_key.tooltip "La touche principale de la combinaison. Elle doit coïncider avec l'usage de "shift" dans les touches de sélection.">
+<!ENTITY opensp_shortcut_modifiers.tooltip "Les touches de sélection doivent être maintenues quand on appuye sur la touche principale (liste d'éléments séparés par une virgule ou un espace pour : shift alt meta control). L'utilisation de « shift » doit être conforme à la configuration de votre clavier.">
+<!ENTITY opensp_shortcut_key.tooltip "La touche principale de la combinaison. Elle doit coïncider avec l'usage de « shift » dans les touches de sélection.">
 <!ENTITY captureshortcut.label "Capture">
-<!ENTITY captureshortcut.tooltip "Cliquez pour capturer une combinaison de touches de votre clavier">
-<!ENTITY entershortcut.label "Veuillez appuyer sur la combinaison de touches maintenant.">
+<!ENTITY captureshortcut.tooltip "Cliquez pour capturer une combinaison de touches de votre clavier.">
+<!ENTITY entershortcut.label "Veuillez appuyer maintenant sur la combinaison de touches.">
 <!ENTITY webpages.caption "Pages web">
-<!ENTITY promptforctxmenudelete.label "Demander avant de supprimer les informations d'identifiants du menu contextuel (clic droit sur la page web)">
-<!ENTITY modstosavedpasswords.caption "Modifications de la fenêtre de Saved Passwords">
-<!ENTITY preselectCurrentSite.label "Présélectionnez le site courant dans Saved Passwords">
-<!ENTITY preselectCurrentSite.tooltip "À l'ouverture de Saved Passwords, cela sélectionnera et atteindra immédiatement le site visité dans l'onglet courant du navigateur.">
+<!ENTITY promptforctxmenudelete.label "Demander confirmation avant de supprimer les informations d'identification depuis le menu contextuel (clic droit sur la page web)">
+<!ENTITY modstosavedpasswords.caption "Modifications de la fenêtre du gestionnaire des identifiants">
+<!ENTITY preselectCurrentSite.label "Présélectionner le site actuel dans le gestionnaire des identifiants">
+<!ENTITY preselectCurrentSite.tooltip "À l'ouverture du gestionnaire des identifiants, cela sélectionnera et fera défiler immédiatement vers le site visité dans l'onglet actuel du navigateur.">
 <!ENTITY alwaysShowPasswords.label "Toujours afficher les mots de passe">
-<!ENTITY alwaysShowPasswords.tooltip "Si la case est cochée, Saved Password Editor affichera la colonne des mots de passe à l'ouverture de la fenêtre de l'extension, et le mot de passe sera affiché quand la fenêtre d'édition sera ouverte.">
+<!ENTITY alwaysShowPasswords.tooltip "Si la case est cochée, Saved Password Editor affichera le mot de passe à l'ouverture de l'éditeur.">
 <!ENTITY alwaysPromptForMasterPassword.label "Toujours demander le mot de passe principal">
-<!ENTITY alwaysPromptForMasterPassword.tooltip "Demande le mot de passe principal quand les mots de passe enregistrés sont affichés. Si cette fonction est activée, vous serez sollicité au moins deux fois par session par cette demande. Si elle est désactivée, dans la plupart des cas on ne vous demandera pas le mot de passe principal.">
+<!ENTITY alwaysPromptForMasterPassword.tooltip "Demande le mot de passe principal avant d'afficher les mots de passe enregistrés dans le gestionnaire des identifiants. Si cette fonction est activée, vous serez sollicité au moins deux fois par session. Si elle est désactivée, dans la plupart des cas on ne vous demandera pas le mot de passe principal.">
 <!ENTITY passwordfield_caption.label "Champ de mot de passe dans la fenêtre de l'éditeur">
-<!ENTITY passwordfield_alwayshide.label "Toujours masquer le mot de passe à l'ouverture de la fenêtre de l'éditeur">
-<!ENTITY passwordfield_alwaysshow.label "Toujours afficher le mot de passe à l'ouverture de la fenêtre de l'éditeur">
-<!ENTITY passwordfield_rememberlast.label "Se souvenir du dernier état choisi">
-<!ENTITY passwordfield_rememberlast.tooltip "Masquer/afficher exactement comme lors de la précédente fenêtre ouverte">
-<!ENTITY passwordfield_followspwin.label "Suivre la liste de mots de passe enregistrés">
-<!ENTITY passwordfield_followspwin.tooltip "Afficher seulement si les mots de passe sont affichés en ce moment dans la fenêtre des mots de passe enregistrés.">
+<!ENTITY passwordfield_alwayshide.label "Toujours masquer le mot de passe lors de l'ouverture de la fenêtre de l'éditeur">
+<!ENTITY passwordfield_alwaysshow.label "Toujours afficher le mot de passe lors de l'ouverture de la fenêtre de l'éditeur">
+<!ENTITY passwordfield_rememberlast.label "Se souvenir du dernier état">
+<!ENTITY passwordfield_rememberlast.tooltip "Masque ou affiche le mot de passe exactement comme lors de la dernière fois où la fenêtre était ouverte.">
+<!ENTITY passwordfield_followspwin.label "Suivre la liste des identifiants enregistrés">
+<!ENTITY passwordfield_followspwin.tooltip "Affiche si (et seulement si) les mots de passe sont actuellement affichés dans la fenêtre du gestionnaire des identifiants.">
diff --git a/locale/fr/pwdedit.dtd b/locale/fr/pwdedit.dtd
index 40e8ede..6108cb5 100644
--- a/locale/fr/pwdedit.dtd
+++ b/locale/fr/pwdedit.dtd
@@ -1,36 +1,36 @@
 <!ENTITY savedpasswordeditor.title "Saved Password Editor">
 <!ENTITY signontype.label "Type">
-<!ENTITY type_form.label "Formulaire Web">
+<!ENTITY type_form.label "Formulaire web">
 <!ENTITY type_form.accesskey "W">
 <!ENTITY type_form.tooltip "Un formulaire inclus dans une page web">
 <!ENTITY type_annotated.label "Annoté">
 <!ENTITY type_annotated.accesskey "A">
-<!ENTITY type_annotated.tooltip "Un identifiant qui nécessite une chaîne ajoutée au nom d'hôte pour s'identifier (ex. authentification HTTP)">
+<!ENTITY type_annotated.tooltip "Une connexion qui nécessite une chaîne en plus du nom d'hôte pour identifier le service (authentification HTTP, par exemple)">
 <!ENTITY hostname.label "Hôte">
-<!ENTITY hostname.tooltip "Protocole/nom d'hôte auquel correspond le mot de passe (e.g. http://www.exemple.com)">
-<!ENTITY formSubmitURL.label "Soumettre un préfixe">
-<!ENTITY formSubmitURL.tooltip "Préfixe de l'adresse pour soumettre un formulaire">
+<!ENTITY hostname.tooltip "Protocole/nom d'hôte auquel correspond le mot de passe (http://www.exemple.fr par exemple)">
+<!ENTITY formSubmitURL.label "Préfixe de soumission">
+<!ENTITY formSubmitURL.tooltip "Préfixe de l'adresse de soumission du formulaire">
 <!ENTITY annotation.label "Annotation">
-<!ENTITY annotation.tooltip "Une chaîne supplémentaire pour identifier le service d'authentification de (ex. HTTP)">
+<!ENTITY annotation.tooltip "Chaîne supplémentaire identifiant le service auprès duquel s'identifier (HTTP realm, par exemple)">
 <!ENTITY username.label "Nom d'utilisateur">
-<!ENTITY username.tooltip "Nom d'utilisateur à retenir">
+<!ENTITY username.tooltip "Le nom d'utilisateur à retenir">
 <!ENTITY password.label "Mot de passe">
-<!ENTITY password.tooltip "Mot de passe à retenir">
+<!ENTITY password.tooltip "Le mot de passe à retenir">
 <!ENTITY usernameField.label "Champ du nom d'utilisateur">
-<!ENTITY usernameField.tooltip "L'attribut du nom pour le champ de saisie du nom d'utilisateur">
+<!ENTITY usernameField.tooltip "L'attribut du nom pour le champ du nom d'utilisateur approprié du formulaire">
 <!ENTITY passwordField.label "Nom du champ de mot de passe">
-<!ENTITY passwordField.tooltip "L'attribut du nom pour le champ de saisie du mot de passe">
+<!ENTITY passwordField.tooltip "L'attribut du nom pour le champ de mot de passe approprié du formulaire">
 <!ENTITY showPassword.label "Afficher">
 <!ENTITY showPassword.accesskey "A">
 <!ENTITY showPassword.tooltip "Afficher/masquer le mot de passe">
 <!ENTITY hidePassword.label "Masquer">
 <!ENTITY hidePassword.accesskey "M">
-<!ENTITY guessfrompage.label "Essai pour la page courante">
-<!ENTITY guessfrompage.accesskey "E">
-<!ENTITY guessfrompage.tooltip "Remplit ce champ en essayant l'identifiant probable de la page courante">
+<!ENTITY guessfrompage.label "Deviner depuis la page actuelle">
+<!ENTITY guessfrompage.accesskey "D">
+<!ENTITY guessfrompage.tooltip "Remplit ce champ en essayant le formulaire de connexion probable de la page actuelle">
 <!ENTITY prevform.label "Formulaire précédent">
-<!ENTITY prevform.accesskey "p">
-<!ENTITY prevform.tooltip "Essayer le formulaire précédent de la page">
+<!ENTITY prevform.accesskey "P">
+<!ENTITY prevform.tooltip "Essaye le formulaire précédent de la page">
 <!ENTITY nextform.label "Formulaire suivant">
 <!ENTITY nextform.accesskey "S">
-<!ENTITY nextform.tooltip "Essayer le formulaire suivant de la page">
+<!ENTITY nextform.tooltip "Essaye le formulaire suivant de la page">
diff --git a/locale/fr/pwdedit.properties b/locale/fr/pwdedit.properties
index 83d9e6f..a7addbf 100644
--- a/locale/fr/pwdedit.properties
+++ b/locale/fr/pwdedit.properties
@@ -1,11 +1,11 @@
 # TRANSLATORS: \n stands for a line break, and %S is a placeholder
 # for a string to be inserted.
 # SAVED PASSWORD EDITOR DIALOG
-newlogin=Création d'un identifiant
-clonelogin=Reproduction d'un identifiant
+newlogin=Création d'un nouvel identifiant
+clonelogin=Duplication d'un identifiant
 editlogin=Modification d'un identifiant
 editmultlogin=Modification de plusieurs identifiants
-nologinform=Aucun identifiant d'accès valide au formulaire trouvé dans cette page !
-emptyhost=le champ d'hôte ne peut être vide. Veuillez corriger et essayer à nouveau.
-emptysecondary=Le préfixe de soumission du champ d'annotation (selon le type sélectionné) ne peut être vide. Veuillez corriger et essayer à nouveau.
-multduplogins=Cela pourrait provoquer des doublons d'identifiants. Pour achever vos modifications, vous devez laisser au moins un nom d'hôte, fournir un préfixe, un domaine HTTP, une annotation ou des champs utilisateurs (si possible) dans un état indéterminé, en effaçant les valeurs que vous avez entrées.
+nologinform=Aucun formulaire d'identification valide trouvé sur cette page !
+emptyhost=Le champ d'hôte ne doit pas être vide. Veuillez corriger ceci et essayer à nouveau.
+emptysecondary=Le préfixe de soumission ou le champ d'annotation (selon le type sélectionné) ne peut être vide. Veuillez corriger ceci et essayer à nouveau.
+multduplogins=Cela pourrait provoquer des doublons d'identifiants. Pour achever vos modifications, vous devez laisser au moins un nom d'hôte, un préfixe de soumission, une annotation, ou des champs de nom d'utilisateur (selon le cas) dans un état indéterminé, en effaçant les valeurs que vous avez entrées.
diff --git a/locale/fr/pwdmgrOverlay.dtd b/locale/fr/pwdmgrOverlay.dtd
index 81ac1a4..3af924f 100644
--- a/locale/fr/pwdmgrOverlay.dtd
+++ b/locale/fr/pwdmgrOverlay.dtd
@@ -5,9 +5,9 @@
 -->
 <!ENTITY newentry.label "Nouveau">
 <!ENTITY newentry.accesskey "N">
-<!ENTITY editentry.label "Modifier">
-<!ENTITY editentry.accesskey "M">
-<!ENTITY cloneentry.label "Cloner">
-<!ENTITY cloneentry.accesskey "o">
+<!ENTITY editentry.label "Éditer">
+<!ENTITY editentry.accesskey "T">
+<!ENTITY cloneentry.label "Dupliquer">
+<!ENTITY cloneentry.accesskey "D">
 <!ENTITY visitsite.label "Visiter le ou les sites">
 <!ENTITY visitsite.accesskey "V">
diff --git a/locale/fr/pwdmgrOverlay.properties b/locale/fr/pwdmgrOverlay.properties
index 192079e..1a71838 100644
--- a/locale/fr/pwdmgrOverlay.properties
+++ b/locale/fr/pwdmgrOverlay.properties
@@ -1,6 +1,6 @@
 # TRANSLATORS: \n stands for a line break, and %S is a placeholder
 # for a string to be inserted.
 # POPUP MESSAGE WHEN ADDING/MODIFYING AN ENTRY FAILS
-badnewentry=Une erreur s'est produite :\n  %S\nAvez-vous essayé de créer un identifiant en doublon ?
-badurl=L'identifiant sélectionné n'a pas d'adresse valide. Aucun onglet ne s'est ouvert.
-badmulturl=Un ou plusieurs identifiants ont des adresses invalides. Aucun onglet n'a été ouvert avec ces identifiants.
+badnewentry=Une erreur s'est produite :\n  %S\nAvez-vous essayé de créer un identifiant en double ?
+badurl=L'identifiant sélectionné possède une URL invalide. Aucun onglet n'a été ouvert.
+badmulturl=Un ou plusieurs identifiants sélectionnés ont des URL invalides. Aucun onglet n'a été ouvert pour ces identifiants.
diff --git a/locale/fr/spe.properties b/locale/fr/spe.properties
index a554840..5fc491f 100644
--- a/locale/fr/spe.properties
+++ b/locale/fr/spe.properties
@@ -2,12 +2,12 @@
 # for a string to be inserted.
 savedpasswordeditor=Saved Password Editor
 error=Erreur
-nologinstoedit=Pas d'identifiants à modifier !
-nologinstodelete=Pas d'identifiants à supprimer !
+nologinstoedit=Aucun identifiant à modifier !
+nologinstodelete=Aucun identifiant à supprimer !
 logininfosaved=Informations de connexion enregistrées
 logininfochanged=Informations de connexion modifiées
 logininfodeleted=Informations de connexion supprimées
-failed=Échec de l'opération :\n %S
+failed=Échec de l'opération :\n %S
 deletinglogininfo=Suppression des informations de connexion
-deletingareyousure=Voulez-vous vraiment supprimer les informations de connexion ? Vous ne pourrez pas les retrouver.
-deletingdontask=Ne plus demander (vous pouvez restaurer cette demande de confirmation dans les options de l'extension)
+deletingareyousure=Voulez-vous vraiment supprimer ces informations de connexion ? Ceci ne pourra être annulé.
+deletingdontask=Ne plus demander (vous pouvez restaurer cette demande de confirmation dans les options du module)
diff --git a/locale/fr/welcome.dtd b/locale/fr/welcome.dtd
index fa4f317..44b3f67 100644
--- a/locale/fr/welcome.dtd
+++ b/locale/fr/welcome.dtd
@@ -9,7 +9,7 @@
      en-US  - English in US
      en-GB  - English in Great Britain
      de-DE  - German in Germany
-     ru     - Russian (no specific country)
+     ru     - Russian (no specific country)     
 
 -->
 <!ENTITY locale "fr">
@@ -33,18 +33,18 @@
      strings are already double-quote delimited.
 
 -->
-<!ENTITY welcometospe "Bienvenue dans l'extension Saved Password Editor">
+<!ENTITY welcometospe "Bienvenue dans Saved Password Editor">
 <!-- Paragraph 1, Firefox version -->
-<!ENTITY welcomepara1_fx "Merci d'utiliser <a id='addonlink'>Saved Password Editor</a>. Vous pouvez accéder à ses fonctionnalités en allant à Outils > Options, ou Édition > Préférences (selon votre système d'exploitation), puis le panneau "Sécurité", puis en cliquant sur le bouton "Mots de passe enregistrés…". Vous pouvez aussi simplement accéder à l'extension Save Passwords depuis le menu Outils ou encore (avec Firefox 4 sous Windows) par le menu des applicatio [...]
+<!ENTITY welcomepara1_fx "Merci d'utiliser <a id='addonlink'>Saved Password Editor</a>. Vous pouvez accéder à ses fonctionnalités d'édition en allant à Outils > Options, ou Édition > Préférences (selon votre système d'exploitation), en sélectionnant le panneau « Sécurité », puis en cliquant sur le bouton « Identifiants enregistrés… ». Vous pouvez aussi simplement accéder au gestionnaire des identifiants depuis le menu Outils ou (avec Firefox 4 ou supérieur sous Windows et Linux) le [...]
 <!-- Paragraph 1, SeaMonkey version -->
 <!-- XXXXX TRANSLATORS: Please pay attention! XXXXX
      XXXXX SeaMonkey DOES NOT HAVE View > Toolbars > Customize…
            among other things XXXXX
      XXXXX Be careful if you copy and paste. XXXXX 
 -->
-<!ENTITY welcomepara1_sm "Merci d'utiliser l'extension <a id='addonlink'>Saved Password Editor</a>. Vous pouvez accéder à ses fonctionnalités en allant à Outils > Options, ou Édition > Préférences (selon votre système d'exploitation), puis naviguez jusqu'au panneau "Mots de passe" dans la catégorie "Confidentialité et sécurité", puis cliquez sur le bouton "Mots de passe enregistrés…". Vous pouvez aussi simplement accéder à l'extension Save Passwords de [...]
+<!ENTITY welcomepara1_sm "Merci d'utiliser <a id='addonlink'>Saved Password Editor</a>. Vous pouvez accéder à ses fonctionnalités d'édition en allant à Outils > Options, ou Édition > Préférences (selon votre système d'exploitation), en naviguant jusqu'au panneau « Mots de passe » dans la catégorie « Confidentialité et sécurité », puis en cliquant sur le bouton « Mots de passe enregistrés… ». Vous pouvez aussi simplement accéder au gestionnaire des identifiants depuis le menu Outils [...]
 <!-- Paragraph 2 -->
 <!-- The "span" element here is replaced by "Firefox", "Thunderbird", etc. -->
-<!ENTITY welcomepara2 "Notez que le dialogue des mots de passe enregistrés est un composant de base de <span id='appname'></span>, et qu'il n'est pas fourni avec l'extension, sauf les deux boutons ajoutés. Le bouton de la barre d'outils n'est fourni que pour votre confort, dans l'espoir que certains utilisateurs de cette extension voudront accéder au dialogue beaucoup plus souvent qu'avec une autre solution.">
+<!ENTITY welcomepara2 "Notez que la fenêtre du gestionnaire des identifiants est un composant de base de <span id='appname'/>, et qu'il n'est pas fourni par ce module, en dehors des susmentionnées fonctionnalités ajoutées. Le bouton de barre d'outils est uniquement fourni pour votre confort, dans l'idée que certains utilisateurs de ce module voudront accéder au gestioçnnaire des identifiants beaucoup plus souvent qu'ils ne l'auraient fait autrement.">
 <!-- Paragraph 3 -->
-<!ENTITY welcomepara3 "Vous pouvez également gérer les informations de connexion associées à un formulaire particulier en cliquant droit sur un champ quelconque et en choisissant une action.">
+<!ENTITY welcomepara3 "Vous pouvez également gérer les informations de connexion associées à un formulaire web en particulier, en effectuant un clic droit sur n'importe lequel de ses champs puis en choisissant une action.">
diff --git a/locale/hu/prefwindow.dtd b/locale/hu/prefwindow.dtd
index 513fa87..3f4f2b3 100644
--- a/locale/hu/prefwindow.dtd
+++ b/locale/hu/prefwindow.dtd
@@ -12,8 +12,8 @@
 <!ENTITY captureshortcut.label "Felvétel">
 <!ENTITY captureshortcut.tooltip "Kattintson a billentyűkombináció felvételéhez a billentyűzetről">
 <!ENTITY entershortcut.label "Kérem nyomja le a választott billentyűkombinációt most.">
-<!ENTITY webpages.caption "Web pages">
-<!ENTITY promptforctxmenudelete.label "Prompt when deleting login info from context menu (right-click on web page)">
+<!ENTITY webpages.caption "Weboldalak">
+<!ENTITY promptforctxmenudelete.label "Rákérdezés bejelentkezési infó törlésekor a helyi menüből (jobb-kattintás a weboldalon)">
 <!ENTITY modstosavedpasswords.caption "Változások a mentett jelszavak ablakhoz">
 <!ENTITY preselectCurrentSite.label "Jelenlegi webcím auto-kijelölése">
 <!ENTITY preselectCurrentSite.tooltip "Automatikus váltás a mentett jelszavakban a jelenlegi megnyitott lap webcímére.">
diff --git a/locale/hu/spe.properties b/locale/hu/spe.properties
index 8a89a65..5bba730 100644
--- a/locale/hu/spe.properties
+++ b/locale/hu/spe.properties
@@ -8,6 +8,6 @@ logininfosaved=Bejelentkezési adat elmentve
 logininfochanged=Bejelentkezési adat módosítva
 logininfodeleted=Bejelentkezési adat törölve
 failed=A művelet nem sikerült:\n  %S
-deletinglogininfo=Deleting login info
-deletingareyousure=Are you sure you want to delete this login info? This cannot be undone.
-deletingdontask=Don't ask again (you can restore this prompt in the add-on options)
+deletinglogininfo=Bejelentkezési infó törlése
+deletingareyousure=Valóban szeretné kitörölni ezt a bejelentkezési infót? Nem lehet visszaállítani.
+deletingdontask=Ne kérdezze újra (visszaállítható a kiterjesztés beállításaiban)
diff --git a/locale/id-ID/prefwindow.dtd b/locale/id-ID/prefwindow.dtd
index 6152108..4ead9e0 100644
--- a/locale/id-ID/prefwindow.dtd
+++ b/locale/id-ID/prefwindow.dtd
@@ -1,20 +1,20 @@
 <!ENTITY prefwindow.title "Preferensi Editor Simpanan Kata Sandi">
-<!ENTITY opensp_group.caption "Saved Passwords shortcut">
+<!ENTITY opensp_group.caption "Jalan pintas kata sandi yang tersimpan">
 <!ENTITY displayMenuitem.label "Masukkan jalan pintas di menu">
 <!ENTITY displayMenuitem.tooltip "Tambahkan "Simpanan Kata Sandi" ke menu Peralatan dan menu aplikasi Windows sebagai jalan pintas ke pengatur kata sandi">
 <!ENTITY renameMenuitemTo.label "Ubah nama jalan pintas ke:">
 <!ENTITY renameMenuitemTo.tooltip "Ketikkan sesuatu di sini untuk memanggil jalan pintas, sesuatu yang lain daripada "Saved Passwords", jika Anda ingin membuatnya tidak lebih terlihat oleh orang lain. Hapus nilai untuk kembali untuk menggunakan "Saved Passwords". Peringatan: ini bukanlah pengganti untuk keamananan yang baik; Anda harus menggunakan kata sandi utama sebisa mungkin untuk melindungi kata sandi Anda.">
-<!ENTITY opensp_shortcut.label "Keyboard shortcut">
-<!ENTITY opensp_shortcut.tooltip "Key combination to press to open Saved Passwords">
+<!ENTITY opensp_shortcut.label "Jalanpintas keyboard">
+<!ENTITY opensp_shortcut.tooltip "tekan kunci kombinasu untuk membuka kata sandi yang tersimpan">
 <!-- TRANSLATORS: "shift", "alt", "meta", and "control" must be copied exactly (excluding quotes). Please do not try to translate them. -->
 <!ENTITY opensp_shortcut_modifiers.tooltip "Key modifiers that must be held when pressing the main key (comma- or space-separated list from the following: shift alt meta control). The use of "shift" must match the requirements of your keyboard.">
-<!ENTITY opensp_shortcut_key.tooltip "The main key of the combination. Must match the use of "shift" in the modifiers.">
-<!ENTITY captureshortcut.label "Capture">
-<!ENTITY captureshortcut.tooltip "Click to capture a key combination from your keyboard">
-<!ENTITY entershortcut.label "Please press your desired key combination now.">
-<!ENTITY webpages.caption "Web pages">
+<!ENTITY opensp_shortcut_key.tooltip "Kunci kombinasi yang utama.Harus sama dengan yang digunakan oleh "shift" di pengubahan.">
+<!ENTITY captureshortcut.label "Tangkap">
+<!ENTITY captureshortcut.tooltip "Klik untuk tangkap sebuah kunci kombinasi dari keyboard anda">
+<!ENTITY entershortcut.label "Tolong tekan kombinasu kunci yang anda ingin kan sekarang">
+<!ENTITY webpages.caption "Halaman Website">
 <!ENTITY promptforctxmenudelete.label "Prompt when deleting login info from context menu (right-click on web page)">
-<!ENTITY modstosavedpasswords.caption "Modifications to Saved Passwords window">
+<!ENTITY modstosavedpasswords.caption "Modifikasi ke jendela password yang tersimpan">
 <!ENTITY preselectCurrentSite.label "Pilih situs ini di Simpanan Kata Sandi">
 <!ENTITY preselectCurrentSite.tooltip "Ketika membuka Simpanan Kata Sandi, situs yang dikunjungi akan langsung dipilih di tab browser.">
 <!ENTITY alwaysShowPasswords.label "Selalu tampilkan kata sandi">
diff --git a/locale/id-ID/pwdmgrOverlay.dtd b/locale/id-ID/pwdmgrOverlay.dtd
index 14d6533..5bd8fdd 100644
--- a/locale/id-ID/pwdmgrOverlay.dtd
+++ b/locale/id-ID/pwdmgrOverlay.dtd
@@ -9,5 +9,5 @@
 <!ENTITY editentry.accesskey "E">
 <!ENTITY cloneentry.label "Klon">
 <!ENTITY cloneentry.accesskey "K">
-<!ENTITY visitsite.label "Visit site(s)">
+<!ENTITY visitsite.label "Kunjungi situs">
 <!ENTITY visitsite.accesskey "V">
diff --git a/locale/id-ID/pwdmgrOverlay.properties b/locale/id-ID/pwdmgrOverlay.properties
index 6f32e2b..4a5cdea 100644
--- a/locale/id-ID/pwdmgrOverlay.properties
+++ b/locale/id-ID/pwdmgrOverlay.properties
@@ -2,5 +2,5 @@
 # for a string to be inserted.
 # POPUP MESSAGE WHEN ADDING/MODIFYING AN ENTRY FAILS
 badnewentry=Mendapat kesalahan:\n  %S\nApakah Anda mencoba untuk membuat duplikat entri login?
-badurl=The selected login has an invalid URL. No tab was opened.
-badmulturl=One or more selected logins have invalid URLs. No tabs were opened for those logins.
+badurl=Login yang terpilih memiliki alamat yang salah. Tidak ada tab yang terbuka
+badmulturl=Satu atau lebih login yang dipilih memiliki alamat yang salah. Tidak ada tab yang terbuka
diff --git a/locale/id-ID/spe.properties b/locale/id-ID/spe.properties
index 705eb80..6cb8abb 100644
--- a/locale/id-ID/spe.properties
+++ b/locale/id-ID/spe.properties
@@ -8,6 +8,6 @@ logininfosaved=Info login disimpan
 logininfochanged=Info login berubah
 logininfodeleted=Info login dihapus
 failed=Operasi gagal:\n  %S
-deletinglogininfo=Deleting login info
-deletingareyousure=Are you sure you want to delete this login info? This cannot be undone.
-deletingdontask=Don't ask again (you can restore this prompt in the add-on options)
+deletinglogininfo=Sedang meghapus informasi login
+deletingareyousure=Apakah anda yakin kamu ingin menghapus informasi login ini? Ini tidak bisa dikembalikan
+deletingdontask=Jangan bertanya lagi (anda bisa mengembalikan perubahan ini di add-on options

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/mozilla-password-editor.git



More information about the Pkg-mozext-commits mailing list