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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Jared Wein 2018-12-28 19:40:17 +00:00
Родитель 74953e7a43
Коммит 4f86678a71
8 изменённых файлов: 986 добавлений и 840 удалений

Просмотреть файл

@ -8,25 +8,20 @@ ChromeUtils.import("resource://gre/modules/Services.jsm");
add_task(async function() { add_task(async function() {
await BrowserTestUtils.withNewTab({ gBrowser, url: "about:support" }, async function(browser) { 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 keyGoogleStatus = await ContentTask.spawn(browser, null, async function() {
let textBox = content.document.getElementById("key-google-box"); 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"); "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 keyMozillaStatus = await ContentTask.spawn(browser, null, async function() {
let textBox = content.document.getElementById("key-mozilla-box"); 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"); "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");
}); });
}); });

Просмотреть файл

@ -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"),
},
)
),
]
)

Просмотреть файл

@ -17,25 +17,30 @@ ChromeUtils.defineModuleGetter(this, "PlacesDBUtils",
window.addEventListener("load", function onload(event) { window.addEventListener("load", function onload(event) {
try { try {
window.removeEventListener("load", onload); window.removeEventListener("load", onload);
Troubleshoot.snapshot(function(snapshot) { Troubleshoot.snapshot(async function(snapshot) {
for (let prop in snapshotFormatters) for (let prop in snapshotFormatters)
snapshotFormatters[prop](snapshot[prop]); await snapshotFormatters[prop](snapshot[prop]);
}); });
populateActionBox(); populateActionBox();
setupEventListeners(); setupEventListeners();
} catch (e) { } catch (e) {
Cu.reportError("stack of load error for about:support: " + e + ": " + e.stack); 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 // Each property in this object corresponds to a property in Troubleshoot.jsm's
// snapshot data. Each function is passed its property's corresponding data, // snapshot data. Each function is passed its property's corresponding data,
// and it's the function's job to update the page with it. // and it's the function's job to update the page with it.
var snapshotFormatters = { var snapshotFormatters = {
application: function application(data) { async application(data) {
let strings = stringBundle();
$("application-box").textContent = data.name; $("application-box").textContent = data.name;
$("useragent-box").textContent = data.userAgent; $("useragent-box").textContent = data.userAgent;
$("os-box").textContent = data.osVersion; $("os-box").textContent = data.osVersion;
@ -49,7 +54,7 @@ var snapshotFormatters = {
$("updatechannel-box").textContent = data.updateChannel; $("updatechannel-box").textContent = data.updateChannel;
$("profile-dir-box").textContent = Services.dirsvc.get("ProfD", Ci.nsIFile).path; $("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: // Whitelist of known values with string descriptions:
switch (data.autoStartStatus) { switch (data.autoStartStatus) {
@ -60,12 +65,17 @@ var snapshotFormatters = {
case 6: case 6:
case 7: case 7:
case 8: case 8:
statusText = strings.GetStringFromName("multiProcessStatus." + data.autoStartStatus); statusTextId = "multi-process-status-" + data.autoStartStatus;
break; break;
} }
$("multiprocess-box").textContent = strings.formatStringFromName("multiProcessWindows", document.l10n.setAttributes($("multiprocess-box-process-count"),
[data.numRemoteWindows, data.numTotalWindows, statusText], 3); "multi-process-windows",
{
remoteWindows: data.numRemoteWindows,
totalWindows: data.numTotalWindows,
});
document.l10n.setAttributes($("multiprocess-box-status"), statusTextId);
if (data.remoteAutoStart) { if (data.remoteAutoStart) {
$("contentprocesses-box").textContent = data.currentContentProcesses + $("contentprocesses-box").textContent = data.currentContentProcesses +
@ -80,16 +90,16 @@ var snapshotFormatters = {
let aboutPolicies = "about:policies"; let aboutPolicies = "about:policies";
switch (data.policiesStatus) { switch (data.policiesStatus) {
case Services.policies.INACTIVE: case Services.policies.INACTIVE:
policiesText = strings.GetStringFromName("policies.inactive"); policiesText = await document.l10n.formatValue("policies-inactive");
break; break;
case Services.policies.ACTIVE: case Services.policies.ACTIVE:
policiesText = strings.GetStringFromName("policies.active"); policiesText = await document.l10n.formatValue("policies-active");
aboutPolicies += "#active"; aboutPolicies += "#active";
break; break;
default: default:
policiesText = strings.GetStringFromName("policies.error"); policiesText = await document.l10n.formatValue("policies-error");
aboutPolicies += "#errors"; aboutPolicies += "#errors";
break; break;
} }
@ -105,23 +115,20 @@ var snapshotFormatters = {
} }
let keyGoogleFound = data.keyGoogleFound ? "found" : "missing"; 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"; 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; $("safemode-box").textContent = data.safeMode;
}, },
crashes: function crashes(data) { crashes(data) {
if (!AppConstants.MOZ_CRASHREPORTER) if (!AppConstants.MOZ_CRASHREPORTER)
return; return;
let strings = stringBundle();
let daysRange = Troubleshoot.kMaxCrashAge / (24 * 60 * 60 * 1000); let daysRange = Troubleshoot.kMaxCrashAge / (24 * 60 * 60 * 1000);
$("crashes-title").textContent = document.l10n.setAttributes($("crashes-title"), "report-crash-for-days", { days: daysRange });
PluralForm.get(daysRange, strings.GetStringFromName("crashesTitle"))
.replace("#1", daysRange);
let reportURL; let reportURL;
try { try {
reportURL = Services.prefs.getCharPref("breakpad.reportURL"); reportURL = Services.prefs.getCharPref("breakpad.reportURL");
@ -138,42 +145,38 @@ var snapshotFormatters = {
$("crashes-allReports").classList.remove("no-copy"); $("crashes-allReports").classList.remove("no-copy");
if (data.pending > 0) { if (data.pending > 0) {
$("crashes-allReportsWithPending").textContent = document.l10n.setAttributes($("crashes-allReportsWithPending"), "pending-reports", { reports: data.pending });
PluralForm.get(data.pending, strings.GetStringFromName("pendingReports"))
.replace("#1", data.pending);
} }
let dateNow = new Date(); let dateNow = new Date();
$.append($("crashes-tbody"), data.submitted.map(function(crash) { $.append($("crashes-tbody"), data.submitted.map(function(crash) {
let date = new Date(crash.date); let date = new Date(crash.date);
let timePassed = dateNow - date; let timePassed = dateNow - date;
let formattedDate; let formattedDateStrId;
let formattedDateStrArgs;
if (timePassed >= 24 * 60 * 60 * 1000) { if (timePassed >= 24 * 60 * 60 * 1000) {
let daysPassed = Math.round(timePassed / (24 * 60 * 60 * 1000)); let daysPassed = Math.round(timePassed / (24 * 60 * 60 * 1000));
let daysPassedString = strings.GetStringFromName("crashesTimeDays"); formattedDateStrId = "crashes-time-days";
formattedDate = PluralForm.get(daysPassed, daysPassedString) formattedDateStrArgs = { days: daysPassed };
.replace("#1", daysPassed);
} else if (timePassed >= 60 * 60 * 1000) { } else if (timePassed >= 60 * 60 * 1000) {
let hoursPassed = Math.round(timePassed / (60 * 60 * 1000)); let hoursPassed = Math.round(timePassed / (60 * 60 * 1000));
let hoursPassedString = strings.GetStringFromName("crashesTimeHours"); formattedDateStrId = "crashes-time-hours";
formattedDate = PluralForm.get(hoursPassed, hoursPassedString) formattedDateStrArgs = { hours: hoursPassed };
.replace("#1", hoursPassed);
} else { } else {
let minutesPassed = Math.max(Math.round(timePassed / (60 * 1000)), 1); let minutesPassed = Math.max(Math.round(timePassed / (60 * 1000)), 1);
let minutesPassedString = strings.GetStringFromName("crashesTimeMinutes"); formattedDateStrId = "crashes-time-minutes";
formattedDate = PluralForm.get(minutesPassed, minutesPassedString) formattedDateStrArgs = { minutes: minutesPassed };
.replace("#1", minutesPassed);
} }
return $.new("tr", [ return $.new("tr", [
$.new("td", [ $.new("td", [
$.new("a", crash.id, null, {href: reportURL + crash.id}), $.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) { $.append($("extensions-tbody"), data.map(function(extension) {
return $.new("tr", [ return $.new("tr", [
$.new("td", extension.name), $.new("td", extension.name),
@ -184,7 +187,7 @@ var snapshotFormatters = {
})); }));
}, },
securitySoftware: function securitySoftware(data) { securitySoftware(data) {
if (!AppConstants.isPlatformAndVersionAtLeast("win", "6.2")) { if (!AppConstants.isPlatformAndVersionAtLeast("win", "6.2")) {
$("security-software-title").hidden = true; $("security-software-title").hidden = true;
$("security-software-table").hidden = true; $("security-software-table").hidden = true;
@ -196,7 +199,7 @@ var snapshotFormatters = {
$("security-software-firewall").textContent = data.registeredFirewall; $("security-software-firewall").textContent = data.registeredFirewall;
}, },
features: function features(data) { features(data) {
$.append($("features-tbody"), data.map(function(feature) { $.append($("features-tbody"), data.map(function(feature) {
return $.new("tr", [ return $.new("tr", [
$.new("td", feature.name), $.new("td", feature.name),
@ -206,7 +209,7 @@ var snapshotFormatters = {
})); }));
}, },
modifiedPreferences: function modifiedPreferences(data) { modifiedPreferences(data) {
$.append($("prefs-tbody"), sortedArrayFromObject(data).map( $.append($("prefs-tbody"), sortedArrayFromObject(data).map(
function([name, value]) { function([name, value]) {
return $.new("tr", [ return $.new("tr", [
@ -220,7 +223,7 @@ var snapshotFormatters = {
)); ));
}, },
lockedPreferences: function lockedPreferences(data) { lockedPreferences(data) {
$.append($("locked-prefs-tbody"), sortedArrayFromObject(data).map( $.append($("locked-prefs-tbody"), sortedArrayFromObject(data).map(
function([name, value]) { function([name, value]) {
return $.new("tr", [ return $.new("tr", [
@ -231,31 +234,10 @@ var snapshotFormatters = {
)); ));
}, },
graphics: function graphics(data) { async graphics(data) {
let strings = stringBundle(); function localizedMsg(msg) {
let msgId = toFluentID(msg);
function localizedMsg(msgArray) { return document.l10n.formatValue(msgId);
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;
} }
// Read APZ info out of data.info, stripping it out in the process. // Read APZ info out of data.info, stripping it out in the process.
@ -270,8 +252,7 @@ var snapshotFormatters = {
delete info[key]; delete info[key];
let message = localizedMsg([type.toLowerCase() + "Enabled"]); out.push(toFluentID(type.toLowerCase() + "Enabled"));
out.push(message);
} }
return out; return out;
@ -282,21 +263,14 @@ var snapshotFormatters = {
// @key Text in the key column. Localized automatically, unless starts with "#". // @key Text in the key column. Localized automatically, unless starts with "#".
// @value Text in the value column. Not localized. // @value Text in the value column. Not localized.
function buildRow(key, value) { function buildRow(key, value) {
let title; let title = key[0] == "#" ? key.substr(1) : key;
if (key[0] == "#") { let keyStrId = toFluentID(key);
title = key.substr(1); let valueStrId = Array.isArray(value) ? null : toFluentID(value);
} else { let td = $.new("td", value, null, {"data-l10n-id": valueStrId});
try {
title = strings.GetStringFromName(key);
} catch (e) {
title = key;
}
}
let td = $.new("td", value);
td.style["white-space"] = "pre-wrap"; td.style["white-space"] = "pre-wrap";
return $.new("tr", [ return $.new("tr", [
$.new("th", title, "column"), $.new("th", title, "column", {"data-l10n-id": keyStrId}),
td, td,
]); ]);
} }
@ -314,7 +288,7 @@ var snapshotFormatters = {
addRows(where, [buildRow(key, value)]); addRows(where, [buildRow(key, value)]);
} }
if (data.clearTypeParameters !== undefined) { if (data.clearTypeParameters !== undefined) {
addRow("diagnostics", "clearTypeParameters", data.clearTypeParameters); addRow("diagnostics", "clear-type-parameters", data.clearTypeParameters);
} }
if ("info" in data) { if ("info" in data) {
apzInfo = formatApzInfo(data.info); apzInfo = formatApzInfo(data.info);
@ -342,7 +316,7 @@ var snapshotFormatters = {
windowUtils.terminateGPUProcess(); windowUtils.terminateGPUProcess();
}); });
gpuProcessKillButton.textContent = strings.GetStringFromName("gpuProcessKillButton"); document.l10n.setAttributes(gpuProcessKillButton, "gpu-process-kill-button");
} }
addRow("diagnostics", "GPUProcessPid", gpuProcessPid); addRow("diagnostics", "GPUProcessPid", gpuProcessPid);
@ -358,7 +332,7 @@ var snapshotFormatters = {
windowUtils.triggerDeviceReset(); windowUtils.triggerDeviceReset();
}); });
gpuDeviceResetButton.textContent = strings.GetStringFromName("gpuDeviceResetButton"); document.l10n.setAttributes(gpuDeviceResetButton, "gpu-device-reset-button");
addRow("diagnostics", "Device Reset", [gpuDeviceResetButton]); addRow("diagnostics", "Device Reset", [gpuDeviceResetButton]);
} }
@ -399,7 +373,7 @@ var snapshotFormatters = {
// @where Table section to add to. // @where Table section to add to.
// @key Data key to use. // @key Data key to use.
// @colKey The localization key to use, if different from key. // @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)) if (!(key in data))
return; return;
colKey = colKey || key; colKey = colKey || key;
@ -407,7 +381,7 @@ var snapshotFormatters = {
let value; let value;
let messageKey = key + "Message"; let messageKey = key + "Message";
if (messageKey in data) { if (messageKey in data) {
value = localizedMsg(data[messageKey]); value = await localizedMsg(data[messageKey]);
delete data[messageKey]; delete data[messageKey];
} else { } else {
value = data[key]; value = data[key];
@ -427,7 +401,8 @@ var snapshotFormatters = {
compositor += " (Advanced Layers)"; compositor += " (Advanced Layers)";
} }
} else { } else {
compositor = "BasicLayers (" + strings.GetStringFromName("mainThreadNoOMTC") + ")"; let noOMTCString = await document.l10n.formatValue("main-thread-no-omtc");
compositor = "BasicLayers (" + noOMTCString + ")";
} }
addRow("features", "compositing", compositor); addRow("features", "compositing", compositor);
delete data.windowLayerManagerRemote; delete data.windowLayerManagerRemote;
@ -439,44 +414,53 @@ var snapshotFormatters = {
addRow("features", "asyncPanZoom", addRow("features", "asyncPanZoom",
apzInfo.length apzInfo.length
? apzInfo.join("; ") ? (await document.l10n.formatValues(apzInfo.map(id => { return {id}; }))).join("; ")
: localizedMsg(["apzNone"])); : await localizedMsg("apz-none"));
addRowFromKey("features", "webgl1WSIInfo"); let featureKeys = [
addRowFromKey("features", "webgl1Renderer"); "webgl1WSIInfo",
addRowFromKey("features", "webgl1Version"); "webgl1Renderer",
addRowFromKey("features", "webgl1DriverExtensions"); "webgl1Version",
addRowFromKey("features", "webgl1Extensions"); "webgl1DriverExtensions",
addRowFromKey("features", "webgl2WSIInfo"); "webgl1Extensions",
addRowFromKey("features", "webgl2Renderer"); "webgl2WSIInfo",
addRowFromKey("features", "webgl2Version"); "webgl2Renderer",
addRowFromKey("features", "webgl2DriverExtensions"); "webgl2Version",
addRowFromKey("features", "webgl2Extensions"); "webgl2DriverExtensions",
addRowFromKey("features", "supportsHardwareH264", "hardwareH264"); "webgl2Extensions",
addRowFromKey("features", "direct2DEnabled", "#Direct2D"); ["supportsHardwareH264", "hardware-h264"],
addRowFromKey("features", "usesTiling"); ["direct2DEnabled", "#Direct2D"],
addRowFromKey("features", "contentUsesTiling"); "usesTiling",
addRowFromKey("features", "offMainThreadPaintEnabled"); "contentUsesTiling",
addRowFromKey("features", "offMainThreadPaintWorkerCount"); "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) { if ("directWriteEnabled" in data) {
let message = data.directWriteEnabled; let message = data.directWriteEnabled;
if ("directWriteVersion" in data) if ("directWriteVersion" in data)
message += " (" + data.directWriteVersion + ")"; message += " (" + data.directWriteVersion + ")";
addRow("features", "#DirectWrite", message); await addRow("features", "#DirectWrite", message);
delete data.directWriteEnabled; delete data.directWriteEnabled;
delete data.directWriteVersion; delete data.directWriteVersion;
} }
// Adapter tbodies. // Adapter tbodies.
let adapterKeys = [ let adapterKeys = [
["adapterDescription", "gpuDescription"], ["adapterDescription", "gpu-description"],
["adapterVendorID", "gpuVendorID"], ["adapterVendorID", "gpu-vendor-id"],
["adapterDeviceID", "gpuDeviceID"], ["adapterDeviceID", "gpu-device-id"],
["driverVersion", "gpuDriverVersion"], ["driverVersion", "gpu-driver-version"],
["driverDate", "gpuDriverDate"], ["driverDate", "gpu-driver-date"],
["adapterDrivers", "gpuDrivers"], ["adapterDrivers", "gpu-drivers"],
["adapterSubsysID", "gpuSubsysID"], ["adapterSubsysID", "gpu-subsys-id"],
["adapterRAM", "gpuRAM"], ["adapterRAM", "gpu-ram"],
]; ];
function showGpu(id, suffix) { function showGpu(id, suffix) {
@ -501,7 +485,8 @@ var snapshotFormatters = {
if ("isGPU2Active" in data && ((suffix == "2") != data.isGPU2Active)) { if ("isGPU2Active" in data && ((suffix == "2") != data.isGPU2Active)) {
active = "no"; active = "no";
} }
addRow(id, "gpuActive", strings.GetStringFromName(active));
addRow(id, "gpu-active", active);
addRows(id, trs); addRows(id, trs);
} }
showGpu("gpu-1", ""); showGpu("gpu-1", "");
@ -539,16 +524,17 @@ var snapshotFormatters = {
let m = /#BLOCKLIST_FEATURE_FAILURE_BUG_(\d+)/.exec(entry.message); let m = /#BLOCKLIST_FEATURE_FAILURE_BUG_(\d+)/.exec(entry.message);
if (m) { if (m) {
let bugSpan = $.new("span"); let bugSpan = $.new("span");
bugSpan.textContent = strings.GetStringFromName("blocklistedBug") + "; "; document.l10n.setAttributes(bugSpan, "blocklisted-bug");
let bugHref = $.new("a"); let bugHref = $.new("a");
bugHref.href = "https://bugzilla.mozilla.org/show_bug.cgi?id=" + m[1]; 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]; contents = [bugSpan, bugHref];
} else { } else {
contents = strings.formatStringFromName( let unknownFailure = $.new("span");
"unknownFailure", [entry.message.substr(1)], 1); document.l10n.setAttributes(unknownFailure, "unknown-failure", { failureCode: entry.message.substr(1) });
contents = [unknownFailure];
} }
} else { } else {
contents = entry.status + " by " + entry.type + ": " + entry.message; contents = entry.status + " by " + entry.type + ": " + entry.message;
@ -584,7 +570,7 @@ var snapshotFormatters = {
resetButton.disabled = true; resetButton.disabled = true;
}; };
resetButton.textContent = strings.GetStringFromName("resetOnNextRestart"); document.l10n.setAttributes(resetButton, "reset-on-next-restart");
resetButton.addEventListener("click", onClickReset); resetButton.addEventListener("click", onClickReset);
addRow("crashguards", guard.type + "CrashGuard", [resetButton]); addRow("crashguards", guard.type + "CrashGuard", [resetButton]);
@ -597,25 +583,20 @@ var snapshotFormatters = {
// the diagnostics section. // the diagnostics section.
for (let key in data) { for (let key in data) {
let value = data[key]; let value = data[key];
if (Array.isArray(value)) {
value = localizedMsg(value);
}
addRow("diagnostics", key, value); addRow("diagnostics", key, value);
} }
}, },
media: function media(data) { async media(data) {
let strings = stringBundle(); async function insertBasicInfo(key, value) {
async function createRow(key, value) {
function insertBasicInfo(key, value) { let th = $.new("th", await document.l10n.formatValue(key), "column");
function createRow(key, value) {
let th = $.new("th", strings.GetStringFromName(key), "column");
let td = $.new("td", value); let td = $.new("td", value);
td.style["white-space"] = "pre-wrap"; td.style["white-space"] = "pre-wrap";
td.colSpan = 8; td.colSpan = 8;
return $.new("tr", [th, td]); return $.new("tr", [th, td]);
} }
$.append($("media-info-tbody"), [createRow(key, value)]); $.append($("media-info-tbody"), [await createRow(key, value)]);
} }
function createDeviceInfoRow(device) { function createDeviceInfoRow(device) {
@ -698,9 +679,9 @@ var snapshotFormatters = {
} }
// Basic information // Basic information
insertBasicInfo("audioBackend", data.currentAudioBackend); await insertBasicInfo("audio-backend", data.currentAudioBackend);
insertBasicInfo("maxAudioChannels", data.currentMaxAudioChannels); await insertBasicInfo("max-audio-channels", data.currentMaxAudioChannels);
insertBasicInfo("sampleRate", data.currentPreferredSampleRate); await insertBasicInfo("sample-rate", data.currentPreferredSampleRate);
// Output devices information // Output devices information
insertDeviceInfo("output", data.audioOutputDevices); insertDeviceInfo("output", data.audioOutputDevices);
@ -709,11 +690,11 @@ var snapshotFormatters = {
insertDeviceInfo("input", data.audioInputDevices); insertDeviceInfo("input", data.audioInputDevices);
}, },
javaScript: function javaScript(data) { javaScript(data) {
$("javascript-incremental-gc").textContent = data.incrementalGCEnabled; $("javascript-incremental-gc").textContent = data.incrementalGCEnabled;
}, },
accessibility: function accessibility(data) { accessibility(data) {
$("a11y-activated").textContent = data.isActive; $("a11y-activated").textContent = data.isActive;
$("a11y-force-disabled").textContent = data.forceDisabled || 0; $("a11y-force-disabled").textContent = data.forceDisabled || 0;
@ -728,13 +709,12 @@ var snapshotFormatters = {
} }
}, },
libraryVersions: function libraryVersions(data) { async libraryVersions(data) {
let strings = stringBundle();
let trs = [ let trs = [
$.new("tr", [ $.new("tr", [
$.new("th", ""), $.new("th", ""),
$.new("th", strings.GetStringFromName("minLibVersions")), $.new("th", await document.l10n.formatValue("min-lib-versions")),
$.new("th", strings.GetStringFromName("loadedLibVersions")), $.new("th", await document.l10n.formatValue("loaded-lib-versions")),
]), ]),
]; ];
sortedArrayFromObject(data).forEach( sortedArrayFromObject(data).forEach(
@ -749,7 +729,7 @@ var snapshotFormatters = {
$.append($("libversions-tbody"), trs); $.append($("libversions-tbody"), trs);
}, },
userJS: function userJS(data) { userJS(data) {
if (!data.exists) if (!data.exists)
return; return;
let userJSFile = Services.dirsvc.get("PrefD", Ci.nsIFile); let userJSFile = Services.dirsvc.get("PrefD", Ci.nsIFile);
@ -760,11 +740,10 @@ var snapshotFormatters = {
$("prefs-user-js-section").className = ""; $("prefs-user-js-section").className = "";
}, },
sandbox: function sandbox(data) { async sandbox(data) {
if (!AppConstants.MOZ_SANDBOX) if (!AppConstants.MOZ_SANDBOX)
return; return;
let strings = stringBundle();
let tbody = $("sandbox-tbody"); let tbody = $("sandbox-tbody");
for (let key in data) { for (let key in data) {
// Simplify the display a little in the common case. // Simplify the display a little in the common case.
@ -776,8 +755,9 @@ var snapshotFormatters = {
// Not in this table. // Not in this table.
continue; continue;
} }
let keyStrId = toFluentID(key);
tbody.appendChild($.new("tr", [ tbody.appendChild($.new("tr", [
$.new("th", strings.GetStringFromName(key), "column"), $.new("th", await document.l10n.formatValue(keyStrId), "column"),
$.new("td", data[key]), $.new("td", data[key]),
])); ]));
} }
@ -789,13 +769,13 @@ var snapshotFormatters = {
if (argsHead.colSpan < syscall.args.length) { if (argsHead.colSpan < syscall.args.length) {
argsHead.colSpan = syscall.args.length; argsHead.colSpan = syscall.args.length;
} }
let procTypeStrId = toFluentID(syscall.procType);
let cells = [ let cells = [
$.new("td", syscall.index, "integer"), $.new("td", syscall.index, "integer"),
$.new("td", syscall.msecAgo / 1000), $.new("td", syscall.msecAgo / 1000),
$.new("td", syscall.pid, "integer"), $.new("td", syscall.pid, "integer"),
$.new("td", syscall.tid, "integer"), $.new("td", syscall.tid, "integer"),
$.new("td", strings.GetStringFromName("sandboxProcType." + $.new("td", await document.l10n.formatValue("sandbox-proc-type-" + procTypeStrId)),
syscall.procType)),
$.new("td", syscall.syscall, "integer"), $.new("td", syscall.syscall, "integer"),
]; ];
for (let arg of syscall.args) { for (let arg of syscall.args) {
@ -806,7 +786,7 @@ var snapshotFormatters = {
} }
}, },
intl: function intl(data) { intl(data) {
$("intl-locale-requested").textContent = $("intl-locale-requested").textContent =
JSON.stringify(data.localeService.requested); JSON.stringify(data.localeService.requested);
$("intl-locale-available").textContent = $("intl-locale-available").textContent =
@ -829,16 +809,29 @@ var $ = document.getElementById.bind(document);
$.new = function $_new(tag, textContentOrChildren, className, attributes) { $.new = function $_new(tag, textContentOrChildren, className, attributes) {
let elt = document.createElement(tag); let elt = document.createElement(tag);
if (className) if (className) {
elt.className = className; elt.className = className;
if (attributes) {
for (let attrName in attributes)
elt.setAttribute(attrName, attributes[attrName]);
} }
if (Array.isArray(textContentOrChildren)) if (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)) {
this.append(elt, textContentOrChildren); this.append(elt, textContentOrChildren);
else } else if (textContentOrChildren) {
elt.textContent = String(textContentOrChildren); elt.textContent = String(textContentOrChildren);
}
return elt; return elt;
}; };
@ -846,11 +839,6 @@ $.append = function $_append(parent, children) {
children.forEach(c => parent.appendChild(c)); children.forEach(c => parent.appendChild(c));
}; };
function stringBundle() {
return Services.strings.createBundle(
"chrome://global/locale/aboutSupport.properties");
}
function assembleFromGraphicsFailure(i, data) { function assembleFromGraphicsFailure(i, data) {
// Only cover the cases we have today; for example, we do not have // 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. // log failures that assert and we assume the log level is 1/error.
@ -888,7 +876,7 @@ function copyRawDataToClipboard(button) {
if (button) if (button)
button.disabled = true; button.disabled = true;
try { try {
Troubleshoot.snapshot(function(snapshot) { Troubleshoot.snapshot(async function(snapshot) {
if (button) if (button)
button.disabled = false; button.disabled = false;
let str = Cc["@mozilla.org/supports-string;1"]. let str = Cc["@mozilla.org/supports-string;1"].
@ -903,8 +891,8 @@ function copyRawDataToClipboard(button) {
if (AppConstants.platform == "android") { if (AppConstants.platform == "android") {
// Present a snackbar notification. // Present a snackbar notification.
ChromeUtils.import("resource://gre/modules/Snackbars.jsm"); ChromeUtils.import("resource://gre/modules/Snackbars.jsm");
Snackbars.show(stringBundle().GetStringFromName("rawDataCopied"), let rawDataCopiedString = await document.l10n.formatValue("raw-data-copied");
Snackbars.LENGTH_SHORT); Snackbars.show(rawDataCopiedString, Snackbars.LENGTH_SHORT);
} }
}); });
} catch (err) { } catch (err) {
@ -918,7 +906,7 @@ function getLoadContext() {
return window.docShell.QueryInterface(Ci.nsILoadContext); return window.docShell.QueryInterface(Ci.nsILoadContext);
} }
function copyContentsToClipboard() { async function copyContentsToClipboard() {
// Get the HTML and text representations for the important part of the page. // Get the HTML and text representations for the important part of the page.
let contentsDiv = $("contents"); let contentsDiv = $("contents");
let dataHtml = contentsDiv.innerHTML; let dataHtml = contentsDiv.innerHTML;
@ -949,8 +937,8 @@ function copyContentsToClipboard() {
if (AppConstants.platform == "android") { if (AppConstants.platform == "android") {
// Present a snackbar notification. // Present a snackbar notification.
ChromeUtils.import("resource://gre/modules/Snackbars.jsm"); ChromeUtils.import("resource://gre/modules/Snackbars.jsm");
Snackbars.show(stringBundle().GetStringFromName("textCopied"), let textCopiedString = await document.l10n.formatValue("text-copied");
Snackbars.LENGTH_SHORT); Snackbars.show(textCopiedString, Snackbars.LENGTH_SHORT);
} }
} }

Просмотреть файл

@ -6,15 +6,13 @@
<!DOCTYPE html [ <!DOCTYPE html [
<!ENTITY % htmlDTD PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> %htmlDTD; <!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 % 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; <!ENTITY % resetProfileDTD SYSTEM "chrome://global/locale/resetProfile.dtd"> %resetProfileDTD;
]> ]>
<html xmlns="http://www.w3.org/1999/xhtml"> <html xmlns="http://www.w3.org/1999/xhtml">
<head> <head>
<title>&aboutSupport.pageTitle;</title> <title data-l10n-id="page-title"/>
<link rel="icon" type="image/png" id="favicon" <link rel="icon" type="image/png" id="favicon"
href="chrome://branding/content/icon32.png"/> href="chrome://branding/content/icon32.png"/>
@ -23,9 +21,11 @@
<script type="application/javascript" <script type="application/javascript"
src="chrome://global/content/aboutSupport.js"/> src="chrome://global/content/aboutSupport.js"/>
<link rel="localization" href="branding/brand.ftl"/>
<link rel="localization" href="toolkit/about/aboutSupport.ftl"/>
</head> </head>
<body dir="&locale.dir;" class="wide-container"> <body class="wide-container">
#ifndef ANDROID #ifndef ANDROID
<div id="action-box" class="notice-box"> <div id="action-box" class="notice-box">
@ -36,77 +36,57 @@
</button> </button>
</div> </div>
<div id="safe-mode-box"> <div id="safe-mode-box">
<h3>&aboutSupport.safeModeTitle;</h3> <h3 data-l10n-id="safe-mode-title"/>
<button id="restart-in-safe-mode-button"> <button id="restart-in-safe-mode-button" data-l10n-id="restart-in-safe-mode-label"/>
&aboutSupport.restartInSafeMode.label;
</button>
</div> </div>
</div> </div>
#endif #endif
<h1> <h1 data-l10n-id="page-title"/>
&aboutSupport.pageTitle;
</h1>
<div class="page-subtitle"> <div class="page-subtitle" data-l10n-id="page-subtitle">
&aboutSupport.pageSubtitle; <a id="supportLink" data-l10n-name="support-link"></a>
</div> </div>
<div> <div>
<button id="copy-raw-data-to-clipboard"> <button id="copy-raw-data-to-clipboard" data-l10n-id="copy-raw-data-to-clipboard-label"/>
&aboutSupport.copyRawDataToClipboard.label; <button id="copy-to-clipboard" data-l10n-id="copy-text-to-clipboard-label"/>
</button>
<button id="copy-to-clipboard">
&aboutSupport.copyTextToClipboard.label;
</button>
</div> </div>
<div id="contents"> <div id="contents">
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="app-basics-title"/>
&aboutSupport.appBasicsTitle;
</h2>
<table> <table>
<tbody> <tbody>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-name"/>
&aboutSupport.appBasicsName;
</th>
<td id="application-box"> <td id="application-box">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-version"/>
&aboutSupport.appBasicsVersion;
</th>
<td id="version-box"> <td id="version-box">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-build-id"/>
&aboutSupport.appBasicsBuildID;
</th>
<td id="buildid-box"></td> <td id="buildid-box"></td>
</tr> </tr>
#ifndef ANDROID #ifndef ANDROID
#ifdef MOZ_UPDATER #ifdef MOZ_UPDATER
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-update-history"/>
&aboutSupport.appBasicsUpdateHistory;
</th>
<td> <td>
<button id="show-update-history-button"> <button id="show-update-history-button" data-l10n-id="app-basics-show-update-history"/>
&aboutSupport.appBasicsShowUpdateHistory;
</button>
</td> </td>
</tr> </tr>
#endif #endif
@ -114,65 +94,37 @@
#ifdef MOZ_UPDATER #ifdef MOZ_UPDATER
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-update-channel"/>
&aboutSupport.appBasicsUpdateChannel;
</th>
<td id="updatechannel-box"></td> <td id="updatechannel-box"></td>
</tr> </tr>
#endif #endif
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-user-agent"/>
&aboutSupport.appBasicsUserAgent;
</th>
<td id="useragent-box"> <td id="useragent-box">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-os"/>
&aboutSupport.appBasicsOS;
</th>
<td id="os-box"> <td id="os-box">
</td> </td>
</tr> </tr>
<tr id="profile-row" class="no-copy"> <tr id="profile-row" class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-profile-dir"/>
#ifdef XP_WIN
&aboutSupport.appBasicsProfileDirWinMac;
#else
#ifdef XP_MACOSX
&aboutSupport.appBasicsProfileDirWinMac;
#else
&aboutSupport.appBasicsProfileDir;
#endif
#endif
</th>
<td> <td>
<button id="profile-dir-button"> <button id="profile-dir-button" data-l10n-id="show-dir-label"/>
#ifdef XP_WIN
&aboutSupport.showWin2.label;
#else
#ifdef XP_MACOSX
&aboutSupport.showMac.label;
#else
&aboutSupport.showDir.label;
#endif
#endif
</button>
<span id="profile-dir-box"> <span id="profile-dir-box">
</span> </span>
</td> </td>
</tr> </tr>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-enabled-plugins"/>
&aboutSupport.appBasicsEnabledPlugins;
</th>
<td> <td>
<a href="about:plugins">about:plugins</a> <a href="about:plugins">about:plugins</a>
@ -180,9 +132,7 @@
</tr> </tr>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-build-config"/>
&aboutSupport.appBasicsBuildConfig;
</th>
<td> <td>
<a href="about:buildconfig">about:buildconfig</a> <a href="about:buildconfig">about:buildconfig</a>
@ -190,9 +140,7 @@
</tr> </tr>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-memory-use"/>
&aboutSupport.appBasicsMemoryUse;
</th>
<td> <td>
<a href="about:memory">about:memory</a> <a href="about:memory">about:memory</a>
@ -200,9 +148,7 @@
</tr> </tr>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-performance"/>
&aboutSupport.appBasicsPerformance;
</th>
<td> <td>
<a href="about:performance">about:performance</a> <a href="about:performance">about:performance</a>
@ -210,9 +156,7 @@
</tr> </tr>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-service-workers"/>
&aboutSupport.appBasicsServiceWorkers;
</th>
<td> <td>
<a href="about:serviceworkers">about:serviceworkers</a> <a href="about:serviceworkers">about:serviceworkers</a>
@ -220,54 +164,44 @@
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-multi-process-support"/>
&aboutSupport.appBasicsMultiProcessSupport;
</th>
<td id="multiprocess-box"> <td id="multiprocess-box">
<span id="multiprocess-box-process-count"/>
<span id="multiprocess-box-status" data-l10n-id="multi-process-status-unknown"/>
</td> </td>
</tr> </tr>
<tr id="contentprocesses-row"> <tr id="contentprocesses-row">
<th class="column"> <th class="column" data-l10n-id="app-basics-process-count"/>
&aboutSupport.appBasicsProcessCount;
</th>
<td id="contentprocesses-box"> <td id="contentprocesses-box">
</td> </td>
</tr> </tr>
<tr id="policies-status-row"> <tr id="policies-status-row">
<th class="column"> <th class="column" data-l10n-id="app-basics-enterprise-policies"/>
&aboutSupport.enterprisePolicies;
</th>
<td id="policies-status"> <td id="policies-status">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-key-google"/>
&aboutSupport.appBasicsKeyGoogle;
</th>
<td id="key-google-box"> <td id="key-google-box">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-key-mozilla"/>
&aboutSupport.appBasicsKeyMozilla;
</th>
<td id="key-mozilla-box"> <td id="key-mozilla-box">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="app-basics-safe-mode"/>
&aboutSupport.appBasicsSafeMode;
</th>
<td id="safemode-box"> <td id="safemode-box">
</td> </td>
@ -275,9 +209,7 @@
#ifndef ANDROID #ifndef ANDROID
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="app-basics-profiles"/>
&aboutSupport.appBasicsProfiles;
</th>
<td> <td>
<a href="about:profiles">about:profiles</a> <a href="about:profiles">about:profiles</a>
@ -291,48 +223,35 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
#ifdef MOZ_CRASHREPORTER #ifdef MOZ_CRASHREPORTER
<h2 class="major-section" id="crashes-title"> <h2 class="major-section" id="crashes-title" data-l10n-id="crashes-title"/>
&aboutSupport.crashes.title;
</h2>
<table id="crashes-table"> <table id="crashes-table">
<thead> <thead>
<tr> <tr>
<th> <th data-l10n-id="crashes-id"/>
&aboutSupport.crashes.id; <th data-l10n-id="crashes-send-date"/>
</th>
<th>
&aboutSupport.crashes.sendDate;
</th>
</tr> </tr>
</thead> </thead>
<tbody id="crashes-tbody"> <tbody id="crashes-tbody">
</tbody> </tbody>
</table> </table>
<p id="crashes-allReports" class="hidden no-copy"> <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>
<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 #endif
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="features-title"/>
&aboutSupport.featuresTitle;
</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th> <th data-l10n-id="features-name"/>
&aboutSupport.featureName; <th data-l10n-id="features-version"/>
</th> <th data-l10n-id="features-id"/>
<th>
&aboutSupport.featureVersion;
</th>
<th>
&aboutSupport.featureId;
</th>
</tr> </tr>
</thead> </thead>
<tbody id="features-tbody"> <tbody id="features-tbody">
@ -341,25 +260,15 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="extensions-title"/>
&aboutSupport.extensionsTitle;
</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
<th> <th data-l10n-id="extensions-name"/>
&aboutSupport.extensionName; <th data-l10n-id="extensions-version"/>
</th> <th data-l10n-id="extensions-enabled"/>
<th> <th data-l10n-id="extensions-id"/>
&aboutSupport.extensionVersion;
</th>
<th>
&aboutSupport.extensionEnabled;
</th>
<th>
&aboutSupport.extensionId;
</th>
</tr> </tr>
</thead> </thead>
<tbody id="extensions-tbody"> <tbody id="extensions-tbody">
@ -368,44 +277,32 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section" id="security-software-title"> <h2 class="major-section" id="security-software-title" data-l10n-id="security-software-title"/>
&aboutSupport.securitySoftwareTitle;
</h2>
<table id="security-software-table"> <table id="security-software-table">
<thead> <thead>
<tr> <tr>
<th> <th data-l10n-id="security-software-type"/>
&aboutSupport.securitySoftwareType; <th data-l10n-id="security-software-name"/>
</th>
<th>
&aboutSupport.securitySoftwareName;
</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="security-software-antivirus"/>
&aboutSupport.securitySoftwareAntivirus;
</th>
<td id="security-software-antivirus"> <td id="security-software-antivirus">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="security-software-antispyware"/>
&aboutSupport.securitySoftwareAntiSpyware;
</th>
<td id="security-software-antispyware"> <td id="security-software-antispyware">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="security-software-firewall"/>
&aboutSupport.securitySoftwareFirewall;
</th>
<td id="security-software-firewall"> <td id="security-software-firewall">
</td> </td>
@ -415,16 +312,12 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="graphics-title"/>
&aboutSupport.graphicsTitle;
</h2>
<table> <table>
<tbody id="graphics-features-tbody"> <tbody id="graphics-features-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-features-title"/>
&aboutSupport.graphicsFeaturesTitle;
</th>
</tr> </tr>
</tbody> </tbody>
@ -433,141 +326,85 @@
<tbody id="graphics-gpu-1-tbody"> <tbody id="graphics-gpu-1-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-gpu1-title"/>
&aboutSupport.graphicsGPU1Title;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-gpu-2-tbody"> <tbody id="graphics-gpu-2-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-gpu2-title"/>
&aboutSupport.graphicsGPU2Title;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-diagnostics-tbody"> <tbody id="graphics-diagnostics-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-diagnostics-title"/>
&aboutSupport.graphicsDiagnosticsTitle;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-decisions-tbody"> <tbody id="graphics-decisions-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-decision-log-title"/>
&aboutSupport.graphicsDecisionLogTitle;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-crashguards-tbody"> <tbody id="graphics-crashguards-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-crash-guards-title"/>
&aboutSupport.graphicsCrashGuardsTitle;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-workarounds-tbody"> <tbody id="graphics-workarounds-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-workarounds-title"/>
&aboutSupport.graphicsWorkaroundsTitle;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="graphics-failures-tbody"> <tbody id="graphics-failures-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="graphics-failure-log-title"/>
&aboutSupport.graphicsFailureLogTitle;
</th>
</tr> </tr>
</tbody> </tbody>
</table> </table>
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="media-title"/>
&aboutSupport.mediaTitle;
</h2>
<table> <table>
<tbody id="media-info-tbody"> <tbody id="media-info-tbody">
</tbody> </tbody>
<tbody id="media-output-devices-tbody"> <tbody id="media-output-devices-tbody">
<tr> <tr>
<th colspan="9" class="title-column"> <th colspan="9" class="title-column" data-l10n-id="media-output-devices-title"/>
&aboutSupport.mediaOutputDevicesTitle;
</th>
</tr> </tr>
<tr> <tr>
<th> <th data-l10n-id="media-device-name"/>
&aboutSupport.mediaDeviceName; <th data-l10n-id="media-device-group"/>
</th> <th data-l10n-id="media-device-vendor"/>
<th> <th data-l10n-id="media-device-state"/>
&aboutSupport.mediaDeviceGroup; <th data-l10n-id="media-device-preferred"/>
</th> <th data-l10n-id="media-device-format"/>
<th> <th data-l10n-id="media-device-channels"/>
&aboutSupport.mediaDeviceVendor; <th data-l10n-id="media-device-rate"/>
</th> <th data-l10n-id="media-device-latency"/>
<th>
&aboutSupport.mediaDeviceState;
</th>
<th>
&aboutSupport.mediaDevicePreferred;
</th>
<th>
&aboutSupport.mediaDeviceFormat;
</th>
<th>
&aboutSupport.mediaDeviceChannels;
</th>
<th>
&aboutSupport.mediaDeviceRate;
</th>
<th>
&aboutSupport.mediaDeviceLatency;
</th>
</tr> </tr>
</tbody> </tbody>
<tbody id="media-input-devices-tbody"> <tbody id="media-input-devices-tbody">
<tr> <tr>
<th colspan="9" class="title-column"> <th colspan="9" class="title-column" data-l10n-id="media-input-devices-title"/>
&aboutSupport.mediaInputDevicesTitle;
</th>
</tr> </tr>
<tr> <tr>
<th> <th data-l10n-id="media-device-name"/>
&aboutSupport.mediaDeviceName; <th data-l10n-id="media-device-group"/>
</th> <th data-l10n-id="media-device-vendor"/>
<th> <th data-l10n-id="media-device-state"/>
&aboutSupport.mediaDeviceGroup; <th data-l10n-id="media-device-preferred"/>
</th> <th data-l10n-id="media-device-format"/>
<th> <th data-l10n-id="media-device-channels"/>
&aboutSupport.mediaDeviceVendor; <th data-l10n-id="media-device-rate"/>
</th> <th data-l10n-id="media-device-latency"/>
<th>
&aboutSupport.mediaDeviceState;
</th>
<th>
&aboutSupport.mediaDevicePreferred;
</th>
<th>
&aboutSupport.mediaDeviceFormat;
</th>
<th>
&aboutSupport.mediaDeviceChannels;
</th>
<th>
&aboutSupport.mediaDeviceRate;
</th>
<th>
&aboutSupport.mediaDeviceLatency;
</th>
</tr> </tr>
</tbody> </tbody>
@ -575,19 +412,13 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="modified-key-prefs-title"/>
&aboutSupport.modifiedKeyPrefsTitle;
</h2>
<table class="prefs-table"> <table class="prefs-table">
<thead class="no-copy"> <thead class="no-copy">
<th class="name"> <th class="name" data-l10n-id="modified-prefs-name"/>
&aboutSupport.modifiedPrefsName;
</th>
<th class="value"> <th class="value" data-l10n-id="modified-prefs-value"/>
&aboutSupport.modifiedPrefsValue;
</th>
</thead> </thead>
<tbody id="prefs-tbody"> <tbody id="prefs-tbody">
@ -595,25 +426,21 @@
</table> </table>
<section id="prefs-user-js-section" class="hidden no-copy"> <section id="prefs-user-js-section" class="hidden no-copy">
<h3>&aboutSupport.userJSTitle;</h3> <h3 data-l10n-id="user-js-title"/>
<p>&aboutSupport.userJSDescription;</p> <p data-l10n-id="user-js-description">
<a id="prefs-user-js-link" data-l10n-name="user-js-link"></a>
</p>
</section> </section>
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="locked-key-prefs-title"/>
&aboutSupport.lockedKeyPrefsTitle;
</h2>
<table class="prefs-table"> <table class="prefs-table">
<thead class="no-copy"> <thead class="no-copy">
<th class="name"> <th class="name" data-l10n-id="locked-prefs-name"/>
&aboutSupport.lockedPrefsName;
</th>
<th class="value"> <th class="value" data-l10n-id="locked-prefs-value"/>
&aboutSupport.lockedPrefsValue;
</th>
</thead> </thead>
<tbody id="locked-prefs-tbody"> <tbody id="locked-prefs-tbody">
@ -623,20 +450,14 @@
#ifndef ANDROID #ifndef ANDROID
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="place-database-title"/>
&aboutSupport.placeDatabaseTitle;
</h2>
<table> <table>
<tr class="no-copy"> <tr class="no-copy">
<th class="column"> <th class="column" data-l10n-id="place-database-integrity"/>
&aboutSupport.placeDatabaseIntegrity;
</th>
<td> <td>
<button id="verify-place-integrity-button"> <button id="verify-place-integrity-button" data-l10n-id="place-database-verify-integrity"/>
&aboutSupport.placeDatabaseVerifyIntegrity;
</button>
<pre id="verify-place-result" class="hidden no-copy"></pre> <pre id="verify-place-result" class="hidden no-copy"></pre>
</td> </td>
</tr> </tr>
@ -644,16 +465,12 @@
#endif #endif
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="js-title"/>
&aboutSupport.jsTitle;
</h2>
<table> <table>
<tbody> <tbody>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="js-incremental-gc"/>
&aboutSupport.jsIncrementalGC;
</th>
<td id="javascript-incremental-gc"> <td id="javascript-incremental-gc">
</td> </td>
@ -662,42 +479,32 @@
</table> </table>
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="a11y-title"/>
&aboutSupport.a11yTitle;
</h2>
<table> <table>
<tbody> <tbody>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="a11y-activated"/>
&aboutSupport.a11yActivated;
</th>
<td id="a11y-activated"> <td id="a11y-activated">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="a11y-force-disabled"/>
&aboutSupport.a11yForceDisabled;
</th>
<td id="a11y-force-disabled"> <td id="a11y-force-disabled">
</td> </td>
</tr> </tr>
#if defined(XP_WIN) #if defined(XP_WIN)
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="a11y-handler-used"/>
&aboutSupport.a11yHandlerUsed;
</th>
<td id="a11y-handler-used"> <td id="a11y-handler-used">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="a11y-instantiator"/>
&aboutSupport.a11yInstantiator;
</th>
<td id="a11y-instantiator"> <td id="a11y-instantiator">
</td> </td>
@ -707,9 +514,7 @@
</table> </table>
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="library-version-title"/>
&aboutSupport.libraryVersionsTitle;
</h2>
<table> <table>
<tbody id="libversions-tbody"> <tbody id="libversions-tbody">
@ -719,9 +524,7 @@
<!-- - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - -->
#if defined(MOZ_SANDBOX) #if defined(MOZ_SANDBOX)
<h2 class="major-section" id="sandbox"> <h2 class="major-section" id="sandbox" data-l10n-id="sandbox-title"/>
&aboutSupport.sandboxTitle;
</h2>
<table> <table>
<tbody id="sandbox-tbody"> <tbody id="sandbox-tbody">
@ -729,31 +532,17 @@
</table> </table>
#if defined(XP_LINUX) #if defined(XP_LINUX)
<h4>&aboutSupport.sandboxSyscallLogTitle;</h4> <h4 data-l10n-id="sandbox-sys-call-log-title"/>
<table> <table>
<thead> <thead>
<tr> <tr>
<th> <th data-l10n-id="sandbox-sys-call-index"/>
&aboutSupport.sandboxSyscallIndex; <th data-l10n-id="sandbox-sys-call-age"/>
</th> <th data-l10n-id="sandbox-sys-call-pid"/>
<th> <th data-l10n-id="sandbox-sys-call-tid"/>
&aboutSupport.sandboxSyscallAge; <th data-l10n-id="sandbox-sys-call-proc-type"/>
</th> <th data-l10n-id="sandbox-sys-call-number"/>
<th> <th id="sandbox-syscalls-argshead" data-l10n-id="sandbox-sys-call-args"/>
&aboutSupport.sandboxSyscallPID;
</th>
<th>
&aboutSupport.sandboxSyscallTID;
</th>
<th>
&aboutSupport.sandboxSyscallProcType;
</th>
<th>
&aboutSupport.sandboxSyscallNumber;
</th>
<th id="sandbox-syscalls-argshead">
&aboutSupport.sandboxSyscallArgs;
</th>
</tr> </tr>
</thead> </thead>
<tbody id="sandbox-syscalls-tbody"> <tbody id="sandbox-syscalls-tbody">
@ -762,70 +551,50 @@
#endif #endif
#endif #endif
<h2 class="major-section"> <h2 class="major-section" data-l10n-id="intl-title"/>
&aboutSupport.intlTitle;
</h2>
<table> <table>
<tbody id="intl-localeservice-tbody"> <tbody id="intl-localeservice-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="intl-app-title"/>
&aboutSupport.intlAppTitle;
</th>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-locales-requested"/>
&aboutSupport.intlLocalesRequested;
</th>
<td id="intl-locale-requested"> <td id="intl-locale-requested">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-locales-available"/>
&aboutSupport.intlLocalesAvailable;
</th>
<td id="intl-locale-available"> <td id="intl-locale-available">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-locales-supported"/>
&aboutSupport.intlLocalesSupported;
</th>
<td id="intl-locale-supported"> <td id="intl-locale-supported">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-regional-prefs"/>
&aboutSupport.intlRegionalPrefs;
</th>
<td id="intl-locale-regionalprefs"> <td id="intl-locale-regionalprefs">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-locales-default"/>
&aboutSupport.intlLocalesDefault;
</th>
<td id="intl-locale-default"> <td id="intl-locale-default">
</td> </td>
</tr> </tr>
</tbody> </tbody>
<tbody id="intl-ospreferences-tbody"> <tbody id="intl-ospreferences-tbody">
<tr> <tr>
<th colspan="2" class="title-column"> <th colspan="2" class="title-column" data-l10n-id="intl-os-title"/>
&aboutSupport.intlOSTitle;
</th>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-os-prefs-system-locales"/>
&aboutSupport.intlOSPrefsSystemLocales;
</th>
<td id="intl-osprefs-systemlocales"> <td id="intl-osprefs-systemlocales">
</td> </td>
</tr> </tr>
<tr> <tr>
<th class="column"> <th class="column" data-l10n-id="intl-regional-prefs"/>
&aboutSupport.intlRegionalPrefs;
</th>
<td id="intl-osprefs-regionalprefs"> <td id="intl-osprefs-regionalprefs">
</td> </td>
</tr> </tr>

Просмотреть файл

@ -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 youre
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">

Просмотреть файл

@ -2,39 +2,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # 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/. # 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". # LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers".
blockedDriver = Blocked for your graphics driver version. blockedDriver = Blocked for your graphics driver version.
@ -49,110 +16,3 @@ blockedOSVersion = Blocked for your operating system version.
# LOCALIZATION NOTE The verb "blocked" here refers to a graphics feature such as "Direct2D" or "OpenGL layers". # 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. 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

Просмотреть файл

@ -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 youre
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

Просмотреть файл

@ -12,7 +12,6 @@
locale/@AB_CD@/global/aboutReader.properties (%chrome/global/aboutReader.properties) locale/@AB_CD@/global/aboutReader.properties (%chrome/global/aboutReader.properties)
locale/@AB_CD@/global/aboutRights.dtd (%chrome/global/aboutRights.dtd) locale/@AB_CD@/global/aboutRights.dtd (%chrome/global/aboutRights.dtd)
locale/@AB_CD@/global/aboutStudies.properties (%chrome/global/aboutStudies.properties) 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/aboutSupport.properties (%chrome/global/aboutSupport.properties)
locale/@AB_CD@/global/aboutTelemetry.dtd (%chrome/global/aboutTelemetry.dtd) locale/@AB_CD@/global/aboutTelemetry.dtd (%chrome/global/aboutTelemetry.dtd)
locale/@AB_CD@/global/aboutTelemetry.properties (%chrome/global/aboutTelemetry.properties) locale/@AB_CD@/global/aboutTelemetry.properties (%chrome/global/aboutTelemetry.properties)