Bug 1268159 - Use GreD in addition to XCurProcD for browser_misused_characters_in_strings.js to cover more string files. r=gijs
authorJared Wein <jwein@mozilla.com>
Fri, 29 Apr 2016 09:28:48 -0400
changeset 295495 0af3c129a3665692271cda977178286d5937e326
parent 295494 3b652d51edf728e672db99d59525f15fc93c4dc4
child 295496 cc898e5dfa22a5263e34488baccd32c2ca275f30
push id30225
push usercbook@mozilla.com
push dateMon, 02 May 2016 09:22:51 +0000
treeherdermozilla-central@9c01418829e4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgijs
bugs1268159
milestone49.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1268159 - Use GreD in addition to XCurProcD for browser_misused_characters_in_strings.js to cover more string files. r=gijs MozReview-Commit-ID: IlC170W0nlG * * * [mq]: temp MozReview-Commit-ID: GF0k4zvONPD
browser/base/content/test/general/browser_aboutCertError.js
browser/base/content/test/general/browser_misused_characters_in_strings.js
devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js
devtools/client/webconsole/test/browser_console_error_source_click.js
devtools/client/webconsole/test/browser_webconsole_allow_mixedcontent_securityerrors.js
devtools/client/webconsole/test/browser_webconsole_block_mixedcontent_securityerrors.js
devtools/client/webconsole/test/browser_webconsole_bug_1010953_cspro.js
devtools/client/webconsole/test/browser_webconsole_bug_611795.js
devtools/client/webconsole/test/browser_webconsole_bug_644419_log_limits.js
devtools/client/webconsole/test/browser_webconsole_bug_770099_violation.js
devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js
devtools/client/webconsole/test/browser_webconsole_bug_837351_securityerrors.js
devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
devtools/client/webconsole/test/browser_webconsole_hsts_invalid-headers.js
devtools/client/webconsole/test/browser_webconsole_trackingprotection_errors.js
devtools/client/webconsole/test/test_bug1045902_console_csp_ignore_reflected_xss_message.html
dom/locales/en-US/chrome/dom/dom.properties
dom/locales/en-US/chrome/layout/css.properties
dom/locales/en-US/chrome/layout/layout_errors.properties
dom/locales/en-US/chrome/layout/printing.properties
dom/locales/en-US/chrome/layout/xbl.properties
dom/locales/en-US/chrome/layout/xul.properties
dom/locales/en-US/chrome/mathml/mathml.properties
dom/locales/en-US/chrome/netError.dtd
dom/locales/en-US/chrome/nsWebBrowserPersist.properties
dom/locales/en-US/chrome/security/caps.properties
dom/locales/en-US/chrome/security/csp.properties
dom/locales/en-US/chrome/security/security.properties
dom/locales/en-US/chrome/xslt/xslt.properties
dom/manifest/test/test_ManifestProcessor_warnings.html
layout/style/test/test_bug413958.html
layout/style/test/test_parser_diagnostics_unprintables.html
netwerk/locales/en-US/necko.properties
security/manager/locales/en-US/chrome/pipnss/nsserrors.properties
security/manager/locales/en-US/chrome/pipnss/pipnss.properties
security/manager/locales/en-US/chrome/pippki/pippki.properties
services/sync/locales/en-US/errors.properties
services/sync/locales/en-US/sync.properties
toolkit/components/prompts/test/test_modal_prompts.html
toolkit/locales/en-US/chrome/global/aboutProfiles.properties
toolkit/locales/en-US/chrome/global/aboutSupport.dtd
toolkit/locales/en-US/chrome/global/commonDialogs.properties
toolkit/locales/en-US/chrome/global/console.properties
toolkit/locales/en-US/chrome/global/customizeToolbar.properties
toolkit/locales/en-US/chrome/global/extensions.properties
toolkit/locales/en-US/chrome/global/filepicker.properties
toolkit/locales/en-US/chrome/global/printdialog.properties
toolkit/locales/en-US/chrome/global/resetProfile.properties
toolkit/locales/en-US/chrome/global/videocontrols.dtd
toolkit/locales/en-US/chrome/mozapps/downloads/downloads.properties
toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
toolkit/locales/en-US/chrome/mozapps/extensions/update.dtd
toolkit/locales/en-US/chrome/mozapps/extensions/update.properties
toolkit/locales/en-US/chrome/mozapps/handling/handling.properties
toolkit/locales/en-US/chrome/mozapps/profile/createProfileWizard.dtd
toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
toolkit/locales/en-US/chrome/mozapps/update/updates.dtd
toolkit/locales/en-US/chrome/mozapps/update/updates.properties
toolkit/locales/en-US/chrome/passwordmgr/passwordmgr.properties
toolkit/locales/en-US/chrome/pluginproblem/pluginproblem.dtd
toolkit/locales/en-US/chrome/search/search.properties
--- a/browser/base/content/test/general/browser_aboutCertError.js
+++ b/browser/base/content/test/general/browser_aboutCertError.js
@@ -319,17 +319,17 @@ add_task(function* checkAdvancedDetailsF
     return {
       divDisplay: content.getComputedStyle(div).display,
       text: text.textContent,
       securityInfoAsString: serializedSecurityInfo
     };
   });
   isnot(message.divDisplay, "none", "Debug information is visible");
   ok(message.text.includes(badStsUri.spec), "Correct URL found");
-  ok(message.text.includes("requested domain name does not match the server's certificate"),
+  ok(message.text.includes("requested domain name does not match the server\u2019s certificate"),
      "Correct error message found");
   ok(message.text.includes("HTTP Strict Transport Security: false"),
      "Correct HSTS value found");
   ok(message.text.includes("HTTP Public Key Pinning: true"),
      "Correct HPKP value found");
   let certChain = getCertChain(message.securityInfoAsString);
   ok(message.text.includes(certChain), "Found certificate chain");
 
--- a/browser/base/content/test/general/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/general/browser_misused_characters_in_strings.js
@@ -1,168 +1,240 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/* This list allows pre-existing or 'unfixable' issues to remain, while we
- * detect newly occurring issues in shipping files. It is a list of objects
- * specifying conditions under which an error should be ignored.
- *
- * As each issue is found in the whitelist, it is removed from the list. At
- * the end of the test, there is an assertion that all items have been
- * removed from the whitelist, thus ensuring there are no stale entries. */
-let gWhitelist = [{
-    file: "search.properties",
-    key: "searchForSomethingWith",
-    type: "single-quote"
-  }, {
-    file: "browser.dtd",
-    key: "social.activated.description",
-    type: "single-quote"
-  }, {
-    file: "netError.dtd",
-    key: "certerror.introPara",
-    type: "single-quote"
-  }, {
-    file: "netError.dtd",
-    key: "weakCryptoAdvanced.longDesc",
-    type: "single-quote"
-  }, {
-    file: "netError.dtd",
-    key: "weakCryptoAdvanced.override",
-    type: "single-quote"
-  }, {
-    file: "netError.dtd",
-    key: "inadequateSecurityError.longDesc",
-    type: "single-quote"
-  }, {
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* This list allows pre-existing or 'unfixable' issues to remain, while we
+ * detect newly occurring issues in shipping files. It is a list of objects
+ * specifying conditions under which an error should be ignored.
+ *
+ * As each issue is found in the whitelist, it is removed from the list. At
+ * the end of the test, there is an assertion that all items have been
+ * removed from the whitelist, thus ensuring there are no stale entries. */
+let gWhitelist = [{
+    file: "search.properties",
+    key: "searchForSomethingWith",
+    type: "single-quote"
+  }, {
+    file: "browser.dtd",
+    key: "social.activated.description",
+    type: "single-quote"
+  }, {
+    file: "netError.dtd",
+    key: "certerror.introPara",
+    type: "single-quote"
+  }, {
+    file: "netError.dtd",
+    key: "weakCryptoAdvanced.longDesc",
+    type: "single-quote"
+  }, {
+    file: "netError.dtd",
+    key: "weakCryptoAdvanced.override",
+    type: "single-quote"
+  }, {
+    file: "netError.dtd",
+    key: "inadequateSecurityError.longDesc",
+    type: "single-quote"
+  }, {
     file: "netError.dtd",
     key: "certerror.wrongSystemTime",
     type: "single-quote"
   }, {
-    file: "phishing-afterload-warning-message.dtd",
-    key: "safeb.blocked.malwarePage.shortDesc",
-    type: "single-quote"
-  }, {
-    file: "phishing-afterload-warning-message.dtd",
-    key: "safeb.blocked.unwantedPage.shortDesc",
-    type: "single-quote"
-  }, {
-    file: "phishing-afterload-warning-message.dtd",
-    key: "safeb.blocked.phishingPage.shortDesc2",
-    type: "single-quote"
-  }, {
-    file: "phishing-afterload-warning-message.dtd",
-    key: "safeb.blocked.forbiddenPage.shortDesc2",
-    type: "single-quote"
-  }
-];
-
-var moduleLocation = gTestPath.replace(/\/[^\/]*$/i, "/parsingTestHelpers.jsm");
-var {generateURIsFromDirTree} = Cu.import(moduleLocation, {});
-
-/**
- * Check if an error should be ignored due to matching one of the whitelist
- * objects defined in gWhitelist.
- *
- * @param filepath The URI spec of the locale file
- * @param key The key of the entity that is being checked
- * @param type The type of error that has been found
- * @return true if the error should be ignored, false otherwise.
- */
-function ignoredError(filepath, key, type) {
-  for (let index in gWhitelist) {
-    let whitelistItem = gWhitelist[index];
-    if (filepath.endsWith(whitelistItem.file) &&
-        key == whitelistItem.key &&
-        type == whitelistItem.type) {
-      gWhitelist.splice(index, 1);
-      return true;
-    }
-  }
-  return false;
-}
-
-function fetchFile(uri) {
-  return new Promise((resolve, reject) => {
-    let xhr = new XMLHttpRequest();
-    xhr.open("GET", uri, true);
-    xhr.onreadystatechange = function() {
-      if (this.readyState != this.DONE) {
-        return;
-      }
-      try {
-        resolve(this.responseText);
-      } catch (ex) {
-        ok(false, `Script error reading ${uri}: ${ex}`);
-        resolve("");
-      }
-    };
-    xhr.onerror = error => {
-      ok(false, `XHR error reading ${uri}: ${error}`);
-      resolve("");
-    };
-    xhr.send(null);
-  });
-}
-
-function testForError(filepath, key, str, pattern, type, helpText) {
-  if (str.match(pattern) &&
-      !ignoredError(filepath, key, type)) {
-    ok(false, `${filepath} with key=${key} has a misused ${type}. ${helpText}`);
-  }
-}
-
-function testForErrors(filepath, key, str) {
-  testForError(filepath, key, str, /\w'\w/, "apostrophe", "Strings with apostrophes should use foo\u2019s instead of foo's.");
-  testForError(filepath, key, str, /\w\u2018\w/, "incorrect-apostrophe", "Strings with apostrophes should use foo\u2019s instead of foo\u2018s.");
-  testForError(filepath, key, str, /'.+'/, "single-quote", "Single-quoted strings should use Unicode \u2018foo\u2019 instead of 'foo'.");
-  testForError(filepath, key, str, /"/, "double-quote", "Double-quoted strings should use Unicode \u201cfoo\u201d instead of \"foo\".");
-  testForError(filepath, key, str, /\.\.\./, "ellipsis", "Strings with an ellipsis should use the Unicode \u2026 character instead of three periods.");
-}
-
-add_task(function* checkAllTheProperties() {
-  let appDir = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
-  // This asynchronously produces a list of URLs (sadly, mostly sync on our
-  // test infrastructure because it runs against jarfiles there, and
-  // our zipreader APIs are all sync)
-  let uris = yield generateURIsFromDirTree(appDir, [".properties"]);
-  ok(uris.length, `Found ${uris.length} .properties files to scan for misused characters`);
-
-  for (let uri of uris) {
-    let bundle = new StringBundle(uri.spec);
-    let entities = bundle.getAll();
-    for (let entity of entities) {
-      testForErrors(uri.spec, entity.key, entity.value);
-    }
-  }
-});
-
-var checkDTD = Task.async(function* (aURISpec) {
-  let rawContents = yield fetchFile(aURISpec);
-  // The regular expression below is adapted from:
-  // https://hg.mozilla.org/mozilla-central/file/68c0b7d6f16ce5bb023e08050102b5f2fe4aacd8/python/compare-locales/compare_locales/parser.py#l233
-  let entities = rawContents.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/g);
-  for (let entity of entities) {
-    let [, key, str] = entity.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/);
-    // The matched string includes the enclosing quotation marks,
-    // we need to slice them off.
-    str = str.slice(1, -1);
-    testForErrors(aURISpec, key, str);
-  }
-});
-
-add_task(function* checkAllTheDTDs() {
-  let appDir = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
-  let uris = yield generateURIsFromDirTree(appDir, [".dtd"]);
-  ok(uris.length, `Found ${uris.length} .dtd files to scan for misused characters`);
-  for (let uri of uris) {
-    yield checkDTD(uri.spec);
-  }
-
-  // This support DTD file supplies a string with a newline to make sure
-  // the regex in checkDTD works correctly for that case.
-  let dtdLocation = gTestPath.replace(/\/[^\/]*$/i, "/bug1262648_string_with_newlines.dtd");
-  yield checkDTD(dtdLocation);
-});
-
-add_task(function* ensureWhiteListIsEmpty() {
-  is(gWhitelist.length, 0, "No remaining whitelist entries exist");
-});
+    file: "phishing-afterload-warning-message.dtd",
+    key: "safeb.blocked.malwarePage.shortDesc",
+    type: "single-quote"
+  }, {
+    file: "phishing-afterload-warning-message.dtd",
+    key: "safeb.blocked.unwantedPage.shortDesc",
+    type: "single-quote"
+  }, {
+    file: "phishing-afterload-warning-message.dtd",
+    key: "safeb.blocked.phishingPage.shortDesc2",
+    type: "single-quote"
+  }, {
+    file: "phishing-afterload-warning-message.dtd",
+    key: "safeb.blocked.forbiddenPage.shortDesc2",
+    type: "single-quote"
+  }, {
+    file: "mathfont.properties",
+    key: "operator.\\u002E\\u002E\\u002E.postfix",
+    type: "ellipsis"
+  }, {
+    file: "layout_errors.properties",
+    key: "ImageMapRectBoundsError",
+    type: "double-quote"
+  }, {
+    file: "layout_errors.properties",
+    key: "ImageMapCircleWrongNumberOfCoords",
+    type: "double-quote"
+  }, {
+    file: "layout_errors.properties",
+    key: "ImageMapCircleNegativeRadius",
+    type: "double-quote"
+  }, {
+    file: "layout_errors.properties",
+    key: "ImageMapPolyWrongNumberOfCoords",
+    type: "double-quote"
+  }, {
+    file: "layout_errors.properties",
+    key: "ImageMapPolyOddNumberOfCoords",
+    type: "double-quote"
+  }, {
+    file: "xbl.properties",
+    key: "CommandNotInChrome",
+    type: "double-quote"
+  }, {
+    file: "dom.properties",
+    key: "PatternAttributeCompileFailure",
+    type: "single-quote"
+  }, {
+    file: "pipnss.properties",
+    key: "certErrorMismatchSingle2",
+    type: "double-quote"
+  }, {
+    file: "pipnss.properties",
+    key: "certErrorCodePrefix2",
+    type: "double-quote"
+  }, {
+    file: "aboutSupport.dtd",
+    key: "aboutSupport.pageSubtitle",
+    type: "single-quote"
+  }, {
+    file: "aboutSupport.dtd",
+    key: "aboutSupport.userJSDescription",
+    type: "single-quote"
+  }, {
+    file: "netError.dtd",
+    key: "inadequateSecurityError.longDesc",
+    type: "single-quote"
+  }, {
+    file: "netErrorApp.dtd",
+    key: "securityOverride.warningContent",
+    type: "single-quote"
+  }
+];
+
+var moduleLocation = gTestPath.replace(/\/[^\/]*$/i, "/parsingTestHelpers.jsm");
+var {generateURIsFromDirTree} = Cu.import(moduleLocation, {});
+
+/**
+ * Check if an error should be ignored due to matching one of the whitelist
+ * objects defined in gWhitelist.
+ *
+ * @param filepath The URI spec of the locale file
+ * @param key The key of the entity that is being checked
+ * @param type The type of error that has been found
+ * @return true if the error should be ignored, false otherwise.
+ */
+function ignoredError(filepath, key, type) {
+  for (let index in gWhitelist) {
+    let whitelistItem = gWhitelist[index];
+    if (filepath.endsWith(whitelistItem.file) &&
+        key == whitelistItem.key &&
+        type == whitelistItem.type) {
+      gWhitelist.splice(index, 1);
+      return true;
+    }
+  }
+  return false;
+}
+
+function fetchFile(uri) {
+  return new Promise((resolve, reject) => {
+    let xhr = new XMLHttpRequest();
+    xhr.open("GET", uri, true);
+    xhr.onreadystatechange = function() {
+      if (this.readyState != this.DONE) {
+        return;
+      }
+      try {
+        resolve(this.responseText);
+      } catch (ex) {
+        ok(false, `Script error reading ${uri}: ${ex}`);
+        resolve("");
+      }
+    };
+    xhr.onerror = error => {
+      ok(false, `XHR error reading ${uri}: ${error}`);
+      resolve("");
+    };
+    xhr.send(null);
+  });
+}
+
+function testForError(filepath, key, str, pattern, type, helpText) {
+  if (str.match(pattern) &&
+      !ignoredError(filepath, key, type)) {
+    ok(false, `${filepath} with key=${key} has a misused ${type}. ${helpText}`);
+  }
+}
+
+function testForErrors(filepath, key, str) {
+  testForError(filepath, key, str, /\w'\w/, "apostrophe", "Strings with apostrophes should use foo\u2019s instead of foo's.");
+  testForError(filepath, key, str, /\w\u2018\w/, "incorrect-apostrophe", "Strings with apostrophes should use foo\u2019s instead of foo\u2018s.");
+  testForError(filepath, key, str, /'.+'/, "single-quote", "Single-quoted strings should use Unicode \u2018foo\u2019 instead of 'foo'.");
+  testForError(filepath, key, str, /"/, "double-quote", "Double-quoted strings should use Unicode \u201cfoo\u201d instead of \"foo\".");
+  testForError(filepath, key, str, /\.\.\./, "ellipsis", "Strings with an ellipsis should use the Unicode \u2026 character instead of three periods.");
+}
+
+function* getAllTheFiles(extension) {
+  let appDirGreD = Services.dirsvc.get("GreD", Ci.nsIFile);
+  let appDirXCurProcD = Services.dirsvc.get("XCurProcD", Ci.nsIFile);
+  if (appDirGreD.contains(appDirXCurProcD)) {
+    return yield generateURIsFromDirTree(appDirGreD, [extension]);
+  }
+  if (appDirXCurProcD.contains(appDirGreD)) {
+    return yield generateURIsFromDirTree(appDirXCurProcD, [extension]);
+  }
+  let urisGreD = yield generateURIsFromDirTree(appDirGreD, [extension]);
+  let urisXCurProcD = yield generateURIsFromDirTree(appDirXCurProcD, [extension]);
+  return Array.from(new Set(urisGreD.concat(appDirXCurProcD)));
+}
+
+add_task(function* checkAllTheProperties() {
+  // This asynchronously produces a list of URLs (sadly, mostly sync on our
+  // test infrastructure because it runs against jarfiles there, and
+  // our zipreader APIs are all sync)
+  let uris = yield getAllTheFiles(".properties");
+  ok(uris.length, `Found ${uris.length} .properties files to scan for misused characters`);
+
+  for (let uri of uris) {
+    let bundle = new StringBundle(uri.spec);
+    let entities = bundle.getAll();
+    for (let entity of entities) {
+      testForErrors(uri.spec, entity.key, entity.value);
+    }
+  }
+});
+
+var checkDTD = Task.async(function* (aURISpec) {
+  let rawContents = yield fetchFile(aURISpec);
+  // The regular expression below is adapted from:
+  // https://hg.mozilla.org/mozilla-central/file/68c0b7d6f16ce5bb023e08050102b5f2fe4aacd8/python/compare-locales/compare_locales/parser.py#l233
+  let entities = rawContents.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/g);
+  if (!entities) {
+    // Some files, such as requestAutocomplete.dtd, have no entities defined.
+    return;
+  }
+  for (let entity of entities) {
+    let [, key, str] = entity.match(/<!ENTITY\s+([\w\.]*)\s+("[^"]*"|'[^']*')\s*>/);
+    // The matched string includes the enclosing quotation marks,
+    // we need to slice them off.
+    str = str.slice(1, -1);
+    testForErrors(aURISpec, key, str);
+  }
+});
+
+add_task(function* checkAllTheDTDs() {
+  let uris = yield getAllTheFiles(".dtd");
+  ok(uris.length, `Found ${uris.length} .dtd files to scan for misused characters`);
+  for (let uri of uris) {
+    yield checkDTD(uri.spec);
+  }
+
+  // This support DTD file supplies a string with a newline to make sure
+  // the regex in checkDTD works correctly for that case.
+  let dtdLocation = gTestPath.replace(/\/[^\/]*$/i, "/bug1262648_string_with_newlines.dtd");
+  yield checkDTD(dtdLocation);
+});
+
+add_task(function* ensureWhiteListIsEmpty() {
+  is(gWhitelist.length, 0, "No remaining whitelist entries exist");
+});
--- a/devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js
+++ b/devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js
@@ -3,18 +3,18 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that a file with an unsupported CSP directive ('reflected-xss filter')
 // displays the appropriate message to the console.
 
 "use strict";
 
-const EXPECTED_RESULT = "Not supporting directive 'reflected-xss'. Directive " +
-                        "and values will be ignored.";
+const EXPECTED_RESULT = "Not supporting directive \u2018reflected-xss\u2019. " +
+                        "Directive and values will be ignored.";
 const TEST_FILE = "http://example.com/browser/devtools/client/webconsole/" +
                   "test/test_bug1045902_console_csp_ignore_reflected_xss_" +
                   "message.html";
 
 var hud = undefined;
 
 var TEST_URI = "data:text/html;charset=utf8,Web Console CSP ignoring " +
                "reflected XSS (bug 1045902)";
@@ -35,18 +35,18 @@ function loadDocument(browser) {
   browser.loadURI(TEST_FILE);
   return BrowserTestUtils.browserLoaded(browser);
 }
 
 function testViolationMessage() {
   let aOutputNode = hud.outputNode;
 
   return waitForSuccess({
-      name: "Confirming that CSP logs messages to the console when " +
-            "'reflected-xss' directive is used!",
-      validator: function() {
-        console.log(aOutputNode.textContent);
-        let success = false;
-        success = aOutputNode.textContent.indexOf(EXPECTED_RESULT) > -1;
-        return success;
-      }
-    });
+    name: "Confirming that CSP logs messages to the console when " +
+          "\u2018reflected-xss\u2019 directive is used!",
+    validator: function() {
+      console.log(aOutputNode.textContent);
+      let success = false;
+      success = aOutputNode.textContent.indexOf(EXPECTED_RESULT) > -1;
+      return success;
+    }
+  });
 }
--- a/devtools/client/webconsole/test/browser_console_error_source_click.js
+++ b/devtools/client/webconsole/test/browser_console_error_source_click.js
@@ -38,17 +38,17 @@ function test() {
       webconsole: hud,
       messages: [
         {
           text: "ReferenceError: foobar is not defined",
           category: CATEGORY_JS,
           severity: SEVERITY_ERROR,
         },
         {
-          text: "Unknown property 'test-color'",
+          text: "Unknown property \u2018test-color\u2019",
           category: CATEGORY_CSS,
           severity: SEVERITY_WARNING,
         },
       ],
     }).then(onMessageFound);
   }
 
   function onMessageFound(results) {
--- a/devtools/client/webconsole/test/browser_webconsole_allow_mixedcontent_securityerrors.js
+++ b/devtools/client/webconsole/test/browser_webconsole_allow_mixedcontent_securityerrors.js
@@ -26,25 +26,25 @@ add_task(function* () {
   let hud = yield openConsole();
 
   let results = yield waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: "Logged mixed active content",
         text: "Loading mixed (insecure) active content " +
-              "\"http://example.com/\" on a secure page",
+              "\u201chttp://example.com/\u201d on a secure page",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
         objects: true,
       },
       {
         name: "Logged mixed passive content - image",
         text: "Loading mixed (insecure) display content " +
-              "\"http://example.com/tests/image/test/mochitest/blue.png\" " +
+              "\u201chttp://example.com/tests/image/test/mochitest/blue.png\u201d " +
               "on a secure page",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
         objects: true,
       },
     ],
   });
 
--- a/devtools/client/webconsole/test/browser_webconsole_block_mixedcontent_securityerrors.js
+++ b/devtools/client/webconsole/test/browser_webconsole_block_mixedcontent_securityerrors.js
@@ -28,24 +28,24 @@ add_task(function* () {
 
   let hud = yield openConsole();
 
   let results = yield waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: "Logged blocking mixed active content",
-        text: "Blocked loading mixed active content \"http://example.com/\"",
+        text: "Blocked loading mixed active content \u201chttp://example.com/\u201d",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_ERROR,
         objects: true,
       },
       {
         name: "Logged blocking mixed passive content - image",
-        text: "Blocked loading mixed active content \"http://example.com/\"",
+        text: "Blocked loading mixed active content \u201chttp://example.com/\u201d",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_ERROR,
         objects: true,
       },
     ],
   });
 
   yield testClickOpenNewTab(hud, results[0]);
@@ -73,25 +73,25 @@ function mixedContentOverrideTest2(hud, 
   gIdentityHandler.disableMixedContentProtection();
 
   waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: "Logged blocking mixed active content",
         text: "Loading mixed (insecure) active content " +
-              "\"http://example.com/\" on a secure page",
+              "\u201chttp://example.com/\u201d on a secure page",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
         objects: true,
       },
       {
         name: "Logged blocking mixed passive content - image",
         text: "Loading mixed (insecure) display content" +
-          " \"http://example.com/tests/image/test/mochitest/blue.png\"" +
+          " \u201chttp://example.com/tests/image/test/mochitest/blue.png\u201d" +
           " on a secure page",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
         objects: true,
       },
     ],
   }).then(msgs => deferred.resolve(msgs), Cu.reportError);
 
--- a/devtools/client/webconsole/test/browser_webconsole_bug_1010953_cspro.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_1010953_cspro.js
@@ -15,24 +15,24 @@ CSP_REPORT_MSG are confirmed to be found
 */
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf8,Web Console CSP report only " +
                  "test (bug 1010953)";
 const TEST_VIOLATION = "http://example.com/browser/devtools/client/" +
                        "webconsole/test/test_bug_1010953_cspro.html";
-const CSP_VIOLATION_MSG = "Content Security Policy: The page's settings " +
+const CSP_VIOLATION_MSG = "Content Security Policy: The page\u2019s settings " +
                           "blocked the loading of a resource at " +
                           "http://some.example.com/test.png " +
-                          "(\"img-src http://example.com\").";
-const CSP_REPORT_MSG = "Content Security Policy: The page\'s settings " +
+                          "(\u201cimg-src http://example.com\u201d).";
+const CSP_REPORT_MSG = "Content Security Policy: The page\u2019s settings " +
                        "observed the loading of a resource at " +
                        "http://some.example.com/test_bug_1010953_cspro.js " +
-                       "(\"script-src http://example.com\"). A CSP report is " +
+                       "(\u201cscript-src http://example.com\u201d). A CSP report is " +
                        "being sent.";
 
 add_task(function* () {
   let { browser } = yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
   hud.jsterm.clearOutput();
--- a/devtools/client/webconsole/test/browser_webconsole_bug_611795.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_611795.js
@@ -26,17 +26,17 @@ add_task(function* () {
 
   yield onContentLoaded();
   yield testConsoleLogRepeats();
 
   hud = null;
 });
 
 function onContentLoaded() {
-  let cssWarning = "Unknown property '-moz-opacity'.  Declaration dropped.";
+  let cssWarning = "Unknown property \u2018-moz-opacity\u2019.  Declaration dropped.";
 
   return waitForMessages({
     webconsole: hud,
     messages: [{
       text: cssWarning,
       category: CATEGORY_CSS,
       severity: SEVERITY_WARNING,
       repeats: 2,
--- a/devtools/client/webconsole/test/browser_webconsole_bug_644419_log_limits.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_644419_log_limits.js
@@ -219,17 +219,17 @@ function testCssLimits2() {
   return waitForMessages({
     webconsole: hud,
     messages: [{
       text: "-moz-foobar10",
       category: CATEGORY_CSS,
       severity: SEVERITY_WARNING,
     }],
   }).then(() => {
-    testLogEntry(outputNode, "Unknown property '-moz-foobar0'",
+    testLogEntry(outputNode, "Unknown property \u2018-moz-foobar0\u2019",
                  "first message is pruned", false, true);
-    findLogEntry("Unknown property '-moz-foobar1'");
+    findLogEntry("Unknown property \u2018-moz-foobar1\u2019");
     // Check if the sentinel entry is still there.
     findLogEntry("testing CSS limits");
 
     Services.prefs.clearUserPref("devtools.hud.loglimit.cssparser");
   });
 }
--- a/devtools/client/webconsole/test/browser_webconsole_bug_770099_violation.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_770099_violation.js
@@ -5,20 +5,20 @@
 
 // Tests that the Web Console CSP messages are displayed
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf8,Web Console CSP violation test";
 const TEST_VIOLATION = "https://example.com/browser/devtools/client/" +
                        "webconsole/test/test_bug_770099_violation.html";
-const CSP_VIOLATION_MSG = "Content Security Policy: The page's settings " +
+const CSP_VIOLATION_MSG = "Content Security Policy: The page\u2019s settings " +
                           "blocked the loading of a resource at " +
-                          "http://some.example.com/test.png (\"default-src " +
-                            "https://example.com\").";
+                          "http://some.example.com/test.png (\u201cdefault-src " +
+                            "https://example.com\u201d).";
 
 add_task(function* () {
   let { browser } = yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
   hud.jsterm.clearOutput();
 
--- a/devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_782653_CSS_links_in_Style_Editor.js
@@ -22,22 +22,22 @@ add_task(function* () {
 });
 
 function testViewSource() {
   let deferred = promise.defer();
 
   waitForMessages({
     webconsole: hud,
     messages: [{
-      text: "'font-weight'",
+      text: "\u2018font-weight\u2019",
       category: CATEGORY_CSS,
       severity: SEVERITY_WARNING,
     },
     {
-      text: "'color'",
+      text: "\u2018color\u2019",
       category: CATEGORY_CSS,
       severity: SEVERITY_WARNING,
     }],
   }).then(([error1Rule, error2Rule]) => {
     let error1Msg = [...error1Rule.matched][0];
     let error2Msg = [...error2Rule.matched][0];
     nodes = [error1Msg.querySelector(".message-location .frame-link"),
              error2Msg.querySelector(".message-location .frame-link")];
--- a/devtools/client/webconsole/test/browser_webconsole_bug_837351_securityerrors.js
+++ b/devtools/client/webconsole/test/browser_webconsole_bug_837351_securityerrors.js
@@ -18,17 +18,17 @@ add_task(function* () {
   let button = hud.ui.rootElement.querySelector(".webconsole-filter-button[category=\"security\"]");
   ok(button, "Found security button in the web console");
 
   yield waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: "Logged blocking mixed active content",
-        text: "Blocked loading mixed active content \"http://example.com/\"",
+        text: "Blocked loading mixed active content \u201chttp://example.com/\u201d",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_ERROR
       },
     ],
   });
 });
 
 function pushPrefEnv() {
--- a/devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
+++ b/devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
@@ -32,52 +32,52 @@ add_task(function* () {
     text: "Public-Key-Pins: The site specified a header that could not be " +
           "parsed successfully."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?noMaxAge",
     name: "No max-age error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that did not include " +
-          "a 'max-age' directive."
+          "a \u2018max-age\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?invalidIncludeSubDomains",
     name: "Invalid includeSubDomains error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that included an " +
-          "invalid 'includeSubDomains' directive."
+          "invalid \u2018includeSubDomains\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?invalidMaxAge",
     name: "Invalid max-age error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that included an " +
-          "invalid 'max-age' directive."
+          "invalid \u2018max-age\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?multipleIncludeSubDomains",
     name: "Multiple includeSubDomains error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that included " +
-          "multiple 'includeSubDomains' directives."
+          "multiple \u2018includeSubDomains\u2019 directives."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?multipleMaxAge",
     name: "Multiple max-age error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that included " +
-          "multiple 'max-age' directives."
+          "multiple \u2018max-age\u2019 directives."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?multipleReportURIs",
     name: "Multiple report-uri error displayed successfully",
     text: "Public-Key-Pins: The site specified a header that included " +
-          "multiple 'report-uri' directives."
+          "multiple \u2018report-uri\u2019 directives."
   }, hud);
 
   // The root used for mochitests is not built-in, so set the relevant pref to
   // true to have the PKP implementation return more specific errors.
   Services.prefs.setBoolPref(NON_BUILTIN_ROOT_PREF, true);
 
   yield* checkForMessage({
     url: SJS_URL + "?pinsetDoesNotMatch",
--- a/devtools/client/webconsole/test/browser_webconsole_hsts_invalid-headers.js
+++ b/devtools/client/webconsole/test/browser_webconsole_hsts_invalid-headers.js
@@ -26,45 +26,45 @@ add_task(function* () {
     text: "Strict-Transport-Security: The site specified a header that could " +
           "not be parsed successfully."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?noMaxAge",
     name: "No max-age error displayed successfully",
     text: "Strict-Transport-Security: The site specified a header that did " +
-          "not include a 'max-age' directive."
+          "not include a \u2018max-age\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?invalidIncludeSubDomains",
     name: "Invalid includeSubDomains error displayed successfully",
     text: "Strict-Transport-Security: The site specified a header that " +
-          "included an invalid 'includeSubDomains' directive."
+          "included an invalid \u2018includeSubDomains\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?invalidMaxAge",
     name: "Invalid max-age error displayed successfully",
     text: "Strict-Transport-Security: The site specified a header that " +
-          "included an invalid 'max-age' directive."
+          "included an invalid \u2018max-age\u2019 directive."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?multipleIncludeSubDomains",
     name: "Multiple includeSubDomains error displayed successfully",
     text: "Strict-Transport-Security: The site specified a header that " +
-          "included multiple 'includeSubDomains' directives."
+          "included multiple \u2018includeSubDomains\u2019 directives."
   }, hud);
 
   yield* checkForMessage({
     url: SJS_URL + "?multipleMaxAge",
     name: "Multiple max-age error displayed successfully",
     text: "Strict-Transport-Security: The site specified a header that " +
-          "included multiple 'max-age' directives."
+          "included multiple \u2018max-age\u2019 directives."
   }, hud);
 });
 
 function* checkForMessage(curTest, hud) {
   hud.jsterm.clearOutput();
 
   content.location = curTest.url;
 
--- a/devtools/client/webconsole/test/browser_webconsole_trackingprotection_errors.js
+++ b/devtools/client/webconsole/test/browser_webconsole_trackingprotection_errors.js
@@ -26,17 +26,17 @@ add_task(function* testMessagesAppear() 
 
   let hud = yield openConsole();
 
   let results = yield waitForMessages({
     webconsole: hud,
     messages: [
       {
         name: "Was blocked because tracking protection is enabled",
-        text: "The resource at \"http://tracking.example.com/\" was blocked because tracking protection is enabled",
+        text: "The resource at \u201chttp://tracking.example.com/\u201d was blocked because tracking protection is enabled",
         category: CATEGORY_SECURITY,
         severity: SEVERITY_WARNING,
         objects: true,
       },
     ],
   });
 
   yield testClickOpenNewTab(hud, results[0]);
--- a/devtools/client/webconsole/test/test_bug1045902_console_csp_ignore_reflected_xss_message.html
+++ b/devtools/client/webconsole/test/test_bug1045902_console_csp_ignore_reflected_xss_message.html
@@ -1,10 +1,10 @@
 <!DOCTYPE HTML>
 <html>
 <head>
   <meta charset="UTF-8">
-  <title>Bug 1045902 - CSP: Log console message for 'reflected-xss'</title>
+  <title>Bug 1045902 - CSP: Log console message for ‘reflected-xss’</title>
 </head>
 <body>
-Bug 1045902 - CSP: Log console message for 'reflected-xss'
+Bug 1045902 - CSP: Log console message for ‘reflected-xss’
 </body>
 </html>
--- a/dom/locales/en-US/chrome/dom/dom.properties
+++ b/dom/locales/en-US/chrome/dom/dom.properties
@@ -4,17 +4,17 @@
 
 KillScriptTitle=Warning: Unresponsive script
 KillScriptMessage=A script on this page may be busy, or it may have stopped responding. You can stop the script now, or you can continue to see if the script will complete.
 KillScriptWithDebugMessage=A script on this page may be busy, or it may have stopped responding. You can stop the script now, open the script in the debugger, or let the script continue.
 KillScriptLocation=Script: %S
 StopScriptButton=Stop script
 DebugScriptButton=Debug script
 WaitForScriptButton=Continue
-DontAskAgain=&Don't ask me again
+DontAskAgain=&Don’t ask me again
 JSURLLoadBlockedWarning=Attempt to load a javascript: URL from one host\nin a window displaying content from another host\nwas blocked by the security manager.
 WindowCloseBlockedWarning=Scripts may not close windows that were not opened by script.
 OnBeforeUnloadTitle=Are you sure?
 OnBeforeUnloadMessage=This page is asking you to confirm that you want to leave - data you have entered may not be saved.
 OnBeforeUnloadStayButton=Stay on Page
 OnBeforeUnloadLeaveButton=Leave Page
 UnexpectedCanvasVariantStyle=canvas: an attempt to set strokeStyle or fillStyle to a value that is neither a string, a CanvasGradient, or a CanvasPattern was ignored.
 EmptyGetElementByIdParam=Empty string passed to getElementById().
@@ -52,103 +52,103 @@ FormValidationStepMismatchOneValue=Pleas
 FormValidationBadInputNumber=Please enter a number.
 GetAttributeNodeWarning=Use of getAttributeNode() is deprecated. Use getAttribute() instead.
 SetAttributeNodeWarning=Use of setAttributeNode() is deprecated. Use setAttribute() instead.
 GetAttributeNodeNSWarning=Use of getAttributeNodeNS() is deprecated. Use getAttributeNS() instead.
 SetAttributeNodeNSWarning=Use of setAttributeNodeNS() is deprecated. Use setAttributeNS() instead.
 RemoveAttributeNodeWarning=Use of removeAttributeNode() is deprecated. Use removeAttribute() instead.
 CreateAttributeWarning=Use of document.createAttribute() is deprecated. Use element.setAttribute() instead.
 CreateAttributeNSWarning=Use of document.createAttributeNS() is deprecated. Use element.setAttributeNS() instead.
-NodeValueWarning=Use of attributes' nodeValue attribute is deprecated. Use value instead.
-TextContentWarning=Use of attributes' textContent attribute is deprecated. Use value instead.
+NodeValueWarning=Use of attributes’ nodeValue attribute is deprecated. Use value instead.
+TextContentWarning=Use of attributes’ textContent attribute is deprecated. Use value instead.
 EnablePrivilegeWarning=Use of enablePrivilege is deprecated.  Please use code that runs with the system principal (e.g. an extension) instead.
 nsIJSONDecodeDeprecatedWarning=nsIJSON.decode is deprecated.  Please use JSON.parse instead.
 nsIJSONEncodeDeprecatedWarning=nsIJSON.encode is deprecated.  Please use JSON.stringify instead.
 nsIDOMWindowInternalWarning=Use of nsIDOMWindowInternal is deprecated. Use nsIDOMWindow instead.
 FullscreenDeniedDisabled=Request for fullscreen was denied because Fullscreen API is disabled by user preference.
 FullscreenDeniedFocusedPlugin=Request for fullscreen was denied because a windowed plugin is focused.
 FullscreenDeniedHidden=Request for fullscreen was denied because the document is no longer visible.
-FullscreenDeniedContainerNotAllowed=Request for fullscreen was denied because at least one of the document's containing elements is not an iframe or does not have an "allowfullscreen" attribute.
+FullscreenDeniedContainerNotAllowed=Request for fullscreen was denied because at least one of the document’s containing elements is not an iframe or does not have an “allowfullscreen” attribute.
 FullscreenDeniedNotInputDriven=Request for fullscreen was denied because Element.requestFullscreen() was not called from inside a short running user-generated event handler.
 FullscreenDeniedNotInDocument=Request for fullscreen was denied because requesting element is no longer in its document.
 FullscreenDeniedMovedDocument=Request for fullscreen was denied because requesting element has moved document.
 FullscreenDeniedLostWindow=Request for fullscreen was denied because we no longer have a window.
 FullscreenDeniedSubDocFullscreen=Request for fullscreen was denied because a subdocument of the document requesting fullscreen is already fullscreen.
 FullscreenDeniedNotDescendant=Request for fullscreen was denied because requesting element is not a descendant of the current fullscreen element.
 FullscreenDeniedNotFocusedTab=Request for fullscreen was denied because requesting element is not in the currently focused tab.
 RemovedFullscreenElement=Exited fullscreen because fullscreen element was removed from document.
 FocusedWindowedPluginWhileFullscreen=Exited fullscreen because windowed plugin was focused.
 HTMLSyncXHRWarning=HTML parsing in XMLHttpRequest is not supported in the synchronous mode.
-InvalidRedirectChannelWarning=Unable to redirect to %S because the channel doesn't implement nsIWritablePropertyBag2.
-ResponseTypeSyncXHRWarning=Use of XMLHttpRequest's responseType attribute is no longer supported in the synchronous mode in window context.
-WithCredentialsSyncXHRWarning=Use of XMLHttpRequest's withCredentials attribute is no longer supported in the synchronous mode in window context.
-TimeoutSyncXHRWarning=Use of XMLHttpRequest's timeout attribute is not supported in the synchronous mode in window context.
+InvalidRedirectChannelWarning=Unable to redirect to %S because the channel doesn’t implement nsIWritablePropertyBag2.
+ResponseTypeSyncXHRWarning=Use of XMLHttpRequest’s responseType attribute is no longer supported in the synchronous mode in window context.
+WithCredentialsSyncXHRWarning=Use of XMLHttpRequest’s withCredentials attribute is no longer supported in the synchronous mode in window context.
+TimeoutSyncXHRWarning=Use of XMLHttpRequest’s timeout attribute is not supported in the synchronous mode in window context.
 JSONCharsetWarning=An attempt was made to declare a non-UTF-8 encoding for JSON retrieved using XMLHttpRequest. Only UTF-8 is supported for decoding JSON.
 # LOCALIZATION NOTE: Do not translate AudioBufferSourceNode
 MediaBufferSourceNodeResampleOutOfMemory=Insufficient memory to resample the AudioBufferSourceNode for playback.
 # LOCALIZATION NOTE: Do not translate decodeAudioData.
 MediaDecodeAudioDataUnknownContentType=The buffer passed to decodeAudioData contains an unknown content type.
 # LOCALIZATION NOTE: Do not translate decodeAudioData.
 MediaDecodeAudioDataUnknownError=An unknown error occured while processing decodeAudioData.
 # LOCALIZATION NOTE: Do not translate decodeAudioData.
 MediaDecodeAudioDataInvalidContent=The buffer passed to decodeAudioData contains invalid content which cannot be decoded successfully.
 # LOCALIZATION NOTE: Do not translate decodeAudioData.
 MediaDecodeAudioDataNoAudio=The buffer passed to decodeAudioData does not contain any audio.
 # LOCALIZATION NOTE: Do not translate HTMLMediaElement and createMediaElementSource.
 MediaElementAudioSourceNodeCrossOrigin=The HTMLMediaElement passed to createMediaElementSource has a cross-origin resource, the node will output silence.
 # LOCALIZATION NOTE: Do not translate MediaStream and createMediaStreamSource.
 MediaStreamAudioSourceNodeCrossOrigin=The MediaStream passed to createMediaStreamSource has a cross-origin resource, the node it will output silence.
 MediaLoadExhaustedCandidates=All candidate resources failed to load. Media load paused.
-MediaLoadSourceMissingSrc=<source> element has no "src" attribute. Media resource load failed.
+MediaLoadSourceMissingSrc=<source> element has no “src” attribute. Media resource load failed.
 # LOCALIZATION NOTE: %1$S is the Http error code the server returned (e.g. 404, 500, etc), %2$S is the URL of the media resource which failed to load.
 MediaLoadHttpError=HTTP load failed with status %1$S. Load of media resource %2$S failed.
 # LOCALIZATION NOTE: %S is the URL of the media resource which failed to load.
 MediaLoadInvalidURI=Invalid URI. Load of media resource %S failed.
 # LOCALIZATION NOTE: %1$S is the media resource's format/codec type (basically equivalent to the file type, e.g. MP4,AVI,WMV,MOV etc), %2$S is the URL of the media resource which failed to load.
-MediaLoadUnsupportedTypeAttribute=Specified "type" attribute of "%1$S" is not supported. Load of media resource %2$S failed.
+MediaLoadUnsupportedTypeAttribute=Specified “type” attribute of “%1$S” is not supported. Load of media resource %2$S failed.
 # LOCALIZATION NOTE: %1$S is the "media" attribute value of the <source> element. It is a media query. %2$S is the URL of the media resource which failed to load.
-MediaLoadSourceMediaNotMatched=Specified "media" attribute of "%1$S" does not match the environment. Load of media resource %2$S failed.
+MediaLoadSourceMediaNotMatched=Specified “media” attribute of “%1$S” does not match the environment. Load of media resource %2$S failed.
 # LOCALIZATION NOTE: %1$S is the MIME type HTTP header being sent by the web server, %2$S is the URL of the media resource which failed to load.
-MediaLoadUnsupportedMimeType=HTTP "Content-Type" of "%1$S" is not supported. Load of media resource %2$S failed.
+MediaLoadUnsupportedMimeType=HTTP “Content-Type” of “%1$S” is not supported. Load of media resource %2$S failed.
 # LOCALIZATION NOTE: %S is the URL of the media resource which failed to load because of error in decoding.
 MediaLoadDecodeError=Media resource %S could not be decoded.
 MediaWidevineNoWMFNoSilverlight=Trying to play Widevine with no Windows Media Foundation (nor Silverlight fallback), see https://support.mozilla.org/kb/fix-video-audio-problems-firefox-windows
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
 MediaWMFNeeded=To play video formats %S, you need to install extra Microsoft software, see https://support.mozilla.org/kb/fix-video-audio-problems-firefox-windows
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
-MediaPlatformDecoderNotFound=The video on this page can't be played. Your system may not have the required video codecs for: %S
+MediaPlatformDecoderNotFound=The video on this page can’t be played. Your system may not have the required video codecs for: %S
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
 MediaCannotPlayNoDecoders=Cannot play media. No decoders for requested formats: %S
 # LOCALIZATION NOTE: %S is a comma-separated list of codecs (e.g. 'video/mp4, video/webm')
 MediaNoDecoders=No decoders for some of the requested formats: %S
 # LOCALIZATION NOTE: Do not translate "MediaRecorder".
 MediaRecorderMultiTracksNotSupported=MediaRecorder does not support recording multiple tracks of the same type at this time.
 # LOCALIZATION NOTE: %S is the ID of the MediaStreamTrack passed to MediaStream.addTrack(). Do not translate "MediaStreamTrack" and "AudioChannel".
 MediaStreamAddTrackDifferentAudioChannel=MediaStreamTrack %S could not be added since it belongs to a different AudioChannel.
 # LOCALIZATION NOTE: Do not translate "MediaStream", "stop()" and "MediaStreamTrack"
 MediaStreamStopDeprecatedWarning=MediaStream.stop() is deprecated and will soon be removed. Use MediaStreamTrack.stop() instead.
 # LOCALIZATION NOTE: Do not translate "DOMException", "code" and "name"
-DOMExceptionCodeWarning=Use of DOMException's code attribute is deprecated. Use name instead.
+DOMExceptionCodeWarning=Use of DOMException’s code attribute is deprecated. Use name instead.
 # LOCALIZATION NOTE: Do not translate "__exposedProps__"
 NoExposedPropsWarning=Exposing chrome JS objects to content without __exposedProps__ is insecure and deprecated. See https://developer.mozilla.org/en/XPConnect_wrappers for more information.
 # LOCALIZATION NOTE: Do not translate "Mutation Event" and "MutationObserver"
 MutationEventWarning=Use of Mutation Events is deprecated. Use MutationObserver instead.
 # LOCALIZATION NOTE: Do not translate "Components"
 ComponentsWarning=The Components object is deprecated. It will soon be removed.
 PluginHangUITitle=Warning: Unresponsive plugin
 PluginHangUIMessage=%S may be busy, or it may have stopped responding. You can stop the plugin now, or you can continue to see if the plugin will complete.
 PluginHangUIWaitButton=Continue
 PluginHangUIStopButton=Stop plugin
 PrefixedFullscreenAPIWarning=Prefixed Fullscreen API is deprecated. Please use unprefixed API for fullscreen. For more help https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API
 # LOCALIZATION NOTE: Do not translate "mozHidden", "mozVisibilityState", "hidden", or "visibilityState"
-PrefixedVisibilityAPIWarning='mozHidden' and 'mozVisibilityState' are deprecated.  Please use the unprefixed 'hidden' and 'visibilityState' instead.
+PrefixedVisibilityAPIWarning=‘mozHidden’ and ‘mozVisibilityState’ are deprecated.  Please use the unprefixed ‘hidden’ and ‘visibilityState’ instead.
 # LOCALIZATION NOTE: Do not translate "NodeIterator" or "detach()".
 NodeIteratorDetachWarning=Calling detach() on a NodeIterator no longer has an effect.
 # LOCALIZATION NOTE: Do not translate "LenientThis" and "this"
-LenientThisWarning=Ignoring get or set of property that has [LenientThis] because the "this" object is incorrect.
+LenientThisWarning=Ignoring get or set of property that has [LenientThis] because the “this” object is incorrect.
 # LOCALIZATION NOTE: Do not translate "nsIDOMWindowUtils", "getWindowWithOuterId", or "nsIWindowMediator"
 GetWindowWithOuterIdWarning=Use of nsIDOMWindowUtils.getOuterWindowWithId() is deprecated.  Instead, use the nsIWindowMediator method of the same name.
 # LOCALIZATION NOTE: Do not translate "getPreventDefault" or "defaultPrevented".
 GetPreventDefaultWarning=Use of getPreventDefault() is deprecated.  Use defaultPrevented instead.
 # LOCALIZATION NOTE: Do not translate "getUserData", "setUserData", "WeakMap", or "element.dataset".
 GetSetUserDataWarning=Use of getUserData() or setUserData() is deprecated.  Use WeakMap or element.dataset instead.
 # LOCALIZATION NOTE: Do not translate "mozGetAsFile" or "toBlob"
 MozGetAsFileWarning=The non-standard mozGetAsFile method is deprecated and will soon be removed.  Use the standard toBlob method instead.
@@ -158,17 +158,17 @@ UseOfCaptureEventsWarning=Use of capture
 UseOfReleaseEventsWarning=Use of releaseEvents() is deprecated. To upgrade your code, use the DOM 2 removeEventListener() method. For more help http://developer.mozilla.org/en/docs/DOM:element.removeEventListener
 # LOCALIZATION NOTE: Do not translate "document.load()" or "XMLHttpRequest"
 UseOfDOM3LoadMethodWarning=Use of document.load() is deprecated. To upgrade your code, use the DOM XMLHttpRequest object. For more help https://developer.mozilla.org/en/XMLHttpRequest
 # LOCALIZATION NOTE: Do not translate "window.showModalDialog()" or "window.open()"
 ShowModalDialogWarning=Use of window.showModalDialog() is deprecated. Use window.open() instead. For more help https://developer.mozilla.org/en-US/docs/Web/API/Window.open
 # LOCALIZATION NOTE: Do not translate "window._content" or "window.content"
 Window_ContentWarning=window._content is deprecated.  Please use window.content instead.
 # LOCALIZATION NOTE: Do not translate "XMLHttpRequest"
-SyncXMLHttpRequestWarning=Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help http://xhr.spec.whatwg.org/
+SyncXMLHttpRequestWarning=Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user’s experience. For more help http://xhr.spec.whatwg.org/
 ImplicitMetaViewportTagFallback=No meta-viewport tag found. Please explicitly specify one to prevent unexpected behavioural changes in future versions. For more help https://developer.mozilla.org/en/docs/Mozilla/Mobile/Viewport_meta_tag
 # LOCALIZATION NOTE: Do not translate "DataContainerEvent" or "CustomEvent"
 DataContainerEventWarning=Use of DataContainerEvent is deprecated. Use CustomEvent instead.
 # LOCALIZATION NOTE: Do not translate "window.controllers"
 Window_ControllersWarning=window.controllers is deprecated. Do not use it for UA detection.
 ImportXULIntoContentWarning=Importing XUL nodes into a content document is deprecated. This functionality may be removed soon.
 XMLDocumentLoadPrincipalMismatch=Use of document.load forbidden on Documents that come from other Windows. Only the Window in which a Document was created is allowed to call .load on that Document. Preferably, use XMLHttpRequest instead.
 # LOCALIZATION NOTE: Do not translate "IndexedDB".
@@ -178,48 +178,48 @@ IgnoringWillChangeOverBudgetWarning=Will
 # LOCALIZATION NOTE: Do not translate "Worker".
 HittingMaxWorkersPerDomain2=A Worker could not be started immediately because other documents in the same origin are already using the maximum number of workers. The Worker is now queued and will be started after some of the other workers have completed.
 # LOCALIZATION NOTE: Do not translate "setVelocity", "PannerNode", "AudioListener", "speedOfSound" and "dopplerFactor"
 PannerNodeDopplerWarning=Use of setVelocity on the PannerNode and AudioListener, and speedOfSound and dopplerFactor on the AudioListener are deprecated and those members will be removed. For more help https://developer.mozilla.org/en-US/docs/Web/API/AudioListener#Deprecated_features
 # LOCALIZATION NOTE: Do not translate "Application Cache API", "AppCache" and "ServiceWorker".
 AppCacheWarning=The Application Cache API (AppCache) is deprecated and will be removed at a future date.  Please consider using ServiceWorker for offline support.
 # LOCALIZATION NOTE: Do not translate "Worker".
 EmptyWorkerSourceWarning=Attempting to create a Worker from an empty source. This is probably unintentional.
-WebrtcDeprecatedPrefixWarning=WebRTC interfaces with the "moz" prefix (mozRTCPeerConnection, mozRTCSessionDescription, mozRTCIceCandidate) have been deprecated.
+WebrtcDeprecatedPrefixWarning=WebRTC interfaces with the “moz” prefix (mozRTCPeerConnection, mozRTCSessionDescription, mozRTCIceCandidate) have been deprecated.
 NavigatorGetUserMediaWarning=navigator.mozGetUserMedia has been replaced by navigator.mediaDevices.getUserMedia
 # LOCALIZATION NOTE: Do not translate "ServiceWorker". %S is a URL.
-InterceptionFailedWithURL=Failed to load '%S'. A ServiceWorker intercepted the request and encountered an unexpected error.
+InterceptionFailedWithURL=Failed to load ‘%S’. A ServiceWorker intercepted the request and encountered an unexpected error.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "FetchEvent.respondWith()", "FetchEvent", "no-cors", "opaque", "Response", or "RequestMode". %1$S is a URL. %2$S is a RequestMode value.
-BadOpaqueInterceptionRequestModeWithURL=Failed to load '%1$S'. A ServiceWorker passed an opaque Response to FetchEvent.respondWith() while handling a '%2$S' FetchEvent. Opaque Response objects are only valid when the RequestMode is 'no-cors'.
+BadOpaqueInterceptionRequestModeWithURL=Failed to load ‘%1$S’. A ServiceWorker passed an opaque Response to FetchEvent.respondWith() while handling a ‘%2$S’ FetchEvent. Opaque Response objects are only valid when the RequestMode is ‘no-cors’.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "Error", "Response", "FetchEvent.respondWith()", or "fetch()". %S is a URL.
-InterceptedErrorResponseWithURL=Failed to load '%S'. A ServiceWorker passed an Error Response to FetchEvent.respondWith(). This typically means the ServiceWorker performed an invalid fetch() call.
+InterceptedErrorResponseWithURL=Failed to load ‘%S’. A ServiceWorker passed an Error Response to FetchEvent.respondWith(). This typically means the ServiceWorker performed an invalid fetch() call.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "Response", "FetchEvent.respondWith()", or "Response.clone()". %S is a URL.
-InterceptedUsedResponseWithURL=Failed to load '%S'. A ServiceWorker passed a used Response to FetchEvent.respondWith(). The body of a Response may only be read once. Use Response.clone() to access the body multiple times.
+InterceptedUsedResponseWithURL=Failed to load ‘%S’. A ServiceWorker passed a used Response to FetchEvent.respondWith(). The body of a Response may only be read once. Use Response.clone() to access the body multiple times.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "opaqueredirect", "Response", "FetchEvent.respondWith()", or "FetchEvent". %s is a URL.
-BadOpaqueRedirectInterceptionWithURL=Failed to load '%S'. A ServiceWorker passed an opaqueredirect Response to FetchEvent.respondWith() while handling a non-navigation FetchEvent.
+BadOpaqueRedirectInterceptionWithURL=Failed to load ‘%S’. A ServiceWorker passed an opaqueredirect Response to FetchEvent.respondWith() while handling a non-navigation FetchEvent.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker" or "FetchEvent.preventDefault()". %S is a URL.
-InterceptionCanceledWithURL=Failed to load '%S'. A ServiceWorker canceled the load by calling FetchEvent.preventDefault().
+InterceptionCanceledWithURL=Failed to load ‘%S’. A ServiceWorker canceled the load by calling FetchEvent.preventDefault().
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "promise", or "FetchEvent.respondWith()". %1$S is a URL. %2$S is an error string.
-InterceptionRejectedResponseWithURL=Failed to load '%1$S'. A ServiceWorker passed a promise to FetchEvent.respondWith() that rejected with '%2$S'.
+InterceptionRejectedResponseWithURL=Failed to load ‘%1$S’. A ServiceWorker passed a promise to FetchEvent.respondWith() that rejected with ‘%2$S’.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "promise", "FetchEvent.respondWith()", or "Response". %1$S is a URL. %2$S is an error string.
-InterceptedNonResponseWithURL=Failed to load '%1$S'. A ServiceWorker passed a promise to FetchEvent.respondWith() that resolved with non-Response value '%2$S'.
+InterceptedNonResponseWithURL=Failed to load ‘%1$S’. A ServiceWorker passed a promise to FetchEvent.respondWith() that resolved with non-Response value ‘%2$S’.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker", "Service-Worker-Allowed" or "HTTP". %1$S and %2$S are URLs.
-ServiceWorkerScopePathMismatch=Failed to register a ServiceWorker: The path of the provided scope '%1$S' is not under the max scope allowed '%2$S'. Adjust the scope, move the Service Worker script, or use the Service-Worker-Allowed HTTP header to allow the scope.
-ExecCommandCutCopyDeniedNotInputDriven=document.execCommand('cut'/'copy') was denied because it was not called from inside a short running user-generated event handler.
+ServiceWorkerScopePathMismatch=Failed to register a ServiceWorker: The path of the provided scope ‘%1$S’ is not under the max scope allowed ‘%2$S’. Adjust the scope, move the Service Worker script, or use the Service-Worker-Allowed HTTP header to allow the scope.
+ExecCommandCutCopyDeniedNotInputDriven=document.execCommand(‘cut’/‘copy’) was denied because it was not called from inside a short running user-generated event handler.
 ManifestShouldBeObject=Manifest should be an object.
 ManifestScopeURLInvalid=The scope URL is invalid.
 ManifestScopeNotSameOrigin=The scope URL must be same origin as document.
 ManifestStartURLOutsideScope=The start URL is outside the scope, so the scope is invalid.
 ManifestStartURLInvalid=The start URL is invalid.
 ManifestStartURLShouldBeSameOrigin=The start URL must be same origin as document.
 # LOCALIZATION NOTE: %1$S is the name of the object whose property is invalid. %2$S is the name of the invalid property. %3$S is the expected type of the property value. E.g. "Expected the manifest's start_url member to be a string."
-ManifestInvalidType=Expected the %1$S's %2$S member to be a %3$S.
+ManifestInvalidType=Expected the %1$S’s %2$S member to be a %3$S.
 # LOCALIZATION NOTE: %1$S is the name of the property whose value is invalid. %2$S is the (invalid) value of the property. E.g. "theme_color: 42 is not a valid CSS color."
 ManifestInvalidCSSColor=%1$S: %2$S is not a valid CSS color.
 PatternAttributeCompileFailure=Unable to check <input pattern='%S'> because the pattern is not a valid regexp: %S
 # LOCALIZATION NOTE: Do not translate "postMessage" or DOMWindow. %S values are origins, like https://domain.com:port
-TargetPrincipalDoesNotMatch=Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('%S') does not match the recipient window's origin ('%S').
+TargetPrincipalDoesNotMatch=Failed to execute ‘postMessage’ on ‘DOMWindow’: The target origin provided (‘%S’) does not match the recipient window’s origin (‘%S’).
 # LOCALIZATION NOTE: Do not translate 'youtube'. %S values are origins, like https://domain.com:port
 RewriteYoutubeEmbed=Rewriting old-style Youtube Flash embed (%S) to iframe embed (%S). Please update page to use iframe instead of embed/object, if possible.
 # LOCALIZATION NOTE: Do not translate 'youtube'. %S values are origins, like https://domain.com:port
 RewriteYoutubeEmbedInvalidQuery=Rewriting old-style Youtube Flash embed (%S) to iframe embed (%S). Query was invalid and removed from URL. Please update page to use iframe instead of embed/object, if possible.
 # LOCALIZATION NOTE: Do not translate "ServiceWorker". %1$S is the ServiceWorker scope URL. %2$S is an error string.
-PushMessageDecryptionFailure=The ServiceWorker for scope '%1$S' encountered an error decrypting a push message: '%2$S'. For help with encryption, please see https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Using_the_Push_API#Encryption
+PushMessageDecryptionFailure=The ServiceWorker for scope ‘%1$S’ encountered an error decrypting a push message: ‘%2$S’. For help with encryption, please see https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Using_the_Push_API#Encryption
--- a/dom/locales/en-US/chrome/layout/css.properties
+++ b/dom/locales/en-US/chrome/layout/css.properties
@@ -1,177 +1,177 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-MimeNotCss=The stylesheet %1$S was not loaded because its MIME type, "%2$S", is not "text/css".
-MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, "%2$S", is not "text/css".
+MimeNotCss=The stylesheet %1$S was not loaded because its MIME type, “%2$S”, is not “text/css”.
+MimeNotCssWarn=The stylesheet %1$S was loaded as CSS even though its MIME type, “%2$S”, is not “text/css”.
 
 PEUnexpEOF2=Unexpected end of file while searching for %1$S.
 PEParseRuleWSOnly=Whitespace-only string given to be parsed as rule.
 PEDeclDropped=Declaration dropped.
 PEDeclSkipped=Skipped to next declaration.
-PEUnknownProperty=Unknown property '%1$S'.
-PEValueParsingError=Error in parsing value for '%1$S'.
-PEExpectEndValue=Expected end of value but found '%1$S'.
-PERuleTrailing=Expected end of rule but found '%1$S'.
+PEUnknownProperty=Unknown property ‘%1$S’.
+PEValueParsingError=Error in parsing value for ‘%1$S’.
+PEExpectEndValue=Expected end of value but found ‘%1$S’.
+PERuleTrailing=Expected end of rule but found ‘%1$S’.
 PESkipAtRuleEOF2=end of at-rule
-PEUnknownAtRule=Unrecognized at-rule or error parsing at-rule '%1$S'.
+PEUnknownAtRule=Unrecognized at-rule or error parsing at-rule ‘%1$S’.
 PECharsetRuleEOF=charset string in @charset rule
-PECharsetRuleNotString=Expected charset string but found '%1$S'.
+PECharsetRuleNotString=Expected charset string but found ‘%1$S’.
 PEGatherMediaEOF=end of media list in @import or @media rule
-PEGatherMediaNotComma=Expected ',' in media list but found '%1$S'.
-PEGatherMediaNotIdent=Expected identifier in media list but found '%1$S'.
-PEGatherMediaReservedMediaType=Found reserved keyword '%1$S' when looking for media type.
+PEGatherMediaNotComma=Expected ‘,’ in media list but found ‘%1$S’.
+PEGatherMediaNotIdent=Expected identifier in media list but found ‘%1$S’.
+PEGatherMediaReservedMediaType=Found reserved keyword ‘%1$S’ when looking for media type.
 PEParseSourceSizeListEOF=length value for matched media condition
-PEParseSourceSizeListNotComma=Expected ',' after value but found '%1$S'
-PEImportNotURI=Expected URI in @import rule but found '%1$S'.
-PEImportBadURI=Invalid URI in @import rule: '%1$S'.
-PEImportUnexpected=Found unexpected '%1$S' within @import.
+PEParseSourceSizeListNotComma=Expected ‘,’ after value but found ‘%1$S’
+PEImportNotURI=Expected URI in @import rule but found ‘%1$S’.
+PEImportBadURI=Invalid URI in @import rule: ‘%1$S’.
+PEImportUnexpected=Found unexpected ‘%1$S’ within @import.
 PEGroupRuleEOF2=end of @media, @supports or @-moz-document rule
 PEGroupRuleNestedAtRule=%1$S rule not allowed within @media or @-moz-document rule.
-PEMozDocRuleBadFunc2=Expected url(), url-prefix(), domain() or regexp() in @-moz-document rule but found '%1$S'.
-PEMozDocRuleNotURI=Expected URI in @-moz-document rule but found '%1$S'.
-PEMozDocRuleNotString=Expected string in @-moz-document rule regexp() function but found '%1$S'.
+PEMozDocRuleBadFunc2=Expected url(), url-prefix(), domain() or regexp() in @-moz-document rule but found ‘%1$S’.
+PEMozDocRuleNotURI=Expected URI in @-moz-document rule but found ‘%1$S’.
+PEMozDocRuleNotString=Expected string in @-moz-document rule regexp() function but found ‘%1$S’.
 PEMozDocRuleEOF=next URI in @-moz-document rule
 PEAtNSPrefixEOF=namespace prefix in @namespace rule
 PEAtNSURIEOF=namespace URI in @namespace rule
-PEAtNSUnexpected=Unexpected token within @namespace: '%1$S'.
+PEAtNSUnexpected=Unexpected token within @namespace: ‘%1$S’.
 PEKeyframeNameEOF=name of @keyframes rule.
 PEKeyframeBadName=Expected identifier for name of @keyframes rule.
 PEKeyframeBrace=Expected opening { of @keyframes rule.
 PESkipDeclBraceEOF=closing } of declaration block
 PESkipRSBraceEOF=closing } of invalid rule set
 PEBadSelectorRSIgnored=Ruleset ignored due to bad selector.
 PEBadSelectorKeyframeRuleIgnored=Keyframe rule ignored due to bad selector.
-PESelectorListExtraEOF=',' or '{'
-PESelectorListExtra=Expected ',' or '{' but found '%1$S'.
+PESelectorListExtraEOF=‘,’ or ‘{’
+PESelectorListExtra=Expected ‘,’ or ‘{’ but found ‘%1$S’.
 PESelectorGroupNoSelector=Selector expected.
 PESelectorGroupExtraCombinator=Dangling combinator.
 PECounterStyleNotIdent=Expected identifier for name of @counter-style rule.
-PECounterStyleBadName=Name of @counter-style rule can't be '%1$S'.
-PECounterStyleBadBlockStart=Expected '{' to begin @counter-style rule but found '%1$S'.
-PECounterStyleEOF=closing '}' of @counter-style block
-PECounterDescExpected=Expected counter descriptor but found '%1$S'.
-PEUnknownCounterDesc=Unknown descriptor '%1$S' in @counter-style rule.
-PECounterExtendsNotIdent=Expected identifier for extends system but found '%1$S'.
+PECounterStyleBadName=Name of @counter-style rule can’t be ‘%1$S’.
+PECounterStyleBadBlockStart=Expected ‘{’ to begin @counter-style rule but found ‘%1$S’.
+PECounterStyleEOF=closing ‘}’ of @counter-style block
+PECounterDescExpected=Expected counter descriptor but found ‘%1$S’.
+PEUnknownCounterDesc=Unknown descriptor ‘%1$S’ in @counter-style rule.
+PECounterExtendsNotIdent=Expected identifier for extends system but found ‘%1$S’.
 PECounterASWeight=Each weight in the additive-symbols descriptor must be smaller than the previous weight.
 PEClassSelEOF=class name
-PEClassSelNotIdent=Expected identifier for class selector but found '%1$S'.
-PECoordinatePair=Expected coordinate pair but found '%1$S'.
+PEClassSelNotIdent=Expected identifier for class selector but found ‘%1$S’.
+PECoordinatePair=Expected coordinate pair but found ‘%1$S’.
 PETypeSelEOF=element type
-PETypeSelNotType=Expected element name or '*' but found '%1$S'.
-PEUnknownNamespacePrefix=Unknown namespace prefix '%1$S'.
+PETypeSelNotType=Expected element name or ‘*’ but found ‘%1$S’.
+PEUnknownNamespacePrefix=Unknown namespace prefix ‘%1$S’.
 PEAttributeNameEOF=attribute name
-PEAttributeNameExpected=Expected identifier for attribute name but found '%1$S'.
-PEAttributeNameOrNamespaceExpected=Expected attribute name or namespace but found '%1$S'.
-PEAttSelNoBar=Expected '|' but found '%1$S'.
+PEAttributeNameExpected=Expected identifier for attribute name but found ‘%1$S’.
+PEAttributeNameOrNamespaceExpected=Expected attribute name or namespace but found ‘%1$S’.
+PEAttSelNoBar=Expected ‘|’ but found ‘%1$S’.
 PEAttSelInnerEOF=part of attribute selector
-PEAttSelUnexpected=Unexpected token in attribute selector: '%1$S'.
+PEAttSelUnexpected=Unexpected token in attribute selector: ‘%1$S’.
 PEAttSelValueEOF=attribute value
-PEAttSelCloseEOF=']' to end attribute selector
-PEAttSelNoClose=Expected ']' to terminate attribute selector but found '%1$S'.
-PEAttSelBadValue=Expected identifier or string for value in attribute selector but found '%1$S'.
+PEAttSelCloseEOF=‘]’ to end attribute selector
+PEAttSelNoClose=Expected ‘]’ to terminate attribute selector but found ‘%1$S’.
+PEAttSelBadValue=Expected identifier or string for value in attribute selector but found ‘%1$S’.
 PEPseudoSelEOF=name of pseudo-class or pseudo-element
-PEPseudoSelBadName=Expected identifier for pseudo-class or pseudo-element but found '%1$S'.
-PEPseudoSelNonFunc=Function token for non-function pseudo-class or pseudo-element, or the other way around, when reading '%1$S'.
-PEPseudoSelNotPE=Expected pseudo-element but found '%1$S'.
-PEPseudoSelDoubleNot=Negation pseudo-class can't be negated '%1$S'.
-PEPseudoSelPEInNot=Pseudo-elements can't be negated '%1$S'.
-PEPseudoSelNewStyleOnly=This pseudo-element must use the "::" form: '%1$S'.
-PEPseudoSelEndOrUserActionPC=Expected end of selector or a user action pseudo-class after pseudo-element but found '%1$S'.
-PEPseudoSelNoUserActionPC=Expected end of selector after pseudo-element that does not support user action pseudo-classes but found '%1$S'.
-PEPseudoSelMultiplePE=Extra pseudo-element '%1$S'.
-PEPseudoSelUnknown=Unknown pseudo-class or pseudo-element '%1$S'.
+PEPseudoSelBadName=Expected identifier for pseudo-class or pseudo-element but found ‘%1$S’.
+PEPseudoSelNonFunc=Function token for non-function pseudo-class or pseudo-element, or the other way around, when reading ‘%1$S’.
+PEPseudoSelNotPE=Expected pseudo-element but found ‘%1$S’.
+PEPseudoSelDoubleNot=Negation pseudo-class can’t be negated ‘%1$S’.
+PEPseudoSelPEInNot=Pseudo-elements can’t be negated ‘%1$S’.
+PEPseudoSelNewStyleOnly=This pseudo-element must use the “::” form: ‘%1$S’.
+PEPseudoSelEndOrUserActionPC=Expected end of selector or a user action pseudo-class after pseudo-element but found ‘%1$S’.
+PEPseudoSelNoUserActionPC=Expected end of selector after pseudo-element that does not support user action pseudo-classes but found ‘%1$S’.
+PEPseudoSelMultiplePE=Extra pseudo-element ‘%1$S’.
+PEPseudoSelUnknown=Unknown pseudo-class or pseudo-element ‘%1$S’.
 PENegationEOF=selector within negation
-PENegationBadInner=Malformed simple selector as negation pseudo-class argument '%1$S'.
-PENegationNoClose=Missing closing ')' in negation pseudo-class '%1$S'.
-PENegationBadArg=Missing argument in negation pseudo-class '%1$S'.
+PENegationBadInner=Malformed simple selector as negation pseudo-class argument ‘%1$S’.
+PENegationNoClose=Missing closing ‘)’ in negation pseudo-class ‘%1$S’.
+PENegationBadArg=Missing argument in negation pseudo-class ‘%1$S’.
 PEPseudoClassArgEOF=argument to pseudo-class selector
-PEPseudoClassArgNotIdent=Expected identifier for pseudo-class parameter but found '%1$S'.
-PEPseudoClassArgNotNth=Expected part of argument to pseudo-class but found '%1$S'.
-PEPseudoClassNoClose=Missing closing ')' in pseudo-class, found '%1$S' instead.
-PEPseudoClassNoArg=Missing argument in pseudo-class '%1$S'.
-PEPseudoClassNotUserAction=Expected end of selector or a user action pseudo-class after pseudo-element but found pseudo-class '%1$S'.
+PEPseudoClassArgNotIdent=Expected identifier for pseudo-class parameter but found ‘%1$S’.
+PEPseudoClassArgNotNth=Expected part of argument to pseudo-class but found ‘%1$S’.
+PEPseudoClassNoClose=Missing closing ‘)’ in pseudo-class, found ‘%1$S’ instead.
+PEPseudoClassNoArg=Missing argument in pseudo-class ‘%1$S’.
+PEPseudoClassNotUserAction=Expected end of selector or a user action pseudo-class after pseudo-element but found pseudo-class ‘%1$S’.
 PESelectorEOF=selector
-PEBadDeclBlockStart=Expected '{' to begin declaration block but found '%1$S'.
+PEBadDeclBlockStart=Expected ‘{’ to begin declaration block but found ‘%1$S’.
 PEColorEOF=color
-PEColorNotColor=Expected color but found '%1$S'.
+PEColorNotColor=Expected color but found ‘%1$S’.
 PEColorComponentEOF=color component
-PEExpectedPercent=Expected a percentage but found '%1$S'.
-PEExpectedInt=Expected an integer but found '%1$S'.
-PEColorBadRGBContents=Expected number or percentage in rgb() but found '%1$S'.
-PEColorComponentBadTerm=Expected '%2$S' but found '%1$S'.
+PEExpectedPercent=Expected a percentage but found ‘%1$S’.
+PEExpectedInt=Expected an integer but found ‘%1$S’.
+PEColorBadRGBContents=Expected number or percentage in rgb() but found ‘%1$S’.
+PEColorComponentBadTerm=Expected ‘%2$S’ but found ‘%1$S’.
 PEColorHueEOF=hue
-PEExpectedComma=Expected ',' but found '%1$S'.
+PEExpectedComma=Expected ‘,’ but found ‘%1$S’.
 PEColorSaturationEOF=saturation
 PEColorLightnessEOF=lightness
 PEColorOpacityEOF=opacity in color value
-PEExpectedNumber=Expected a number but found '%1$S'.
+PEExpectedNumber=Expected a number but found ‘%1$S’.
 PEPositionEOF=<position>
-PEExpectedPosition=Expected <position> but found '%1$S'.
-PEExpectedRadius=Expected radius but found '%1$S'.
-PEExpectedCloseParen=Expected ')' but found '%1$S'.
-PEDeclEndEOF=';' or '}' to end declaration
-PEParseDeclarationNoColon=Expected ':' but found '%1$S'.
-PEParseDeclarationDeclExpected=Expected declaration but found '%1$S'.
+PEExpectedPosition=Expected <position> but found ‘%1$S’.
+PEExpectedRadius=Expected radius but found ‘%1$S’.
+PEExpectedCloseParen=Expected ‘)’ but found ‘%1$S’.
+PEDeclEndEOF=‘;’ or ‘}’ to end declaration
+PEParseDeclarationNoColon=Expected ‘:’ but found ‘%1$S’.
+PEParseDeclarationDeclExpected=Expected declaration but found ‘%1$S’.
 PEEndOfDeclEOF=end of declaration
 PEImportantEOF=important
-PEExpectedImportant=Expected 'important' but found '%1$S'.
-PEBadDeclEnd=Expected ';' to terminate declaration but found '%1$S'.
-PEBadDeclOrRuleEnd2=Expected ';' or '}' to terminate declaration but found '%1$S'.
+PEExpectedImportant=Expected ‘important’ but found ‘%1$S’.
+PEBadDeclEnd=Expected ‘;’ to terminate declaration but found ‘%1$S’.
+PEBadDeclOrRuleEnd2=Expected ‘;’ or ‘}’ to terminate declaration but found ‘%1$S’.
 PEInaccessibleProperty2=Cannot specify value for internal property.
 PECommentEOF=end of comment
-SEUnterminatedString=Found unclosed string '%1$S'.
-PEFontDescExpected=Expected font descriptor but found '%1$S'.
-PEUnknownFontDesc=Unknown descriptor '%1$S' in @font-face rule.
-PEMQExpectedExpressionStart=Expected '(' to start media query expression but found '%1$S'.
+SEUnterminatedString=Found unclosed string ‘%1$S’.
+PEFontDescExpected=Expected font descriptor but found ‘%1$S’.
+PEUnknownFontDesc=Unknown descriptor ‘%1$S’ in @font-face rule.
+PEMQExpectedExpressionStart=Expected ‘(’ to start media query expression but found ‘%1$S’.
 PEMQExpressionEOF=contents of media query expression
-PEMQExpectedFeatureName=Expected media feature name but found '%1$S'.
-PEMQExpectedFeatureNameEnd=Expected ':' or ')' after media feature name but found '%1$S'.
+PEMQExpectedFeatureName=Expected media feature name but found ‘%1$S’.
+PEMQExpectedFeatureNameEnd=Expected ‘:’ or ‘)’ after media feature name but found ‘%1$S’.
 PEMQNoMinMaxWithoutValue=Media features with min- or max- must have a value.
 PEMQExpectedFeatureValue=Found invalid value for media feature.
-PEBadFontBlockStart=Expected '{' to begin @font-face rule but found '%1$S'.
-PEBadFontBlockEnd=Expected '}' to end @font-face rule but found '%1$S'.
+PEBadFontBlockStart=Expected ‘{’ to begin @font-face rule but found ‘%1$S’.
+PEBadFontBlockEnd=Expected ‘}’ to end @font-face rule but found ‘%1$S’.
 PEAnonBoxNotAlone=Did not expect anonymous box.
 PEFFVUnexpectedEOF=Unexpected end of @font-feature-values rule.
-PEFFVBlockStart=Expected opening { of @font-feature-values rule but found '%1$S'.
-PEFFVValueSetStart=Expected opening { of feature value set but found '%1$S'.
-PEFFVNoFamily=Expected font family list for @font-feature-values rule but found '%1$S'.
-PEFFVUnexpectedBlockEnd=Expected '}' to end @font-feature-values rule but found '%1$S'.
-PEFFVUnknownFontVariantPropValue=Unknown font-variant property value '%1$S'.
-PEFFVExpectedIdent=Expected identifier but found '%1$S'.
-PEFFVExpectedValue=Expected non-negative integer value but found '%1$S'.
-PEFFVTooManyValues=Too many values for feature type '%1$S'.
+PEFFVBlockStart=Expected opening { of @font-feature-values rule but found ‘%1$S’.
+PEFFVValueSetStart=Expected opening { of feature value set but found ‘%1$S’.
+PEFFVNoFamily=Expected font family list for @font-feature-values rule but found ‘%1$S’.
+PEFFVUnexpectedBlockEnd=Expected ‘}’ to end @font-feature-values rule but found ‘%1$S’.
+PEFFVUnknownFontVariantPropValue=Unknown font-variant property value ‘%1$S’.
+PEFFVExpectedIdent=Expected identifier but found ‘%1$S’.
+PEFFVExpectedValue=Expected non-negative integer value but found ‘%1$S’.
+PEFFVTooManyValues=Too many values for feature type ‘%1$S’.
 PEFFVGenericInFamilyList=Family list cannot contain generic font family name.
-PEFFVValueDefinitionTrailing=Expected end of value definition but found '%1$S'.
-PEBadDirValue=Expected 'ltr' or 'rtl' in direction selector but found '%1$S'.
-PESupportsConditionStartEOF2='not', '(', or function
-PESupportsConditionInParensEOF=')'
-PESupportsConditionNotEOF='not'
-PESupportsWhitespaceRequired=Expected whitespace after 'not', 'and', or 'or'.
-PESupportsConditionExpectedOpenParenOrFunction=Expected '(' or function while parsing supports condition but found '%1$S'.
-PESupportsConditionExpectedCloseParen=Expected ')' while parsing supports condition but found '%1$S'.
-PESupportsConditionExpectedStart2=Expected 'not', '(', or function while parsing supports condition but found '%1$S'.
-PESupportsConditionExpectedNot=Expected 'not' while parsing supports condition but found '%1$S'.
-PESupportsGroupRuleStart=Expected '{' to begin @supports rule but found '%1$S'.
+PEFFVValueDefinitionTrailing=Expected end of value definition but found ‘%1$S’.
+PEBadDirValue=Expected ‘ltr’ or ‘rtl’ in direction selector but found ‘%1$S’.
+PESupportsConditionStartEOF2=‘not’, ‘(’, or function
+PESupportsConditionInParensEOF=‘)’
+PESupportsConditionNotEOF=‘not’
+PESupportsWhitespaceRequired=Expected whitespace after ‘not’, ‘and’, or ‘or’.
+PESupportsConditionExpectedOpenParenOrFunction=Expected ‘(’ or function while parsing supports condition but found ‘%1$S’.
+PESupportsConditionExpectedCloseParen=Expected ‘)’ while parsing supports condition but found ‘%1$S’.
+PESupportsConditionExpectedStart2=Expected ‘not’, ‘(’, or function while parsing supports condition but found ‘%1$S’.
+PESupportsConditionExpectedNot=Expected ‘not’ while parsing supports condition but found ‘%1$S’.
+PESupportsGroupRuleStart=Expected ‘{’ to begin @supports rule but found ‘%1$S’.
 PEFilterEOF=filter
-PEExpectedNoneOrURL=Expected 'none' or URL but found '%1$S'.
-PEExpectedNoneOrURLOrFilterFunction=Expected 'none', URL, or filter function but found '%1$S'.
+PEExpectedNoneOrURL=Expected ‘none’ or URL but found ‘%1$S’.
+PEExpectedNoneOrURLOrFilterFunction=Expected ‘none’, URL, or filter function but found ‘%1$S’.
 PEExpectedNonnegativeNP=Expected non-negative number or percentage.
 PEFilterFunctionArgumentsParsingError=Error in parsing arguments for filter function.
 PEVariableEOF=variable
-PEVariableEmpty=Expected variable value but found '%1$S'.
+PEVariableEmpty=Expected variable value but found ‘%1$S’.
 # LOCALIZATION NOTE(PEValueWithVariablesParsingErrorInValue): %1$S is replaced
 # with the property name and %2$S is replaced with the property value.
-PEValueWithVariablesParsingErrorInValue=Error in parsing value for '%1$S' after substituting variables. Generated value was '%2$S'.
-PEValueWithVariablesFallbackInherit=Falling back to 'inherit'.
-PEValueWithVariablesFallbackInitial=Falling back to 'initial'.
+PEValueWithVariablesParsingErrorInValue=Error in parsing value for ‘%1$S’ after substituting variables. Generated value was ‘%2$S’.
+PEValueWithVariablesFallbackInherit=Falling back to ‘inherit’.
+PEValueWithVariablesFallbackInitial=Falling back to ‘initial’.
 PEInvalidVariableReference=Property contained reference to invalid variable.
-PEInvalidVariableTokenFallback=Found invalid token '%1$S' at top level of variable reference fallback.
+PEInvalidVariableTokenFallback=Found invalid token ‘%1$S’ at top level of variable reference fallback.
 PEExpectedVariableNameEOF=identifier for variable name
-PEExpectedVariableName=Expected identifier for variable name but found '%1$S'.
-PEExpectedVariableFallback=Expected variable reference fallback after ','.
-PEExpectedVariableCommaOrCloseParen=Expected ',' or ')' after variable name in variable reference but found '%1$S'.
-PESubgridNotSupported=Support for the 'subgrid' keyword of CSS Grid is not enabled.
+PEExpectedVariableName=Expected identifier for variable name but found ‘%1$S’.
+PEExpectedVariableFallback=Expected variable reference fallback after ‘,’.
+PEExpectedVariableCommaOrCloseParen=Expected ‘,’ or ‘)’ after variable name in variable reference but found ‘%1$S’.
+PESubgridNotSupported=Support for the ‘subgrid’ keyword of CSS Grid is not enabled.
 PEMoreThanOneGridRepeatAutoFillInNameList=Only one repeat(auto-fill, …) is allowed in a name list for a subgrid.
 PEMoreThanOneGridRepeatAutoFillFitInTrackList=Only one repeat(auto-fill, …) or repeat(auto-fit, …) is allowed in a track list.
 PEMoreThanOneGridRepeatTrackSize=Only one track size is allowed inside repeat(auto-fit/auto-fill, …).
--- a/dom/locales/en-US/chrome/layout/layout_errors.properties
+++ b/dom/locales/en-US/chrome/layout/layout_errors.properties
@@ -1,34 +1,34 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-ImageMapRectBoundsError=The "coords" attribute of the <area shape="rect"> tag is not in the "left,top,right,bottom" format.
-ImageMapCircleWrongNumberOfCoords=The "coords" attribute of the <area shape="circle"> tag is not in the "center-x,center-y,radius" format.
-ImageMapCircleNegativeRadius=The "coords" attribute of the <area shape="circle"> tag has a negative radius.
-ImageMapPolyWrongNumberOfCoords=The "coords" attribute of the <area shape="poly"> tag is not in the "x1,y1,x2,y2 …" format.
-ImageMapPolyOddNumberOfCoords=The "coords" attribute of the <area shape="poly"> tag is missing the last "y" coordinate (the correct format is "x1,y1,x2,y2 …").
+ImageMapRectBoundsError=The “coords” attribute of the <area shape="rect"> tag is not in the “left,top,right,bottom” format.
+ImageMapCircleWrongNumberOfCoords=The “coords” attribute of the <area shape="circle"> tag is not in the “center-x,center-y,radius” format.
+ImageMapCircleNegativeRadius=The “coords” attribute of the <area shape="circle"> tag has a negative radius.
+ImageMapPolyWrongNumberOfCoords=The “coords” attribute of the <area shape="poly"> tag is not in the “x1,y1,x2,y2 …” format.
+ImageMapPolyOddNumberOfCoords=The “coords” attribute of the <area shape="poly"> tag is missing the last “y” coordinate (the correct format is “x1,y1,x2,y2 …”).
 
 TablePartRelPosWarning=Relative positioning of table rows and row groups is now supported. This site may need to be updated because it may depend on this feature having no effect.
 ScrollLinkedEffectFound2=This site appears to use a scroll-linked positioning effect. This may not work well with asynchronous panning; see https://developer.mozilla.org/docs/Mozilla/Performance/ScrollLinkedEffects for further details and to join the discussion on related tools and features!
 
 ## LOCALIZATION NOTE(AnimationWarningContentTooLarge):
 ## (%1$S, %2$S) is a pair of integer values of the frame size
 ## (%3$S, %4$S) is a pair of integer values of the viewport size
 ## (%5$S, %6$S) is a pair of integer values of the visual rectangle size
 ## (%7$S) is an integer value
 AnimationWarningContentTooLarge=Animation cannot be run on the compositor because the frame size (%1$S, %2$S) is bigger than the viewport (%3$S, %4$S) or the visual rectangle (%5$S, %6$S) is larger than the maximum allowed value (%7$S)
 ## LOCALIZATION NOTE(AnimationWarningTransformBackfaceVisibilityHidde):
 ## 'backface-visibility: hidden' is a CSS property, don't translate it.
-AnimationWarningTransformBackfaceVisibilityHidden=Animations of 'backface-visibility: hidden' transforms cannot be run on the compositor
+AnimationWarningTransformBackfaceVisibilityHidden=Animations of ‘backface-visibility: hidden’ transforms cannot be run on the compositor
 ## LOCALIZATION NOTE(AnimationWarningTransformPreserve3D):
 ## 'transform-style: preserve-3d' is a CSS property, don't translate it.
-AnimationWarningTransformPreserve3D=Animations of 'transform-style: preserve-3d' transforms cannot be run on the compositor
+AnimationWarningTransformPreserve3D=Animations of ‘transform-style: preserve-3d’ transforms cannot be run on the compositor
 ## LOCALIZATION NOTE(AnimationWarningTransformSVG,
 ##                   AnimationWarningTransformWithGeometricProperties,
 ##                   AnimationWarningTransformFrameInactive,
 ##                   AnimationWarningOpacityFrameInactive):
 ## 'transform' and 'opacity' mean CSS property names, don't translate it.
-AnimationWarningTransformSVG=Animations of 'transform' on elements with SVG transforms cannot be run on the compositor
-AnimationWarningTransformWithGeometricProperties=Animations of 'transform' cannot be run on the compositor when geometric properties are animated on the same element at the same time
-AnimationWarningTransformFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for 'transform' animation
-AnimationWarningOpacityFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for 'opacity' animation
+AnimationWarningTransformSVG=Animations of ‘transform’ on elements with SVG transforms cannot be run on the compositor
+AnimationWarningTransformWithGeometricProperties=Animations of ‘transform’ cannot be run on the compositor when geometric properties are animated on the same element at the same time
+AnimationWarningTransformFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘transform’ animation
+AnimationWarningOpacityFrameInactive=Animation cannot be run on the compositor because the frame was not marked active for ‘opacity’ animation
--- a/dom/locales/en-US/chrome/layout/printing.properties
+++ b/dom/locales/en-US/chrome/layout/printing.properties
@@ -16,17 +16,17 @@ pagenumber=%1$d
 # Place the word %ld where the page number and number of pages should be
 # The first %ld will receive the the page number
 # the second %ld will receive the total number of pages
 pageofpages=%1$d of %2$d
 
 noprinter=No printers available.
 PrintToFile=Print To File
 noPrintFilename.title=Filename is missing
-noPrintFilename.alert=You have selected "Print To File", and the filename is empty!
+noPrintFilename.alert=You have selected “Print To File”, and the filename is empty!
 fileConfirm.exists=%S already exists.\nDo you want to replace it?
 print_error_dialog_title=Printer Error
 printpreview_error_dialog_title=Print Preview Error
 
 # Printing error messages.
 #LOCALIZATION NOTE: Some of these messages come in pairs, one
 # for printing and one for print previewing.  You can remove that
 # distinction in your language by removing the entity with the _PP
--- a/dom/locales/en-US/chrome/layout/xbl.properties
+++ b/dom/locales/en-US/chrome/layout/xbl.properties
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 UnexpectedElement=Unexpected <%1$S> element.
-# LOCALIZATION NOTE: do not localize key="%S" modifiers="%S"
-GTK2Conflict=Key event not available on GTK2: key="%S" modifiers="%S"
-WinConflict=Key event not available on some keyboard layouts: key="%S" modifiers="%S"
-TooDeepBindingRecursion=The XBL binding "%S" is already used by too many ancestor elements; not applying it to prevent infinite recursion.
-CircularExtendsBinding=Extending the XBL binding "%S" with "%S" would lead to it extending itself
+# LOCALIZATION NOTE: do not localize key=“%S” modifiers=“%S”
+GTK2Conflict=Key event not available on GTK2: key=“%S” modifiers=“%S”
+WinConflict=Key event not available on some keyboard layouts: key=“%S” modifiers=“%S”
+TooDeepBindingRecursion=The XBL binding “%S” is already used by too many ancestor elements; not applying it to prevent infinite recursion.
+CircularExtendsBinding=Extending the XBL binding “%S” with “%S” would lead to it extending itself
 # LOCALIZATION NOTE: do not localize <handler command="…">
 CommandNotInChrome=Use of <handler command="…"> not allowed outside chrome.
 MalformedXBL = An XBL file is malformed. Did you forget the XBL namespace on the bindings tag?
-InvalidExtendsBinding=Extending "%S" is invalid. In general, do not extend tag names.
-MissingIdAttr = An "id" attribute missing on the binding tag.
+InvalidExtendsBinding=Extending “%S” is invalid. In general, do not extend tag names.
+MissingIdAttr = An “id” attribute missing on the binding tag.
--- a/dom/locales/en-US/chrome/layout/xul.properties
+++ b/dom/locales/en-US/chrome/layout/xul.properties
@@ -1,8 +1,8 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 MissingOverlay=Failed to load overlay from %1$S.
 PINotInProlog=<?%1$S?> processing instruction does not have any effect outside the prolog anymore (see bug 360119).
 NeededToWrapXUL=XUL box for %1$S element contained an inline %2$S child, forcing all its children to be wrapped in a block.
-NeededToWrapXULInlineBox=XUL box for %1$S element contained an inline %2$S child, forcing all its children to be wrapped in a block.  This can often be fixed by replacing "display: -moz-inline-box" with "display: -moz-inline-box; display: inline-block".
+NeededToWrapXULInlineBox=XUL box for %1$S element contained an inline %2$S child, forcing all its children to be wrapped in a block.  This can often be fixed by replacing “display: -moz-inline-box” with “display: -moz-inline-box; display: inline-block”.
--- a/dom/locales/en-US/chrome/mathml/mathml.properties
+++ b/dom/locales/en-US/chrome/mathml/mathml.properties
@@ -5,13 +5,13 @@
 InvalidChild=Invalid markup: <%1$S> is not allowed as a child of <%2$S>.
 ChildCountIncorrect=Invalid markup: Incorrect number of children for <%1$S/> tag.
 DuplicateMprescripts=Invalid markup: More than one <mprescripts/> in <mmultiscripts/>.
 # LOCALIZATION NOTE:  The first child of <mmultiscript/> is the base, that is the element to which scripts are attached.
 NoBase=Invalid markup: Expected exactly one Base element in <mmultiscripts/>.  Found none.
 SubSupMismatch=Invalid markup: Incomplete subscript/superscript pair in <mmultiscripts/>.
 
 # LOCALIZATION NOTE:  When localizing the single quotes ('), follow the conventions in css.properties for your target locale.
-AttributeParsingError=Error in parsing the value '%1$S' for '%2$S' attribute of <%3$S/>.  Attribute ignored.
-AttributeParsingErrorNoTag=Error in parsing the value '%1$S' for '%2$S' attribute.  Attribute ignored.
-LengthParsingError=Error in parsing MathML attribute value '%1$S' as length.  Attribute ignored.
-DeprecatedSupersededBy='%1$S' is deprecated in MathML 3, superseded by '%2$S'.
+AttributeParsingError=Error in parsing the value ‘%1$S’ for ‘%2$S’ attribute of <%3$S/>.  Attribute ignored.
+AttributeParsingErrorNoTag=Error in parsing the value ‘%1$S’ for ‘%2$S’ attribute.  Attribute ignored.
+LengthParsingError=Error in parsing MathML attribute value ‘%1$S’ as length.  Attribute ignored.
+DeprecatedSupersededBy=‘%1$S’ is deprecated in MathML 3, superseded by ‘%2$S’.
 UnitlessValuesAreDeprecated=Unitless values are deprecated in MathML 3.
--- a/dom/locales/en-US/chrome/netError.dtd
+++ b/dom/locales/en-US/chrome/netError.dtd
@@ -3,17 +3,17 @@
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!ENTITY loadError.label "Page Load Error">
 <!ENTITY retry.label "Try Again">
 
 <!-- Specific error messages -->
 
 <!ENTITY connectionFailure.title "Failed to Connect">
-<!ENTITY connectionFailure.longDesc "<p>Though the site seems valid, the browser was unable to establish a connection.</p><ul><li>Could the site be temporarily unavailable? Try again later.</li><li>Are you unable to browse other sites?  Check the computer's network connection.</li><li>Is your computer or network protected by a firewall or proxy? Incorrect settings can interfere with Web browsing.</li></ul>">
+<!ENTITY connectionFailure.longDesc "<p>Though the site seems valid, the browser was unable to establish a connection.</p><ul><li>Could the site be temporarily unavailable? Try again later.</li><li>Are you unable to browse other sites?  Check the computer’s network connection.</li><li>Is your computer or network protected by a firewall or proxy? Incorrect settings can interfere with Web browsing.</li></ul>">
 
 <!ENTITY deniedPortAccess.title "Port Restricted for Security Reasons">
 <!ENTITY deniedPortAccess.longDesc "<p>The requested address specified a port (e.g. <q>mozilla.org:80</q> for port 80 on mozilla.org) normally used for purposes <em>other</em> than Web browsing. The browser has canceled the request for your protection and security.</p>">
 
 <!ENTITY dnsNotFound.title "Address Not Found">
 <!ENTITY dnsNotFound.longDesc "<p>The browser could not find the host server for the provided address.</p><ul><li>Did you make a mistake when typing the domain? (e.g. <q><strong>ww</strong>.mozilla.org</q> instead of <q><strong>www</strong>.mozilla.org</q>)</li><li>Are you certain this domain address exists?  Its registration may have expired.</li><li>Are you unable to browse other sites?  Check your network connection and DNS server settings.</li><li>Is your computer or network protected by a firewall or proxy?  Incorrect settings can interfere with Web browsing.</li></ul>">
 
 <!ENTITY fileNotFound.title "File Not Found">
@@ -24,20 +24,20 @@
 
 <!ENTITY generic.title "Cannot Complete Request">
 <!ENTITY generic.longDesc "<p>Additional information about this problem or error is currently unavailable.</p>">
 
 <!ENTITY malformedURI.title "Invalid Address">
 <!ENTITY malformedURI.longDesc "<p>The provided address is not in a recognized format. Please check the location bar for mistakes and try again.</p>">
 
 <!ENTITY netInterrupt.title "Data Transfer Interrupted">
-<!ENTITY netInterrupt.longDesc "<p>The browser connected successfully, but the connection was interrupted while transferring information.  Please try again.</p><ul><li>Are you unable to browse other sites? Check the computer's network connection.</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
+<!ENTITY netInterrupt.longDesc "<p>The browser connected successfully, but the connection was interrupted while transferring information.  Please try again.</p><ul><li>Are you unable to browse other sites? Check the computer’s network connection.</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
 
 <!ENTITY notCached.title "Document Expired">
-<!ENTITY notCached.longDesc "<p>The requested document is not available in the browser's cache.</p><ul><li>As a security precaution, the browser does not automatically re-request sensitive documents.</li><li>Click Try Again to re-request the document from the website.</li></ul>">
+<!ENTITY notCached.longDesc "<p>The requested document is not available in the browser’s cache.</p><ul><li>As a security precaution, the browser does not automatically re-request sensitive documents.</li><li>Click Try Again to re-request the document from the website.</li></ul>">
 
 <!ENTITY netOffline.title "Offline Mode">
 <!ENTITY netOffline.longDesc2 "<p>The browser is operating in its offline mode and cannot connect to the requested item.</p><ul><li>Is the computer connected to an active network?</li><li>Press &quot;Try Again&quot; to switch to online mode and reload the page.</li></ul>">
 
 <!ENTITY contentEncodingError.title "Content Encoding Error">
 <!ENTITY contentEncodingError.longDesc "<p>The page you are trying to view cannot be shown because it uses an invalid or unsupported form of compression.</p><ul><li>Please contact the website owners to inform them of this problem.</li></ul>">
 
 <!ENTITY unsafeContentType.title "Unsafe File Type">
@@ -46,39 +46,39 @@
   <li>Please contact the website owners to inform them of this problem.</li>
 </ul>
 ">
 
 <!ENTITY netReset.title "Connection Interrupted">
 <!ENTITY netReset.longDesc "<p>The network link was interrupted while negotiating a connection. Please try again.</p>">
 
 <!ENTITY netTimeout.title "Network Timeout">
-<!ENTITY netTimeout.longDesc "<p>The requested site did not respond to a connection request and the browser has stopped waiting for a reply.</p><ul><li>Could the server be experiencing high demand or a temporary outage?  Try again later.</li><li>Are you unable to browse other sites? Check the computer's network connection.</li><li>Is your computer or network protected by a firewall or proxy?  Incorrect settings can interfere with Web browsing.</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
+<!ENTITY netTimeout.longDesc "<p>The requested site did not respond to a connection request and the browser has stopped waiting for a reply.</p><ul><li>Could the server be experiencing high demand or a temporary outage?  Try again later.</li><li>Are you unable to browse other sites? Check the computer’s network connection.</li><li>Is your computer or network protected by a firewall or proxy?  Incorrect settings can interfere with Web browsing.</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
 
 <!ENTITY unknownProtocolFound.title "Unknown Protocol">
 <!ENTITY unknownProtocolFound.longDesc "<p>The address specifies a protocol (e.g. <q>wxyz://</q>) the browser does not recognize, so the browser cannot properly connect to the site.</p><ul><li>Are you trying to access multimedia or other non-text services? Check the site for extra requirements.</li><li>Some protocols may require third-party software or plugins before the browser can recognize them.</li></ul>">
 
 <!ENTITY proxyConnectFailure.title "Proxy Server Refused Connection">
-<!ENTITY proxyConnectFailure.longDesc "<p>The browser is configured to use a proxy server, but the proxy refused a connection.</p><ul><li>Is the browser's proxy configuration correct? Check the settings and try again.</li><li>Does the proxy service allow connections from this network?</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
+<!ENTITY proxyConnectFailure.longDesc "<p>The browser is configured to use a proxy server, but the proxy refused a connection.</p><ul><li>Is the browser’s proxy configuration correct? Check the settings and try again.</li><li>Does the proxy service allow connections from this network?</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
 
 <!ENTITY proxyResolveFailure.title "Proxy Server Not Found">
-<!ENTITY proxyResolveFailure.longDesc "<p>The browser is configured to use a proxy server, but the proxy could not be found.</p><ul><li>Is the browser's proxy configuration correct? Check the settings and try again.</li><li>Is the computer connected to an active network?</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
+<!ENTITY proxyResolveFailure.longDesc "<p>The browser is configured to use a proxy server, but the proxy could not be found.</p><ul><li>Is the browser’s proxy configuration correct? Check the settings and try again.</li><li>Is the computer connected to an active network?</li><li>Still having trouble? Consult your network administrator or Internet provider for assistance.</li></ul>">
 
 <!ENTITY redirectLoop.title "Redirect Loop">
-<!ENTITY redirectLoop.longDesc "<p>The browser has stopped trying to retrieve the requested item. The site is redirecting the request in a way that will never complete.</p><ul><li>Have you disabled or blocked cookies required by this site?</li><li><em>NOTE</em>: If accepting the site's cookies does not resolve the problem, it is likely a server configuration issue and not your computer.</li></ul>">
+<!ENTITY redirectLoop.longDesc "<p>The browser has stopped trying to retrieve the requested item. The site is redirecting the request in a way that will never complete.</p><ul><li>Have you disabled or blocked cookies required by this site?</li><li><em>NOTE</em>: If accepting the site’s cookies does not resolve the problem, it is likely a server configuration issue and not your computer.</li></ul>">
 
 <!ENTITY unknownSocketType.title "Incorrect Response">
 <!ENTITY unknownSocketType.longDesc "<p>The site responded to the network request in an unexpected way and the browser cannot continue.</p>">
 
 <!ENTITY nssFailure2.title "Secure Connection Failed">
 <!ENTITY nssFailure2.longDesc2 "<p>The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.</p><ul><li>Please contact the website owners to inform them of this problem.</li></ul>">
 
 <!ENTITY nssBadCert.title "Secure Connection Failed">
 <!ENTITY nssBadCert.longDesc2 "<ul>
-<li>This could be a problem with the server's configuration, or it could be someone trying to impersonate the server.</li>
+<li>This could be a problem with the server’s configuration, or it could be someone trying to impersonate the server.</li>
 <li>If you have connected to this server successfully in the past, the error may be temporary, and you can try again later.</li>
 </ul>
 ">
 
 <!ENTITY securityOverride.linkText "Or you can add an exception…">
 <!ENTITY securityOverride.warningContent "
 <p>You should not add an exception if you are using an internet connection that you do not trust completely or if you are not used to seeing a warning for this server.</p>
 <p>If you still wish to add an exception for this site, you can do so in your advanced encryption settings.</p>
--- a/dom/locales/en-US/chrome/nsWebBrowserPersist.properties
+++ b/dom/locales/en-US/chrome/nsWebBrowserPersist.properties
@@ -8,10 +8,10 @@ launchError=%S could not be opened, beca
 diskFull=There is not enough room on the disk to save %S.\n\nRemove unnecessary files from the disk and try again, or try saving in a different location.
 readOnly=%S could not be saved, because the disk, folder, or file is write-protected.\n\nWrite-enable the disk and try again, or try saving in a different location.
 accessError=%S could not be saved, because you cannot change the contents of that folder.\n\nChange the folder properties and try again, or try saving in a different location.
 SDAccessErrorCardReadOnly=Cannot download file because the SD card is in use.
 SDAccessErrorCardMissing=Cannot download file because the SD card is missing.
 helperAppNotFound=%S could not be opened, because the associated helper application does not exist. Change the association in your preferences.
 noMemory=There is not sufficient memory to complete the action you requested.\n\nQuit some applications and try again.
 title=Downloading %S
-fileAlreadyExistsError=%S could not be saved, because a file already exists with the same name as the '_files' directory.\n\nTry saving to a different location.
+fileAlreadyExistsError=%S could not be saved, because a file already exists with the same name as the ‘_files’ directory.\n\nTry saving to a different location.
 fileNameTooLongError=%S could not be saved, because the file name was too long.\n\nTry saving with a shorter file name.
--- a/dom/locales/en-US/chrome/security/caps.properties
+++ b/dom/locales/en-US/chrome/security/caps.properties
@@ -105,9 +105,9 @@ CallMethodDeniedOriginsObjectDomain = Pe
 #      don't translate "document.domain".
 CallMethodDeniedOriginsSubjectDomainObjectDomain = Permission denied for <%1$S> (document.domain=<%5$S>) to call method %2$S.%3$S on <%4$S> (document.domain=<%6$S>).
 
 GetPropertyDeniedOriginsOnlySubject = Permission denied for <%S> to get property %S.%S
 SetPropertyDeniedOriginsOnlySubject = Permission denied for <%S> to set property %S.%S
 CallMethodDeniedOriginsOnlySubject = Permission denied for <%S> to call method %S.%S
 CreateWrapperDenied = Permission denied to create wrapper for object of class %S
 CreateWrapperDeniedForOrigin = Permission denied for <%2$S> to create wrapper for object of class %1$S
-ProtocolFlagError = Warning: Protocol handler for '%S' doesn't advertise a security policy.  While loading of such protocols is allowed for now, this is deprecated.  Please see the documentation in nsIProtocolHandler.idl.
+ProtocolFlagError = Warning: Protocol handler for ‘%S’ doesn’t advertise a security policy.  While loading of such protocols is allowed for now, this is deprecated.  Please see the documentation in nsIProtocolHandler.idl.
--- a/dom/locales/en-US/chrome/security/csp.properties
+++ b/dom/locales/en-US/chrome/security/csp.properties
@@ -1,49 +1,49 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # CSP Warnings:
 # LOCALIZATION NOTE (CSPViolation):
 # %1$S is the reason why the resource has not been loaded.
-CSPViolation = The page's settings blocked the loading of a resource: %1$S
+CSPViolation = The page’s settings blocked the loading of a resource: %1$S
 # LOCALIZATION NOTE (CSPViolationWithURI):
 # %1$S is the directive that has been violated.
 # %2$S is the URI of the resource which violated the directive.
-CSPViolationWithURI = The page's settings blocked the loading of a resource at %2$S ("%1$S").
+CSPViolationWithURI = The page’s settings blocked the loading of a resource at %2$S (“%1$S”).
 # LOCALIZATION NOTE (CSPROViolation):
 # %1$S is the reason why the resource has not been loaded.
-CSPROViolation = A violation occurred for a report-only CSP policy ("%1$S"). The behavior was allowed, and a CSP report was sent.
+CSPROViolation = A violation occurred for a report-only CSP policy (“%1$S”). The behavior was allowed, and a CSP report was sent.
 # LOCALIZATION NOTE (CSPROViolationWithURI):
 # %1$S is the directive that has been violated.
 # %2$S is the URI of the resource which violated the directive.
-CSPROViolationWithURI = The page's settings observed the loading of a resource at %2$S ("%1$S"). A CSP report is being sent.
+CSPROViolationWithURI = The page’s settings observed the loading of a resource at %2$S (“%1$S”). A CSP report is being sent.
 # LOCALIZATION NOTE (triedToSendReport):
 # %1$S is the URI we attempted to send a report to.
-triedToSendReport = Tried to send report to invalid URI: "%1$S"
+triedToSendReport = Tried to send report to invalid URI: “%1$S”
 # LOCALIZATION NOTE (couldNotParseReportURI):
 # %1$S is the report URI that could not be parsed
-couldNotParseReportURI = couldn't parse report URI: %1$S
+couldNotParseReportURI = couldn’t parse report URI: %1$S
 # LOCALIZATION NOTE (couldNotProcessUnknownDirective):
 # %1$S is the unknown directive
-couldNotProcessUnknownDirective = Couldn't process unknown directive '%1$S'
+couldNotProcessUnknownDirective = Couldn’t process unknown directive ‘%1$S’
 # LOCALIZATION NOTE (ignoringUnknownOption):
 # %1$S is the option that could not be understood
 ignoringUnknownOption = Ignoring unknown option %1$S
 # LOCALIZATION NOTE (ignoringDuplicateSrc):
 # %1$S defines the duplicate src
 ignoringDuplicateSrc = Ignoring duplicate source %1$S
 # LOCALIZATION NOTE (ignoringSrcFromMetaCSP):
 # %1$S defines the ignored src
-ignoringSrcFromMetaCSP = Ignoring source '%1$S' (Not supported when delivered via meta element).
+ignoringSrcFromMetaCSP = Ignoring source ‘%1$S’ (Not supported when delivered via meta element).
 # LOCALIZATION NOTE (ignoringSrcWithinScriptStyleSrc):
 # %1$S is the ignored src
 # script-src and style-src are directive names and should not be localized
-ignoringSrcWithinScriptStyleSrc = Ignoring "%1$S" within script-src or style-src: nonce-source or hash-source specified
+ignoringSrcWithinScriptStyleSrc = Ignoring “%1$S” within script-src or style-src: nonce-source or hash-source specified
 # LOCALIZATION NOTE (reportURInotHttpsOrHttp2):
 # %1$S is the ETLD of the report URI that is not HTTP or HTTPS
 reportURInotHttpsOrHttp2 = The report URI (%1$S) should be an HTTP or HTTPS URI.
 # LOCALIZATION NOTE (reportURInotInReportOnlyHeader):
 # %1$S is the ETLD of the page with the policy
 reportURInotInReportOnlyHeader = This site (%1$S) has a Report-Only policy without a report URI. CSP will not block and cannot report violations of this policy.
 # LOCALIZATION NOTE (failedToParseUnrecognizedSource):
 # %1$S is the CSP Source that could not be parsed
@@ -54,40 +54,40 @@ inlineScriptBlocked = An attempt to exec
 # LOCALIZATION NOTE (inlineStyleBlocked):
 # inline style refers to CSS code that is embedded into the HTML document.
 inlineStyleBlocked = An attempt to apply inline style sheets has been blocked
 # LOCALIZATION NOTE (scriptFromStringBlocked):
 # eval is a name and should not be localized.
 scriptFromStringBlocked = An attempt to call JavaScript from a string (by calling a function like eval) has been blocked
 # LOCALIZATION NOTE (upgradeInsecureRequest):
 # %1$S is the URL of the upgraded request; %2$S is the upgraded scheme.
-upgradeInsecureRequest = Upgrading insecure request '%1$S' to use '%2$S'
+upgradeInsecureRequest = Upgrading insecure request ‘%1$S’ to use ‘%2$S’
 # LOCALIZATION NOTE (ignoreSrcForDirective):
-ignoreSrcForDirective = Ignoring srcs for directive '%1$S'
+ignoreSrcForDirective = Ignoring srcs for directive ‘%1$S’
 # LOCALIZATION NOTE (hostNameMightBeKeyword):
 # %1$S is the hostname in question and %2$S is the keyword
-hostNameMightBeKeyword = Interpreting %1$S as a hostname, not a keyword. If you intended this to be a keyword, use '%2$S' (wrapped in single quotes).
+hostNameMightBeKeyword = Interpreting %1$S as a hostname, not a keyword. If you intended this to be a keyword, use ‘%2$S’ (wrapped in single quotes).
 # LOCALIZATION NOTE (notSupportingDirective):
 # directive is not supported (e.g. 'reflected-xss')
-notSupportingDirective = Not supporting directive '%1$S'. Directive and values will be ignored.
+notSupportingDirective = Not supporting directive ‘%1$S’. Directive and values will be ignored.
 # LOCALIZATION NOTE (blockAllMixedContent):
 # %1$S is the URL of the blocked resource load.
-blockAllMixedContent = Blocking insecure request '%1$S'.
+blockAllMixedContent = Blocking insecure request ‘%1$S’.
 
 # CSP Errors:
 # LOCALIZATION NOTE (couldntParseInvalidSource):
 # %1$S is the source that could not be parsed
-couldntParseInvalidSource = Couldn't parse invalid source %1$S
+couldntParseInvalidSource = Couldn’t parse invalid source %1$S
 # LOCALIZATION NOTE (couldntParseInvalidHost):
 # %1$S is the host that's invalid
-couldntParseInvalidHost = Couldn't parse invalid host %1$S
+couldntParseInvalidHost = Couldn’t parse invalid host %1$S
 # LOCALIZATION NOTE (couldntParseScheme):
 # %1$S is the string source
-couldntParseScheme = Couldn't parse scheme in %1$S
+couldntParseScheme = Couldn’t parse scheme in %1$S
 # LOCALIZATION NOTE (couldntParsePort):
 # %1$S is the string source
-couldntParsePort = Couldn't parse port in %1$S
+couldntParsePort = Couldn’t parse port in %1$S
 # LOCALIZATION NOTE (duplicateDirective):
 # %1$S is the name of the duplicate directive
 duplicateDirective = Duplicate %1$S directives detected.  All but the first instance will be ignored.
 # LOCALIZATION NOTE (deprecatedDirective):
 # %1$S is the name of the deprecated directive, %2$S is the name of the replacement.
-deprecatedDirective = Directive '%1$S' has been deprecated. Please use directive '%2$S' instead.
+deprecatedDirective = Directive ‘%1$S’ has been deprecated. Please use directive ‘%2$S’ instead.
--- a/dom/locales/en-US/chrome/security/security.properties
+++ b/dom/locales/en-US/chrome/security/security.properties
@@ -1,74 +1,74 @@
 # Mixed Content Blocker
 # LOCALIZATION NOTE: "%1$S" is the URI of the blocked mixed content resource
-BlockMixedDisplayContent = Blocked loading mixed display content "%1$S"
-BlockMixedActiveContent = Blocked loading mixed active content "%1$S"
+BlockMixedDisplayContent = Blocked loading mixed display content “%1$S”
+BlockMixedActiveContent = Blocked loading mixed active content “%1$S”
 
 # CORS
 # LOCALIZATION NOTE: Do not translate "Access-Control-Allow-Origin", Access-Control-Allow-Credentials, Access-Control-Allow-Methods, Access-Control-Allow-Headers
 CORSDisabled=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS disabled).
 CORSRequestNotHttp=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS request not http).
-CORSMissingAllowOrigin=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS header 'Access-Control-Allow-Origin' missing).
-CORSAllowOriginNotMatchingOrigin=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS header 'Access-Control-Allow-Origin' does not match '%2$S').
-CORSMethodNotFound=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: Did not find method in CORS header 'Access-Control-Allow-Methods').
-CORSMissingAllowCredentials=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: expected 'true' in CORS header 'Access-Control-Allow-Credentials').
+CORSMissingAllowOrigin=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).
+CORSAllowOriginNotMatchingOrigin=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘%2$S’).
+CORSMethodNotFound=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: Did not find method in CORS header ‘Access-Control-Allow-Methods’).
+CORSMissingAllowCredentials=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: expected ‘true’ in CORS header ‘Access-Control-Allow-Credentials’).
 CORSPreflightDidNotSucceed=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: CORS preflight channel did not succeed).
-CORSInvalidAllowMethod=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: invalid token '%2$S' in CORS header 'Access-Control-Allow-Methods').
-CORSInvalidAllowHeader=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: invalid token '%2$S' in CORS header 'Access-Control-Allow-Headers').
-CORSMissingAllowHeaderFromPreflight=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: missing token '%2$S' in CORS header 'Access-Control-Allow-Headers' from CORS preflight channel).
+CORSInvalidAllowMethod=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: invalid token ‘%2$S’ in CORS header ‘Access-Control-Allow-Methods’).
+CORSInvalidAllowHeader=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: invalid token ‘%2$S’ in CORS header ‘Access-Control-Allow-Headers’).
+CORSMissingAllowHeaderFromPreflight=Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at %1$S. (Reason: missing token ‘%2$S’ in CORS header ‘Access-Control-Allow-Headers’ from CORS preflight channel).
 
 # LOCALIZATION NOTE: Do not translate "Strict-Transport-Security", "HSTS", "max-age" or "includeSubDomains"
 STSUnknownError=Strict-Transport-Security: An unknown error occurred processing the header specified by the site.
 STSUntrustworthyConnection=Strict-Transport-Security: The connection to the site is untrustworthy, so the specified header was ignored.
 STSCouldNotParseHeader=Strict-Transport-Security: The site specified a header that could not be parsed successfully.
-STSNoMaxAge=Strict-Transport-Security: The site specified a header that did not include a 'max-age' directive.
-STSMultipleMaxAges=Strict-Transport-Security: The site specified a header that included multiple 'max-age' directives.
-STSInvalidMaxAge=Strict-Transport-Security: The site specified a header that included an invalid 'max-age' directive.
-STSMultipleIncludeSubdomains=Strict-Transport-Security: The site specified a header that included multiple 'includeSubDomains' directives.
-STSInvalidIncludeSubdomains=Strict-Transport-Security: The site specified a header that included an invalid 'includeSubDomains' directive.
+STSNoMaxAge=Strict-Transport-Security: The site specified a header that did not include a ‘max-age’ directive.
+STSMultipleMaxAges=Strict-Transport-Security: The site specified a header that included multiple ‘max-age’ directives.
+STSInvalidMaxAge=Strict-Transport-Security: The site specified a header that included an invalid ‘max-age’ directive.
+STSMultipleIncludeSubdomains=Strict-Transport-Security: The site specified a header that included multiple ‘includeSubDomains’ directives.
+STSInvalidIncludeSubdomains=Strict-Transport-Security: The site specified a header that included an invalid ‘includeSubDomains’ directive.
 STSCouldNotSaveState=Strict-Transport-Security: An error occurred noting the site as a Strict-Transport-Security host.
 
 # LOCALIZATION NOTE: Do not translate "Public-Key-Pins", "HPKP", "max-age", "report-uri" or "includeSubDomains"
 PKPUnknownError=Public-Key-Pins: An unknown error occurred processing the header specified by the site.
 PKPUntrustworthyConnection=Public-Key-Pins: The connection to the site is untrustworthy, so the specified header was ignored.
 PKPCouldNotParseHeader=Public-Key-Pins: The site specified a header that could not be parsed successfully.
-PKPNoMaxAge=Public-Key-Pins: The site specified a header that did not include a 'max-age' directive.
-PKPMultipleMaxAges=Public-Key-Pins: The site specified a header that included multiple 'max-age' directives.
-PKPInvalidMaxAge=Public-Key-Pins: The site specified a header that included an invalid 'max-age' directive.
-PKPMultipleIncludeSubdomains=Public-Key-Pins: The site specified a header that included multiple 'includeSubDomains' directives.
-PKPInvalidIncludeSubdomains=Public-Key-Pins: The site specified a header that included an invalid 'includeSubDomains' directive.
+PKPNoMaxAge=Public-Key-Pins: The site specified a header that did not include a ‘max-age’ directive.
+PKPMultipleMaxAges=Public-Key-Pins: The site specified a header that included multiple ‘max-age’ directives.
+PKPInvalidMaxAge=Public-Key-Pins: The site specified a header that included an invalid ‘max-age’ directive.
+PKPMultipleIncludeSubdomains=Public-Key-Pins: The site specified a header that included multiple ‘includeSubDomains’ directives.
+PKPInvalidIncludeSubdomains=Public-Key-Pins: The site specified a header that included an invalid ‘includeSubDomains’ directive.
 PKPInvalidPin=Public-Key-Pins: The site specified a header that included an invalid pin.
-PKPMultipleReportURIs=Public-Key-Pins: The site specified a header that included multiple 'report-uri' directives.
+PKPMultipleReportURIs=Public-Key-Pins: The site specified a header that included multiple ‘report-uri’ directives.
 PKPPinsetDoesNotMatch=Public-Key-Pins: The site specified a header that did not include a matching pin.
 PKPNoBackupPin=Public-Key-Pins: The site specified a header that did not include a backup pin.
 PKPCouldNotSaveState=Public-Key-Pins: An error occurred noting the site as a Public-Key-Pins host.
 PKPRootNotBuiltIn=Public-Key-Pins: The certificate used by the site was not issued by a certificate in the default root certificate store. To prevent accidental breakage, the specified header was ignored.
 
 # LOCALIZATION NOTE: Do not translate "SHA-1"
-SHA1Sig=This site makes use of a SHA-1 Certificate; it's recommended you use certificates with signature algorithms that use hash functions stronger than SHA-1.
+SHA1Sig=This site makes use of a SHA-1 Certificate; it’s recommended you use certificates with signature algorithms that use hash functions stronger than SHA-1.
 InsecurePasswordsPresentOnPage=Password fields present on an insecure (http://) page. This is a security risk that allows user login credentials to be stolen.
 InsecureFormActionPasswordsPresent=Password fields present in a form with an insecure (http://) form action. This is a security risk that allows user login credentials to be stolen.
 InsecurePasswordsPresentOnIframe=Password fields present on an insecure (http://) iframe. This is a security risk that allows user login credentials to be stolen.
 # LOCALIZATION NOTE: "%1$S" is the URI of the insecure mixed content resource
-LoadingMixedActiveContent2=Loading mixed (insecure) active content "%1$S" on a secure page
-LoadingMixedDisplayContent2=Loading mixed (insecure) display content "%1$S" on a secure page
+LoadingMixedActiveContent2=Loading mixed (insecure) active content “%1$S” on a secure page
+LoadingMixedDisplayContent2=Loading mixed (insecure) display content “%1$S” on a secure page
 # LOCALIZATION NOTE: Do not translate "allow-scripts", "allow-same-origin", "sandbox" or "iframe"
 BothAllowScriptsAndSameOriginPresent=An iframe which has both allow-scripts and allow-same-origin for its sandbox attribute can remove its sandboxing.
 
 # Sub-Resource Integrity
 # LOCALIZATION NOTE: Do not translate "script" or "integrity". "%1$S" is the invalid token found in the attribute.
-MalformedIntegrityHash=The script element has a malformed hash in its integrity attribute: "%1$S". The correct format is "<hash algorithm>-<hash value>".
+MalformedIntegrityHash=The script element has a malformed hash in its integrity attribute: “%1$S”. The correct format is “<hash algorithm>-<hash value>”.
 # LOCALIZATION NOTE: Do not translate "integrity"
 InvalidIntegrityLength=The hash contained in the integrity attribute has the wrong length.
 # LOCALIZATION NOTE: Do not translate "integrity"
 InvalidIntegrityBase64=The hash contained in the integrity attribute could not be decoded.
 # LOCALIZATION NOTE: Do not translate "integrity". "%1$S" is the type of hash algorigthm in use (e.g. "sha256").
-IntegrityMismatch=None of the "%1$S" hashes in the integrity attribute match the content of the subresource.
+IntegrityMismatch=None of the “%1$S” hashes in the integrity attribute match the content of the subresource.
 # LOCALIZATION NOTE: "%1$S" is the URI of the sub-resource that cannot be protected using SRI.
-IneligibleResource="%1$S" is not eligible for integrity checks since it's neither CORS-enabled nor same-origin.
+IneligibleResource=“%1$S” is not eligible for integrity checks since it’s neither CORS-enabled nor same-origin.
 # LOCALIZATION NOTE: Do not translate "integrity". "%1$S" is the invalid hash algorithm found in the attribute.
-UnsupportedHashAlg=Unsupported hash algorithm in the integrity attribute: "%1$S"
+UnsupportedHashAlg=Unsupported hash algorithm in the integrity attribute: “%1$S”
 # LOCALIZATION NOTE: Do not translate "integrity"
 NoValidMetadata=The integrity attribute does not contain any valid metadata.
 
 # LOCALIZATION NOTE: Do not translate "RC4".
 WeakCipherSuiteWarning=This site uses the cipher RC4 for encryption, which is deprecated and insecure.
--- a/dom/locales/en-US/chrome/xslt/xslt.properties
+++ b/dom/locales/en-US/chrome/xslt/xslt.properties
@@ -11,26 +11,26 @@ 6  = XSLT Stylesheet (possibly) contains
 7  = Attribute value illegal in XSLT 1.0.
 8  = An XPath expression was expected to return a NodeSet.
 9  = XSLT transformation was terminated by <xsl:message>.
 10 = A network error occurred loading an XSLT stylesheet:
 11 = An XSLT stylesheet does not have an XML mimetype:
 12 = An XSLT stylesheet directly or indirectly imports or includes itself:
 13 = An XPath function was called with the wrong number of arguments.
 14 = An unknown XPath extension function was called.
-15 = XPath parse failure: ')' expected:
+15 = XPath parse failure: ‘)’ expected:
 16 = XPath parse failure: invalid axis:
 17 = XPath parse failure: Name or Nodetype test expected:
-18 = XPath parse failure: ']' expected:
+18 = XPath parse failure: ‘]’ expected:
 19 = XPath parse failure: invalid variable name:
 20 = XPath parse failure: unexpected end of expression:
 21 = XPath parse failure: operator expected:
 22 = XPath parse failure: unclosed literal:
-23 = XPath parse failure: ':' unexpected:
-24 = XPath parse failure: '!' unexpected, negation is not():
+23 = XPath parse failure: ‘:’ unexpected:
+24 = XPath parse failure: ‘!’ unexpected, negation is not():
 25 = XPath parse failure: illegal character found:
 26 = XPath parse failure: binary operator expected:
 27 = An XSLT stylesheet load was blocked for security reasons.
 28 = Evaluating an invalid expression.
 29 = Unbalanced curly brace.
 30 = Creating an element with an invalid QName.
 31 = Variable binding shadows variable binding within the same template.
 32 = Call to the key function not allowed.
--- a/dom/manifest/test/test_ManifestProcessor_warnings.html
+++ b/dom/manifest/test/test_ManifestProcessor_warnings.html
@@ -54,17 +54,17 @@ ConsoleAPI.prototype.warn = function(aWa
       start_url: 'https://www.mozilla.org',
     }),
     warning: 'The start URL must be same origin as document.',
   },
   {
     func: () => data.jsonText = JSON.stringify({
       start_url: 42,
     }),
-    warning: 'Expected the manifest\'s start_url member to be a string.',
+    warning: 'Expected the manifest\u2019s start_url member to be a string.',
   },
   {
     func: () => data.jsonText = JSON.stringify({
       theme_color: '42',
     }),
     warning: 'theme_color: 42 is not a valid CSS color.',
   },
   {
--- a/layout/style/test/test_bug413958.html
+++ b/layout/style/test/test_bug413958.html
@@ -35,29 +35,29 @@ var tests = [
   },
   function() {
     var s = document.getElementById("setStyleProp").style;
     s.width = "200";
     s.color = "black";
   },
 ];
 var results = [
-  [ { errorMessage: /Unknown property 'nosuchprop'/,
+  [ { errorMessage: /Unknown property \u2018nosuchprop\u2019/,
       lineNumber: 1, columnNumber: 14,
       sourceLine: "#s1{nosuchprop:auto; color:black}" },
-    { errorMessage: /Unknown property 'nosuchprop'/,
+    { errorMessage: /Unknown property \u2018nosuchprop\u2019/,
       lineNumber: 2, columnNumber: 14, sourceLine:
       "#s2{nosuchprop:auto; color:black}invalid?sel{}#s3{color:black}" },
     { errorMessage: /Ruleset ignored due to bad selector/,
       lineNumber: 2, columnNumber: 40, sourceLine:
       "#s2{nosuchprop:auto; color:black}invalid?sel{}#s3{color:black}" } ],
-  [ { errorMessage: /parsing value for 'width'/,
+  [ { errorMessage: /parsing value for \u2018width\u2019/,
       lineNumber: 0, columnNumber: 6,
       sourceLine: "width:200;color:black" } ],
-  [ { errorMessage: /parsing value for 'width'/,
+  [ { errorMessage: /parsing value for \u2018width\u2019/,
       lineNumber: 0, columnNumber: 0,
       sourceLine: "200" } ],
 ];
 var curTest = -1;
 
 function doTest() {
   if (++curTest == tests.length) {
     var ss = document.getElementsByTagName("span");
--- a/layout/style/test/test_parser_diagnostics_unprintables.html
+++ b/layout/style/test/test_parser_diagnostics_unprintables.html
@@ -21,36 +21,36 @@
 // There is one "pattern" for each code path through the error reporter
 // that might need to escape some kind of user-supplied text.
 // Each "pattern" is tested once with each of the "substitution"s below:
 // <t>, <i>, and <s> are replaced by the t:, i:, and s: fields of
 // each substitution object in turn.
 const patterns = [
   // REPORT_UNEXPECTED_P (only ever used in contexts where identifier-like
   // escaping is appropriate)
-  { i: "<t>|x{}",                 o: "prefix '<i>'" },
+  { i: "<t>|x{}",                 o: "prefix \u2018<i>\u2019" },
   // REPORT_UNEXPECTED_TOKEN with:
   // _Ident
-  { i: "@namespace fnord <t>;",    o: "within @namespace: '<i>'" },
+  { i: "@namespace fnord <t>;",    o: "within @namespace: \u2018<i>\u2019" },
   // _Ref
-  { i: "@namespace fnord #<t>;",   o: "within @namespace: '#<i>'" },
+  { i: "@namespace fnord #<t>;",   o: "within @namespace: \u2018#<i>\u2019" },
   // _Function
-  { i: "@namespace fnord <t>();",  o: "within @namespace: '<i>('" },
+  { i: "@namespace fnord <t>();",  o: "within @namespace: \u2018<i>(\u2019" },
   // _Dimension
-  { i: "@namespace fnord 14<t>;",  o: "within @namespace: '14<i>'" },
+  { i: "@namespace fnord 14<t>;",  o: "within @namespace: \u201814<i>\u2019" },
   // _AtKeyword
-  { i: "x{@<t>: }",        o: "declaration but found '@<i>'." },
+  { i: "x{@<t>: }",        o: "declaration but found \u2018@<i>\u2019." },
   // _String
-  { i: "x{ '<t>'}" ,       o: "declaration but found ''<s>''." },
+  { i: "x{ '<t>'}" ,       o: "declaration but found \u2018'<s>'\u2019." },
   // _Bad_String
-  { i: "x{ '<t>\n}",      o: "declaration but found ''<s>'." },
+  { i: "x{ '<t>\n}",      o: "declaration but found \u2018'<s>\u2019." },
   // _URL
-  { i: "x{ url('<t>')}",   o: "declaration but found 'url('<s>')'." },
+  { i: "x{ url('<t>')}",   o: "declaration but found \u2018url('<s>')\u2019." },
   // _Bad_URL
-  { i: "x{ url('<t>'.)}" , o: "declaration but found 'url('<s>''." }
+  { i: "x{ url('<t>'.)}" , o: "declaration but found \u2018url('<s>'\u2019." }
 ];
 
 // Blocks of characters to test, and how they should be escaped when
 // they appear in identifiers and string constants.
 const substitutions = [
   // ASCII printables that _can_ normally appear in identifiers,
   // so should of course _not_ be escaped.
   { t: "-_0123456789",               i: "-_0123456789",
--- a/netwerk/locales/en-US/necko.properties
+++ b/netwerk/locales/en-US/necko.properties
@@ -28,21 +28,21 @@ RepostFormData=This web page is being re
 DirTitle=Index of %1$S
 DirGoUp=Up to higher level directory
 ShowHidden=Show hidden objects
 DirColName=Name
 DirColSize=Size
 DirColMTime=Last Modified
 DirFileLabel=File: 
 
-PhishingAuth=You are about to visit "%1$S". This site may be attempting to trick you into thinking you are visiting a different site. Use extreme caution.
+PhishingAuth=You are about to visit “%1$S”. This site may be attempting to trick you into thinking you are visiting a different site. Use extreme caution.
 PhishingAuthAccept=I understand and will be very careful
-SuperfluousAuth=You are about to log in to the site "%1$S" with the username "%2$S", but the website does not require authentication. This may be an attempt to trick you.\n\nIs "%1$S" the site you want to visit?
-AutomaticAuth=You are about to log in to the site "%1$S" with the username "%2$S".
+SuperfluousAuth=You are about to log in to the site “%1$S” with the username “%2$S”, but the website does not require authentication. This may be an attempt to trick you.\n\nIs “%1$S” the site you want to visit?
+AutomaticAuth=You are about to log in to the site “%1$S” with the username “%2$S”.
 
-TrackingUriBlocked=The resource at "%1$S" was blocked because tracking protection is enabled.
+TrackingUriBlocked=The resource at “%1$S” was blocked because tracking protection is enabled.
 
 # LOCALIZATION NOTE (APIDeprecationWarning):
 # %1$S is the deprected API; %2$S is the API function that should be used.
-APIDeprecationWarning=Warning: '%1$S' deprecated, please use '%2$S'
+APIDeprecationWarning=Warning: ‘%1$S’ deprecated, please use ‘%2$S’
 
 # LOCALIZATION NOTE (nsICookieManagerRemoveDeprecated): don't localize nsICookieManager.remove() and originAttributes.
 nsICookieManagerRemoveDeprecated=“nsICookieManager.remove()” is changed. Update your code and pass the correct originAttributes. Read more on MDN: https://developer.mozilla.org/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsICookieManager
--- a/security/manager/locales/en-US/chrome/pipnss/nsserrors.properties
+++ b/security/manager/locales/en-US/chrome/pipnss/nsserrors.properties
@@ -1,23 +1,23 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 SSL_ERROR_EXPORT_ONLY_SERVER=Unable to communicate securely. Peer does not support high-grade encryption.
 SSL_ERROR_US_ONLY_SERVER=Unable to communicate securely. Peer requires high-grade encryption which is not supported.
 SSL_ERROR_NO_CYPHER_OVERLAP=Cannot communicate securely with peer: no common encryption algorithm(s).
 SSL_ERROR_NO_CERTIFICATE=Unable to find the certificate or key necessary for authentication.
-SSL_ERROR_BAD_CERTIFICATE=Unable to communicate securely with peer: peers's certificate was rejected.
+SSL_ERROR_BAD_CERTIFICATE=Unable to communicate securely with peer: peers’s certificate was rejected.
 SSL_ERROR_BAD_CLIENT=The server has encountered bad data from the client.
 SSL_ERROR_BAD_SERVER=The client has encountered bad data from the server.
 SSL_ERROR_UNSUPPORTED_CERTIFICATE_TYPE=Unsupported certificate type.
 SSL_ERROR_UNSUPPORTED_VERSION=Peer using unsupported version of security protocol.
 SSL_ERROR_WRONG_CERTIFICATE=Client authentication failed: private key in key database does not match public key in certificate database.
-SSL_ERROR_BAD_CERT_DOMAIN=Unable to communicate securely with peer: requested domain name does not match the server's certificate.
+SSL_ERROR_BAD_CERT_DOMAIN=Unable to communicate securely with peer: requested domain name does not match the server’s certificate.
 SSL_ERROR_POST_WARNING=Unrecognized SSL error code.
 SSL_ERROR_SSL2_DISABLED=Peer only supports SSL version 2, which is locally disabled.
 SSL_ERROR_BAD_MAC_READ=SSL received a record with an incorrect Message Authentication Code.
 SSL_ERROR_BAD_MAC_ALERT=SSL peer reports incorrect Message Authentication Code.
 SSL_ERROR_BAD_CERT_ALERT=SSL peer cannot verify your certificate.
 SSL_ERROR_REVOKED_CERT_ALERT=SSL peer rejected your certificate as revoked.
 SSL_ERROR_EXPIRED_CERT_ALERT=SSL peer rejected your certificate as expired.
 SSL_ERROR_SSL_DISABLED=Cannot connect: SSL is disabled.
@@ -62,17 +62,17 @@ SSL_ERROR_CLOSE_NOTIFY_ALERT=SSL peer ha
 SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT=SSL peer was not expecting a handshake message it received.
 SSL_ERROR_DECOMPRESSION_FAILURE_ALERT=SSL peer was unable to successfully decompress an SSL record it received.
 SSL_ERROR_HANDSHAKE_FAILURE_ALERT=SSL peer was unable to negotiate an acceptable set of security parameters.
 SSL_ERROR_ILLEGAL_PARAMETER_ALERT=SSL peer rejected a handshake message for unacceptable content.
 SSL_ERROR_UNSUPPORTED_CERT_ALERT=SSL peer does not support certificates of the type it received.
 SSL_ERROR_CERTIFICATE_UNKNOWN_ALERT=SSL peer had some unspecified issue with the certificate it received.
 SSL_ERROR_GENERATE_RANDOM_FAILURE=SSL experienced a failure of its random number generator.
 SSL_ERROR_SIGN_HASHES_FAILURE=Unable to digitally sign data required to verify your certificate.
-SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE=SSL was unable to extract the public key from the peer's certificate.
+SSL_ERROR_EXTRACT_PUBLIC_KEY_FAILURE=SSL was unable to extract the public key from the peer’s certificate.
 SSL_ERROR_SERVER_KEY_EXCHANGE_FAILURE=Unspecified failure while processing SSL Server Key Exchange handshake.
 SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE=Unspecified failure while processing SSL Client Key Exchange handshake.
 SSL_ERROR_ENCRYPTION_FAILURE=Bulk data encryption algorithm failed in selected cipher suite.
 SSL_ERROR_DECRYPTION_FAILURE=Bulk data decryption algorithm failed in selected cipher suite.
 SSL_ERROR_SOCKET_WRITE_FAILURE=Attempt to write encrypted data to underlying socket failed.
 SSL_ERROR_MD5_DIGEST_FAILURE=MD5 digest function failed.
 SSL_ERROR_SHA_DIGEST_FAILURE=SHA-1 digest function failed.
 SSL_ERROR_MAC_COMPUTATION_FAILURE=MAC computation failed.
@@ -85,17 +85,17 @@ SSL_ERROR_SESSION_KEY_GEN_FAILURE=Client
 SSL_ERROR_NO_SERVER_KEY_FOR_ALG=Server has no key for the attempted key exchange algorithm.
 SSL_ERROR_TOKEN_INSERTION_REMOVAL=PKCS#11 token was inserted or removed while operation was in progress.
 SSL_ERROR_TOKEN_SLOT_NOT_FOUND=No PKCS#11 token could be found to do a required operation.
 SSL_ERROR_NO_COMPRESSION_OVERLAP=Cannot communicate securely with peer: no common compression algorithm(s).
 SSL_ERROR_HANDSHAKE_NOT_COMPLETED=Cannot initiate another SSL handshake until current handshake is complete.
 SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE=Received incorrect handshakes hash values from peer.
 SSL_ERROR_CERT_KEA_MISMATCH=The certificate provided cannot be used with the selected key exchange algorithm.
 SSL_ERROR_NO_TRUSTED_SSL_CLIENT_CA=No certificate authority is trusted for SSL client authentication.
-SSL_ERROR_SESSION_NOT_FOUND=Client's SSL session ID not found in server's session cache.
+SSL_ERROR_SESSION_NOT_FOUND=Client’s SSL session ID not found in server’s session cache.
 SSL_ERROR_DECRYPTION_FAILED_ALERT=Peer was unable to decrypt an SSL record it received.
 SSL_ERROR_RECORD_OVERFLOW_ALERT=Peer received an SSL record that was longer than is permitted.
 SSL_ERROR_UNKNOWN_CA_ALERT=Peer does not recognize and trust the CA that issued your certificate.
 SSL_ERROR_ACCESS_DENIED_ALERT=Peer received a valid certificate, but access was denied.
 SSL_ERROR_DECODE_ERROR_ALERT=Peer could not decode an SSL handshake message.
 SSL_ERROR_DECRYPT_ERROR_ALERT=Peer reports failure of signature verification or key exchange.
 SSL_ERROR_EXPORT_RESTRICTION_ALERT=Peer reports negotiation not in compliance with export regulations.
 SSL_ERROR_PROTOCOL_VERSION_ALERT=Peer reports incompatible or unsupported protocol version.
@@ -143,39 +143,39 @@ SEC_ERROR_LIBRARY_FAILURE=security libra
 SEC_ERROR_BAD_DATA=security library: received bad data.
 SEC_ERROR_OUTPUT_LEN=security library: output length error.
 SEC_ERROR_INPUT_LEN=security library has experienced an input length error.
 SEC_ERROR_INVALID_ARGS=security library: invalid arguments.
 SEC_ERROR_INVALID_ALGORITHM=security library: invalid algorithm.
 SEC_ERROR_INVALID_AVA=security library: invalid AVA.
 SEC_ERROR_INVALID_TIME=Improperly formatted time string.
 SEC_ERROR_BAD_DER=security library: improperly formatted DER-encoded message.
-SEC_ERROR_BAD_SIGNATURE=Peer's certificate has an invalid signature.
-SEC_ERROR_EXPIRED_CERTIFICATE=Peer's Certificate has expired.
-SEC_ERROR_REVOKED_CERTIFICATE=Peer's Certificate has been revoked.
-SEC_ERROR_UNKNOWN_ISSUER=Peer's Certificate issuer is not recognized.
-SEC_ERROR_BAD_KEY=Peer's public key is invalid.
+SEC_ERROR_BAD_SIGNATURE=Peer’s certificate has an invalid signature.
+SEC_ERROR_EXPIRED_CERTIFICATE=Peer’s Certificate has expired.
+SEC_ERROR_REVOKED_CERTIFICATE=Peer’s Certificate has been revoked.
+SEC_ERROR_UNKNOWN_ISSUER=Peer’s Certificate issuer is not recognized.
+SEC_ERROR_BAD_KEY=Peer’s public key is invalid.
 SEC_ERROR_BAD_PASSWORD=The security password entered is incorrect.
 SEC_ERROR_RETRY_PASSWORD=New password entered incorrectly. Please try again.
 SEC_ERROR_NO_NODELOCK=security library: no nodelock.
 SEC_ERROR_BAD_DATABASE=security library: bad database.
 SEC_ERROR_NO_MEMORY=security library: memory allocation failure.
-SEC_ERROR_UNTRUSTED_ISSUER=Peer's certificate issuer has been marked as not trusted by the user.
-SEC_ERROR_UNTRUSTED_CERT=Peer's certificate has been marked as not trusted by the user.
+SEC_ERROR_UNTRUSTED_ISSUER=Peer’s certificate issuer has been marked as not trusted by the user.
+SEC_ERROR_UNTRUSTED_CERT=Peer’s certificate has been marked as not trusted by the user.
 SEC_ERROR_DUPLICATE_CERT=Certificate already exists in your database.
-SEC_ERROR_DUPLICATE_CERT_NAME=Downloaded certificate's name duplicates one already in your database.
+SEC_ERROR_DUPLICATE_CERT_NAME=Downloaded certificate’s name duplicates one already in your database.
 SEC_ERROR_ADDING_CERT=Error adding certificate to database.
 SEC_ERROR_FILING_KEY=Error refiling the key for this certificate.
 SEC_ERROR_NO_KEY=The private key for this certificate cannot be found in key database
 SEC_ERROR_CERT_VALID=This certificate is valid.
 SEC_ERROR_CERT_NOT_VALID=This certificate is not valid.
 SEC_ERROR_CERT_NO_RESPONSE=Cert Library: No Response
-SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE=The certificate issuer's certificate has expired. Check your system date and time.
-SEC_ERROR_CRL_EXPIRED=The CRL for the certificate's issuer has expired. Update it or check your system date and time.
-SEC_ERROR_CRL_BAD_SIGNATURE=The CRL for the certificate's issuer has an invalid signature.
+SEC_ERROR_EXPIRED_ISSUER_CERTIFICATE=The certificate issuer’s certificate has expired. Check your system date and time.
+SEC_ERROR_CRL_EXPIRED=The CRL for the certificate’s issuer has expired. Update it or check your system date and time.
+SEC_ERROR_CRL_BAD_SIGNATURE=The CRL for the certificate’s issuer has an invalid signature.
 SEC_ERROR_CRL_INVALID=New CRL has an invalid format.
 SEC_ERROR_EXTENSION_VALUE_INVALID=Certificate extension value is invalid.
 SEC_ERROR_EXTENSION_NOT_FOUND=Certificate extension not found.
 SEC_ERROR_CA_CERT_INVALID=Issuer certificate is invalid.
 SEC_ERROR_PATH_LEN_CONSTRAINT_INVALID=Certificate path length constraint is invalid.
 SEC_ERROR_CERT_USAGES_INVALID=Certificate usages field is invalid.
 SEC_INTERNAL_ONLY=**Internal ONLY module**
 SEC_ERROR_INVALID_KEY=The key does not support the requested operation.
@@ -190,34 +190,34 @@ SEC_ERROR_UNSUPPORTED_KEYALG=Unsupported
 SEC_ERROR_DECRYPTION_DISALLOWED=Cannot decrypt: encrypted using a disallowed algorithm or key size.
 XP_SEC_FORTEZZA_BAD_CARD=Fortezza card has not been properly initialized. Please remove it and return it to your issuer.
 XP_SEC_FORTEZZA_NO_CARD=No Fortezza cards Found
 XP_SEC_FORTEZZA_NONE_SELECTED=No Fortezza card selected
 XP_SEC_FORTEZZA_MORE_INFO=Please select a personality to get more info on
 XP_SEC_FORTEZZA_PERSON_NOT_FOUND=Personality not found
 XP_SEC_FORTEZZA_NO_MORE_INFO=No more information on that Personality
 XP_SEC_FORTEZZA_BAD_PIN=Invalid Pin
-XP_SEC_FORTEZZA_PERSON_ERROR=Couldn't initialize Fortezza personalities.
-SEC_ERROR_NO_KRL=No KRL for this site's certificate has been found.
-SEC_ERROR_KRL_EXPIRED=The KRL for this site's certificate has expired.
-SEC_ERROR_KRL_BAD_SIGNATURE=The KRL for this site's certificate has an invalid signature.
-SEC_ERROR_REVOKED_KEY=The key for this site's certificate has been revoked.
+XP_SEC_FORTEZZA_PERSON_ERROR=Couldn’t initialize Fortezza personalities.
+SEC_ERROR_NO_KRL=No KRL for this site’s certificate has been found.
+SEC_ERROR_KRL_EXPIRED=The KRL for this site’s certificate has expired.
+SEC_ERROR_KRL_BAD_SIGNATURE=The KRL for this site’s certificate has an invalid signature.
+SEC_ERROR_REVOKED_KEY=The key for this site’s certificate has been revoked.
 SEC_ERROR_KRL_INVALID=New KRL has an invalid format.
 SEC_ERROR_NEED_RANDOM=security library: need random data.
 SEC_ERROR_NO_MODULE=security library: no security module can perform the requested operation.
 SEC_ERROR_NO_TOKEN=The security card or token does not exist, needs to be initialized, or has been removed.
 SEC_ERROR_READ_ONLY=security library: read-only database.
 SEC_ERROR_NO_SLOT_SELECTED=No slot or token was selected.
 SEC_ERROR_CERT_NICKNAME_COLLISION=A certificate with the same nickname already exists.
 SEC_ERROR_KEY_NICKNAME_COLLISION=A key with the same nickname already exists.
 SEC_ERROR_SAFE_NOT_CREATED=error while creating safe object
 SEC_ERROR_BAGGAGE_NOT_CREATED=error while creating baggage object
-XP_JAVA_REMOVE_PRINCIPAL_ERROR=Couldn't remove the principal
-XP_JAVA_DELETE_PRIVILEGE_ERROR=Couldn't delete the privilege
-XP_JAVA_CERT_NOT_EXISTS_ERROR=This principal doesn't have a certificate
+XP_JAVA_REMOVE_PRINCIPAL_ERROR=Couldn’t remove the principal
+XP_JAVA_DELETE_PRIVILEGE_ERROR=Couldn’t delete the privilege
+XP_JAVA_CERT_NOT_EXISTS_ERROR=This principal doesn’t have a certificate
 SEC_ERROR_BAD_EXPORT_ALGORITHM=Required algorithm is not allowed.
 SEC_ERROR_EXPORTING_CERTIFICATES=Error attempting to export certificates.
 SEC_ERROR_IMPORTING_CERTIFICATES=Error attempting to import certificates.
 SEC_ERROR_PKCS12_DECODING_PFX=Unable to import. Decoding error. File not valid.
 SEC_ERROR_PKCS12_INVALID_MAC=Unable to import. Invalid MAC. Incorrect password or corrupt file.
 SEC_ERROR_PKCS12_UNSUPPORTED_MAC_ALGORITHM=Unable to import. MAC algorithm not supported.
 SEC_ERROR_PKCS12_UNSUPPORTED_TRANSPORT_MODE=Unable to import. Only password integrity and privacy modes supported.
 SEC_ERROR_PKCS12_CORRUPT_PFX_STRUCTURE=Unable to import. File structure is corrupt.
@@ -249,17 +249,17 @@ SEC_ERROR_JS_INVALID_DLL=Invalid module 
 SEC_ERROR_JS_ADD_MOD_FAILURE=Unable to add module
 SEC_ERROR_JS_DEL_MOD_FAILURE=Unable to delete module
 SEC_ERROR_OLD_KRL=New KRL is not later than the current one.
 SEC_ERROR_CKL_CONFLICT=New CKL has different issuer than current CKL. Delete current CKL.
 SEC_ERROR_CERT_NOT_IN_NAME_SPACE=The Certifying Authority for this certificate is not permitted to issue a certificate with this name.
 SEC_ERROR_KRL_NOT_YET_VALID=The key revocation list for this certificate is not yet valid.
 SEC_ERROR_CRL_NOT_YET_VALID=The certificate revocation list for this certificate is not yet valid.
 SEC_ERROR_UNKNOWN_CERT=The requested certificate could not be found.
-SEC_ERROR_UNKNOWN_SIGNER=The signer's certificate could not be found.
+SEC_ERROR_UNKNOWN_SIGNER=The signer’s certificate could not be found.
 SEC_ERROR_CERT_BAD_ACCESS_LOCATION=The location for the certificate status server has invalid format.
 SEC_ERROR_OCSP_UNKNOWN_RESPONSE_TYPE=The OCSP response cannot be fully decoded; it is of an unknown type.
 SEC_ERROR_OCSP_BAD_HTTP_RESPONSE=The OCSP server returned unexpected/invalid HTTP data.
 SEC_ERROR_OCSP_MALFORMED_REQUEST=The OCSP server found the request to be corrupted or improperly formed.
 SEC_ERROR_OCSP_SERVER_ERROR=The OCSP server experienced an internal error.
 SEC_ERROR_OCSP_TRY_SERVER_LATER=The OCSP server suggests trying again later.
 SEC_ERROR_OCSP_REQUEST_NEEDS_SIG=The OCSP server requires a signature on this request.
 SEC_ERROR_OCSP_UNAUTHORIZED_REQUEST=The OCSP server has refused this request as unauthorized.
@@ -278,28 +278,28 @@ SEC_ERROR_BAD_TEMPLATE=Could not decode 
 SEC_ERROR_CRL_NOT_FOUND=No matching CRL was found.
 SEC_ERROR_REUSED_ISSUER_AND_SERIAL=You are attempting to import a cert with the same issuer/serial as an existing cert, but that is not the same cert.
 SEC_ERROR_BUSY=NSS could not shutdown. Objects are still in use.
 SEC_ERROR_EXTRA_INPUT=DER-encoded message contained extra unused data.
 SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE=Unsupported elliptic curve.
 SEC_ERROR_UNSUPPORTED_EC_POINT_FORM=Unsupported elliptic curve point form.
 SEC_ERROR_UNRECOGNIZED_OID=Unrecognized Object Identifier.
 SEC_ERROR_OCSP_INVALID_SIGNING_CERT=Invalid OCSP signing certificate in OCSP response.
-SEC_ERROR_REVOKED_CERTIFICATE_CRL=Certificate is revoked in issuer's certificate revocation list.
-SEC_ERROR_REVOKED_CERTIFICATE_OCSP=Issuer's OCSP responder reports certificate is revoked.
-SEC_ERROR_CRL_INVALID_VERSION=Issuer's Certificate Revocation List has an unknown version number.
-SEC_ERROR_CRL_V1_CRITICAL_EXTENSION=Issuer's V1 Certificate Revocation List has a critical extension.
-SEC_ERROR_CRL_UNKNOWN_CRITICAL_EXTENSION=Issuer's V2 Certificate Revocation List has an unknown critical extension.
+SEC_ERROR_REVOKED_CERTIFICATE_CRL=Certificate is revoked in issuer’s certificate revocation list.
+SEC_ERROR_REVOKED_CERTIFICATE_OCSP=Issuer’s OCSP responder reports certificate is revoked.
+SEC_ERROR_CRL_INVALID_VERSION=Issuer’s Certificate Revocation List has an unknown version number.
+SEC_ERROR_CRL_V1_CRITICAL_EXTENSION=Issuer’s V1 Certificate Revocation List has a critical extension.
+SEC_ERROR_CRL_UNKNOWN_CRITICAL_EXTENSION=Issuer’s V2 Certificate Revocation List has an unknown critical extension.
 SEC_ERROR_UNKNOWN_OBJECT_TYPE=Unknown object type specified.
 SEC_ERROR_INCOMPATIBLE_PKCS11=PKCS #11 driver violates the spec in an incompatible way.
 SEC_ERROR_NO_EVENT=No new slot event is available at this time.
 SEC_ERROR_CRL_ALREADY_EXISTS=CRL already exists.
 SEC_ERROR_NOT_INITIALIZED=NSS is not initialized.
 SEC_ERROR_TOKEN_NOT_LOGGED_IN=The operation failed because the PKCS#11 token is not logged in.
-SEC_ERROR_OCSP_RESPONDER_CERT_INVALID=Configured OCSP responder's certificate is invalid.
+SEC_ERROR_OCSP_RESPONDER_CERT_INVALID=Configured OCSP responder’s certificate is invalid.
 SEC_ERROR_OCSP_BAD_SIGNATURE=OCSP response has an invalid signature.
 SEC_ERROR_OUT_OF_SEARCH_LIMITS=Cert validation search is out of search limits
 SEC_ERROR_INVALID_POLICY_MAPPING=Policy mapping contains anypolicy
 SEC_ERROR_POLICY_VALIDATION_FAILED=Cert chain fails policy validation
 SEC_ERROR_UNKNOWN_AIA_LOCATION_TYPE=Unknown location type in cert AIA extension
 SEC_ERROR_BAD_HTTP_RESPONSE=Server returned bad HTTP response
 SEC_ERROR_BAD_LDAP_RESPONSE=Server returned bad LDAP response
 SEC_ERROR_FAILED_TO_ENCODE_DATA=Failed to encode data with ASN1 encoder
@@ -313,16 +313,16 @@ SEC_ERROR_CRL_IMPORT_FAILED=Error attemp
 SEC_ERROR_EXPIRED_PASSWORD=The password expired.
 SEC_ERROR_LOCKED_PASSWORD=The password is locked.
 SEC_ERROR_UNKNOWN_PKCS11_ERROR=Unknown PKCS #11 error.
 SEC_ERROR_BAD_CRL_DP_URL=Invalid or unsupported URL in CRL distribution point name.
 SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED=The certificate was signed using a signature algorithm that is disabled because it is not secure.
 MOZILLA_PKIX_ERROR_KEY_PINNING_FAILURE=The server uses key pinning (HPKP) but no trusted certificate chain could be constructed that matches the pinset. Key pinning violations cannot be overridden.
 MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY=The server uses a certificate with a basic constraints extension identifying it as a certificate authority. For a properly-issued certificate, this should not be the case.
 MOZILLA_PKIX_ERROR_INADEQUATE_KEY_SIZE=The server presented a certificate with a key size that is too small to establish a secure connection.
-MOZILLA_PKIX_ERROR_V1_CERT_USED_AS_CA=An X.509 version 1 certificate that is not a trust anchor was used to issue the server's certificate. X.509 version 1 certificates are deprecated and should not be used to sign other certificates.
+MOZILLA_PKIX_ERROR_V1_CERT_USED_AS_CA=An X.509 version 1 certificate that is not a trust anchor was used to issue the server’s certificate. X.509 version 1 certificates are deprecated and should not be used to sign other certificates.
 MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE=The server presented a certificate that is not yet valid.
-MOZILLA_PKIX_ERROR_NOT_YET_VALID_ISSUER_CERTIFICATE=A certificate that is not yet valid was used to issue the server's certificate.
+MOZILLA_PKIX_ERROR_NOT_YET_VALID_ISSUER_CERTIFICATE=A certificate that is not yet valid was used to issue the server’s certificate.
 MOZILLA_PKIX_ERROR_SIGNATURE_ALGORITHM_MISMATCH=The signature algorithm in the signature field of the certificate does not match the algorithm in its signatureAlgorithm field.
 MOZILLA_PKIX_ERROR_OCSP_RESPONSE_FOR_CERT_MISSING=The OCSP response does not include a status for the certificate being verified.
 MOZILLA_PKIX_ERROR_VALIDITY_TOO_LONG=The server presented a certificate that is valid for too long.
 MOZILLA_PKIX_ERROR_REQUIRED_TLS_FEATURE_MISSING=A required TLS feature is missing.
 MOZILLA_PKIX_ERROR_INVALID_INTEGER_ENCODING=The server presented a certificate that contains an invalid encoding of an integer. Common causes include negative serial numbers, negative RSA moduli, and encodings that are longer than necessary.
--- a/security/manager/locales/en-US/chrome/pipnss/pipnss.properties
+++ b/security/manager/locales/en-US/chrome/pipnss/pipnss.properties
@@ -44,17 +44,17 @@ VerifySSLCA=SSL Certificate Authority
 VerifyEmailSigner=Email Signer Certificate
 VerifyEmailRecip=Email Recipient Certificate
 VerifyObjSign=Object Signer
 VerifyCAVerifier=CA Verifier
 VerifyStatusResponder=Status Responder Certificate
 HighGrade=High Grade
 MediumGrade=Medium Grade
 # LOCALIZATION NOTE (nick_template): $1s is the common name from a cert (e.g. "Mozilla"), $2s is the CA name (e.g. VeriSign)
-nick_template=%1$s's %2$s ID
+nick_template=%1$s’s %2$s ID
 #These are the strings set for the ASN1 objects in a certificate.
 CertDumpCertificate=Certificate
 CertDumpVersion=Version
 # LOCALIZATION NOTE (CertDumpVersionValue): %S is a version number (e.g. "3" in "Version 3")
 CertDumpVersionValue=Version %S
 CertDumpSerialNo=Serial Number
 CertDumpMD2WithRSA=PKCS #1 MD2 With RSA Encryption
 CertDumpMD5WithRSA=PKCS #1 MD5 With RSA Encryption
@@ -84,17 +84,17 @@ CertDumpSPKI=Subject Public Key Info
 CertDumpSPKIAlg=Subject Public Key Algorithm
 CertDumpAlgID=Algorithm Identifier
 CertDumpParams=Algorithm Parameters
 CertDumpRSAEncr=PKCS #1 RSA Encryption
 CertDumpRSAPSSSignature=PKCS #1 RSASSA-PSS Signature
 CertDumpRSATemplate=Modulus (%S bits):\n%S\nExponent (%S bits):\n%S
 CertDumpECTemplate=Key size: %S bits\nBase point order length: %S bits\nPublic value:\n%S
 CertDumpIssuerUniqueID=Issuer Unique ID
-CertDumpSubjPubKey=Subject's Public Key
+CertDumpSubjPubKey=Subject’s Public Key
 CertDumpSubjectUniqueID=Subject Unique ID
 CertDumpExtensions=Extensions
 CertDumpSubjectDirectoryAttr=Certificate Subject Directory Attributes
 CertDumpSubjectKeyID=Certificate Subject Key ID
 CertDumpKeyUsage=Certificate Key Usage
 CertDumpSubjectAltName=Certificate Subject Alt Name
 CertDumpIssuerAltName=Certificate Issuer Alt Name
 CertDumpBasicConstraints=Certificate Basic Constraints
@@ -256,18 +256,18 @@ PKCS12UnknownErr=The PKCS #12 operation 
 PKCS12InfoNoSmartcardBackup=It is not possible to back up certificates from a hardware security device such as a smart card.
 PKCS12DupData=The certificate and private key already exist on the security device.
 AddModuleFailure=Unable to add module
 AddModuleDup=Security Module already exists
 DelModuleWarning=Are you sure you want to delete this security module?
 DelModuleError=Unable to delete module
 AVATemplate=%S = %S
 
-PSMERR_SSL_Disabled=Can't connect securely because the SSL protocol has been disabled.
-PSMERR_SSL2_Disabled=Can't connect securely because the site uses an older, insecure version of the SSL protocol.
+PSMERR_SSL_Disabled=Can’t connect securely because the SSL protocol has been disabled.
+PSMERR_SSL2_Disabled=Can’t connect securely because the site uses an older, insecure version of the SSL protocol.
 PSMERR_HostReusedIssuerSerial=You have received an invalid certificate.  Please contact the server administrator or email correspondent and give them the following information:\n\nYour certificate contains the same serial number as another certificate issued by the certificate authority.  Please get a new certificate containing a unique serial number.
 
 SSLConnectionErrorPrefix=An error occurred during a connection to %S.
 
 certErrorIntro=%S uses an invalid security certificate.
 
 certErrorTrust_SelfSigned=The certificate is not trusted because it is self-signed.
 certErrorTrust_UnknownIssuer=The certificate is not trusted because the issuer certificate is unknown.
@@ -315,16 +315,16 @@ CertCA=CA (Certificate Authority)
 CertSSL=SSL Server
 CertEmail=Peer S/MIME
 CertUnknown=Unknown
 CertNoNickname=(no nickname)
 CertNoEmailAddress=(no email address)
 NicknameExpired=(expired)
 NicknameNotYetValid=(not yet valid)
 CaCertExists=This certificate is already installed as a certificate authority.
-NotACACert=This is not a certificate authority certificate, so it can't be imported into the certificate authority list.
-NotImportingUnverifiedCert=This certificate can't be verified and will not be imported. The certificate issuer might be unknown or untrusted, the certificate might have expired or been revoked, or the certificate might not have been approved.
-UserCertIgnoredNoPrivateKey=This personal certificate can't be installed because you do not own the corresponding private key which was created when the certificate was requested.
+NotACACert=This is not a certificate authority certificate, so it can’t be imported into the certificate authority list.
+NotImportingUnverifiedCert=This certificate can’t be verified and will not be imported. The certificate issuer might be unknown or untrusted, the certificate might have expired or been revoked, or the certificate might not have been approved.
+UserCertIgnoredNoPrivateKey=This personal certificate can’t be installed because you do not own the corresponding private key which was created when the certificate was requested.
 UserCertImported=Your personal certificate has been installed. You should keep a backup copy of this certificate.
 CertOrgUnknown=(Unknown)
 CertNotStored=(Not Stored)
 CertExceptionPermanent=Permanent
 CertExceptionTemporary=Temporary
--- a/security/manager/locales/en-US/chrome/pippki/pippki.properties
+++ b/security/manager/locales/en-US/chrome/pippki/pippki.properties
@@ -2,37 +2,37 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 CertPassPrompt=Please enter the Personal Security Password for the PSM Private Keys security device.
 
 #These are for dialogs
 #Download Cert dialog
-newCAMessage1=Do you want to trust "%S" for the following purposes?
+newCAMessage1=Do you want to trust “%S” for the following purposes?
 unnamedCA=Certificate Authority (unnamed)
 
 #For editing cert trust
-editTrustCA=The certificate "%S" represents a Certificate Authority.
+editTrustCA=The certificate “%S” represents a Certificate Authority.
 
 #For Deleting Certificates
 deleteSslCertConfirm3=Are you sure you want to delete these server exceptions?
 deleteSslCertImpact3=If you delete a server exception, you restore the usual security checks for that server and require it uses a valid certificate.
 deleteSslCertTitle3=Delete Server Certificate Exceptions
 
 deleteUserCertConfirm=Are you sure you want to delete these certificates?
 deleteUserCertImpact=If you delete one of your own certificates, you can no longer use it to identify yourself.
 deleteUserCertTitle=Delete your Certificates
 
 deleteCaCertConfirm2=You have requested to delete these CA certificates. For built-in certificates all trust will be removed, which has the same effect. Are you sure you want to delete or distrust?
 deleteCaCertImpactX2=If you delete or distrust a certificate authority (CA) certificate, this application will no longer trust any certificates issued by that CA.
 deleteCaCertTitle2=Delete or Distrust CA Certificates
 
-deleteEmailCertConfirm=Are you sure you want to delete these people's e-mail certificates?
-deleteEmailCertImpactDesc=If you delete a person's e-mail certificate, you will no longer be able to send encrypted e-mail to that person.
+deleteEmailCertConfirm=Are you sure you want to delete these people’s e-mail certificates?
+deleteEmailCertImpactDesc=If you delete a person’s e-mail certificate, you will no longer be able to send encrypted e-mail to that person.
 deleteEmailCertTitle=Delete E-Mail Certificates
 
 deleteOrphanCertConfirm=Are you sure you want to delete these certificates?
 deleteOrphanCertTitle=Delete Certificates
 
 
 #PKCS#12 file dialogs
 chooseP12RestoreFileDialog2=Certificate File to Import
@@ -47,35 +47,35 @@ certNotVerified_CertExpired=Could not ve
 certNotVerified_CertNotTrusted=Could not verify this certificate because it is not trusted.
 certNotVerified_IssuerNotTrusted=Could not verify this certificate because the issuer is not trusted.
 certNotVerified_IssuerUnknown=Could not verify this certificate because the issuer is unknown.
 certNotVerified_CAInvalid=Could not verify this certificate because the CA certificate is invalid.
 certNotVerified_AlgorithmDisabled=Could not verify this certificate because it was signed using a signature algorithm that was disabled because that algorithm is not secure.
 certNotVerified_Unknown=Could not verify this certificate for unknown reasons.
 
 #Client auth
-clientAuthMessage1=Organization: "%S"
-clientAuthMessage2=Issued Under: "%S"
+clientAuthMessage1=Organization: “%S”
+clientAuthMessage2=Issued Under: “%S”
 
 #Page Info
 pageInfo_NoEncryption=Connection Not Encrypted
 pageInfo_Privacy_None1=The website %S does not support encryption for the page you are viewing.
 pageInfo_Privacy_None2=Information sent over the Internet without encryption can be seen by other people while it is in transit. 
 pageInfo_Privacy_None3=The page you are viewing is not encrypted.
 # LOCALIZATION NOTE (pageInfo_EncryptionWithBitsAndProtocol and pageInfo_BrokenEncryption):
 # %1$S is the name of the encryption standard,
 # %2$S is the key size of the cipher.
 # %3$S is protocol version like "SSL 3" or "TLS 1.2"
 pageInfo_EncryptionWithBitsAndProtocol=Connection Encrypted (%1$S, %2$S bit keys, %3$S)
 pageInfo_BrokenEncryption=Broken Encryption (%1$S, %2$S bit keys, %3$S)
 pageInfo_Privacy_Encrypted1=The page you are viewing was encrypted before being transmitted over the Internet.
 pageInfo_Privacy_Encrypted2=Encryption makes it difficult for unauthorized people to view information traveling between computers. It is therefore unlikely that anyone read this page as it traveled across the network.
 pageInfo_MixedContent=Connection Partially Encrypted
 pageInfo_MixedContent2=Parts of the page you are viewing were not encrypted before being transmitted over the Internet.
-pageInfo_WeakCipher=Your connection to this website uses weak encryption and is not private. Other people can view your information or modify the website's behavior.
+pageInfo_WeakCipher=Your connection to this website uses weak encryption and is not private. Other people can view your information or modify the website’s behavior.
 
 #Cert Viewer
 certDetails=Certificate Viewer:
 notPresent=<Not Part Of Certificate>
 
 #Token Manager
 password_not_set=(not set)
 failed_pw_change=Unable to change Master Password.
@@ -106,41 +106,41 @@ enable_fips=Enable FIPS
 disable_fips=Disable FIPS
 fips_nonempty_password_required=FIPS mode requires that you have a Master Password set for each security device. Please set the password before trying to enable FIPS mode.
 unable_to_toggle_fips=Unable to change the FIPS mode for the security device. It is recommended that you exit and restart this application.
 
 resetPasswordConfirmationTitle=Reset Master Password
 resetPasswordConfirmationMessage=Your password has been reset.
 
 # Import certificate(s) file dialog
-importEmailCertPrompt=Select File containing somebody's Email certificate to import
+importEmailCertPrompt=Select File containing somebody’s Email certificate to import
 importCACertsPrompt=Select File containing CA certificate(s) to import
 file_browse_Certificate_spec=Certificate Files
 
 # Cert export
 SaveCertAs=Save Certificate To File
 CertFormatBase64=X.509 Certificate (PEM)
 CertFormatBase64Chain=X.509 Certificate with chain (PEM)
 CertFormatDER=X.509 Certificate (DER)
 CertFormatPKCS7=X.509 Certificate (PKCS#7)
 CertFormatPKCS7Chain=X.509 Certificate with chain (PKCS#7)
 writeFileFailure=File Error
-writeFileFailed=Can't write to file %S:\n%S.
+writeFileFailed=Can’t write to file %S:\n%S.
 writeFileAccessDenied=Access denied
 writeFileIsLocked=File is locked
 writeFileNoDeviceSpace=No space left on device
 writeFileUnknownError=Unknown error
 
 #Add Security Exception dialog
 addExceptionBrandedWarning2=You are about to override how %S identifies this site.
 addExceptionInvalidHeader=This site attempts to identify itself with invalid information.
 addExceptionDomainMismatchShort=Wrong Site
 addExceptionDomainMismatchLong2=The certificate belongs to a different site, which could mean that someone is trying to impersonate this site.
 addExceptionExpiredShort=Outdated Information
 addExceptionExpiredLong2=The certificate is not currently valid. It may have been stolen or lost, and could be used by someone to impersonate this site.
 addExceptionUnverifiedOrBadSignatureShort=Unknown Identity
-addExceptionUnverifiedOrBadSignatureLong2=The certificate is not trusted because it hasn't been verified as issued by a trusted authority using a secure signature.
+addExceptionUnverifiedOrBadSignatureLong2=The certificate is not trusted because it hasn’t been verified as issued by a trusted authority using a secure signature.
 addExceptionValidShort=Valid Certificate
 addExceptionValidLong=This site provides valid, verified identification.  There is no need to add an exception.
 addExceptionCheckingShort=Checking Information
 addExceptionCheckingLong2=Attempting to identify this site…
 addExceptionNoCertShort=No Information Available
 addExceptionNoCertLong2=Unable to obtain identification status for this site.
--- a/services/sync/locales/en-US/errors.properties
+++ b/services/sync/locales/en-US/errors.properties
@@ -15,13 +15,13 @@ error.sync.failed_partial            = O
 error.sync.reason.serverMaintenance  = Firefox Sync server maintenance is underway, syncing will resume automatically
 
 invalid-captcha = Incorrect words, try again
 weak-password   = Use a stronger password
 
 # this is the fallback, if we hit an error we didn't bother to localize
 error.reason.unknown          = Unknown error
 
-change.password.pwSameAsPassword     = Password can't match current password
-change.password.pwSameAsUsername     = Password can't match your user name
-change.password.pwSameAsEmail        = Password can't match your email address
+change.password.pwSameAsPassword     = Password can’t match current password
+change.password.pwSameAsUsername     = Password can’t match your user name
+change.password.pwSameAsEmail        = Password can’t match your email address
 change.password.mismatch             = The passwords entered do not match
 change.password.tooShort             = The password entered is too short
--- a/services/sync/locales/en-US/sync.properties
+++ b/services/sync/locales/en-US/sync.properties
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # %1: the user name (Ed), %2: the app name (Firefox), %3: the operating system (Android)
-client.name2 = %1$S's %2$S on %3$S
+client.name2 = %1$S’s %2$S on %3$S
 
 # %S is the date and time at which the last sync successfully completed
 lastSync2.label = Last sync: %S
 
 # signInToSync.description is the tooltip for the Sync buttons when Sync is
 # not configured.
 signInToSync.description = Sign In To Sync
 
--- a/toolkit/components/prompts/test/test_modal_prompts.html
+++ b/toolkit/components/prompts/test/test_modal_prompts.html
@@ -1021,19 +1021,19 @@ function* runTests() {
     }
 
 
     // =====
     // (promptAuth is only accessible from the prompt service)
     info("Starting test: promptAuth with long realm");
     state = {
         msg : 'A username and password are being requested by http://example.com. The site '  +
-              'says: "abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ' +
+              'says: \u201cabcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ' +
               'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi '        +
-              'abcdefghi \u2026"',
+              'abcdefghi \u2026\u201d',
         title : "TestTitle",
         iconClass   : "authentication-icon question-icon",
         titleHidden : true,
         textHidden  : false,
         passHidden  : false,
         checkHidden : false,
         textValue   : "",
         passValue   : "",
--- a/toolkit/locales/en-US/chrome/global/aboutProfiles.properties
+++ b/toolkit/locales/en-US/chrome/global/aboutProfiles.properties
@@ -21,22 +21,22 @@ launchProfile = Launch profile in new br
 
 yes = yes
 no = no
 
 renameProfileTitle = Rename Profile
 renameProfile = Rename profile %S
 
 invalidProfileNameTitle = Invalid profile name
-invalidProfileName = The profile name "%S" is not allowed.
+invalidProfileName = The profile name “%S” is not allowed.
 
 deleteProfileTitle = Delete Profile
-deleteProfileConfirm = Deleting a profile will remove the profile from the list of available profiles and cannot be undone.\nYou may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder "%S" and cannot be undone.\nWould you like to delete the profile data files?
+deleteProfileConfirm = Deleting a profile will remove the profile from the list of available profiles and cannot be undone.\nYou may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder “%S” and cannot be undone.\nWould you like to delete the profile data files?
 deleteFiles = Delete Files
-dontDeleteFiles = Don't Delete Files
+dontDeleteFiles = Don’t Delete Files
 
 openDir = Open Directory
 # LOCALIZATION NOTE (macOpenDir): This is the Mac-specific variant of openDir.
 # This allows us to use the preferred"Finder" terminology on Mac.
 macOpenDir = Show in Finder
 # LOCALIZATION NOTE (winOpenDir): This is the Windows-specific variant of
 # openDir.
 winOpenDir = Show Folder
--- a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
+++ b/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
@@ -1,17 +1,17 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!ENTITY aboutSupport.pageTitle "Troubleshooting Information">
 
 <!-- LOCALIZATION NOTE (aboutSupport.pageSubtitle): don't change the 'supportLink' id. -->
 <!ENTITY aboutSupport.pageSubtitle "
-  This page contains technical information that might be useful when you're
+  This page contains technical information that might be useful when you’re
   trying to solve a problem. If you are looking for answers to common questions
   about &brandShortName;, check out our <a id='supportLink'>support website</a>.
 ">
 
 <!ENTITY aboutSupport.crashes.title "Crash Reports">
 <!-- LOCALIZATION NOTE (aboutSupport.crashes.id):
 This is likely the same like id.heading in crashes.dtd. -->
 <!ENTITY aboutSupport.crashes.id "Report ID">
--- a/toolkit/locales/en-US/chrome/global/commonDialogs.properties
+++ b/toolkit/locales/en-US/chrome/global/commonDialogs.properties
@@ -10,22 +10,22 @@ PromptUsernameAndPassword2=Authenticatio
 PromptPassword2=Password Required
 Select=Select
 OK=OK
 Cancel=Cancel
 Yes=&Yes
 No=&No
 Save=&Save
 Revert=&Revert
-DontSave=Do&n't Save
+DontSave=Do&n’t Save
 ScriptDlgGenericHeading=[JavaScript Application]
 ScriptDlgHeading=The page at %S says:
 ScriptDialogLabel=Prevent this page from creating additional dialogs
 ScriptDialogPreventTitle=Confirm Dialog Preference
 # LOCALIZATION NOTE (EnterLoginForRealm, EnterLoginForProxy):
 # %1 is an untrusted string provided by a remote server. It could try to
 # take advantage of sentence structure in order to mislead the user (see
 # bug 244273). %1 should be integrated into the translated sentences as
 # little as possible. %2 is the url of the site being accessed.
-EnterLoginForRealm=A username and password are being requested by %2$S. The site says: "%1$S"
-EnterLoginForProxy=The proxy %2$S is requesting a username and password. The site says: "%1$S"
+EnterLoginForRealm=A username and password are being requested by %2$S. The site says: “%1$S”
+EnterLoginForProxy=The proxy %2$S is requesting a username and password. The site says: “%1$S”
 EnterUserPasswordFor=Enter username and password for %1$S
 EnterPasswordFor=Enter password for %1$S on %2$S
--- a/toolkit/locales/en-US/chrome/global/console.properties
+++ b/toolkit/locales/en-US/chrome/global/console.properties
@@ -9,9 +9,9 @@ errFile=Source File: %S
 errLine=Line: %S
 errLineCol=Line: %S, Column: %S
 errCode=Source Code:
 errTime=Timestamp: %S
 
 # LOCALIZATION NOTE (evaluationContextChanged): The message displayed when the
 # browser console's evaluation context (window against which input is evaluated)
 # changes.
-evaluationContextChanged=The console's evaluation context changed, probably because the target window was closed or because you opened a main window from the browser console's window.
+evaluationContextChanged=The console’s evaluation context changed, probably because the target window was closed or because you opened a main window from the browser console’s window.
--- a/toolkit/locales/en-US/chrome/global/customizeToolbar.properties
+++ b/toolkit/locales/en-US/chrome/global/customizeToolbar.properties
@@ -1,11 +1,11 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 enterToolbarTitle=New Toolbar
 enterToolbarName=Enter a name for this toolbar:
-enterToolbarDup=There is already a toolbar with the name "%S". Please enter a different name.
+enterToolbarDup=There is already a toolbar with the name “%S”. Please enter a different name.
 enterToolbarBlank=You must enter a name to create a new toolbar.
 separatorTitle=Separator
 springTitle=Flexible Space
 spacerTitle=Space
--- a/toolkit/locales/en-US/chrome/global/extensions.properties
+++ b/toolkit/locales/en-US/chrome/global/extensions.properties
@@ -1,12 +1,12 @@
 
-csp.error.missing-directive = Policy is missing a required '%S' directive
+csp.error.missing-directive = Policy is missing a required ‘%S’ directive
 
-csp.error.illegal-keyword = '%1$S' directive contains a forbidden %2$S keyword
+csp.error.illegal-keyword = ‘%1$S’ directive contains a forbidden %2$S keyword
 
-csp.error.illegal-protocol = '%1$S' directive contains a forbidden %2$S: protocol source
+csp.error.illegal-protocol = ‘%1$S’ directive contains a forbidden %2$S: protocol source
 
-csp.error.missing-host = %2$S: protocol requires a host in '%1$S' directives
+csp.error.missing-host = %2$S: protocol requires a host in ‘%1$S’ directives
 
-csp.error.missing-source = '%1$S' must include the source %2$S
+csp.error.missing-source = ‘%1$S’ must include the source %2$S
 
-csp.error.illegal-host-wildcard = %2$S: wildcard sources in '%1$S' directives must include at least one non-generic sub-domain (e.g., *.example.com rather than *.com)
+csp.error.illegal-host-wildcard = %2$S: wildcard sources in ‘%1$S’ directives must include at least one non-generic sub-domain (e.g., *.example.com rather than *.com)
--- a/toolkit/locales/en-US/chrome/global/filepicker.properties
+++ b/toolkit/locales/en-US/chrome/global/filepicker.properties
@@ -21,26 +21,26 @@ confirmTitle=Confirm
 confirmFileReplacing=%S already exists.\nDo you want to replace it?
 openButtonLabel=Open
 saveButtonLabel=Save
 selectFolderButtonLabel=Select
 noButtonLabel=No
 formatLabel=Format:
 
 errorOpenFileDoesntExistTitle=Error opening %S
-errorOpenFileDoesntExistMessage=File %S doesn't exist
+errorOpenFileDoesntExistMessage=File %S doesn’t exist
 errorDirDoesntExistTitle=Error accessing %S
-errorDirDoesntExistMessage=Directory %S doesn't exist
+errorDirDoesntExistMessage=Directory %S doesn’t exist
 
 errorOpeningFileTitle=Error opening %S
 openWithoutPermissionMessage_file=File %S is not readable
 
 errorSavingFileTitle=Error saving %S
-saveParentIsFileMessage=%S is a file, can't save %S
-saveParentDoesntExistMessage=Path %S doesn't exist, can't save %S
+saveParentIsFileMessage=%S is a file, can’t save %S
+saveParentDoesntExistMessage=Path %S doesn’t exist, can’t save %S
 
 saveWithoutPermissionMessage_file=File %S is not writable.
 saveWithoutPermissionMessage_dir=Cannot create file. Directory %S is not writable.
 
 errorNewDirDoesExistTitle=Error creating %S
 errorNewDirDoesExistMessage=A file named %S already exists, directory cannot be created.
 
 errorCreateNewDirTitle=Error creating %S
--- a/toolkit/locales/en-US/chrome/global/printdialog.properties
+++ b/toolkit/locales/en-US/chrome/global/printdialog.properties
@@ -42,17 +42,17 @@ left=Left
 center=Center
 right=Right
 headerFooterBlank=--blank--
 headerFooterTitle=Title
 headerFooterURL=URL
 headerFooterDate=Date/Time
 headerFooterPage=Page #
 headerFooterPageTotal=Page # of #
-headerFooterCustom=Custom...
+headerFooterCustom=Custom…
 customHeaderFooterPrompt=Please enter your custom header/footer text
 
 # These are for the summary view in the Mac dialog:
 summaryFramesTitle=Print Frames
 summarySelectionOnlyTitle=Print Selection
 summaryShrinkToFitTitle=Shrink To Fit
 summaryPrintBGColorsTitle=Print BG Colors
 summaryPrintBGImagesTitle=Print BG Images
--- a/toolkit/locales/en-US/chrome/global/resetProfile.properties
+++ b/toolkit/locales/en-US/chrome/global/resetProfile.properties
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # LOCALIZATION NOTE: These strings are used for profile reset.
 
 # LOCALIZATION NOTE (resetUnusedProfile.message): %S is brandShortName.
-resetUnusedProfile.message=It looks like you haven't started %S in a while. Do you want to clean it up for a fresh, like-new experience? And by the way, welcome back!
+resetUnusedProfile.message=It looks like you haven’t started %S in a while. Do you want to clean it up for a fresh, like-new experience? And by the way, welcome back!
 # LOCALIZATION NOTE (resetUninstalled.message): %S is brandShortName.
 resetUninstalled.message=Looks like you’ve reinstalled %S. Want us to clean it up for a fresh, like-new experience?
 
 # LOCALIZATION NOTE (refreshProfile.resetButton.label): %S is brandShortName.
 refreshProfile.resetButton.label=Refresh %S…
 refreshProfile.resetButton.accesskey=e
--- a/toolkit/locales/en-US/chrome/global/videocontrols.dtd
+++ b/toolkit/locales/en-US/chrome/global/videocontrols.dtd
@@ -20,17 +20,17 @@
 <!ENTITY stats.volume "Volume">
 <!ENTITY stats.framesParsed "Frames parsed">
 <!ENTITY stats.framesDecoded "Frames decoded">
 <!ENTITY stats.framesPresented "Frames presented">
 <!ENTITY stats.framesPainted "Frames painted">
 
 <!ENTITY error.aborted "Video loading stopped.">
 <!ENTITY error.network "Video playback aborted due to a network error.">
-<!ENTITY error.decode "Video can't be played because the file is corrupt.">
+<!ENTITY error.decode "Video can’t be played because the file is corrupt.">
 <!ENTITY error.srcNotSupported "Video format or MIME type is not supported.">
 <!ENTITY error.noSource2 "No video with supported format and MIME type found.">
 <!ENTITY error.generic "Video playback aborted due to an unknown error.">
 
 <!-- LOCALIZATION NOTE (scrubberScale.nameFormat): the #1 string is the current
 media position, and the #2 string is the total duration. For example, when at
 the 5 minute mark in a 6 hour long video, #1 would be "5:00" and #2 would be
 "6:00:00", result string would be "5:00 of 6:00:00 elapsed".
--- a/toolkit/locales/en-US/chrome/mozapps/downloads/downloads.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/downloads/downloads.properties
@@ -31,18 +31,18 @@ quitCancelDownloadsAlertMsgMacMultiple=I
 offlineCancelDownloadsAlertTitle=Cancel All Downloads?
 offlineCancelDownloadsAlertMsg=If you go offline now, 1 download will be canceled. Are you sure you want to go offline?
 offlineCancelDownloadsAlertMsgMultiple=If you go offline now, %S downloads will be canceled. Are you sure you want to go offline?
 leavePrivateBrowsingCancelDownloadsAlertTitle=Cancel All Downloads?
 leavePrivateBrowsingWindowsCancelDownloadsAlertMsg2=If you close all Private Browsing windows now, 1 download will be canceled. Are you sure you want to leave Private Browsing?
 leavePrivateBrowsingWindowsCancelDownloadsAlertMsgMultiple2=If you close all Private Browsing windows now, %S downloads will be canceled. Are you sure you want to leave Private Browsing?
 cancelDownloadsOKText=Cancel 1 Download
 cancelDownloadsOKTextMultiple=Cancel %S Downloads
-dontQuitButtonWin=Don't Exit
-dontQuitButtonMac=Don't Quit
+dontQuitButtonWin=Don’t Exit
+dontQuitButtonMac=Don’t Quit
 dontGoOfflineButton=Stay Online
 dontLeavePrivateBrowsingButton2=Stay in Private Browsing
 downloadsCompleteTitle=Downloads Complete
 downloadsCompleteMsg=All files have finished downloading. 
 
 # LOCALIZATION NOTE (infiniteRate):
 # If download speed is a JavaScript Infinity value, this phrase is used
 infiniteRate=Really fast
@@ -127,16 +127,16 @@ chooseAppFilePickerTitle=Open With…
 
 # LOCALIZATION NOTE (downloadsTitleFiles, downloadsTitlePercent): Semi-colon list of
 # plural forms. See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
 # #1 number of files; #2 overall download percent (only for downloadsTitlePercent)
 # examples: 2% of 1 file - Downloads; 22% of 11 files - Downloads
 downloadsTitleFiles=#1 file - Downloads;#1 files - Downloads
 downloadsTitlePercent=#2% of #1 file - Downloads;#2% of #1 files - Downloads
 
-fileExecutableSecurityWarning="%S" is an executable file. Executable files may contain viruses or other malicious code that could harm your computer. Use caution when opening this file. Are you sure you want to launch "%S"?
+fileExecutableSecurityWarning=“%S” is an executable file. Executable files may contain viruses or other malicious code that could harm your computer. Use caution when opening this file. Are you sure you want to launch “%S”?
 fileExecutableSecurityWarningTitle=Open Executable File?
-fileExecutableSecurityWarningDontAsk=Don't ask me this again
+fileExecutableSecurityWarningDontAsk=Don’t ask me this again
 
 displayNameDesktop=Desktop
 
 # Desktop folder name for downloaded files
 downloadsFolder=Downloads
--- a/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
@@ -2,17 +2,17 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 title=Opening %S
 saveDialogTitle=Enter name of file to save to…
 defaultApp=%S (default)
 chooseAppFilePickerTitle=Choose Helper Application
-badApp=The application you chose ("%S") could not be found.  Check the file name or choose another application.
+badApp=The application you chose (“%S”) could not be found.  Check the file name or choose another application.
 badApp.title=Application not found
 badPermissions=The file could not be saved because you do not have the proper permissions.  Choose another save directory.
 badPermissions.title=Invalid Save Permissions
 selectDownloadDir=Select Download Folder
 unknownAccept.label=Save File
 unknownCancel.label=Cancel
 fileType=%S file
 # LOCALIZATION NOTE (orderedFileSizeWithType): first %S is type, second %S is size, and third %S is unit  
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/extensions.dtd
@@ -5,19 +5,19 @@
 
 <!ENTITY search.placeholder                   "Search all add-ons">
 <!ENTITY search.buttonlabel                   "Search">
 <!-- LOCALIZATION NOTE (search.commandKey):
      The search command key should match findOnCmd.commandkey from browser.dtd -->
 <!ENTITY search.commandkey                    "f">
 
 <!ENTITY loading.label                        "Loading…">
-<!ENTITY listEmpty.installed.label            "You don't have any add-ons of this type installed">
+<!ENTITY listEmpty.installed.label            "You don’t have any add-ons of this type installed">
 <!ENTITY listEmpty.availableUpdates.label     "No updates found">
-<!ENTITY listEmpty.recentUpdates.label        "You haven't recently updated any add-ons">
+<!ENTITY listEmpty.recentUpdates.label        "You haven’t recently updated any add-ons">
 <!ENTITY listEmpty.findUpdates.label          "Check For Updates">
 <!ENTITY listEmpty.search.label               "Could not find any matching add-ons">
 <!ENTITY listEmpty.button.label               "Learn more about add-ons">
 <!ENTITY installAddonFromFile.label           "Install Add-on From File…">
 <!ENTITY installAddonFromFile.accesskey       "I">
 <!ENTITY toolsMenu.tooltip                    "Tools for all add-ons">
 
 <!ENTITY cmd.back.tooltip                     "Go back one page">
@@ -103,67 +103,67 @@
 <!ENTITY cmd.neverActivate.label              "Never Activate">
 <!ENTITY cmd.neverActivate.tooltip            "Never use this add-on">
 <!ENTITY cmd.stateMenu.tooltip                "Change when this add-on runs">
 <!ENTITY cmd.installAddon.label               "Install">
 <!ENTITY cmd.installAddon.accesskey           "I">
 <!ENTITY cmd.uninstallAddon.label             "Remove">
 <!ENTITY cmd.uninstallAddon.accesskey         "R">
 <!ENTITY cmd.showPreferencesWin.label         "Options">
-<!ENTITY cmd.showPreferencesWin.tooltip       "Change this add-on's options">
+<!ENTITY cmd.showPreferencesWin.tooltip       "Change this add-on’s options">
 <!ENTITY cmd.showPreferencesUnix.label        "Preferences">
-<!ENTITY cmd.showPreferencesUnix.tooltip      "Change this add-on's preferences">
+<!ENTITY cmd.showPreferencesUnix.tooltip      "Change this add-on’s preferences">
 <!ENTITY cmd.contribute.label                 "Contribute">
 <!ENTITY cmd.contribute.accesskey             "C">
 <!ENTITY cmd.contribute.tooltip               "Contribute to the development of this add-on">
 
 <!ENTITY cmd.showReleaseNotes.label           "Show Release Notes">
 <!ENTITY cmd.showReleaseNotes.tooltip         "Show the release notes for this update">
 <!ENTITY cmd.hideReleaseNotes.label           "Hide Release Notes">
 <!ENTITY cmd.hideReleaseNotes.tooltip         "Hide the release notes for this update">
 
 <!-- discovery view -->
 <!-- LOCALIZATION NOTE (discover.title,discover.description,discover.footer):
      Displayed in the center of the Get Add-ons view, see bug 601143 for mockups. -->
 <!ENTITY discover.title                       "What are Add-ons?">
 <!ENTITY discover.description2                "Add-ons are applications that let you personalize &brandShortName; with
   extra functionality or style. Try a time-saving sidebar, a weather notifier, or a themed look to make &brandShortName;
   your own.">
-<!ENTITY discover.footer                      "When you're connected to the internet, this pane will feature
+<!ENTITY discover.footer                      "When you’re connected to the internet, this pane will feature
   some of the best and most popular add-ons for you to try out.">
 
 <!-- detail view -->
 <!ENTITY detail.version.label                 "Version">
 <!ENTITY detail.lastupdated.label             "Last Updated">
 <!ENTITY detail.creator.label                 "Developer">
 <!ENTITY detail.homepage.label                "Homepage">
 <!ENTITY detail.numberOfDownloads.label       "Downloads">
 
 <!ENTITY detail.contributions.description     "The developer of this add-on asks that you help support its continued development by making a small contribution.">
 
 <!ENTITY detail.updateType                    "Automatic Updates">
 <!ENTITY detail.updateDefault.label           "Default">
-<!ENTITY detail.updateDefault.tooltip         "Automatically install updates only if that's the default">
+<!ENTITY detail.updateDefault.tooltip         "Automatically install updates only if that’s the default">
 <!ENTITY detail.updateAutomatic.label         "On">
 <!ENTITY detail.updateAutomatic.tooltip       "Automatically install updates">
 <!ENTITY detail.updateManual.label            "Off">
-<!ENTITY detail.updateManual.tooltip          "Don't automatically install updates">
+<!ENTITY detail.updateManual.tooltip          "Don’t automatically install updates">
 <!ENTITY detail.home                          "Homepage">
 <!ENTITY detail.repository                    "Add-on Profile">
 <!ENTITY detail.size                          "Size">
 
 <!ENTITY detail.checkForUpdates.label         "Check for Updates">
 <!ENTITY detail.checkForUpdates.accesskey     "F">
 <!ENTITY detail.checkForUpdates.tooltip       "Check for updates for this add-on">
 <!ENTITY detail.showPreferencesWin.label      "Options">
 <!ENTITY detail.showPreferencesWin.accesskey  "O">
-<!ENTITY detail.showPreferencesWin.tooltip    "Change this add-on's options">
+<!ENTITY detail.showPreferencesWin.tooltip    "Change this add-on’s options">
 <!ENTITY detail.showPreferencesUnix.label     "Preferences">
 <!ENTITY detail.showPreferencesUnix.accesskey "P">
-<!ENTITY detail.showPreferencesUnix.tooltip   "Change this add-on's preferences">
+<!ENTITY detail.showPreferencesUnix.tooltip   "Change this add-on’s preferences">
 
 
 <!-- ratings -->
 <!ENTITY rating2.label                        "Rating">
 
 <!-- download/install progress -->
 <!ENTITY progress.pause.tooltip               "Pause">
 <!ENTITY progress.cancel.tooltip              "Cancel">
@@ -223,17 +223,17 @@
 
 <!ENTITY settings.path.button.label           "Browse…">
 
 <!-- LOCALIZATION NOTE (experiment.info.label): The strings related to
      experiments are present on the "Experiments" tab of the add-ons manager.
      This tab won't be displayed unless an Experiment add-on is installed.
      Install https://people.mozilla.org/~gszorc/dummy-experiment-addon.xpi
      to cause this tab to appear. -->
-<!ENTITY experiment.info.label "What's this? Telemetry may install and run experiments from time to time.">
+<!ENTITY experiment.info.label "What’s this? Telemetry may install and run experiments from time to time.">
 <!ENTITY experiment.info.learnmore "Learn More">
 <!ENTITY experiment.info.learnmore.accesskey "L">
 <!ENTITY experiment.info.changetelemetry "Telemetry Settings">
 <!ENTITY experiment.info.changetelemetry.accesskey "T">
 
 <!ENTITY setting.learnmore "Learn More…">
 
 <!ENTITY disabledUnsigned.heading "Some add-ons have been disabled">
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/update.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/update.dtd
@@ -18,17 +18,17 @@
                                            of these add-ons available.">
 
 <!ENTITY  checking.wizard.title           "Checking for Compatible Add-ons">
 <!ENTITY  checking.top.label              "Checking your incompatible add-ons for updates…">
 <!ENTITY  checking.status                 "This may take a few minutes…">
 
 <!ENTITY  found.wizard.title               "Found Compatible Add-ons">
 <!ENTITY  found.top.label                 "Select the add-ons you would like to install:">
-<!ENTITY  found.disabledXPinstall.label   "These updates can't be installed because software installation is currently
+<!ENTITY  found.disabledXPinstall.label   "These updates can’t be installed because software installation is currently
                                            disabled. You can change this setting below.">
 <!ENTITY  found.enableXPInstall.label     "Allow websites to install software">
 <!ENTITY  found.enableXPInstall.accesskey "A">
 
 <!ENTITY  installing.wizard.title         "Installing Compatible Add-ons">
 <!ENTITY  installing.top.label            "Downloading and installing updates to your add-ons…">
 
 <!ENTITY  noupdates.wizard.title          "No Compatible Add-ons Found">
--- a/toolkit/locales/en-US/chrome/mozapps/extensions/update.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/extensions/update.properties
@@ -1,15 +1,15 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 mismatchCheckNow=Check Now
 mismatchCheckNowAccesskey=C
-mismatchDontCheck=Don't Check
+mismatchDontCheck=Don’t Check
 mismatchDontCheckAccesskey=D
 installButtonText=Install Now
 installButtonTextAccesskey=I
 nextButtonText=Next >
 nextButtonTextAccesskey=N
 cancelButtonText=Cancel
 cancelButtonTextAccesskey=C
 statusPrefix=Finished checking %S
--- a/toolkit/locales/en-US/chrome/mozapps/handling/handling.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/handling/handling.properties
@@ -2,11 +2,11 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 protocol.title=Launch Application
 protocol.description=This link needs to be opened with an application.
 protocol.choices.label=Send to:
 protocol.checkbox.label=Remember my choice for %S links.
 protocol.checkbox.accesskey=R
-protocol.checkbox.extra=This can be changed in %S's preferences. 
+protocol.checkbox.extra=This can be changed in %S’s preferences.
 
 choose.application.title=Another Application…
--- a/toolkit/locales/en-US/chrome/mozapps/profile/createProfileWizard.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/profile/createProfileWizard.dtd
@@ -2,17 +2,17 @@
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!ENTITY newprofile.title             "Create Profile Wizard">
 <!ENTITY window.size                  "width: 45em; height: 32em;">
 
 <!-- First wizard page -->
 <!ENTITY profileCreationExplanation_1.text  "&brandShortName; stores information about your settings and preferences in your personal profile.">
-<!ENTITY profileCreationExplanation_2.text  "If you are sharing this copy of &brandShortName; with other users, you can use profiles to keep each user's information separate. To do this, each user should create his or her own profile.">
+<!ENTITY profileCreationExplanation_2.text  "If you are sharing this copy of &brandShortName; with other users, you can use profiles to keep each user’s information separate. To do this, each user should create his or her own profile.">
 <!ENTITY profileCreationExplanation_3.text  "If you are the only person using this copy of &brandShortName;, you must have at least one profile. If you would like, you can create multiple profiles for yourself to store different sets of settings and preferences. For example, you may want to have separate profiles for business and personal use.">
 <!ENTITY profileCreationExplanation_4.text  "To begin creating your profile, click Next.">
 <!ENTITY profileCreationExplanation_4Mac.text  "To begin creating your profile, click Continue.">
 <!ENTITY profileCreationExplanation_4Gnome.text  "To begin creating your profile, click Next.">
 
 <!-- Second wizard page -->
 <!ENTITY profileCreationIntro.text      "If you create several profiles you can tell them apart by the profile names. You may use the name provided here or use one of your own.">
 <!ENTITY profilePrompt.label            "Enter new profile name:">
--- a/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
@@ -9,40 +9,40 @@
 restartTitle=Close %S
 restartMessageNoUnlocker=%S is already running, but is not responding. To open a new window, you must first close the existing %S process, or restart your system.
 restartMessageUnlocker=%S is already running, but is not responding. The old %S process must be closed to open a new window.
 restartMessageNoUnlockerMac=A copy of %S is already open. Only one copy of %S can be open at a time.
 restartMessageUnlockerMac=A copy of %S is already open. The running copy of %S will quit in order to open this one.
 
 # Profile manager
 # LOCALIZATION NOTE (profileTooltip): First %S is the profile name, second %S is the path to the profile folder.
-profileTooltip=Profile: '%S' - Path: '%S'
+profileTooltip=Profile: ‘%S’ - Path: ‘%S’
 
 pleaseSelectTitle=Select Profile
 pleaseSelect=Please select a profile to begin %S, or create a new profile.
 
 profileLockedTitle=Profile In Use
-profileLocked2=%S cannot use the profile "%S" because it is in use.\n\nTo continue, close the running instance of %S or choose a different profile.
+profileLocked2=%S cannot use the profile “%S” because it is in use.\n\nTo continue, close the running instance of %S or choose a different profile.
 
 renameProfileTitle=Rename Profile
-renameProfilePrompt=Rename the profile "%S" to:
+renameProfilePrompt=Rename the profile “%S” to:
 
 profileNameInvalidTitle=Invalid profile name
-profileNameInvalid=The profile name "%S" is not allowed.
+profileNameInvalid=The profile name “%S” is not allowed.
 
 chooseFolder=Choose Profile Folder
 profileNameEmpty=An empty profile name is not allowed.
-invalidChar=The character "%S" is not allowed in profile names. Please choose a different name.
+invalidChar=The character “%S” is not allowed in profile names. Please choose a different name.
 
 deleteTitle=Delete Profile
-deleteProfileConfirm=Deleting a profile will remove the profile from the list of available profiles and cannot be undone.\nYou may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder "%S" and cannot be undone.\nWould you like to delete the profile data files?
+deleteProfileConfirm=Deleting a profile will remove the profile from the list of available profiles and cannot be undone.\nYou may also choose to delete the profile data files, including your settings, certificates and other user-related data. This option will delete the folder “%S” and cannot be undone.\nWould you like to delete the profile data files?
 deleteFiles=Delete Files
-dontDeleteFiles=Don't Delete Files
+dontDeleteFiles=Don’t Delete Files
 
-profileCreationFailed=Profile couldn't be created. Probably the chosen folder isn't writable.
+profileCreationFailed=Profile couldn’t be created. Probably the chosen folder isn’t writable.
 profileCreationFailedTitle=Profile Creation failed
 profileExists=A profile with this name already exists. Please choose another name.
 profileExistsTitle=Profile Exists
 profileFinishText=Click Finish to create this new profile.
 profileFinishTextMac=Click Done to create this new profile.
 profileMissing=Your %S profile cannot be loaded. It may be missing or inaccessible.
 profileMissingTitle=Profile Missing
 
--- a/toolkit/locales/en-US/chrome/mozapps/update/updates.dtd
+++ b/toolkit/locales/en-US/chrome/mozapps/update/updates.dtd
@@ -89,13 +89,13 @@
                                            downloaded and is ready to be installed.">
 <!ENTITY  finishedBackground.name         "Update:">
 <!-- LOCALIZATION NOTE (finishedBackground.more): This string describes the button labels defined by restartNowButton and restartLaterButton in updates.properties. -->
 <!ENTITY  finishedBackground.more         "The update will be installed the next time &brandShortName; starts. You
                                            can restart &brandShortName; now, or continue working and restart later.">
 
 <!ENTITY  installed.title                 "Update Installed">
 <!ENTITY  installed.intro                 "The update was successfully installed.">
-<!ENTITY  whatsnew.label                  "Read more about what's new…">
+<!ENTITY  whatsnew.label                  "Read more about what’s new…">
 
 <!ENTITY  update.details.label            "Details">
 <!ENTITY  update.installedOn.label        "Installed on:">
 <!ENTITY  update.status.label             "Status:">
--- a/toolkit/locales/en-US/chrome/mozapps/update/updates.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/update/updates.properties
@@ -14,18 +14,18 @@ updateName=%S %S
 licenseContentDownloading=Getting license for %S %S…
 updateMoreInfoContentDownloading=Getting more details about %S %S…
 
 # LOCALIZATION NOTE: When present
 # %1$S is the brandShortName. Ex: MyApplication
 # %2$S is the update version - provided by the update xml. Ex: version 10.0.5
 # %3$S is the build identifier - provided by the update xml. Ex: 20081022033543
 updateNightlyName=%1$S %2$S %3$S nightly
-incompatAddons_major=Some of your add-ons won't work with %1$S %2$S, and will be disabled. As soon as they are made compatible, %1$S will update and re-enable these add-ons:
-incompatAddons_minor=Some of your add-ons won't work with this update, and will be disabled. As soon as they are made compatible, %1$S will update and re-enable these add-ons:
+incompatAddons_major=Some of your add-ons won’t work with %1$S %2$S, and will be disabled. As soon as they are made compatible, %1$S will update and re-enable these add-ons:
+incompatAddons_minor=Some of your add-ons won’t work with this update, and will be disabled. As soon as they are made compatible, %1$S will update and re-enable these add-ons:
 intro_major=Do you want to upgrade to %1$S %2$S now?
 intro_minor=A security and stability update for %1$S is available:
 
 # LOCALIZATION NOTE:
 # %1$S is the add-on name
 # Example: My Addon
 # %2$S is the add-on version.
 # Example: 2.1.5
--- a/toolkit/locales/en-US/chrome/passwordmgr/passwordmgr.properties
+++ b/toolkit/locales/en-US/chrome/passwordmgr/passwordmgr.properties
@@ -12,17 +12,17 @@ rememberLoginButtonText = Remember
 rememberLoginButtonAccessKey = R
 updateLoginMsg = Would you like to update this login?
 updateLoginMsgNoUser = Would you like to update this password?
 updateLoginButtonText = Update
 updateLoginButtonAccessKey = U
 # LOCALIZATION NOTE (rememberPasswordMsg):
 # 1st string is the username for the login, 2nd is the login's hostname. 
 # Note that long usernames may be truncated.
-rememberPasswordMsg = Would you like to remember the password for "%1$S" on %2$S?
+rememberPasswordMsg = Would you like to remember the password for “%1$S” on %2$S?
 # LOCALIZATION NOTE (rememberPasswordMsgNoUsername):
 # String is the login's hostname.
 rememberPasswordMsgNoUsername = Would you like to remember the password on %S?
 # LOCALIZATION NOTE (noUsernamePlaceholder):
 # This is displayed in place of the username when it is missing.
 noUsernamePlaceholder=No username
 # LOCALIZATION NOTE (showPasswordPlaceholder):
 # This is displayed in the password field to indicate that the password will be
@@ -35,21 +35,21 @@ neverForSiteButtonText = Ne&ver for This
 notifyBarNeverRememberButtonText = Never Remember Password for This Site
 notifyBarNeverRememberButtonAccessKey = e
 rememberButtonText = &Remember
 notifyBarRememberPasswordButtonText = Remember Password
 notifyBarRememberPasswordButtonAccessKey = R
 passwordChangeTitle = Confirm Password Change
 # LOCALIZATION NOTE (updatePasswordMsg):
 # String is the username for the login.
-updatePasswordMsg = Would you like to update the saved password for "%S"?
+updatePasswordMsg = Would you like to update the saved password for “%S”?
 updatePasswordMsgNoUser = Would you like to update the saved password?
 notifyBarUpdateButtonText = Update Password
 notifyBarUpdateButtonAccessKey = U
-notifyBarDontChangeButtonText = Don't Change
+notifyBarDontChangeButtonText = Don’t Change
 notifyBarDontChangeButtonAccessKey = D
 userSelectText = Please confirm which user you are changing the password for
 hidePasswords=Hide Passwords
 hidePasswordsAccessKey=P
 showPasswords=Show Passwords
 showPasswordsAccessKey=P
 noMasterPasswordPrompt=Are you sure you wish to show your passwords?
 removeAllPasswordsPrompt=Are you sure you wish to remove all passwords?
--- a/toolkit/locales/en-US/chrome/pluginproblem/pluginproblem.dtd
+++ b/toolkit/locales/en-US/chrome/pluginproblem/pluginproblem.dtd
@@ -1,17 +1,17 @@
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <!-- LOCALIZATION NOTE (unsupportedPlatform.pre): Mobile only. Flash (the only plugin available on mobile)
      is not supported on some devices. Include a trailing space as needed. -->
-<!ENTITY unsupportedPlatform.pre                             "We're very sorry, but &brandShortName; can't play Flash on this device. ">
+<!ENTITY unsupportedPlatform.pre                             "We’re very sorry, but &brandShortName; can’t play Flash on this device. ">
 <!-- LOCALIZATION NOTE (unsupportedPlatform.learnMore): Mobile only. This text is used to link to a SUMO page explaining why Flash is not
-     supported on this device. Use the unicode ellipsis char, \u2026, or use "..." if \u2026 doesn't suit traditions in your locale. -->
+     supported on this device. Use the unicode ellipsis char, \u2026, or use "..." if \u2026 doesn’t suit traditions in your locale. -->
 <!ENTITY unsupportedPlatform.learnMore                       "Learn More…">
 <!-- LOCALIZATION NOTE (unsupportedPlatform.post): Mobile only. Include text here if needed for your locale. -->
 <!ENTITY unsupportedPlatform.post                            "">
 
 <!ENTITY missingPlugin                                       "A plugin is needed to display this content.">
 <!-- LOCALIZATION NOTE (tapToPlayPlugin): Mobile (used for touch interfaces) only has one type of plugin possible. -->
 <!ENTITY tapToPlayPlugin                                     "Tap here to activate plugin.">
 <!ENTITY clickToActivatePlugin                               "Activate plugin.">
@@ -30,13 +30,13 @@
 <!-- LOCALIZATION NOTE (report.please): This and the other report.* strings should be as short as possible, ideally 2-3 words. -->
 <!ENTITY report.please                                       "Send crash report">
 <!ENTITY report.submitting                                   "Sending report…">
 <!ENTITY report.submitted                                    "Crash report sent.">
 <!ENTITY report.disabled                                     "Crash reporting disabled.">
 <!ENTITY report.failed                                       "Submission failed.">
 <!ENTITY report.unavailable                                  "No report available.">
 <!ENTITY report.comment                                      "Add a comment (comments are publicly visible)">
-<!ENTITY report.pageURL                                      "Include the page's URL">
+<!ENTITY report.pageURL                                      "Include the page’s URL">
 
 <!ENTITY plugin.file                                         "File">
 <!ENTITY plugin.mimeTypes                                    "MIME Types">
 <!ENTITY plugin.flashProtectedMode.label                     "Enable Adobe Flash protected mode">
--- a/toolkit/locales/en-US/chrome/search/search.properties
+++ b/toolkit/locales/en-US/chrome/search/search.properties
@@ -1,20 +1,20 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 addEngineConfirmTitle=Add Search Engine
-addEngineConfirmation=Add "%S" to the list of engines available in the search bar?\n\nFrom: %S
+addEngineConfirmation=Add “%S” to the list of engines available in the search bar?\n\nFrom: %S
 addEngineAsCurrentText=Make this the c&urrent search engine
 addEngineAddButtonLabel=Add
 
 error_loading_engine_title=Download Error
 # LOCALIZATION NOTE (error_loading_engine_msg2): %1$S = brandShortName, %2$S = location
 error_loading_engine_msg2=%S could not download the search plugin from:\n%S
-error_duplicate_engine_msg=%S could not install the search plugin from "%S" because an engine with the same name already exists.
+error_duplicate_engine_msg=%S could not install the search plugin from “%S” because an engine with the same name already exists.
 
 error_invalid_engine_title=Install Error
 # LOCALIZATION NOTE (error_invalid_engine_msg): %S = brandShortName
-error_invalid_engine_msg=This search engine isn't supported by %S and can't be installed.
+error_invalid_engine_msg=This search engine isn’t supported by %S and can’t be installed.
 
 suggestion_label=Suggestions