Bug 1507595 - Convert about:support to Fluent. r=Gijs,flod
☠☠ backed out by 8c35900a1c72 ☠ ☠
authorJared Wein <jwein@mozilla.com>
Mon, 24 Dec 2018 16:19:20 +0000
changeset 451887 28805dd1b97ab5b421d9e886fd5d96460d5d26ab
parent 451886 49a28ec78bfef405d2a3dc9214bbd8c15cdf4c9a
child 451888 485ea25a3b82fcf3136bd6102313f76e8d955ef4
push id75237
push userjwein@mozilla.com
push dateMon, 24 Dec 2018 16:23:32 +0000
treeherderautoland@485ea25a3b82 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersGijs, flod
bugs1507595
milestone66.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 1507595 - Convert about:support to Fluent. r=Gijs,flod Initial patch by Collin Wing (masterkrombi@gmail.com). Differential Revision: https://phabricator.services.mozilla.com/D14905
browser/base/content/test/about/browser_aboutSupport.js
python/l10n/fluent_migrations/bug_1507595_aboutsupport.py
toolkit/content/aboutSupport.js
toolkit/content/aboutSupport.xhtml
toolkit/locales/en-US/chrome/global/aboutSupport.dtd
toolkit/locales/en-US/chrome/global/aboutSupport.properties
toolkit/locales/en-US/toolkit/about/aboutSupport.ftl
toolkit/locales/jar.mn
--- a/browser/base/content/test/about/browser_aboutSupport.js
+++ b/browser/base/content/test/about/browser_aboutSupport.js
@@ -3,30 +3,25 @@
 
 "use strict";
 
 ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 
 add_task(async function() {
   await BrowserTestUtils.withNewTab({ gBrowser, url: "about:support" }, async function(browser) {
-    const strings = Services.strings.createBundle(
-                      "chrome://global/locale/aboutSupport.properties");
-    let allowedStates = [strings.GetStringFromName("found"),
-                         strings.GetStringFromName("missing")];
-
     let keyGoogleStatus = await ContentTask.spawn(browser, null, async function() {
       let textBox = content.document.getElementById("key-google-box");
-      await ContentTaskUtils.waitForCondition(() => textBox.textContent.trim(),
+      await ContentTaskUtils.waitForCondition(() => document.l10n.getAttributes(textBox).id,
         "Google API key status loaded");
-      return textBox.textContent;
+      return document.l10n.getAttributes(textBox).id;
     });
-    ok(allowedStates.includes(keyGoogleStatus), "Google API key status shown");
+    ok(keyGoogleStatus, "Google API key status shown");
 
     let keyMozillaStatus = await ContentTask.spawn(browser, null, async function() {
       let textBox = content.document.getElementById("key-mozilla-box");
-      await ContentTaskUtils.waitForCondition(() => textBox.textContent.trim(),
+      await ContentTaskUtils.waitForCondition(() => document.l10n.getAttributes(textBox).id,
         "Mozilla API key status loaded");
-      return textBox.textContent;
+      return document.l10n.getAttributes(textBox).id;
     });
-    ok(allowedStates.includes(keyMozillaStatus), "Mozilla API key status shown");
+    ok(keyMozillaStatus, "Mozilla API key status shown");
   });
 });
new file mode 100644
--- /dev/null
+++ b/python/l10n/fluent_migrations/bug_1507595_aboutsupport.py
@@ -0,0 +1,426 @@
+# coding=utf8
+
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate import COPY
+from fluent.migrate import CONCAT
+from fluent.migrate import REPLACE
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.helpers import TERM_REFERENCE
+from fluent.migrate.helpers import VARIABLE_REFERENCE
+from fluent.migrate.transforms import PLURALS, REPLACE_IN_TEXT
+
+def migrate(ctx):
+    """Bug 1507595 - Migrate about:support messages to use Fluent for localization, part {index}."""
+
+    ctx.add_transforms(
+        "toolkit/toolkit/about/aboutSupport.ftl",
+        "toolkit/toolkit/about/aboutSupport.ftl",
+        transforms_from(
+"""
+page-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.pageTitle")}
+crashes-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.crashes.title")}
+crashes-id = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.crashes.id")}
+crashes-send-date = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.crashes.sendDate")}
+crashes-all-reports = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.crashes.allReports")}
+crashes-no-config = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.crashes.noConfig")}
+extensions-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.extensionsTitle")}
+extensions-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.extensionName")}
+extensions-enabled = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.extensionEnabled")}
+extensions-version = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.extensionVersion")}
+extensions-id = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.extensionId")}
+security-software-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareTitle")}
+security-software-type = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareType")}
+security-software-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareName")}
+security-software-antivirus = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareAntivirus")}
+security-software-antispyware = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareAntiSpyware")}
+security-software-firewall = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.securitySoftwareFirewall")}
+features-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.featureName")}
+features-version = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.featureVersion")}
+features-id = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.featureId")}
+app-basics-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsTitle")}
+app-basics-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsName")}
+app-basics-version = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsVersion")}
+app-basics-build-id = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsBuildID")}
+app-basics-update-channel = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsUpdateChannel")}
+app-basics-update-history = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsUpdateHistory")}
+app-basics-show-update-history = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsShowUpdateHistory")}
+app-basics-enabled-plugins = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsEnabledPlugins")}
+app-basics-build-config = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsBuildConfig")}
+app-basics-user-agent = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsUserAgent")}
+app-basics-os = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsOS")}
+app-basics-memory-use = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsMemoryUse")}
+app-basics-performance = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsPerformance")}
+app-basics-service-workers = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsServiceWorkers")}
+app-basics-profiles = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsProfiles")}
+app-basics-multi-process-support = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsMultiProcessSupport")}
+app-basics-process-count = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsProcessCount")}
+app-basics-enterprise-policies = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.enterprisePolicies")}
+app-basics-key-google = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsKeyGoogle")}
+app-basics-key-mozilla = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsKeyMozilla")}
+app-basics-safe-mode = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.appBasicsSafeMode")}
+modified-key-prefs-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.modifiedKeyPrefsTitle")}
+modified-prefs-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.modifiedPrefsName")}
+modified-prefs-value = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.modifiedPrefsValue")}
+user-js-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.userJSTitle")}
+locked-key-prefs-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.lockedKeyPrefsTitle")}
+locked-prefs-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.lockedPrefsName")}
+locked-prefs-value = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.lockedPrefsValue")}
+graphics-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsTitle")}
+graphics-features-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsFeaturesTitle")}
+graphics-diagnostics-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsDiagnosticsTitle")}
+graphics-failure-log-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsFailureLogTitle")}
+graphics-gpu1-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsGPU1Title")}
+graphics-gpu2-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsGPU2Title")}
+graphics-decision-log-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsDecisionLogTitle")}
+graphics-crash-guards-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsCrashGuardsTitle")}
+graphics-workarounds-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.graphicsWorkaroundsTitle")}
+place-database-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.placeDatabaseTitle")}
+place-database-integrity = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.placeDatabaseIntegrity")}
+place-database-verify-integrity = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.placeDatabaseVerifyIntegrity")}
+js-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.jsTitle")}
+js-incremental-gc = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.jsIncrementalGC")}
+a11y-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.a11yTitle")}
+a11y-activated = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.a11yActivated")}
+a11y-force-disabled = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.a11yForceDisabled")}
+a11y-handler-used = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.a11yHandlerUsed")}
+a11y-instantiator = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.a11yInstantiator")}
+library-version-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.libraryVersionsTitle")}
+copy-text-to-clipboard-label = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.copyTextToClipboard.label")}
+copy-raw-data-to-clipboard-label = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.copyRawDataToClipboard.label")}
+sandbox-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxTitle")}
+sandbox-sys-call-log-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallLogTitle")}
+sandbox-sys-call-index = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallIndex")}
+sandbox-sys-call-age = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallAge")}
+sandbox-sys-call-pid = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallPID")}
+sandbox-sys-call-tid = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallTID")}
+sandbox-sys-call-proc-type = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallProcType")}
+sandbox-sys-call-number = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallNumber")}
+sandbox-sys-call-args = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.sandboxSyscallArgs")}
+safe-mode-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.safeModeTitle")}
+restart-in-safe-mode-label = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.restartInSafeMode.label")}
+media-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaTitle")}
+media-output-devices-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaOutputDevicesTitle")}
+media-input-devices-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaInputDevicesTitle")}
+media-device-name = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceName")}
+media-device-group = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceGroup")}
+media-device-vendor = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceVendor")}
+media-device-state = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceState")}
+media-device-preferred = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDevicePreferred")}
+media-device-format = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceFormat")}
+media-device-channels = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceChannels")}
+media-device-rate = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceRate")}
+media-device-latency = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.mediaDeviceLatency")}
+intl-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlTitle")}
+intl-app-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlAppTitle")}
+intl-locales-requested = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlLocalesRequested")}
+intl-locales-available = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlLocalesAvailable")}
+intl-locales-supported = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlLocalesSupported")}
+intl-locales-default = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlLocalesDefault")}
+intl-os-title = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlOSTitle")}
+intl-os-prefs-system-locales = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlOSPrefsSystemLocales")}
+intl-regional-prefs = { COPY("toolkit/chrome/global/aboutSupport.dtd", "aboutSupport.intlRegionalPrefs")}
+raw-data-copied = { COPY("toolkit/chrome/global/aboutSupport.properties", "rawDataCopied")}
+text-copied = { COPY("toolkit/chrome/global/aboutSupport.properties", "textCopied")}
+clear-type-parameters = { COPY("toolkit/chrome/global/aboutSupport.properties", "clearTypeParameters")}
+compositing = { COPY("toolkit/chrome/global/aboutSupport.properties", "compositing")}
+hardware-h264 = { COPY("toolkit/chrome/global/aboutSupport.properties", "hardwareH264")}
+main-thread-no-omtc = { COPY("toolkit/chrome/global/aboutSupport.properties", "mainThreadNoOMTC")}
+yes = { COPY("toolkit/chrome/global/aboutSupport.properties", "yes")}
+no = { COPY("toolkit/chrome/global/aboutSupport.properties", "no")}
+found = { COPY("toolkit/chrome/global/aboutSupport.properties", "found")}
+missing = { COPY("toolkit/chrome/global/aboutSupport.properties", "missing")}
+gpu-description = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDescription")}
+gpu-vendor-id = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuVendorID")}
+gpu-device-id = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDeviceID")}
+gpu-subsys-id = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuSubsysID")}
+gpu-drivers = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDrivers")}
+gpu-ram = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuRAM")}
+gpu-driver-version = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDriverVersion")}
+gpu-driver-date = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDriverDate")}
+gpu-active = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuActive")}
+webgl1-wsiinfo = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl1WSIInfo")}
+webgl1-renderer = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl1Renderer")}
+webgl1-version = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl1Version")}
+webgl1-driver-extensions = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl1DriverExtensions")}
+webgl1-extensions = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl1Extensions")}
+webgl2-wsiinfo = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl2WSIInfo")}
+webgl2-renderer = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl2Renderer")}
+webgl2-version = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl2Version")}
+webgl2-driver-extensions = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl2DriverExtensions")}
+webgl2-extensions = { COPY("toolkit/chrome/global/aboutSupport.properties", "webgl2Extensions")}
+blocklisted-bug = { COPY("toolkit/chrome/global/aboutSupport.properties", "blocklistedBug")}
+d3d11layers-crash-guard = { COPY("toolkit/chrome/global/aboutSupport.properties", "d3d11layersCrashGuard")}
+d3d11video-crash-guard = { COPY("toolkit/chrome/global/aboutSupport.properties", "d3d11videoCrashGuard")}
+d3d9video-crash-buard = { COPY("toolkit/chrome/global/aboutSupport.properties", "d3d9videoCrashGuard")}
+glcontext-crash-guard = { COPY("toolkit/chrome/global/aboutSupport.properties", "glcontextCrashGuard")}
+reset-on-next-restart = { COPY("toolkit/chrome/global/aboutSupport.properties", "resetOnNextRestart")}
+gpu-process-kill-button = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuProcessKillButton")}
+gpu-device-reset-button = { COPY("toolkit/chrome/global/aboutSupport.properties", "gpuDeviceResetButton")}
+uses-tiling = { COPY("toolkit/chrome/global/aboutSupport.properties", "usesTiling")}
+content-uses-tiling = { COPY("toolkit/chrome/global/aboutSupport.properties", "contentUsesTiling")}
+off-main-thread-paint-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "offMainThreadPaintEnabled")}
+off-main-thread-paint-worker-count = { COPY("toolkit/chrome/global/aboutSupport.properties", "offMainThreadPaintWorkerCount")}
+audio-backend = { COPY("toolkit/chrome/global/aboutSupport.properties", "audioBackend")}
+max-audio-channels = { COPY("toolkit/chrome/global/aboutSupport.properties", "maxAudioChannels")}
+channel-layout = { COPY("toolkit/chrome/global/aboutSupport.properties", "channelLayout")}
+sample-rate = { COPY("toolkit/chrome/global/aboutSupport.properties", "sampleRate")}
+min-lib-versions = { COPY("toolkit/chrome/global/aboutSupport.properties", "minLibVersions")}
+loaded-lib-versions = { COPY("toolkit/chrome/global/aboutSupport.properties", "loadedLibVersions")}
+has-seccomp-bpf = { COPY("toolkit/chrome/global/aboutSupport.properties", "hasSeccompBPF")}
+has-seccomp-tsync = { COPY("toolkit/chrome/global/aboutSupport.properties", "hasSeccompTSync")}
+has-user-namespaces = { COPY("toolkit/chrome/global/aboutSupport.properties", "hasUserNamespaces")}
+has-privileged-user-namespaces = { COPY("toolkit/chrome/global/aboutSupport.properties", "hasPrivilegedUserNamespaces")}
+can-sandbox-content = { COPY("toolkit/chrome/global/aboutSupport.properties", "canSandboxContent")}
+can-sandbox-media = { COPY("toolkit/chrome/global/aboutSupport.properties", "canSandboxMedia")}
+content-sandbox-level = { COPY("toolkit/chrome/global/aboutSupport.properties", "contentSandboxLevel")}
+effective-content-sandbox-level = { COPY("toolkit/chrome/global/aboutSupport.properties", "effectiveContentSandboxLevel")}
+sandbox-proc-type-content = { COPY("toolkit/chrome/global/aboutSupport.properties", "sandboxProcType.content")}
+sandbox-proc-type-file = { COPY("toolkit/chrome/global/aboutSupport.properties", "sandboxProcType.file")}
+sandbox-proc-type-media-plugin = { COPY("toolkit/chrome/global/aboutSupport.properties", "sandboxProcType.mediaPlugin")}
+multi-process-status-0 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.0")}
+multi-process-status-1 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.1")}
+multi-process-status-2 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.2")}
+multi-process-status-4 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.4")}
+multi-process-status-6 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.6")}
+multi-process-status-7 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.7")}
+multi-process-status-8 = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.8")}
+multi-process-status-unknown = { COPY("toolkit/chrome/global/aboutSupport.properties", "multiProcessStatus.unknown")}
+async-pan-zoom = { COPY("toolkit/chrome/global/aboutSupport.properties", "asyncPanZoom")}
+apz-none = { COPY("toolkit/chrome/global/aboutSupport.properties", "apzNone")}
+wheel-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "wheelEnabled")}
+touch-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "touchEnabled")}
+drag-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "dragEnabled")}
+keyboard-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "keyboardEnabled")}
+autoscroll-enabled = { COPY("toolkit/chrome/global/aboutSupport.properties", "autoscrollEnabled")}
+policies-inactive = { COPY("toolkit/chrome/global/aboutSupport.properties", "policies.inactive")}
+policies-active = { COPY("toolkit/chrome/global/aboutSupport.properties", "policies.active")}
+policies-error = { COPY("toolkit/chrome/global/aboutSupport.properties", "policies.error")}
+multi-process-windows = { $remoteWindows }/{ $totalWindows }
+""")
+)
+
+    ctx.add_transforms(
+        "toolkit/toolkit/about/aboutSupport.ftl",
+        "toolkit/toolkit/about/aboutSupport.ftl",
+        [
+        FTL.Message(
+            id=FTL.Identifier("page-subtitle"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.dtd",
+                "aboutSupport.pageSubtitle",
+                {
+                    "&brandShortName;": TERM_REFERENCE("-brand-short-name"),
+                    "<a id='supportLink'>": FTL.TextElement('<a data-l10n-name="support-link">'),
+                },
+                trim=True
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("features-title"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.dtd",
+                "aboutSupport.featuresTitle",
+                {
+                    "&brandShortName;": TERM_REFERENCE("-brand-short-name"),
+                },
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("app-basics-profile-dir"),
+            value=FTL.Pattern(
+                elements=[
+                    FTL.Placeable(
+                        expression=FTL.SelectExpression(
+                            selector=FTL.CallExpression(
+                                callee=FTL.Function("PLATFORM")
+                            ),
+                            variants=[
+                                FTL.Variant(
+                                    key=FTL.Identifier("linux"),
+                                    default=False,
+                                    value=COPY(
+                                        "toolkit/chrome/global/aboutSupport.dtd",
+                                        "aboutSupport.appBasicsProfileDir"
+                                    )
+                                ),
+                                FTL.Variant(
+                                    key=FTL.Identifier("other"),
+                                    default=True,
+                                    value=COPY(
+                                        "toolkit/chrome/global/aboutSupport.dtd",
+                                        "aboutSupport.appBasicsProfileDirWinMac"
+                                    )
+                                ),
+                            ]
+                        )
+                    )
+                ]
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("show-dir-label"),
+            value=FTL.Pattern(
+                elements=[
+                    FTL.Placeable(
+                        expression=FTL.SelectExpression(
+                            selector=FTL.CallExpression(
+                                callee=FTL.Function("PLATFORM")
+                            ),
+                            variants=[
+                                FTL.Variant(
+                                    key=FTL.Identifier("macos"),
+                                    default=False,
+                                    value=COPY(
+                                        "toolkit/chrome/global/aboutSupport.dtd",
+                                        "aboutSupport.showMac.label"
+                                    )
+                                ),
+                                FTL.Variant(
+                                    key=FTL.Identifier("windows"),
+                                    default=False,
+                                    value=COPY(
+                                        "toolkit/chrome/global/aboutSupport.dtd",
+                                        "aboutSupport.showWin2.label"
+                                    )
+                                ),
+                                FTL.Variant(
+                                    key=FTL.Identifier("other"),
+                                    default=True,
+                                    value=COPY(
+                                        "toolkit/chrome/global/aboutSupport.dtd",
+                                        "aboutSupport.showDir.label"
+                                    )
+                                ),
+                            ]
+                        )
+                    )
+                ]
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("user-js-description"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.dtd",
+                "aboutSupport.userJSDescription",
+                {
+                    "<a id='prefs-user-js-link'>": FTL.TextElement('<a data-l10n-name="user-js-link">'),
+                    "&brandShortName;": TERM_REFERENCE("-brand-short-name"),
+                },
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("report-crash-for-days"),
+            value=PLURALS(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "crashesTitle",
+                VARIABLE_REFERENCE("days"),
+                lambda text: REPLACE_IN_TEXT(
+                    text,
+                    {
+                        "#1": VARIABLE_REFERENCE("days")
+                    }
+                )
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("crashes-time-minutes"),
+            value=PLURALS(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "crashesTimeMinutes",
+                VARIABLE_REFERENCE("minutes"),
+                lambda text: REPLACE_IN_TEXT(
+                    text,
+                    {
+                        "#1": VARIABLE_REFERENCE("minutes")
+                    }
+                )
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("crashes-time-hours"),
+            value=PLURALS(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "crashesTimeHours",
+                VARIABLE_REFERENCE("hours"),
+                lambda text: REPLACE_IN_TEXT(
+                    text,
+                    {
+                        "#1": VARIABLE_REFERENCE("hours")
+                    }
+                )
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("crashes-time-days"),
+            value=PLURALS(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "crashesTimeDays",
+                VARIABLE_REFERENCE("days"),
+                lambda text: REPLACE_IN_TEXT(
+                    text,
+                    {
+                        "#1": VARIABLE_REFERENCE("days")
+                    }
+                )
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("pending-reports"),
+            value=PLURALS(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "pendingReports",
+                VARIABLE_REFERENCE("reports"),
+                lambda text: REPLACE_IN_TEXT(
+                    text,
+                    {
+                        "#1": VARIABLE_REFERENCE("reports")
+                    }
+                )
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("bug-link"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "bugLink",
+                {
+                    "%1$S": VARIABLE_REFERENCE("bugNumber"),
+                },
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("unknown-failure"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "unknownFailure",
+                {
+                    "%1$S": VARIABLE_REFERENCE("failureCode"),
+                },
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("wheel-warning"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "wheelWarning",
+                {
+                    "%S": VARIABLE_REFERENCE("preferenceKey"),
+                },
+            )
+        ),
+        FTL.Message(
+            id=FTL.Identifier("touch-warning"),
+            value=REPLACE(
+                "toolkit/chrome/global/aboutSupport.properties",
+                "touchWarning",
+                {
+                    "%S": VARIABLE_REFERENCE("preferenceKey"),
+                },
+            )
+        ),
+   ]
+)
--- a/toolkit/content/aboutSupport.js
+++ b/toolkit/content/aboutSupport.js
@@ -12,296 +12,270 @@ ChromeUtils.import("resource://gre/modul
 
 ChromeUtils.defineModuleGetter(this, "PluralForm",
                                "resource://gre/modules/PluralForm.jsm");
 ChromeUtils.defineModuleGetter(this, "PlacesDBUtils",
                                "resource://gre/modules/PlacesDBUtils.jsm");
 
 window.addEventListener("load", function onload(event) {
   try {
-  window.removeEventListener("load", onload);
-  Troubleshoot.snapshot(function(snapshot) {
-    for (let prop in snapshotFormatters)
-      snapshotFormatters[prop](snapshot[prop]);
-  });
-  populateActionBox();
-  setupEventListeners();
+    window.removeEventListener("load", onload);
+    Troubleshoot.snapshot(async function(snapshot) {
+      for (let prop in snapshotFormatters)
+        await snapshotFormatters[prop](snapshot[prop]);
+    });
+    populateActionBox();
+    setupEventListeners();
   } catch (e) {
     Cu.reportError("stack of load error for about:support: " + e + ": " + e.stack);
   }
 });
 
+// Fluent uses lisp-case IDs so this converts
+// the SentenceCase info IDs to lisp-case.
+function toFluentID(str) {
+  return str.toString().replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
+}
+
 // Each property in this object corresponds to a property in Troubleshoot.jsm's
 // snapshot data.  Each function is passed its property's corresponding data,
 // and it's the function's job to update the page with it.
 var snapshotFormatters = {
 
-  application: function application(data) {
-    let strings = stringBundle();
+  async application(data) {
     $("application-box").textContent = data.name;
     $("useragent-box").textContent = data.userAgent;
     $("os-box").textContent = data.osVersion;
     $("supportLink").href = data.supportURL;
     let version = AppConstants.MOZ_APP_VERSION_DISPLAY;
     if (data.vendor)
       version += " (" + data.vendor + ")";
     $("version-box").textContent = version;
     $("buildid-box").textContent = data.buildID;
     if (data.updateChannel)
       $("updatechannel-box").textContent = data.updateChannel;
     $("profile-dir-box").textContent = Services.dirsvc.get("ProfD", Ci.nsIFile).path;
 
-    let statusText = strings.GetStringFromName("multiProcessStatus.unknown");
+    let statusTextId = "multi-process-status-unknown";
 
     // Whitelist of known values with string descriptions:
     switch (data.autoStartStatus) {
       case 0:
       case 1:
       case 2:
       case 4:
       case 6:
       case 7:
       case 8:
-        statusText = strings.GetStringFromName("multiProcessStatus." + data.autoStartStatus);
+        statusTextId = "multi-process-status-" + data.autoStartStatus;
         break;
     }
 
-    $("multiprocess-box").textContent = strings.formatStringFromName("multiProcessWindows",
-      [data.numRemoteWindows, data.numTotalWindows, statusText], 3);
+    document.l10n.setAttributes($("multiprocess-box-process-count"),
+                                "multi-process-windows",
+                                {
+                                  remoteWindows: data.numRemoteWindows,
+                                  totalWindows: data.numTotalWindows,
+                                });
+    document.l10n.setAttributes($("multiprocess-box-status"), statusTextId);
 
     if (data.remoteAutoStart) {
       $("contentprocesses-box").textContent = data.currentContentProcesses +
                                               "/" +
                                               data.maxContentProcesses;
     } else {
       $("contentprocesses-row").hidden = true;
     }
 
     if (Services.policies) {
       let policiesText = "";
       let aboutPolicies = "about:policies";
       switch (data.policiesStatus) {
         case Services.policies.INACTIVE:
-          policiesText = strings.GetStringFromName("policies.inactive");
+          policiesText = await document.l10n.formatValue("policies-inactive");
           break;
 
         case Services.policies.ACTIVE:
-          policiesText = strings.GetStringFromName("policies.active");
+          policiesText = await document.l10n.formatValue("policies-active");
           aboutPolicies += "#active";
           break;
 
         default:
-          policiesText = strings.GetStringFromName("policies.error");
+          policiesText = await document.l10n.formatValue("policies-error");
           aboutPolicies += "#errors";
           break;
       }
 
       if (data.policiesStatus != Services.policies.INACTIVE) {
         let activePolicies = $.new("a", policiesText, null, {href: aboutPolicies});
         $("policies-status").appendChild(activePolicies);
       } else {
         $("policies-status").textContent = policiesText;
       }
     } else {
       $("policies-status-row").hidden = true;
     }
 
     let keyGoogleFound = data.keyGoogleFound ? "found" : "missing";
-    $("key-google-box").textContent = strings.GetStringFromName(keyGoogleFound);
+    document.l10n.setAttributes($("key-google-box"), keyGoogleFound);
 
     let keyMozillaFound = data.keyMozillaFound ? "found" : "missing";
-    $("key-mozilla-box").textContent = strings.GetStringFromName(keyMozillaFound);
+    document.l10n.setAttributes($("key-mozilla-box"), keyMozillaFound);
 
     $("safemode-box").textContent = data.safeMode;
   },
 
-  crashes: function crashes(data) {
+  crashes(data) {
     if (!AppConstants.MOZ_CRASHREPORTER)
       return;
 
-    let strings = stringBundle();
     let daysRange = Troubleshoot.kMaxCrashAge / (24 * 60 * 60 * 1000);
-    $("crashes-title").textContent =
-      PluralForm.get(daysRange, strings.GetStringFromName("crashesTitle"))
-                .replace("#1", daysRange);
+    document.l10n.setAttributes($("crashes-title"), "report-crash-for-days", { days: daysRange });
     let reportURL;
     try {
       reportURL = Services.prefs.getCharPref("breakpad.reportURL");
       // Ignore any non http/https urls
       if (!/^https?:/i.test(reportURL))
         reportURL = null;
     } catch (e) { }
     if (!reportURL) {
       $("crashes-noConfig").style.display = "block";
       $("crashes-noConfig").classList.remove("no-copy");
       return;
     }
     $("crashes-allReports").style.display = "block";
     $("crashes-allReports").classList.remove("no-copy");
 
     if (data.pending > 0) {
-      $("crashes-allReportsWithPending").textContent =
-        PluralForm.get(data.pending, strings.GetStringFromName("pendingReports"))
-                  .replace("#1", data.pending);
+      document.l10n.setAttributes($("crashes-allReportsWithPending"), "pending-reports", { reports: data.pending });
     }
 
     let dateNow = new Date();
     $.append($("crashes-tbody"), data.submitted.map(function(crash) {
       let date = new Date(crash.date);
       let timePassed = dateNow - date;
-      let formattedDate;
+      let formattedDateStrId;
+      let formattedDateStrArgs;
       if (timePassed >= 24 * 60 * 60 * 1000) {
         let daysPassed = Math.round(timePassed / (24 * 60 * 60 * 1000));
-        let daysPassedString = strings.GetStringFromName("crashesTimeDays");
-        formattedDate = PluralForm.get(daysPassed, daysPassedString)
-                                  .replace("#1", daysPassed);
+        formattedDateStrId = "crashes-time-days";
+        formattedDateStrArgs = { days: daysPassed };
       } else if (timePassed >= 60 * 60 * 1000) {
         let hoursPassed = Math.round(timePassed / (60 * 60 * 1000));
-        let hoursPassedString = strings.GetStringFromName("crashesTimeHours");
-        formattedDate = PluralForm.get(hoursPassed, hoursPassedString)
-                                  .replace("#1", hoursPassed);
+        formattedDateStrId = "crashes-time-hours";
+        formattedDateStrArgs = { hours: hoursPassed };
       } else {
         let minutesPassed = Math.max(Math.round(timePassed / (60 * 1000)), 1);
-        let minutesPassedString = strings.GetStringFromName("crashesTimeMinutes");
-        formattedDate = PluralForm.get(minutesPassed, minutesPassedString)
-                                  .replace("#1", minutesPassed);
+        formattedDateStrId = "crashes-time-minutes";
+        formattedDateStrArgs = { minutes: minutesPassed };
       }
       return $.new("tr", [
         $.new("td", [
           $.new("a", crash.id, null, {href: reportURL + crash.id}),
         ]),
-        $.new("td", formattedDate),
+        $.new("td", null, null, {"data-l10n-id": formattedDateStrId, "data-l10n-args": formattedDateStrArgs}),
       ]);
     }));
   },
 
-  extensions: function extensions(data) {
+  extensions(data) {
     $.append($("extensions-tbody"), data.map(function(extension) {
       return $.new("tr", [
         $.new("td", extension.name),
         $.new("td", extension.version),
         $.new("td", extension.isActive),
         $.new("td", extension.id),
       ]);
     }));
   },
 
-  securitySoftware: function securitySoftware(data) {
+  securitySoftware(data) {
     if (!AppConstants.isPlatformAndVersionAtLeast("win", "6.2")) {
       $("security-software-title").hidden = true;
       $("security-software-table").hidden = true;
       return;
     }
 
     $("security-software-antivirus").textContent = data.registeredAntiVirus;
     $("security-software-antispyware").textContent = data.registeredAntiSpyware;
     $("security-software-firewall").textContent = data.registeredFirewall;
   },
 
-  features: function features(data) {
+  features(data) {
     $.append($("features-tbody"), data.map(function(feature) {
       return $.new("tr", [
         $.new("td", feature.name),
         $.new("td", feature.version),
         $.new("td", feature.id),
       ]);
     }));
   },
 
-  modifiedPreferences: function modifiedPreferences(data) {
+  modifiedPreferences(data) {
     $.append($("prefs-tbody"), sortedArrayFromObject(data).map(
       function([name, value]) {
         return $.new("tr", [
           $.new("td", name, "pref-name"),
           // Very long preference values can cause users problems when they
           // copy and paste them into some text editors.  Long values generally
           // aren't useful anyway, so truncate them to a reasonable length.
           $.new("td", String(value).substr(0, 120), "pref-value"),
         ]);
       }
     ));
   },
 
-  lockedPreferences: function lockedPreferences(data) {
+  lockedPreferences(data) {
     $.append($("locked-prefs-tbody"), sortedArrayFromObject(data).map(
       function([name, value]) {
         return $.new("tr", [
           $.new("td", name, "pref-name"),
           $.new("td", String(value).substr(0, 120), "pref-value"),
         ]);
       }
     ));
   },
 
-  graphics: function graphics(data) {
-    let strings = stringBundle();
-
-    function localizedMsg(msgArray) {
-      let nameOrMsg = msgArray.shift();
-      if (msgArray.length) {
-        // formatStringFromName logs an NS_ASSERTION failure otherwise that says
-        // "use GetStringFromName".  Lame.
-        try {
-          return strings.formatStringFromName(nameOrMsg, msgArray,
-                                              msgArray.length);
-        } catch (err) {
-          // Throws if nameOrMsg is not a name in the bundle.  This shouldn't
-          // actually happen though, since msgArray.length > 1 => nameOrMsg is a
-          // name in the bundle, not a message, and the remaining msgArray
-          // elements are parameters.
-          return nameOrMsg;
-        }
-      }
-      try {
-        return strings.GetStringFromName(nameOrMsg);
-      } catch (err) {
-        // Throws if nameOrMsg is not a name in the bundle.
-      }
-      return nameOrMsg;
+  async graphics(data) {
+    function localizedMsg(msg) {
+      let msgId = toFluentID(msg);
+      return document.l10n.formatValue(msgId);
     }
 
     // Read APZ info out of data.info, stripping it out in the process.
     let apzInfo = [];
     let formatApzInfo = function(info) {
       let out = [];
       for (let type of ["Wheel", "Touch", "Drag", "Keyboard", "Autoscroll"]) {
         let key = "Apz" + type + "Input";
 
         if (!(key in info))
           continue;
 
         delete info[key];
 
-        let message = localizedMsg([type.toLowerCase() + "Enabled"]);
-        out.push(message);
+        out.push(toFluentID(type.toLowerCase() + "Enabled"));
       }
 
       return out;
     };
 
     // Create a <tr> element with key and value columns.
     //
     // @key      Text in the key column. Localized automatically, unless starts with "#".
     // @value    Text in the value column. Not localized.
     function buildRow(key, value) {
-      let title;
-      if (key[0] == "#") {
-        title = key.substr(1);
-      } else {
-        try {
-          title = strings.GetStringFromName(key);
-        } catch (e) {
-          title = key;
-        }
-      }
-      let td = $.new("td", value);
+      let title = key[0] == "#" ? key.substr(1) : key;
+      let keyStrId = toFluentID(key);
+      let valueStrId = Array.isArray(value) ? null : toFluentID(value);
+      let td = $.new("td", value, null, {"data-l10n-id": valueStrId});
       td.style["white-space"] = "pre-wrap";
 
       return $.new("tr", [
-        $.new("th", title, "column"),
+        $.new("th", title, "column", {"data-l10n-id": keyStrId}),
         td,
       ]);
     }
 
     // @where    The name in "graphics-<name>-tbody", of the element to append to.
     // @trs      Array of row elements.
     function addRows(where, trs) {
       $.append($("graphics-" + where + "-tbody"), trs);
@@ -309,17 +283,17 @@ var snapshotFormatters = {
 
     // Build and append a row.
     //
     // @where    The name in "graphics-<name>-tbody", of the element to append to.
     function addRow(where, key, value) {
       addRows(where, [buildRow(key, value)]);
     }
     if (data.clearTypeParameters !== undefined) {
-      addRow("diagnostics", "clearTypeParameters", data.clearTypeParameters);
+      addRow("diagnostics", "clear-type-parameters", data.clearTypeParameters);
     }
     if ("info" in data) {
       apzInfo = formatApzInfo(data.info);
 
       let trs = sortedArrayFromObject(data.info).map(function([prop, val]) {
         return $.new("tr", [
           $.new("th", prop, "column"),
           $.new("td", String(val)),
@@ -337,33 +311,33 @@ var snapshotFormatters = {
       let gpuProcessKillButton = null;
       if (AppConstants.NIGHTLY_BUILD || AppConstants.MOZ_DEV_EDITION) {
         gpuProcessKillButton = $.new("button");
 
         gpuProcessKillButton.addEventListener("click", function() {
           windowUtils.terminateGPUProcess();
         });
 
-        gpuProcessKillButton.textContent = strings.GetStringFromName("gpuProcessKillButton");
+        document.l10n.setAttributes(gpuProcessKillButton, "gpu-process-kill-button");
       }
 
       addRow("diagnostics", "GPUProcessPid", gpuProcessPid);
       if (gpuProcessKillButton) {
         addRow("diagnostics", "GPUProcess", [gpuProcessKillButton]);
       }
     }
 
     if ((AppConstants.NIGHTLY_BUILD || AppConstants.MOZ_DEV_EDITION) && AppConstants.platform != "macosx") {
       let gpuDeviceResetButton = $.new("button");
 
       gpuDeviceResetButton.addEventListener("click", function() {
         windowUtils.triggerDeviceReset();
       });
 
-      gpuDeviceResetButton.textContent = strings.GetStringFromName("gpuDeviceResetButton");
+      document.l10n.setAttributes(gpuDeviceResetButton, "gpu-device-reset-button");
       addRow("diagnostics", "Device Reset", [gpuDeviceResetButton]);
     }
 
     // graphics-failures-tbody tbody
     if ("failures" in data) {
       // If indices is there, it should be the same length as failures,
       // (see Troubleshoot.jsm) but we check anyway:
       if ("indices" in data && data.failures.length == data.indices.length) {
@@ -394,25 +368,25 @@ var snapshotFormatters = {
       $("graphics-failures-tbody").style.display = "none";
     }
 
     // Add a new row to the table, and take the key (or keys) out of data.
     //
     // @where        Table section to add to.
     // @key          Data key to use.
     // @colKey       The localization key to use, if different from key.
-    function addRowFromKey(where, key, colKey) {
+    async function addRowFromKey(where, key, colKey) {
       if (!(key in data))
         return;
       colKey = colKey || key;
 
       let value;
       let messageKey = key + "Message";
       if (messageKey in data) {
-        value = localizedMsg(data[messageKey]);
+        value = await localizedMsg(data[messageKey]);
         delete data[messageKey];
       } else {
         value = data[key];
       }
       delete data[key];
 
       if (value) {
         addRow(where, colKey, value);
@@ -422,66 +396,76 @@ var snapshotFormatters = {
     // graphics-features-tbody
     let compositor = "";
     if (data.windowLayerManagerRemote) {
       compositor = data.windowLayerManagerType;
       if (data.windowUsingAdvancedLayers) {
         compositor += " (Advanced Layers)";
       }
     } else {
-      compositor = "BasicLayers (" + strings.GetStringFromName("mainThreadNoOMTC") + ")";
+      let noOMTCString = await document.l10n.formatValue("main-thread-no-omtc");
+      compositor = "BasicLayers (" + noOMTCString + ")";
     }
     addRow("features", "compositing", compositor);
     delete data.windowLayerManagerRemote;
     delete data.windowLayerManagerType;
     delete data.numTotalWindows;
     delete data.numAcceleratedWindows;
     delete data.numAcceleratedWindowsMessage;
     delete data.windowUsingAdvancedLayers;
 
     addRow("features", "asyncPanZoom",
            apzInfo.length
-           ? apzInfo.join("; ")
-           : localizedMsg(["apzNone"]));
-    addRowFromKey("features", "webgl1WSIInfo");
-    addRowFromKey("features", "webgl1Renderer");
-    addRowFromKey("features", "webgl1Version");
-    addRowFromKey("features", "webgl1DriverExtensions");
-    addRowFromKey("features", "webgl1Extensions");
-    addRowFromKey("features", "webgl2WSIInfo");
-    addRowFromKey("features", "webgl2Renderer");
-    addRowFromKey("features", "webgl2Version");
-    addRowFromKey("features", "webgl2DriverExtensions");
-    addRowFromKey("features", "webgl2Extensions");
-    addRowFromKey("features", "supportsHardwareH264", "hardwareH264");
-    addRowFromKey("features", "direct2DEnabled", "#Direct2D");
-    addRowFromKey("features", "usesTiling");
-    addRowFromKey("features", "contentUsesTiling");
-    addRowFromKey("features", "offMainThreadPaintEnabled");
-    addRowFromKey("features", "offMainThreadPaintWorkerCount");
+           ? (await document.l10n.formatValues(apzInfo.map(id => { return {id}; }))).join("; ")
+           : await localizedMsg("apz-none"));
+    let featureKeys = [
+      "webgl1WSIInfo",
+      "webgl1Renderer",
+      "webgl1Version",
+      "webgl1DriverExtensions",
+      "webgl1Extensions",
+      "webgl2WSIInfo",
+      "webgl2Renderer",
+      "webgl2Version",
+      "webgl2DriverExtensions",
+      "webgl2Extensions",
+      ["supportsHardwareH264", "hardware-h264"],
+      ["direct2DEnabled", "#Direct2D"],
+      "usesTiling",
+      "contentUsesTiling",
+      "offMainThreadPaintEnabled",
+      "offMainThreadPaintWorkerCount",
+    ];
+    for (let feature of featureKeys) {
+      if (Array.isArray(feature)) {
+        await addRowFromKey("features", feature[0], feature[1]);
+        continue;
+      }
+      await addRowFromKey("features", feature);
+    }
 
     if ("directWriteEnabled" in data) {
       let message = data.directWriteEnabled;
       if ("directWriteVersion" in data)
         message += " (" + data.directWriteVersion + ")";
-      addRow("features", "#DirectWrite", message);
+      await addRow("features", "#DirectWrite", message);
       delete data.directWriteEnabled;
       delete data.directWriteVersion;
     }
 
     // Adapter tbodies.
     let adapterKeys = [
-      ["adapterDescription", "gpuDescription"],
-      ["adapterVendorID", "gpuVendorID"],
-      ["adapterDeviceID", "gpuDeviceID"],
-      ["driverVersion", "gpuDriverVersion"],
-      ["driverDate", "gpuDriverDate"],
-      ["adapterDrivers", "gpuDrivers"],
-      ["adapterSubsysID", "gpuSubsysID"],
-      ["adapterRAM", "gpuRAM"],
+      ["adapterDescription", "gpu-description"],
+      ["adapterVendorID", "gpu-vendor-id"],
+      ["adapterDeviceID", "gpu-device-id"],
+      ["driverVersion", "gpu-driver-version"],
+      ["driverDate", "gpu-driver-date"],
+      ["adapterDrivers", "gpu-drivers"],
+      ["adapterSubsysID", "gpu-subsys-id"],
+      ["adapterRAM", "gpu-ram"],
     ];
 
     function showGpu(id, suffix) {
       function get(prop) {
         return data[prop + suffix];
       }
 
       let trs = [];
@@ -496,17 +480,18 @@ var snapshotFormatters = {
         $("graphics-" + id + "-tbody").style.display = "none";
         return;
       }
 
       let active = "yes";
       if ("isGPU2Active" in data && ((suffix == "2") != data.isGPU2Active)) {
         active = "no";
       }
-      addRow(id, "gpuActive", strings.GetStringFromName(active));
+
+      addRow(id, "gpu-active", active);
       addRows(id, trs);
     }
     showGpu("gpu-1", "");
     showGpu("gpu-2", "2");
 
     // Remove adapter keys.
     for (let [prop /* key */] of adapterKeys) {
       delete data[prop];
@@ -534,26 +519,27 @@ var snapshotFormatters = {
             continue;
 
           let contents;
           if (entry.message.length > 0 && entry.message[0] == "#") {
             // This is a failure ID. See nsIGfxInfo.idl.
             let m = /#BLOCKLIST_FEATURE_FAILURE_BUG_(\d+)/.exec(entry.message);
             if (m) {
               let bugSpan = $.new("span");
-              bugSpan.textContent = strings.GetStringFromName("blocklistedBug") + "; ";
+              document.l10n.setAttributes(bugSpan, "blocklisted-bug");
 
               let bugHref = $.new("a");
               bugHref.href = "https://bugzilla.mozilla.org/show_bug.cgi?id=" + m[1];
-              bugHref.textContent = strings.formatStringFromName("bugLink", [m[1]], 1);
+              document.l10n.setAttributes(bugHref, "bug-link", { bugNumber: m[1]});
 
               contents = [bugSpan, bugHref];
             } else {
-              contents = strings.formatStringFromName(
-                "unknownFailure", [entry.message.substr(1)], 1);
+              let unknownFailure = $.new("span");
+              document.l10n.setAttributes(unknownFailure, "unknown-failure", { failureCode: entry.message.substr(1) });
+              contents = [unknownFailure];
             }
           } else {
             contents = entry.status + " by " + entry.type + ": " + entry.message;
           }
 
           trs.push($.new("tr", [
             $.new("td", contents),
           ]));
@@ -579,48 +565,43 @@ var snapshotFormatters = {
       for (let guard of crashGuards) {
         let resetButton = $.new("button");
         let onClickReset = function() {
           Services.prefs.setIntPref(guard.prefName, 0);
           resetButton.removeEventListener("click", onClickReset);
           resetButton.disabled = true;
         };
 
-        resetButton.textContent = strings.GetStringFromName("resetOnNextRestart");
+        document.l10n.setAttributes(resetButton, "reset-on-next-restart");
         resetButton.addEventListener("click", onClickReset);
 
         addRow("crashguards", guard.type + "CrashGuard", [resetButton]);
       }
     } else {
       $("graphics-crashguards-tbody").style.display = "none";
     }
 
     // Now that we're done, grab any remaining keys in data and drop them into
     // the diagnostics section.
     for (let key in data) {
       let value = data[key];
-      if (Array.isArray(value)) {
-        value = localizedMsg(value);
-      }
       addRow("diagnostics", key, value);
     }
   },
 
-  media: function media(data) {
-    let strings = stringBundle();
-
-    function insertBasicInfo(key, value) {
-      function createRow(key, value) {
-        let th = $.new("th", strings.GetStringFromName(key), "column");
+  async media(data) {
+    async function insertBasicInfo(key, value) {
+      async function createRow(key, value) {
+        let th = $.new("th", await document.l10n.formatValue(key), "column");
         let td = $.new("td", value);
         td.style["white-space"] = "pre-wrap";
         td.colSpan = 8;
         return $.new("tr", [th, td]);
       }
-      $.append($("media-info-tbody"), [createRow(key, value)]);
+      $.append($("media-info-tbody"), [await createRow(key, value)]);
     }
 
     function createDeviceInfoRow(device) {
       let deviceInfo = Ci.nsIAudioDeviceInfo;
 
       let states = {};
       states[deviceInfo.STATE_DISABLED] = "Disabled";
       states[deviceInfo.STATE_UNPLUGGED] = "Unplugged";
@@ -693,125 +674,124 @@ var snapshotFormatters = {
       let rows = [];
       for (let dev of devices) {
         rows.push(createDeviceInfoRow(dev));
       }
       $.append($("media-" + side + "-devices-tbody"), rows);
     }
 
     // Basic information
-    insertBasicInfo("audioBackend", data.currentAudioBackend);
-    insertBasicInfo("maxAudioChannels", data.currentMaxAudioChannels);
-    insertBasicInfo("sampleRate", data.currentPreferredSampleRate);
+    await insertBasicInfo("audio-backend", data.currentAudioBackend);
+    await insertBasicInfo("max-audio-channels", data.currentMaxAudioChannels);
+    await insertBasicInfo("sample-rate", data.currentPreferredSampleRate);
 
     // Output devices information
     insertDeviceInfo("output", data.audioOutputDevices);
 
     // Input devices information
     insertDeviceInfo("input", data.audioInputDevices);
   },
 
-  javaScript: function javaScript(data) {
+  javaScript(data) {
     $("javascript-incremental-gc").textContent = data.incrementalGCEnabled;
   },
 
-  accessibility: function accessibility(data) {
+  accessibility(data) {
     $("a11y-activated").textContent = data.isActive;
     $("a11y-force-disabled").textContent = data.forceDisabled || 0;
 
     let a11yHandlerUsed = $("a11y-handler-used");
     if (a11yHandlerUsed) {
       a11yHandlerUsed.textContent = data.handlerUsed;
     }
 
     let a11yInstantiator = $("a11y-instantiator");
     if (a11yInstantiator) {
       a11yInstantiator.textContent = data.instantiator;
     }
   },
 
-  libraryVersions: function libraryVersions(data) {
-    let strings = stringBundle();
+  async libraryVersions(data) {
     let trs = [
       $.new("tr", [
         $.new("th", ""),
-        $.new("th", strings.GetStringFromName("minLibVersions")),
-        $.new("th", strings.GetStringFromName("loadedLibVersions")),
+        $.new("th", await document.l10n.formatValue("min-lib-versions")),
+        $.new("th", await document.l10n.formatValue("loaded-lib-versions")),
       ]),
     ];
     sortedArrayFromObject(data).forEach(
       function([name, val]) {
         trs.push($.new("tr", [
           $.new("td", name),
           $.new("td", val.minVersion),
           $.new("td", val.version),
         ]));
       }
     );
     $.append($("libversions-tbody"), trs);
   },
 
-  userJS: function userJS(data) {
+  userJS(data) {
     if (!data.exists)
       return;
     let userJSFile = Services.dirsvc.get("PrefD", Ci.nsIFile);
     userJSFile.append("user.js");
     $("prefs-user-js-link").href = Services.io.newFileURI(userJSFile).spec;
     $("prefs-user-js-section").style.display = "";
     // Clear the no-copy class
     $("prefs-user-js-section").className = "";
   },
 
-  sandbox: function sandbox(data) {
+  async sandbox(data) {
     if (!AppConstants.MOZ_SANDBOX)
       return;
 
-    let strings = stringBundle();
     let tbody = $("sandbox-tbody");
     for (let key in data) {
       // Simplify the display a little in the common case.
       if (key === "hasPrivilegedUserNamespaces" &&
           data[key] === data.hasUserNamespaces) {
         continue;
       }
       if (key === "syscallLog") {
         // Not in this table.
         continue;
       }
+      let keyStrId = toFluentID(key);
       tbody.appendChild($.new("tr", [
-        $.new("th", strings.GetStringFromName(key), "column"),
+        $.new("th", await document.l10n.formatValue(keyStrId), "column"),
         $.new("td", data[key]),
       ]));
     }
 
     if ("syscallLog" in data) {
       let syscallBody = $("sandbox-syscalls-tbody");
       let argsHead = $("sandbox-syscalls-argshead");
       for (let syscall of data.syscallLog) {
         if (argsHead.colSpan < syscall.args.length) {
           argsHead.colSpan = syscall.args.length;
         }
+        let procTypeStrId = toFluentID(syscall.procType);
         let cells = [
           $.new("td", syscall.index, "integer"),
           $.new("td", syscall.msecAgo / 1000),
           $.new("td", syscall.pid, "integer"),
           $.new("td", syscall.tid, "integer"),
-          $.new("td", strings.GetStringFromName("sandboxProcType." +
-                                                syscall.procType)),
+          $.new("td", await document.l10n.formatValue("sandbox-proc-type-" + procTypeStrId)),
           $.new("td", syscall.syscall, "integer"),
         ];
         for (let arg of syscall.args) {
           cells.push($.new("td", arg, "integer"));
         }
         syscallBody.appendChild($.new("tr", cells));
       }
     }
   },
 
-  intl: function intl(data) {
+  intl(data) {
     $("intl-locale-requested").textContent =
       JSON.stringify(data.localeService.requested);
     $("intl-locale-available").textContent =
       JSON.stringify(data.localeService.available);
     $("intl-locale-supported").textContent =
       JSON.stringify(data.localeService.supported);
     $("intl-locale-regionalprefs").textContent =
       JSON.stringify(data.localeService.regionalPrefs);
@@ -824,38 +804,46 @@ var snapshotFormatters = {
       JSON.stringify(data.osPrefs.regionalPrefsLocales);
   },
 };
 
 var $ = document.getElementById.bind(document);
 
 $.new = function $_new(tag, textContentOrChildren, className, attributes) {
   let elt = document.createElement(tag);
-  if (className)
+  if (className) {
     elt.className = className;
+  }
   if (attributes) {
-    for (let attrName in attributes)
+    if (attributes["data-l10n-id"]) {
+      document.l10n.setAttributes(elt,
+                                  attributes["data-l10n-id"],
+                                  attributes["data-l10n-args"]);
+      delete attributes["data-l10n-id"];
+      if (attributes["data-l10n-args"]) {
+        delete attributes["data-l10n-args"];
+      }
+    }
+
+    for (let attrName in attributes) {
       elt.setAttribute(attrName, attributes[attrName]);
+    }
   }
-  if (Array.isArray(textContentOrChildren))
+  if (Array.isArray(textContentOrChildren)) {
     this.append(elt, textContentOrChildren);
-  else
+  } else if (textContentOrChildren) {
     elt.textContent = String(textContentOrChildren);
+  }
   return elt;
 };
 
 $.append = function $_append(parent, children) {
   children.forEach(c => parent.appendChild(c));
 };
 
-function stringBundle() {
-  return Services.strings.createBundle(
-           "chrome://global/locale/aboutSupport.properties");
-}
-
 function assembleFromGraphicsFailure(i, data) {
   // Only cover the cases we have today; for example, we do not have
   // log failures that assert and we assume the log level is 1/error.
   let message = data.failures[i];
   let index = data.indices[i];
   let what = "";
   if (message.search(/\[GFX1-\]: \(LF\)/) == 0) {
     // Non-asserting log failure - the message is substring(14)
@@ -883,47 +871,47 @@ function sortedArrayFromObject(obj) {
   tuples.sort(([prop1, v1], [prop2, v2]) => prop1.localeCompare(prop2));
   return tuples;
 }
 
 function copyRawDataToClipboard(button) {
   if (button)
     button.disabled = true;
   try {
-    Troubleshoot.snapshot(function(snapshot) {
+    Troubleshoot.snapshot(async function(snapshot) {
       if (button)
         button.disabled = false;
       let str = Cc["@mozilla.org/supports-string;1"].
                 createInstance(Ci.nsISupportsString);
       str.data = JSON.stringify(snapshot, undefined, 2);
       let transferable = Cc["@mozilla.org/widget/transferable;1"].
                          createInstance(Ci.nsITransferable);
       transferable.init(getLoadContext());
       transferable.addDataFlavor("text/unicode");
       transferable.setTransferData("text/unicode", str, str.data.length * 2);
       Services.clipboard.setData(transferable, null, Ci.nsIClipboard.kGlobalClipboard);
       if (AppConstants.platform == "android") {
         // Present a snackbar notification.
         ChromeUtils.import("resource://gre/modules/Snackbars.jsm");
-        Snackbars.show(stringBundle().GetStringFromName("rawDataCopied"),
-                       Snackbars.LENGTH_SHORT);
+        let rawDataCopiedString = await document.l10n.formatValue("raw-data-copied");
+        Snackbars.show(rawDataCopiedString, Snackbars.LENGTH_SHORT);
       }
     });
   } catch (err) {
     if (button)
       button.disabled = false;
     throw err;
   }
 }
 
 function getLoadContext() {
   return window.docShell.QueryInterface(Ci.nsILoadContext);
 }
 
-function copyContentsToClipboard() {
+async function copyContentsToClipboard() {
   // Get the HTML and text representations for the important part of the page.
   let contentsDiv = $("contents");
   let dataHtml = contentsDiv.innerHTML;
   let dataText = createTextForElement(contentsDiv);
 
   // We can't use plain strings, we have to use nsSupportsString.
   let supportsStringClass = Cc["@mozilla.org/supports-string;1"];
   let ssHtml = supportsStringClass.createInstance(Ci.nsISupportsString);
@@ -944,18 +932,18 @@ function copyContentsToClipboard() {
   transferable.setTransferData("text/unicode", ssText, dataText.length * 2);
 
   // Store the data into the clipboard.
   Services.clipboard.setData(transferable, null, Services.clipboard.kGlobalClipboard);
 
   if (AppConstants.platform == "android") {
     // Present a snackbar notification.
     ChromeUtils.import("resource://gre/modules/Snackbars.jsm");
-    Snackbars.show(stringBundle().GetStringFromName("textCopied"),
-                   Snackbars.LENGTH_SHORT);
+    let textCopiedString = await document.l10n.formatValue("text-copied");
+    Snackbars.show(textCopiedString, Snackbars.LENGTH_SHORT);
   }
 }
 
 // Return the plain text representation of an element.  Do a little bit
 // of pretty-printing to make it human-readable.
 function createTextForElement(elem) {
   let serializer = new Serializer();
   let text = serializer.serialize(elem);
--- a/toolkit/content/aboutSupport.xhtml
+++ b/toolkit/content/aboutSupport.xhtml
@@ -1,836 +1,605 @@
 <?xml version="1.0" encoding="UTF-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/.
 
 <!DOCTYPE html [
   <!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD;
-  <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd"> %globalDTD;
   <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd"> %brandDTD;
-  <!ENTITY % aboutSupportDTD SYSTEM "chrome://global/locale/aboutSupport.dtd"> %aboutSupportDTD;
   <!ENTITY % resetProfileDTD SYSTEM "chrome://global/locale/resetProfile.dtd"> %resetProfileDTD;
 ]>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
-    <title>&aboutSupport.pageTitle;</title>
+    <title data-l10n-id="page-title"/>
 
     <link rel="icon" type="image/png" id="favicon"
           href="chrome://branding/content/icon32.png"/>
     <link rel="stylesheet" href="chrome://global/skin/aboutSupport.css"
           type="text/css"/>
 
     <script type="application/javascript"
             src="chrome://global/content/aboutSupport.js"/>
+    <link rel="localization" href="branding/brand.ftl"/>
+    <link rel="localization" href="toolkit/about/aboutSupport.ftl"/>
   </head>
 
-  <body dir="&locale.dir;" class="wide-container">
+  <body class="wide-container">
 
 #ifndef ANDROID
     <div id="action-box" class="notice-box">
       <div id="reset-box">
         <h3>&refreshProfile.title;</h3>
         <button id="reset-box-button">
           &refreshProfile.button.label;
         </button>
       </div>
       <div id="safe-mode-box">
-        <h3>&aboutSupport.safeModeTitle;</h3>
-        <button id="restart-in-safe-mode-button">
-          &aboutSupport.restartInSafeMode.label;
-        </button>
+        <h3 data-l10n-id="safe-mode-title"/>
+        <button id="restart-in-safe-mode-button" data-l10n-id="restart-in-safe-mode-label"/>
       </div>
     </div>
 #endif
 
-    <h1>
-      &aboutSupport.pageTitle;
-    </h1>
+    <h1 data-l10n-id="page-title"/>
 
-    <div class="page-subtitle">
-        &aboutSupport.pageSubtitle;
+    <div class="page-subtitle" data-l10n-id="page-subtitle">
+      <a id="supportLink" data-l10n-name="support-link"></a>
     </div>
 
     <div>
-      <button id="copy-raw-data-to-clipboard">
-        &aboutSupport.copyRawDataToClipboard.label;
-      </button>
-      <button id="copy-to-clipboard">
-        &aboutSupport.copyTextToClipboard.label;
-      </button>
+      <button id="copy-raw-data-to-clipboard" data-l10n-id="copy-raw-data-to-clipboard-label"/>
+      <button id="copy-to-clipboard" data-l10n-id="copy-text-to-clipboard-label"/>
     </div>
 
     <div id="contents">
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.appBasicsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="app-basics-title"/>
 
       <table>
         <tbody>
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsName;
-            </th>
+            <th class="column" data-l10n-id="app-basics-name"/>
 
             <td id="application-box">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsVersion;
-            </th>
+            <th class="column" data-l10n-id="app-basics-version"/>
 
             <td id="version-box">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsBuildID;
-              </th>
+            <th class="column" data-l10n-id="app-basics-build-id"/>
             <td id="buildid-box"></td>
           </tr>
 
 #ifndef ANDROID
 #ifdef MOZ_UPDATER
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsUpdateHistory;
-            </th>
+            <th class="column" data-l10n-id="app-basics-update-history"/>
 
             <td>
-              <button id="show-update-history-button">
-                &aboutSupport.appBasicsShowUpdateHistory;
-              </button>
+              <button id="show-update-history-button" data-l10n-id="app-basics-show-update-history"/>
             </td>
           </tr>
 #endif
 #endif
 
 #ifdef MOZ_UPDATER
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsUpdateChannel;
-            </th>
+            <th class="column" data-l10n-id="app-basics-update-channel"/>
             <td id="updatechannel-box"></td>
           </tr>
 #endif
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsUserAgent;
-            </th>
+            <th class="column" data-l10n-id="app-basics-user-agent"/>
 
             <td id="useragent-box">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsOS;
-            </th>
+            <th class="column" data-l10n-id="app-basics-os"/>
 
             <td id="os-box">
             </td>
           </tr>
 
           <tr id="profile-row" class="no-copy">
-            <th class="column">
-#ifdef XP_WIN
-              &aboutSupport.appBasicsProfileDirWinMac;
-#else
-#ifdef XP_MACOSX
-              &aboutSupport.appBasicsProfileDirWinMac;
-#else
-              &aboutSupport.appBasicsProfileDir;
-#endif
-#endif
-            </th>
+            <th class="column" data-l10n-id="app-basics-profile-dir"/>
 
             <td>
-              <button id="profile-dir-button">
-#ifdef XP_WIN
-                &aboutSupport.showWin2.label;
-#else
-#ifdef XP_MACOSX
-                &aboutSupport.showMac.label;
-#else
-                &aboutSupport.showDir.label;
-#endif
-#endif
-               </button>
+              <button id="profile-dir-button" data-l10n-id="show-dir-label"/>
                <span id="profile-dir-box">
                </span>
             </td>
           </tr>
 
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsEnabledPlugins;
-            </th>
+            <th class="column" data-l10n-id="app-basics-enabled-plugins"/>
 
             <td>
               <a href="about:plugins">about:plugins</a>
             </td>
           </tr>
 
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsBuildConfig;
-            </th>
+            <th class="column" data-l10n-id="app-basics-build-config"/>
 
             <td>
               <a href="about:buildconfig">about:buildconfig</a>
             </td>
           </tr>
 
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsMemoryUse;
-            </th>
+            <th class="column" data-l10n-id="app-basics-memory-use"/>
 
             <td>
               <a href="about:memory">about:memory</a>
             </td>
           </tr>
 
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsPerformance;
-            </th>
+            <th class="column" data-l10n-id="app-basics-performance"/>
 
             <td>
               <a href="about:performance">about:performance</a>
             </td>
           </tr>
 
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsServiceWorkers;
-            </th>
+            <th class="column" data-l10n-id="app-basics-service-workers"/>
 
             <td>
               <a href="about:serviceworkers">about:serviceworkers</a>
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsMultiProcessSupport;
-            </th>
+            <th class="column" data-l10n-id="app-basics-multi-process-support"/>
 
             <td id="multiprocess-box">
+              <span id="multiprocess-box-process-count"/>
+              <span id="multiprocess-box-status" data-l10n-id="multi-process-status-unknown"/>
             </td>
           </tr>
 
           <tr id="contentprocesses-row">
-            <th class="column">
-              &aboutSupport.appBasicsProcessCount;
-            </th>
+            <th class="column" data-l10n-id="app-basics-process-count"/>
 
             <td id="contentprocesses-box">
             </td>
           </tr>
 
           <tr id="policies-status-row">
-            <th class="column">
-              &aboutSupport.enterprisePolicies;
-            </th>
+            <th class="column" data-l10n-id="app-basics-enterprise-policies"/>
 
             <td id="policies-status">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsKeyGoogle;
-            </th>
+            <th class="column" data-l10n-id="app-basics-key-google"/>
 
             <td id="key-google-box">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsKeyMozilla;
-            </th>
+            <th class="column" data-l10n-id="app-basics-key-mozilla"/>
 
             <td id="key-mozilla-box">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.appBasicsSafeMode;
-            </th>
+            <th class="column" data-l10n-id="app-basics-safe-mode"/>
 
             <td id="safemode-box">
             </td>
           </tr>
 
 #ifndef ANDROID
           <tr class="no-copy">
-            <th class="column">
-              &aboutSupport.appBasicsProfiles;
-            </th>
+            <th class="column" data-l10n-id="app-basics-profiles"/>
 
             <td>
               <a href="about:profiles">about:profiles</a>
             </td>
           </tr>
 #endif
 
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 #ifdef MOZ_CRASHREPORTER
 
-      <h2 class="major-section" id="crashes-title">
-        &aboutSupport.crashes.title;
-      </h2>
+      <h2 class="major-section" id="crashes-title" data-l10n-id="crashes-title"/>
 
       <table id="crashes-table">
         <thead>
           <tr>
-            <th>
-              &aboutSupport.crashes.id;
-            </th>
-            <th>
-              &aboutSupport.crashes.sendDate;
-            </th>
+            <th data-l10n-id="crashes-id"/>
+            <th data-l10n-id="crashes-send-date"/>
           </tr>
         </thead>
         <tbody id="crashes-tbody">
         </tbody>
       </table>
       <p id="crashes-allReports" class="hidden no-copy">
-        <a href="about:crashes" id="crashes-allReportsWithPending" class="block">&aboutSupport.crashes.allReports;</a>
+        <a href="about:crashes" id="crashes-allReportsWithPending"
+           class="block" data-l10n-id="crashes-all-reports"/>
       </p>
-      <p id="crashes-noConfig" class="hidden no-copy">&aboutSupport.crashes.noConfig;</p>
+      <p id="crashes-noConfig" class="hidden no-copy" data-l10n-id="crashes-no-config"/>
 
 #endif
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.featuresTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="features-title"/>
 
       <table>
         <thead>
           <tr>
-            <th>
-              &aboutSupport.featureName;
-            </th>
-            <th>
-              &aboutSupport.featureVersion;
-            </th>
-            <th>
-              &aboutSupport.featureId;
-            </th>
+            <th data-l10n-id="features-name"/>
+            <th data-l10n-id="features-version"/>
+            <th data-l10n-id="features-id"/>
           </tr>
         </thead>
         <tbody id="features-tbody">
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.extensionsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="extensions-title"/>
 
       <table>
         <thead>
           <tr>
-            <th>
-              &aboutSupport.extensionName;
-            </th>
-            <th>
-              &aboutSupport.extensionVersion;
-            </th>
-            <th>
-              &aboutSupport.extensionEnabled;
-            </th>
-            <th>
-              &aboutSupport.extensionId;
-            </th>
+            <th data-l10n-id="extensions-name"/>
+            <th data-l10n-id="extensions-version"/>
+            <th data-l10n-id="extensions-enabled"/>
+            <th data-l10n-id="extensions-id"/>
           </tr>
         </thead>
         <tbody id="extensions-tbody">
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section" id="security-software-title">
-        &aboutSupport.securitySoftwareTitle;
-      </h2>
+      <h2 class="major-section" id="security-software-title" data-l10n-id="security-software-title"/>
 
       <table id="security-software-table">
         <thead>
           <tr>
-            <th>
-              &aboutSupport.securitySoftwareType;
-            </th>
-            <th>
-              &aboutSupport.securitySoftwareName;
-            </th>
+            <th data-l10n-id="security-software-type"/>
+            <th data-l10n-id="security-software-name"/>
           </tr>
         </thead>
         <tbody>
           <tr>
-            <th class="column">
-              &aboutSupport.securitySoftwareAntivirus;
-            </th>
+            <th class="column" data-l10n-id="security-software-antivirus"/>
 
             <td id="security-software-antivirus">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.securitySoftwareAntiSpyware;
-            </th>
+            <th class="column" data-l10n-id="security-software-antispyware"/>
 
             <td id="security-software-antispyware">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.securitySoftwareFirewall;
-            </th>
+            <th class="column" data-l10n-id="security-software-firewall"/>
 
             <td id="security-software-firewall">
             </td>
           </tr>
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.graphicsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="graphics-title"/>
 
       <table>
         <tbody id="graphics-features-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsFeaturesTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-features-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-tbody">
         </tbody>
 
         <tbody id="graphics-gpu-1-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsGPU1Title;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-gpu1-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-gpu-2-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsGPU2Title;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-gpu2-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-diagnostics-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsDiagnosticsTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-diagnostics-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-decisions-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsDecisionLogTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-decision-log-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-crashguards-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsCrashGuardsTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-crash-guards-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-workarounds-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsWorkaroundsTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-workarounds-title"/>
           </tr>
         </tbody>
 
         <tbody id="graphics-failures-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.graphicsFailureLogTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="graphics-failure-log-title"/>
           </tr>
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.mediaTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="media-title"/>
       <table>
         <tbody id="media-info-tbody">
         </tbody>
 
         <tbody id="media-output-devices-tbody">
           <tr>
-            <th colspan="9" class="title-column">
-              &aboutSupport.mediaOutputDevicesTitle;
-            </th>
+            <th colspan="9" class="title-column" data-l10n-id="media-output-devices-title"/>
           </tr>
           <tr>
-            <th>
-              &aboutSupport.mediaDeviceName;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceGroup;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceVendor;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceState;
-            </th>
-            <th>
-              &aboutSupport.mediaDevicePreferred;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceFormat;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceChannels;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceRate;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceLatency;
-            </th>
+            <th data-l10n-id="media-device-name"/>
+            <th data-l10n-id="media-device-group"/>
+            <th data-l10n-id="media-device-vendor"/>
+            <th data-l10n-id="media-device-state"/>
+            <th data-l10n-id="media-device-preferred"/>
+            <th data-l10n-id="media-device-format"/>
+            <th data-l10n-id="media-device-channels"/>
+            <th data-l10n-id="media-device-rate"/>
+            <th data-l10n-id="media-device-latency"/>
           </tr>
         </tbody>
 
         <tbody id="media-input-devices-tbody">
           <tr>
-            <th colspan="9" class="title-column">
-              &aboutSupport.mediaInputDevicesTitle;
-            </th>
+            <th colspan="9" class="title-column" data-l10n-id="media-input-devices-title"/>
           </tr>
           <tr>
-            <th>
-              &aboutSupport.mediaDeviceName;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceGroup;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceVendor;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceState;
-            </th>
-            <th>
-              &aboutSupport.mediaDevicePreferred;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceFormat;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceChannels;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceRate;
-            </th>
-            <th>
-              &aboutSupport.mediaDeviceLatency;
-            </th>
+            <th data-l10n-id="media-device-name"/>
+            <th data-l10n-id="media-device-group"/>
+            <th data-l10n-id="media-device-vendor"/>
+            <th data-l10n-id="media-device-state"/>
+            <th data-l10n-id="media-device-preferred"/>
+            <th data-l10n-id="media-device-format"/>
+            <th data-l10n-id="media-device-channels"/>
+            <th data-l10n-id="media-device-rate"/>
+            <th data-l10n-id="media-device-latency"/>
           </tr>
         </tbody>
 
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.modifiedKeyPrefsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="modified-key-prefs-title"/>
 
       <table class="prefs-table">
         <thead class="no-copy">
-          <th class="name">
-            &aboutSupport.modifiedPrefsName;
-          </th>
+          <th class="name" data-l10n-id="modified-prefs-name"/>
 
-          <th class="value">
-            &aboutSupport.modifiedPrefsValue;
-          </th>
+          <th class="value" data-l10n-id="modified-prefs-value"/>
         </thead>
 
         <tbody id="prefs-tbody">
         </tbody>
       </table>
 
       <section id="prefs-user-js-section" class="hidden no-copy">
-        <h3>&aboutSupport.userJSTitle;</h3>
-        <p>&aboutSupport.userJSDescription;</p>
+        <h3 data-l10n-id="user-js-title"/>
+        <p data-l10n-id="user-js-description">
+          <a id="prefs-user-js-link" data-l10n-name="user-js-link"></a>
+        </p>
       </section>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.lockedKeyPrefsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="locked-key-prefs-title"/>
 
       <table class="prefs-table">
         <thead class="no-copy">
-          <th class="name">
-            &aboutSupport.lockedPrefsName;
-          </th>
+          <th class="name" data-l10n-id="locked-prefs-name"/>
 
-          <th class="value">
-            &aboutSupport.lockedPrefsValue;
-          </th>
+          <th class="value" data-l10n-id="locked-prefs-value"/>
         </thead>
 
         <tbody id="locked-prefs-tbody">
         </tbody>
       </table>
 
 #ifndef ANDROID
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
-      <h2 class="major-section">
-        &aboutSupport.placeDatabaseTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="place-database-title"/>
 
       <table>
         <tr class="no-copy">
-          <th class="column">
-            &aboutSupport.placeDatabaseIntegrity;
-          </th>
+          <th class="column" data-l10n-id="place-database-integrity"/>
 
           <td>
-            <button id="verify-place-integrity-button">
-              &aboutSupport.placeDatabaseVerifyIntegrity;
-            </button>
+            <button id="verify-place-integrity-button" data-l10n-id="place-database-verify-integrity"/>
             <pre id="verify-place-result" class="hidden no-copy"></pre>
           </td>
         </tr>
       </table>
 #endif
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
-      <h2 class="major-section">
-        &aboutSupport.jsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="js-title"/>
 
       <table>
         <tbody>
           <tr>
-            <th class="column">
-              &aboutSupport.jsIncrementalGC;
-            </th>
+            <th class="column" data-l10n-id="js-incremental-gc"/>
 
             <td id="javascript-incremental-gc">
             </td>
           </tr>
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
-      <h2 class="major-section">
-        &aboutSupport.a11yTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="a11y-title"/>
 
       <table>
         <tbody>
           <tr>
-            <th class="column">
-              &aboutSupport.a11yActivated;
-            </th>
+            <th class="column" data-l10n-id="a11y-activated"/>
 
             <td id="a11y-activated">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.a11yForceDisabled;
-            </th>
+            <th class="column" data-l10n-id="a11y-force-disabled"/>
 
             <td id="a11y-force-disabled">
             </td>
           </tr>
 #if defined(XP_WIN)
           <tr>
-            <th class="column">
-              &aboutSupport.a11yHandlerUsed;
-            </th>
+            <th class="column" data-l10n-id="a11y-handler-used"/>
 
             <td id="a11y-handler-used">
             </td>
           </tr>
 
           <tr>
-            <th class="column">
-              &aboutSupport.a11yInstantiator;
-            </th>
+            <th class="column" data-l10n-id="a11y-instantiator"/>
 
             <td id="a11y-instantiator">
             </td>
           </tr>
 #endif
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
-      <h2 class="major-section">
-        &aboutSupport.libraryVersionsTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="library-version-title"/>
 
       <table>
         <tbody id="libversions-tbody">
         </tbody>
       </table>
 
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
 #if defined(MOZ_SANDBOX)
-      <h2 class="major-section" id="sandbox">
-	&aboutSupport.sandboxTitle;
-      </h2>
+      <h2 class="major-section" id="sandbox" data-l10n-id="sandbox-title"/>
 
       <table>
 	<tbody id="sandbox-tbody">
 	</tbody>
       </table>
 
 #if defined(XP_LINUX)
-      <h4>&aboutSupport.sandboxSyscallLogTitle;</h4>
+      <h4 data-l10n-id="sandbox-sys-call-log-title"/>
       <table>
 	<thead>
 	  <tr>
-	    <th>
-	      &aboutSupport.sandboxSyscallIndex;
-	    </th>
-	    <th>
-	      &aboutSupport.sandboxSyscallAge;
-	    </th>
-	    <th>
-	      &aboutSupport.sandboxSyscallPID;
-	    </th>
-	    <th>
-	      &aboutSupport.sandboxSyscallTID;
-	    </th>
-	    <th>
-	      &aboutSupport.sandboxSyscallProcType;
-	    </th>
-	    <th>
-	      &aboutSupport.sandboxSyscallNumber;
-	    </th>
-	    <th id="sandbox-syscalls-argshead">
-	      &aboutSupport.sandboxSyscallArgs;
-	    </th>
+	    <th data-l10n-id="sandbox-sys-call-index"/>
+	    <th data-l10n-id="sandbox-sys-call-age"/>
+	    <th data-l10n-id="sandbox-sys-call-pid"/>
+	    <th data-l10n-id="sandbox-sys-call-tid"/>
+	    <th data-l10n-id="sandbox-sys-call-proc-type"/>
+	    <th data-l10n-id="sandbox-sys-call-number"/>
+	    <th id="sandbox-syscalls-argshead" data-l10n-id="sandbox-sys-call-args"/>
 	    </tr>
 	</thead>
 	<tbody id="sandbox-syscalls-tbody">
 	</tbody>
       </table>
 #endif
 #endif
 
-      <h2 class="major-section">
-        &aboutSupport.intlTitle;
-      </h2>
+      <h2 class="major-section" data-l10n-id="intl-title"/>
 
       <table>
         <tbody id="intl-localeservice-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.intlAppTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="intl-app-title"/>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlLocalesRequested;
-            </th>
+            <th class="column" data-l10n-id="intl-locales-requested"/>
             <td id="intl-locale-requested">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlLocalesAvailable;
-            </th>
+            <th class="column" data-l10n-id="intl-locales-available"/>
             <td id="intl-locale-available">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlLocalesSupported;
-            </th>
+            <th class="column" data-l10n-id="intl-locales-supported"/>
             <td id="intl-locale-supported">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlRegionalPrefs;
-            </th>
+            <th class="column" data-l10n-id="intl-regional-prefs"/>
             <td id="intl-locale-regionalprefs">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlLocalesDefault;
-            </th>
+            <th class="column" data-l10n-id="intl-locales-default"/>
             <td id="intl-locale-default">
             </td>
           </tr>
         </tbody>
         <tbody id="intl-ospreferences-tbody">
           <tr>
-            <th colspan="2" class="title-column">
-              &aboutSupport.intlOSTitle;
-            </th>
+            <th colspan="2" class="title-column" data-l10n-id="intl-os-title"/>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlOSPrefsSystemLocales;
-            </th>
+            <th class="column" data-l10n-id="intl-os-prefs-system-locales"/>
             <td id="intl-osprefs-systemlocales">
             </td>
           </tr>
           <tr>
-            <th class="column">
-              &aboutSupport.intlRegionalPrefs;
-            </th>
+            <th class="column" data-l10n-id="intl-regional-prefs"/>
             <td id="intl-osprefs-regionalprefs">
             </td>
           </tr>
         </tbody>
       </table>
       <!-- - - - - - - - - - - - - - - - - - - - - -->
 
     </div>
deleted file mode 100644
--- a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd
+++ /dev/null
@@ -1,167 +0,0 @@
-<!-- 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
-  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 aboutcrashes.ftl. -->
-<!ENTITY aboutSupport.crashes.id "Report ID">
-<!ENTITY aboutSupport.crashes.sendDate "Submitted">
-<!ENTITY aboutSupport.crashes.allReports "All Crash Reports">
-<!ENTITY aboutSupport.crashes.noConfig "This application has not been configured to display crash reports.">
-
-<!ENTITY aboutSupport.extensionsTitle "Extensions">
-<!ENTITY aboutSupport.extensionName "Name">
-<!ENTITY aboutSupport.extensionEnabled "Enabled">
-<!ENTITY aboutSupport.extensionVersion "Version">
-<!ENTITY aboutSupport.extensionId "ID">
-
-<!ENTITY aboutSupport.securitySoftwareTitle "Security Software">
-<!ENTITY aboutSupport.securitySoftwareType "Type">
-<!ENTITY aboutSupport.securitySoftwareName "Name">
-<!ENTITY aboutSupport.securitySoftwareAntivirus "Antivirus">
-<!ENTITY aboutSupport.securitySoftwareAntiSpyware "Antispyware">
-<!ENTITY aboutSupport.securitySoftwareFirewall "Firewall">
-
-<!ENTITY aboutSupport.featuresTitle "&brandShortName; Features">
-<!ENTITY aboutSupport.featureName "Name">
-<!ENTITY aboutSupport.featureVersion "Version">
-<!ENTITY aboutSupport.featureId "ID">
-
-<!ENTITY aboutSupport.appBasicsTitle "Application Basics">
-<!ENTITY aboutSupport.appBasicsName "Name">
-<!ENTITY aboutSupport.appBasicsVersion "Version">
-<!ENTITY aboutSupport.appBasicsBuildID "Build ID">
-
-<!-- LOCALIZATION NOTE (aboutSupport.appBasicsUpdateChannel, aboutSupport.appBasicsUpdateHistory, aboutSupport.appBasicsShowUpdateHistory):
-"Update" is a noun here, not a verb. -->
-<!ENTITY aboutSupport.appBasicsUpdateChannel "Update Channel">
-<!ENTITY aboutSupport.appBasicsUpdateHistory "Update History">
-<!ENTITY aboutSupport.appBasicsShowUpdateHistory "Show Update History">
-
-<!ENTITY aboutSupport.appBasicsProfileDir "Profile Directory">
-<!-- LOCALIZATION NOTE (aboutSupport.appBasicsProfileDirWinMac):
-This is the Windows- and Mac-specific variant of aboutSupport.appBasicsProfileDir.
-Windows/Mac use the term "Folder" instead of "Directory" -->
-<!ENTITY aboutSupport.appBasicsProfileDirWinMac "Profile Folder">
-
-<!ENTITY aboutSupport.appBasicsEnabledPlugins "Enabled Plugins">
-<!ENTITY aboutSupport.appBasicsBuildConfig "Build Configuration">
-<!ENTITY aboutSupport.appBasicsUserAgent "User Agent">
-<!ENTITY aboutSupport.appBasicsOS "OS">
-<!ENTITY aboutSupport.appBasicsMemoryUse "Memory Use">
-<!ENTITY aboutSupport.appBasicsPerformance "Performance">
-
-<!-- LOCALIZATION NOTE the term "Service Workers" should not be translated. -->
-<!ENTITY aboutSupport.appBasicsServiceWorkers "Registered Service Workers">
-
-<!ENTITY aboutSupport.appBasicsProfiles "Profiles">
-
-<!ENTITY aboutSupport.appBasicsMultiProcessSupport "Multiprocess Windows">
-
-<!ENTITY aboutSupport.appBasicsProcessCount "Web Content Processes">
-
-<!ENTITY aboutSupport.enterprisePolicies "Enterprise Policies">
-
-<!ENTITY aboutSupport.appBasicsKeyGoogle "Google Key">
-<!ENTITY aboutSupport.appBasicsKeyMozilla "Mozilla Location Service Key">
-
-<!ENTITY aboutSupport.appBasicsSafeMode "Safe Mode">
-
-<!ENTITY aboutSupport.showDir.label "Open Directory">
-<!-- LOCALIZATION NOTE (aboutSupport.showMac.label): This is the Mac-specific
-variant of aboutSupport.showDir.label.  This allows us to use the preferred
-"Finder" terminology on Mac. -->
-<!ENTITY aboutSupport.showMac.label "Show in Finder">
-<!-- LOCALIZATION NOTE (aboutSupport.showWin2.label): This is the Windows-specific
-variant of aboutSupport.showDir.label. -->
-<!ENTITY aboutSupport.showWin2.label "Open Folder">
-
-<!ENTITY aboutSupport.modifiedKeyPrefsTitle "Important Modified Preferences">
-<!ENTITY aboutSupport.modifiedPrefsName "Name">
-<!ENTITY aboutSupport.modifiedPrefsValue "Value">
-
-<!-- LOCALIZATION NOTE (aboutSupport.userJSTitle, aboutSupport.userJSDescription): user.js is the name of the preference override file being checked. -->
-<!ENTITY aboutSupport.userJSTitle "user.js Preferences">
-<!ENTITY aboutSupport.userJSDescription "Your profile folder contains a <a id='prefs-user-js-link'>user.js file</a>, which includes preferences that were not created by &brandShortName;.">
-
-<!ENTITY aboutSupport.lockedKeyPrefsTitle "Important Locked Preferences">
-<!ENTITY aboutSupport.lockedPrefsName "Name">
-<!ENTITY aboutSupport.lockedPrefsValue "Value">
-
-<!ENTITY aboutSupport.graphicsTitle "Graphics">
-
-<!ENTITY aboutSupport.placeDatabaseTitle "Places Database">
-<!ENTITY aboutSupport.placeDatabaseIntegrity "Integrity">
-<!ENTITY aboutSupport.placeDatabaseVerifyIntegrity "Verify Integrity">
-
-<!ENTITY aboutSupport.jsTitle "JavaScript">
-<!ENTITY aboutSupport.jsIncrementalGC "Incremental GC">
-
-<!ENTITY aboutSupport.a11yTitle "Accessibility">
-<!ENTITY aboutSupport.a11yActivated "Activated">
-<!ENTITY aboutSupport.a11yForceDisabled "Prevent Accessibility">
-<!ENTITY aboutSupport.a11yHandlerUsed "Accessible Handler Used">
-<!ENTITY aboutSupport.a11yInstantiator "Accessibility Instantiator">
-
-<!ENTITY aboutSupport.libraryVersionsTitle "Library Versions">
-
-<!ENTITY aboutSupport.installationHistoryTitle "Installation History">
-<!ENTITY aboutSupport.updateHistoryTitle "Update History">
-
-<!ENTITY aboutSupport.copyTextToClipboard.label "Copy text to clipboard">
-<!ENTITY aboutSupport.copyRawDataToClipboard.label "Copy raw data to clipboard">
-
-<!ENTITY aboutSupport.sandboxTitle "Sandbox">
-<!ENTITY aboutSupport.sandboxSyscallLogTitle "Rejected System Calls">
-<!ENTITY aboutSupport.sandboxSyscallIndex "#">
-<!ENTITY aboutSupport.sandboxSyscallAge "Seconds Ago">
-<!ENTITY aboutSupport.sandboxSyscallPID "PID">
-<!ENTITY aboutSupport.sandboxSyscallTID "TID">
-<!ENTITY aboutSupport.sandboxSyscallProcType "Process Type">
-<!ENTITY aboutSupport.sandboxSyscallNumber "Syscall">
-<!ENTITY aboutSupport.sandboxSyscallArgs "Arguments">
-
-<!ENTITY aboutSupport.safeModeTitle "Try Safe Mode">
-<!ENTITY aboutSupport.restartInSafeMode.label "Restart with Add-ons Disabled…">
-
-<!ENTITY aboutSupport.graphicsFeaturesTitle "Features">
-<!ENTITY aboutSupport.graphicsDiagnosticsTitle "Diagnostics">
-<!ENTITY aboutSupport.graphicsFailureLogTitle "Failure Log">
-<!ENTITY aboutSupport.graphicsGPU1Title "GPU #1">
-<!ENTITY aboutSupport.graphicsGPU2Title "GPU #2">
-<!ENTITY aboutSupport.graphicsDecisionLogTitle "Decision Log">
-<!ENTITY aboutSupport.graphicsCrashGuardsTitle "Crash Guard Disabled Features">
-<!ENTITY aboutSupport.graphicsWorkaroundsTitle "Workarounds">
-
-<!ENTITY aboutSupport.mediaTitle "Media">
-<!ENTITY aboutSupport.mediaOutputDevicesTitle "Output Devices">
-<!ENTITY aboutSupport.mediaInputDevicesTitle "Input Devices">
-<!ENTITY aboutSupport.mediaDeviceName "Name">
-<!ENTITY aboutSupport.mediaDeviceGroup "Group">
-<!ENTITY aboutSupport.mediaDeviceVendor "Vendor">
-<!ENTITY aboutSupport.mediaDeviceState "State">
-<!ENTITY aboutSupport.mediaDevicePreferred "Preferred">
-<!ENTITY aboutSupport.mediaDeviceFormat "Format">
-<!ENTITY aboutSupport.mediaDeviceChannels "Channels">
-<!ENTITY aboutSupport.mediaDeviceRate "Rate">
-<!ENTITY aboutSupport.mediaDeviceLatency "Latency">
-
-<!ENTITY aboutSupport.intlTitle "Internationalization &amp; Localization">
-<!ENTITY aboutSupport.intlAppTitle "Application Settings">
-<!ENTITY aboutSupport.intlLocalesRequested "Requested Locales">
-<!ENTITY aboutSupport.intlLocalesAvailable "Available Locales">
-<!ENTITY aboutSupport.intlLocalesSupported "App Locales">
-<!ENTITY aboutSupport.intlLocalesDefault "Default Locale">
-<!ENTITY aboutSupport.intlOSTitle "Operating System">
-<!ENTITY aboutSupport.intlOSPrefsSystemLocales "System Locales">
-<!ENTITY aboutSupport.intlRegionalPrefs "Regional Preferences">
--- a/toolkit/locales/en-US/chrome/global/aboutSupport.properties
+++ b/toolkit/locales/en-US/chrome/global/aboutSupport.properties
@@ -1,158 +1,18 @@
 # 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 (crashesTitle): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of relevant days with crash reports
-crashesTitle=Crash Reports for the Last #1 Day;Crash Reports for the Last #1 Days
-
-# LOCALIZATION NOTE (crashesTimeMinutes): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of minutes (between 1 and 59) which have passed since the crash
-crashesTimeMinutes=#1 minute ago;#1 minutes ago
-
-# LOCALIZATION NOTE (crashesTimeHours): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of hours (between 1 and 23) which have passed since the crash
-crashesTimeHours=#1 hour ago;#1 hours ago
-
-# LOCALIZATION NOTE (crashesTimeDays): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of days (1 or more) which have passed since the crash
-crashesTimeDays=#1 day ago;#1 days ago
-
-# LOCALIZATION NOTE (pendingReports): Semi-colon list of plural forms.
-# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 number of pending crash reports
-pendingReports=All Crash Reports (including #1 pending crash in the given time range);All Crash Reports (including #1 pending crashes in the given time range)
-
-# LOCALIZATION NOTE (rawDataCopied) Text displayed in a mobile "Toast" to user when the
-# raw data is successfully copied to the clipboard via button press.
-rawDataCopied=Raw data copied to clipboard
-
-# LOCALIZATION NOTE (textCopied) Text displayed in a mobile "Toast" to user when the
-# text is successfully copied to the clipboard via button press.
-textCopied=Text copied to clipboard
-
 # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
 blockedDriver = Blocked for your graphics driver version.
 
 # LOCALIZATION NOTE The %S here is a placeholder, leave unchanged, it will get replaced by the driver version string.
 tryNewerDriver = Blocked for your graphics driver version. Try updating your graphics driver to version %S or newer.
 
 # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
 blockedGfxCard = Blocked for your graphics card because of unresolved driver issues.
 
 # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
 blockedOSVersion = Blocked for your operating system version.
 
 # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
 blockedMismatchedVersion = Blocked for your graphics driver version mismatch between registry and DLL.
-
-# LOCALIZATION NOTE In the following strings, "Direct2D", "DirectWrite" and "ClearType"
-# are proper nouns and should not be translated. Feel free to leave english strings if
-# there are no good translations, these are only used in about:support
-clearTypeParameters = ClearType Parameters
-
-compositing = Compositing
-hardwareH264 = Hardware H264 Decoding
-mainThreadNoOMTC = main thread, no OMTC
-yes = Yes
-no = No
-# LOCALIZATION NOTE The following strings indicate if an API key has been found.
-# In some development versions, it's expected for some API keys that they are
-# not found.
-found = Found
-missing = Missing
-
-gpuDescription = Description
-gpuVendorID = Vendor ID
-gpuDeviceID = Device ID
-gpuSubsysID = Subsys ID
-gpuDrivers = Drivers
-gpuRAM = RAM
-gpuDriverVersion = Driver Version
-gpuDriverDate = Driver Date
-gpuActive = Active
-webgl1WSIInfo = WebGL 1 Driver WSI Info
-webgl1Renderer = WebGL 1 Driver Renderer
-webgl1Version = WebGL 1 Driver Version
-webgl1DriverExtensions = WebGL 1 Driver Extensions
-webgl1Extensions = WebGL 1 Extensions
-webgl2WSIInfo = WebGL 2 Driver WSI Info
-webgl2Renderer = WebGL 2 Driver Renderer
-webgl2Version = WebGL 2 Driver Version
-webgl2DriverExtensions = WebGL 2 Driver Extensions
-webgl2Extensions = WebGL 2 Extensions
-GPU1 = GPU #1
-GPU2 = GPU #2
-blocklistedBug = Blocklisted due to known issues
-# LOCALIZATION NOTE %1$S will be replaced with a bug number string.
-bugLink = bug %1$S
-# LOCALIZATION NOTE %1$S will be replaced with an arbitrary identifier
-# string that can be searched on DXR/MXR or grepped in the source tree.
-unknownFailure = Blocklisted; failure code %1$S
-d3d11layersCrashGuard = D3D11 Compositor
-d3d11videoCrashGuard = D3D11 Video Decoder
-d3d9videoCrashGuard = D3D9 Video Decoder
-glcontextCrashGuard = OpenGL
-resetOnNextRestart = Reset on Next Restart
-gpuProcessKillButton = Terminate GPU Process
-gpuDeviceResetButton = Trigger Device Reset
-usesTiling = Uses Tiling
-contentUsesTiling = Uses Tiling (Content)
-offMainThreadPaintEnabled = Off Main Thread Painting Enabled
-offMainThreadPaintWorkerCount = Off Main Thread Painting Worker Count
-
-audioBackend = Audio Backend
-maxAudioChannels = Max Channels
-channelLayout = Preferred Channel Layout
-sampleRate = Preferred Sample Rate
-
-minLibVersions = Expected minimum version
-loadedLibVersions = Version in use
-
-hasSeccompBPF = Seccomp-BPF (System Call Filtering)
-hasSeccompTSync = Seccomp Thread Synchronization
-hasUserNamespaces = User Namespaces
-hasPrivilegedUserNamespaces = User Namespaces for privileged processes
-canSandboxContent = Content Process Sandboxing
-canSandboxMedia = Media Plugin Sandboxing
-contentSandboxLevel = Content Process Sandbox Level
-effectiveContentSandboxLevel = Effective Content Process Sandbox Level
-sandboxProcType.content = content
-sandboxProcType.file = file content
-sandboxProcType.mediaPlugin = media plugin
-
-# LOCALIZATION NOTE %1$S and %2$S will be replaced with the number of remote and the total number
-# of windows, respectively, while %3$S will be replaced with one of the status strings below,
-# which contains a description of the multi-process preference and status.
-# Note: multiProcessStatus.3 doesn't exist because status=3 was deprecated.
-multiProcessWindows = %1$S/%2$S (%3$S)
-multiProcessStatus.0 = Enabled by user
-multiProcessStatus.1 = Enabled by default
-multiProcessStatus.2 = Disabled
-multiProcessStatus.4 = Disabled by accessibility tools
-multiProcessStatus.5 = Disabled by lack of graphics hardware acceleration on Mac OS X
-multiProcessStatus.6 = Disabled by unsupported text input
-multiProcessStatus.7 = Disabled by add-ons
-multiProcessStatus.8 = Disabled forcibly
-multiProcessStatus.unknown = Unknown status
-
-asyncPanZoom = Asynchronous Pan/Zoom
-apzNone = none
-wheelEnabled = wheel input enabled
-touchEnabled = touch input enabled
-dragEnabled = scrollbar drag enabled
-keyboardEnabled = keyboard enabled
-autoscrollEnabled = autoscroll enabled
-
-# LOCALIZATION NOTE %1 will be replaced with the key of a preference.
-wheelWarning = async wheel input disabled due to unsupported pref: %S
-touchWarning = async touch input disabled due to unsupported pref: %S
-
-# LOCALIZATION NOTE Strings representing the status of the Enterprise Policies engine.
-policies.inactive = Inactive
-policies.active = Active
-policies.error = Error
new file mode 100644
--- /dev/null
+++ b/toolkit/locales/en-US/toolkit/about/aboutSupport.ftl
@@ -0,0 +1,276 @@
+# 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/.
+
+page-title = Troubleshooting Information
+page-subtitle =
+    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 { -brand-short-name }, check out our <a data-l10n-name="support-link">support website</a>.
+
+crashes-title = Crash Reports
+crashes-id = Report ID
+crashes-send-date = Submitted
+crashes-all-reports = All Crash Reports
+crashes-no-config = This application has not been configured to display crash reports.
+extensions-title = Extensions
+extensions-name = Name
+extensions-enabled = Enabled
+extensions-version = Version
+extensions-id = ID
+security-software-title = Security Software
+security-software-type = Type
+security-software-name = Name
+security-software-antivirus = Antivirus
+security-software-antispyware = Antispyware
+security-software-firewall = Firewall
+features-title = { -brand-short-name } Features
+features-name = Name
+features-version = Version
+features-id = ID
+app-basics-title = Application Basics
+app-basics-name = Name
+app-basics-version = Version
+app-basics-build-id = Build ID
+app-basics-update-channel = Update Channel
+app-basics-update-history = Update History
+app-basics-show-update-history = Show Update History
+app-basics-profile-dir =
+    { PLATFORM() ->
+        [linux] Profile Directory
+       *[other] Profile Folder
+    }
+app-basics-enabled-plugins = Enabled Plugins
+app-basics-build-config = Build Configuration
+app-basics-user-agent = User Agent
+app-basics-os = OS
+app-basics-memory-use = Memory Use
+app-basics-performance = Performance
+app-basics-service-workers = Registered Service Workers
+app-basics-profiles = Profiles
+app-basics-multi-process-support = Multiprocess Windows
+app-basics-process-count = Web Content Processes
+app-basics-enterprise-policies = Enterprise Policies
+app-basics-key-google = Google Key
+app-basics-key-mozilla = Mozilla Location Service Key
+app-basics-safe-mode = Safe Mode
+show-dir-label =
+    { PLATFORM() ->
+        [macos] Show in Finder
+        [windows] Open Folder
+       *[other] Open Directory
+    }
+modified-key-prefs-title = Important Modified Preferences
+modified-prefs-name = Name
+modified-prefs-value = Value
+user-js-title = user.js Preferences
+user-js-description = Your profile folder contains a <a data-l10n-name="user-js-link">user.js file</a>, which includes preferences that were not created by { -brand-short-name }.
+locked-key-prefs-title = Important Locked Preferences
+locked-prefs-name = Name
+locked-prefs-value = Value
+graphics-title = Graphics
+graphics-features-title = Features
+graphics-diagnostics-title = Diagnostics
+graphics-failure-log-title = Failure Log
+graphics-gpu1-title = GPU #1
+graphics-gpu2-title = GPU #2
+graphics-decision-log-title = Decision Log
+graphics-crash-guards-title = Crash Guard Disabled Features
+graphics-workarounds-title = Workarounds
+place-database-title = Places Database
+place-database-integrity = Integrity
+place-database-verify-integrity = Verify Integrity
+js-title = JavaScript
+js-incremental-gc = Incremental GC
+a11y-title = Accessibility
+a11y-activated = Activated
+a11y-force-disabled = Prevent Accessibility
+a11y-handler-used = Accessible Handler Used
+a11y-instantiator = Accessibility Instantiator
+library-version-title = Library Versions
+copy-text-to-clipboard-label = Copy text to clipboard
+copy-raw-data-to-clipboard-label = Copy raw data to clipboard
+sandbox-title = Sandbox
+sandbox-sys-call-log-title = Rejected System Calls
+sandbox-sys-call-index = #
+sandbox-sys-call-age = Seconds Ago
+sandbox-sys-call-pid = PID
+sandbox-sys-call-tid = TID
+sandbox-sys-call-proc-type = Process Type
+sandbox-sys-call-number = Syscall
+sandbox-sys-call-args = Arguments
+safe-mode-title = Try Safe Mode
+restart-in-safe-mode-label = Restart with Add-ons Disabled…
+media-title = Media
+media-output-devices-title = Output Devices
+media-input-devices-title = Input Devices
+media-device-name = Name
+media-device-group = Group
+media-device-vendor = Vendor
+media-device-state = State
+media-device-preferred = Preferred
+media-device-format = Format
+media-device-channels = Channels
+media-device-rate = Rate
+media-device-latency = Latency
+intl-title = Internationalization & Localization
+intl-app-title = Application Settings
+intl-locales-requested = Requested Locales
+intl-locales-available = Available Locales
+intl-locales-supported = App Locales
+intl-locales-default = Default Locale
+intl-os-title = Operating System
+intl-os-prefs-system-locales = System Locales
+intl-regional-prefs = Regional Preferences
+
+# Variables
+# $days (Integer) - Number of days of crashes to log
+report-crash-for-days =
+    { $days ->
+        [one] Crash Reports for the Last { $days } Day
+       *[other] Crash Reports for the Last { $days } Days
+    }
+
+# Variables
+# $minutes (integer) - Number of minutes since crash
+crashes-time-minutes =
+    { $minutes ->
+        [one] { $minutes } minute ago
+       *[other] { $minutes } minutes ago
+    }
+
+# Variables
+# $hours (integer) - Number of hours since crash
+crashes-time-hours =
+    { $hours ->
+        [one] { $hours } hour ago
+       *[other] { $hours } hours ago
+    }
+
+# Variables
+# $days (integer) - Number of days since crash
+crashes-time-days =
+    { $days ->
+        [one] { $days } day ago
+       *[other] { $days } days ago
+    }
+
+# Variables
+# $reports (integer) - Number of pending reports
+pending-reports =
+    { $reports ->
+        [one] All Crash Reports (including { $reports } pending crash in the given time range)
+       *[other] All Crash Reports (including { $reports } pending crashes in the given time range)
+    }
+
+raw-data-copied = Raw data copied to clipboard
+text-copied = Text copied to clipboard
+
+# "ClearType" is a proper noun and should not be translated. Feel free to leave English strings if
+# there are no good translations, these are only used in about:support
+clear-type-parameters = ClearType Parameters
+
+compositing = Compositing
+hardware-h264 = Hardware H264 Decoding
+main-thread-no-omtc = main thread, no OMTC
+yes = Yes
+no = No
+
+## The following strings indicate if an API key has been found.
+## In some development versions, it's expected for some API keys that they are
+## not found.
+found = Found
+missing = Missing
+
+gpu-description = Description
+gpu-vendor-id = Vendor ID
+gpu-device-id = Device ID
+gpu-subsys-id = Subsys ID
+gpu-drivers = Drivers
+gpu-ram = RAM
+gpu-driver-version = Driver Version
+gpu-driver-date = Driver Date
+gpu-active = Active
+webgl1-wsiinfo = WebGL 1 Driver WSI Info
+webgl1-renderer = WebGL 1 Driver Renderer
+webgl1-version = WebGL 1 Driver Version
+webgl1-driver-extensions = WebGL 1 Driver Extensions
+webgl1-extensions = WebGL 1 Extensions
+webgl2-wsiinfo = WebGL 2 Driver WSI Info
+webgl2-renderer = WebGL 2 Driver Renderer
+webgl2-version = WebGL 2 Driver Version
+webgl2-driver-extensions = WebGL 2 Driver Extensions
+webgl2-extensions = WebGL 2 Extensions
+blocklisted-bug = Blocklisted due to known issues
+
+# Variables
+# $bugNumber (string) - String of bug number from Bugzilla
+bug-link = bug { $bugNumber }
+
+# Variables
+# $failureCode (string) - String that can be searched in the source tree.
+unknown-failure = Blocklisted; failure code { $failureCode }
+
+d3d11layers-crash-guard = D3D11 Compositor
+d3d11video-crash-guard = D3D11 Video Decoder
+d3d9video-crash-buard = D3D9 Video Decoder
+glcontext-crash-guard = OpenGL
+
+reset-on-next-restart = Reset on Next Restart
+gpu-process-kill-button = Terminate GPU Process
+gpu-device-reset-button = Trigger Device Reset
+uses-tiling = Uses Tiling
+content-uses-tiling = Uses Tiling (Content)
+off-main-thread-paint-enabled = Off Main Thread Painting Enabled
+off-main-thread-paint-worker-count = Off Main Thread Painting Worker Count
+
+audio-backend = Audio Backend
+max-audio-channels = Max Channels
+channel-layout = Preferred Channel Layout
+sample-rate = Preferred Sample Rate
+
+min-lib-versions = Expected minimum version
+loaded-lib-versions = Version in use
+
+has-seccomp-bpf = Seccomp-BPF (System Call Filtering)
+has-seccomp-tsync = Seccomp Thread Synchronization
+has-user-namespaces = User Namespaces
+has-privileged-user-namespaces = User Namespaces for privileged processes
+can-sandbox-content = Content Process Sandboxing
+can-sandbox-media = Media Plugin Sandboxing
+content-sandbox-level = Content Process Sandbox Level
+effective-content-sandbox-level = Effective Content Process Sandbox Level
+sandbox-proc-type-content = content
+sandbox-proc-type-file = file content
+sandbox-proc-type-media-plugin = media plugin
+
+# Variables
+# $remoteWindows (integer) - Number of remote windows
+# $totalWindows (integer) - Number of total windows
+multi-process-windows = { $remoteWindows }/{ $totalWindows }
+multi-process-status-0 = Enabled by user
+multi-process-status-1 = Enabled by default
+multi-process-status-2 = Disabled
+multi-process-status-4 = Disabled by accessibility tools
+multi-process-status-6 = Disabled by unsupported text input
+multi-process-status-7 = Disabled by add-ons
+multi-process-status-8 = Disabled forcibly
+multi-process-status-unknown = Unknown status
+
+async-pan-zoom = Asynchronous Pan/Zoom
+apz-none = none
+wheel-enabled = wheel input enabled
+touch-enabled = touch input enabled
+drag-enabled = scrollbar drag enabled
+keyboard-enabled = keyboard enabled
+autoscroll-enabled = autoscroll enabled
+
+## Variables
+## $preferenceKey (string) - String ID of preference
+wheel-warning = async wheel input disabled due to unsupported pref: { $preferenceKey }
+touch-warning = async touch input disabled due to unsupported pref: { $preferenceKey }
+
+## Strings representing the status of the Enterprise Policies engine.
+policies-inactive = Inactive
+policies-active = Active
+policies-error = Error
--- a/toolkit/locales/jar.mn
+++ b/toolkit/locales/jar.mn
@@ -7,17 +7,16 @@
   crashreporter                                    (%crashreporter/**/*.ftl)
   toolkit                                          (%toolkit/**/*.ftl)
 
 @AB_CD@.jar:
 % locale global @AB_CD@ %locale/@AB_CD@/global/
   locale/@AB_CD@/global/aboutReader.properties          (%chrome/global/aboutReader.properties)
   locale/@AB_CD@/global/aboutRights.dtd                 (%chrome/global/aboutRights.dtd)
   locale/@AB_CD@/global/aboutStudies.properties         (%chrome/global/aboutStudies.properties)
-  locale/@AB_CD@/global/aboutSupport.dtd                (%chrome/global/aboutSupport.dtd)
   locale/@AB_CD@/global/aboutSupport.properties         (%chrome/global/aboutSupport.properties)
   locale/@AB_CD@/global/aboutTelemetry.dtd              (%chrome/global/aboutTelemetry.dtd)
   locale/@AB_CD@/global/aboutTelemetry.properties       (%chrome/global/aboutTelemetry.properties)
   locale/@AB_CD@/global/aboutWebrtc.properties          (%chrome/global/aboutWebrtc.properties)
   locale/@AB_CD@/global/autocomplete.properties         (%chrome/global/autocomplete.properties)
   locale/@AB_CD@/global/appPicker.dtd                   (%chrome/global/appPicker.dtd)
   locale/@AB_CD@/global/browser.properties              (%chrome/global/browser.properties)
   locale/@AB_CD@/global/charsetMenu.dtd                 (%chrome/global/charsetMenu.dtd)