Bug 1615501 - Migrate Preferences Tab l10n to Fluent. r=mkmelin, ui-r=Paenglab
authorAlessandro Castellani <alessandro@thunderbird.net>
Sun, 31 May 2020 21:45:40 +0300
changeset 39295 8f5971bfa1c6d0713b0e5a45288c595f76abe882
parent 39294 9f4a9f7ce10651f40e6788c3c1d648f4fb99d9dd
child 39296 34815bba0c607f411fa8c4cd1bf5829b0c4a182d
push id402
push userclokep@gmail.com
push dateMon, 29 Jun 2020 20:48:04 +0000
reviewersmkmelin, Paenglab
bugs1615501
Bug 1615501 - Migrate Preferences Tab l10n to Fluent. r=mkmelin, ui-r=Paenglab
calendar/lightning/content/messenger-overlay-preferences.inc.xhtml
mail/components/AboutRedirector.jsm
mail/components/MessengerContentHandler.jsm
mail/components/preferences/aboutPreferences.xhtml
mail/components/preferences/chat.inc.xhtml
mail/components/preferences/chat.js
mail/components/preferences/compose.inc.xhtml
mail/components/preferences/compose.js
mail/components/preferences/downloads.js
mail/components/preferences/general.inc.xhtml
mail/components/preferences/general.js
mail/components/preferences/jar.mn
mail/components/preferences/preferences.js
mail/components/preferences/preferences.xhtml
mail/components/preferences/privacy.inc.xhtml
mail/components/preferences/privacy.js
mail/locales/en-US/chrome/messenger/preferences/advanced.dtd
mail/locales/en-US/chrome/messenger/preferences/applications.dtd
mail/locales/en-US/chrome/messenger/preferences/chat.dtd
mail/locales/en-US/chrome/messenger/preferences/compose.dtd
mail/locales/en-US/chrome/messenger/preferences/display.dtd
mail/locales/en-US/chrome/messenger/preferences/general.dtd
mail/locales/en-US/chrome/messenger/preferences/preferences.dtd
mail/locales/en-US/chrome/messenger/preferences/privacy.dtd
mail/locales/en-US/chrome/messenger/preferences/security.dtd
mail/locales/en-US/messenger/preferences/preferences.ftl
mail/locales/jar.mn
mail/test/browser/shared-modules/PrefTabHelpers.jsm
mail/themes/linux/mail/preferences/preferences.css
mail/themes/osx/mail/preferences/preferences.css
mail/themes/shared/mail/preferences/applications.css
mail/themes/shared/mail/preferences/preferences.css
mail/themes/windows/mail/preferences/preferences.css
python/l10n/tb_fluent_migrations/bug_1615501_preferences.py
--- a/calendar/lightning/content/messenger-overlay-preferences.inc.xhtml
+++ b/calendar/lightning/content/messenger-overlay-preferences.inc.xhtml
@@ -9,18 +9,17 @@
 # chrome://calendar/locale/global.dtd
 # chrome://calendar/locale/calendar-event-dialog.dtd
 # chrome://calendar/locale/preferences/alarms.dtd
 # chrome://calendar/locale/preferences/categories.dtd
 # chrome://calendar/locale/preferences/views.dtd
 
   <prefpane id="paneLightning"
             flex="1"
-            insertbefore="paneAdvanced"
-            label="&lightning.preferencesLabel;">
+            insertbefore="paneAdvanced">
 
     <hbox id="calendarPaneCategory"
           class="subcategory"
           data-category="paneCalendar">
       <html:h1>&panelHeader.title;</html:h1>
     </hbox>
 
 #include ../../base/content/preferences/views.inc.xhtml
--- a/mail/components/AboutRedirector.jsm
+++ b/mail/components/AboutRedirector.jsm
@@ -24,17 +24,17 @@ AboutRedirector.prototype = {
         Ci.nsIAboutModule.ALLOW_SCRIPT |
         Ci.nsIAboutModule.URI_SAFE_FOR_UNTRUSTED_CONTENT,
     },
     support: {
       url: "chrome://messenger/content/about-support/aboutSupport.xhtml",
       flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
     },
     preferences: {
-      url: "chrome://messenger/content/preferences/aboutPreferences.xhtml",
+      url: "chrome://messenger/content/preferences/preferences.xhtml",
       flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
     },
     downloads: {
       url: "chrome://messenger/content/downloads/aboutDownloads.xhtml",
       flags: Ci.nsIAboutModule.ALLOW_SCRIPT,
     },
     policies: {
       url: "chrome://messenger/content/policies/aboutPolicies.xhtml",
--- a/mail/components/MessengerContentHandler.jsm
+++ b/mail/components/MessengerContentHandler.jsm
@@ -277,17 +277,17 @@ MailDefaultHandler.prototype = {
       let instantApply = Services.prefs.getBoolPref(
         "browser.preferences.instantApply"
       );
       let features =
         "chrome,titlebar,toolbar" + (instantApply ? ",dialog=no" : ",modal");
 
       Services.ww.openWindow(
         null,
-        "chrome://messenger/content/preferences/aboutPreferences.xhtml",
+        "chrome://messenger/content/preferences/preferences.xhtml",
         "_blank",
         features,
         null
       );
     }
 
     if (cmdLine.handleFlag("setDefaultMail", false)) {
       var shell = Cc["@mozilla.org/mail/shell-service;1"].getService(
--- a/mail/components/preferences/chat.inc.xhtml
+++ b/mail/components/preferences/chat.inc.xhtml
@@ -1,201 +1,186 @@
 # 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/.
-  <prefpane id="paneChat" label="&paneChat.title;">
+  <prefpane id="paneChat">
     <script src="chrome://messenger/content/preferences/chat.js"/>
     <script src="chrome://messenger/content/preferences/messagestyle.js"/>
 
     <stringbundle id="themesBundle"
                   src="chrome://messenger/locale/preferences/messagestyle.properties"/>
 
     <hbox id="chatPaneCategory"
           class="subcategory"
           data-category="paneChat">
       <html:h1 data-l10n-id="chat-pane-header"/>
     </hbox>
 
     <html:fieldset data-category="paneChat">
       <html:legend data-l10n-id="chat-status-title"></html:legend>
         <!-- Startup -->
         <hbox align="center">
-          <label id="chatStartupAction" value="&startupAction.label;"
-                 accesskey="&startupAction.accesskey;" control="messengerStartupAction"/>
+          <label id="chatStartupAction"
+                 data-l10n-id="startup-label"
+                 control="messengerStartupAction"/>
           <menulist id="messengerStartupAction" preference="messenger.startup.action">
             <menupopup>
-              <menuitem label="&startupOffline.label;"     value="0"/>
-              <menuitem label="&startupConnectAuto.label;" value="1"/>
+              <menuitem data-l10n-id="offline-label" value="0"/>
+              <menuitem data-l10n-id="auto-connect-label" value="1"/>
             </menupopup>
           </menulist>
         </hbox>
         <separator/>
 
         <!-- Status -->
         <hbox align="center">
-          <checkbox id="reportIdle" label="&reportIdleAfter.label;"
-                    accesskey="&reportIdleAfter.accesskey;"
+          <checkbox id="reportIdle" data-l10n-id="idle-label"
                     preference="messenger.status.reportIdle"/>
           <html:input id="timeBeforeAway" type="number"
                       class="size2 idle-reporting-enabled"
                       min="1" max="720"
                       preference="messenger.status.timeBeforeIdle"/>
-          <label value="&idleTime;" control="timeBeforeAway"/>
+          <label data-l10n-id="idle-time-label" control="timeBeforeAway"/>
         </hbox>
         <vbox class="indent">
           <hbox>
             <checkbox id="autoAway"
-                      label="&andSetStatusToAway.label;"
+                      data-l10n-id="away-message-label"
                       class="idle-reporting-enabled"
-                      accesskey="&andSetStatusToAway.accesskey;"
                       preference="messenger.status.awayWhenIdle"/>
             <spacer flex="1"/>
           </hbox>
           <html:input id="defaultIdleAwayMessage"
                       type="text"
                       class="idle-reporting-enabled indent"
                       preference="messenger.status.defaultIdleAwayMessage"/>
         </vbox>
     </html:fieldset>
 
     <html:fieldset data-category="paneChat">
       <html:legend data-l10n-id="chat-notifications-title"></html:legend>
       <hbox>
         <checkbox id="sendTyping"
-                  label="&sendTyping.label;"
-                  accesskey="&sendTyping.accesskey;"
+                  data-l10n-id="send-typing-label"
                   preference="purple.conversations.im.send_typing"/>
         <spacer flex="1"/>
       </hbox>
 
       <separator/>
 
       <hbox>
-        <label value="&chatNotifications.label;"/>
+        <label data-l10n-id="notification-label"/>
       </hbox>
       <hbox>
         <checkbox id="desktopChatNotifications"
-                  label="&desktopChatNotifications.label;"
-                  accesskey="&desktopChatNotifications.accesskey;"
+                  data-l10n-id="show-notification-label"
                   preference="mail.chat.show_desktop_notifications"/>
         <menulist id="chatNotificationInfo" preference="mail.chat.notification_info">
           <menupopup>
-            <menuitem label="&completeNotification.label;" value="0"/>
-            <menuitem label="&buddyInfoOnly.label;" value="1"/>
-            <menuitem label="&dummyNotification.label;" value="2"/>
+            <menuitem data-l10n-id="notification-all" value="0"/>
+            <menuitem data-l10n-id="notification-name" value="1"/>
+            <menuitem data-l10n-id="notification-empty" value="2"/>
           </menupopup>
         </menulist>
       </hbox>
       <checkbox id="getAttention"
-#ifndef XP_MACOSX
-                label="&getAttention.label;"
-                accesskey="&getAttention.accesskey;"
-#else
-                label="&getAttentionMac.label;"
-                accesskey="&getAttentionMac.accesskey;"
-#endif
-                preference="messenger.options.getAttentionOnNewMessages"/>
+                preference="messenger.options.getAttentionOnNewMessages"
+                data-l10n-id="notification-type-label"/>
       <hbox align="center">
         <checkbox id="chatNotification"
-                  label="&chatSound.label;"
-                  accesskey="&chatSound.accesskey;"
+                  data-l10n-id="sound-label"
                   preference="mail.chat.play_sound"/>
         <spacer flex="1"/>
-        <button id="playChatSound" label="&play.label;" accesskey="&play.accesskey;"
+        <button id="playChatSound" data-l10n-id="play-button"
                 oncommand="gChatPane.previewSound();"/>
       </hbox>
       <radiogroup id="chatSoundType"
                   class="indent"
                   orient="vertical"
                   preference="mail.chat.play_sound.type"
                   aria-labelledby="chatNotification">
         <hbox>
           <radio id="chatSoundSystemSound"
-                 label="&systemSound.label;"
-                 value="0"
-                 accesskey="&systemSound.accesskey;"/>
+                 data-l10n-id="system-sound-label"
+                 value="0"/>
           <spacer flex="1"/>
         </hbox>
         <hbox>
           <radio id="chatSoundCustom"
-                 label="&customsound.label;"
-                 value="1"
-                 accesskey="&customsound.accesskey;"/>
+                 data-l10n-id="custom-sound-label"
+                 value="1"/>
           <spacer flex="1"/>
         </hbox>
         <hbox align="center" class="input-container">
           <html:input id="chatSoundUrlLocation"
                       type="text"
                       class="input-filefield indent"
                       readonly="readonly"
                       preference="mail.chat.play_sound.url"
                       preference-editable="true"
                       aria-labelledby="chatSoundCustom"/>
           <button id="browseForChatSound"
-                  label="&browse.label;"
-                  accesskey="&browse.accesskey;"
+                  data-l10n-id="browse-sound-button"
                   oncommand="gChatPane.browseForSoundFile();"/>
         </hbox>
       </radiogroup>
     </html:fieldset>
 
     <hbox id="chatPaneStylingCategory"
           class="subcategory"
           data-category="paneChat">
       <html:h1 data-l10n-id="chat-pane-styling-header"/>
     </hbox>
 
     <html:fieldset data-category="paneChat">
       <separator/>
       <hbox align="center">
-        <label value="&messageStyleTheme.label;" control="messagestyle-themename"
-               accesskey="&messageStyleTheme.accesskey;"/>
+        <label data-l10n-id="theme-label" control="messagestyle-themename"/>
         <menulist id="messagestyle-themename"
                   flex="1" crop="end"
                   preference="messenger.options.messagesStyle.theme"
                   onselect="previewObserver.currentThemeChanged();">
           <menupopup id="theme-menupopup">
             <menuitem id="mail-menuitem"
-                      label="&messageStyleThunderbirdTheme.label;"
+                      data-l10n-id="style-thunderbird"
                       value="mail"/>
             <menuitem id="bubbles-menuitem"
-                      label="&messageStyleBubblesTheme.label;"
+                      data-l10n-id="style-bubbles"
                       value="bubbles"/>
             <menuitem id="dark-menuitem"
-                      label="&messageStyleDarkTheme.label;"
+                      data-l10n-id="style-dark"
                       value="dark"/>
             <menuitem id="papersheets-menuitem"
-                      label="&messageStylePaperSheetsTheme.label;"
+                      data-l10n-id="style-paper"
                       value="papersheets"/>
             <menuitem id="simple-menuitem"
-                      label="&messageStyleSimpleTheme.label;"
+                      data-l10n-id="style-simple"
                       value="simple"/>
           </menupopup>
         </menulist>
       </hbox>
       <separator class="thin"/>
       <hbox align="start">
-      <label value="&messageStylePreview.label;"/>
+      <label data-l10n-id="preview-label"/>
       <tooltip id="aHTMLTooltip" page="true"/>
       <deck flex="1" id="previewDeck" selectedIndex="1">
         <vbox flex="1" id="noPreviewScreen" align="center" pack="center">
           <hbox id="noPreviewBox" align="start">
             <vbox id="noPreviewInnerBox" flex="1">
-              <label id="noPreviewTitle" value="&messageStyleNoPreview.title;"/>
-              <description id="noAccountDesc">&messageStyleNoPreview.description;</description>
+              <label id="noPreviewTitle" data-l10n-id="no-preview-label"/>
+              <description id="noAccountDesc"
+                           data-l10n-id="no-preview-description"/>
             </vbox>
           </hbox>
         </vbox>
       </deck>
       </hbox>
       <hbox align="center">
-        <label value="&messageStyleVariant.label;" control="themevariant"
-               accesskey="&messageStyleVariant.accesskey;"/>
+        <label data-l10n-id="chat-variant-label" control="themevariant"/>
         <menulist id="themevariant"
                   preference="messenger.options.messagesStyle.variant"
                   onselect="previewObserver.currentVariantChanged();"/>
       </hbox>
-      <checkbox id="showHeaderCheckbox" label="&messageStyleShowHeader.label;"
-                accesskey="&messageStyleShowHeader.accesskey;"
+      <checkbox id="showHeaderCheckbox" data-l10n-id="chat-header-label"
                 preference="messenger.options.messagesStyle.showHeader"/>
     </html:fieldset>
 
   </prefpane>
--- a/mail/components/preferences/chat.js
+++ b/mail/components/preferences/chat.js
@@ -24,20 +24,16 @@ Preferences.addAll([
   { id: "mail.chat.play_sound.type", type: "int" },
   { id: "mail.chat.play_sound.url", type: "string" },
   { id: "messenger.options.getAttentionOnNewMessages", type: "bool" },
   { id: "messenger.options.messagesStyle.theme", type: "string" },
   { id: "messenger.options.messagesStyle.variant", type: "string" },
   { id: "messenger.options.messagesStyle.showHeader", type: "bool" },
 ]);
 
-document.getElementById("paneChat").addEventListener("paneload", function() {
-  gChatPane.init();
-});
-
 var gChatPane = {
   init() {
     this.updateDisabledState();
     this.updateMessageDisabledState();
     this.updatePlaySound();
     this.initPreview();
 
     window.addEventListener("paneSelected", this.paneSelectionChanged);
--- a/mail/components/preferences/compose.inc.xhtml
+++ b/mail/components/preferences/compose.inc.xhtml
@@ -1,290 +1,274 @@
 # 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/.
-  <prefpane id="paneCompose" label="&paneComposition.title;">
+  <prefpane id="paneCompose">
     <script src="chrome://messenger/content/preferences/compose.js"/>
     <script src="chrome://global/content/contentAreaUtils.js"/>
     <script src="chrome://messenger/content/preferences/downloads.js"/>
     <script src="chrome://communicator/content/utilityOverlay.js"/>
 
     <stringbundle id="bundle_addressBook" src="chrome://messenger/locale/addressbook/addressBook.properties"/>
 
     <hbox id="compositionMainCategory"
           class="subcategory"
           data-category="paneCompose">
       <html:h1 data-l10n-id="composition-category-header"/>
     </hbox>
 
     <html:fieldset data-category="paneCompose">
       <separator class="thin"/>
       <hbox align="center">
-        <label value="&forwardMsg.label;" accesskey="&forwardMsg.accesskey;" control="forwardMessageMode"/>
+        <label data-l10n-id="forward-label" control="forwardMessageMode"/>
         <menulist id="forwardMessageMode" preference="mail.forward_message_mode">
           <menupopup>
-            <menuitem value="2" label="&inline.label;"/>
-            <menuitem value="0" label="&asAttachment.label;"/>
+            <menuitem value="2" data-l10n-id="inline-label"/>
+            <menuitem value="0" data-l10n-id="as-attachment-label"/>
           </menupopup>
         </menulist>
         <separator orient="vertical" class="thin"/>
-        <checkbox id="addExtension" label="&addExtension.label;" preference="mail.forward_add_extension"
-                  accesskey="&addExtension.accesskey;"/>
+        <checkbox id="addExtension" preference="mail.forward_add_extension"
+                  data-l10n-id="extension-label"/>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center" pack="start">
-        <checkbox id="autoSave" label="&autoSave.label;" preference="mail.compose.autosave"
-                  accesskey="&autoSave.accesskey;"/>
+        <checkbox id="autoSave" preference="mail.compose.autosave"
+                  data-l10n-id="auto-save-label"/>
         <html:input id="autoSaveInterval" type="number" class="size2"
                     min="1" max="35790"
                     preference="mail.compose.autosaveinterval"
                     aria-labelledby="autoSave autoSaveInterval autoSaveEnd"/>
-        <label id="autoSaveEnd" value="&autoSaveEnd.label;"/>
+        <label id="autoSaveEnd" data-l10n-id="auto-save-end"/>
       </hbox>
       <hbox>
         <checkbox id="mailWarnOnSendAccelKey"
-                  label="&warnOnSendAccelKey.label;"
-                  preference="mail.warn_on_send_accel_key"
-                  accesskey="&warnOnSendAccelKey.accesskey;"/>
+                  data-l10n-id="warn-on-send-accel-key"
+                  preference="mail.warn_on_send_accel_key"/>
         <spacer flex="1"/>
       </hbox>
     </html:fieldset>
     <html:fieldset data-category="paneCompose">
       <html:legend data-l10n-id="composition-spelling-title"></html:legend>
       <hbox>
         <checkbox id="spellCheckBeforeSend"
-                  label="&spellCheck.label;"
-                  preference="mail.SpellCheckBeforeSend"
-                  accesskey="&spellCheck.accesskey;"/>
+                  data-l10n-id="spellcheck-label"
+                  preference="mail.SpellCheckBeforeSend"/>
         <spacer flex="1"/>
       </hbox>
       <hbox>
         <checkbox id="inlineSpellCheck"
-                  label="&spellCheckInline.label;"
-                  preference="mail.spellcheck.inline"
-                  accesskey="&spellCheckInline1.accesskey;"/>
+                  data-l10n-id="spellcheck-inline-label"
+                  preference="mail.spellcheck.inline"/>
         <spacer flex="1"/>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center" pack="start">
-        <label value="&languagePopup.label;" control="languageMenuList" accesskey="&languagePopup.accessKey;"/>
+        <label data-l10n-id="language-popup-label" control="languageMenuList"/>
         <menulist id="languageMenuList" preference="spellchecker.dictionary" flex="1">
           <menupopup onpopupshowing="gComposePane.initLanguageMenu();">
             <!-- dynamic content populated by JS -->
           </menupopup>
         </menulist>
         <label id="downloadDictionaries" class="text-link"
                 onclick="if (event.button == 0) { openDictionaryList('tab'); }"
-                value="&downloadDictionaries.label;"/>
+                data-l10n-id="download-dictionaries-link"/>
         <spacer flex="1"/>
       </hbox>
     </html:fieldset>
     <html:fieldset data-category="paneCompose">
       <html:legend data-l10n-id="compose-html-style-title"></html:legend>
       <hbox>
         <vbox flex="1">
           <hbox align="center">
-            <label control="FontSelect" value="&font.label;" accesskey="&font.accesskey;"/>
+            <label control="FontSelect" data-l10n-id="font-label"/>
             <menulist id="FontSelect" preference="msgcompose.font_face"
                       sizetopopup="pref" crop="center" flex="1">
               <menupopup>
                 <menuitem value="" label="&fontVarWidth.label;"/>
                 <menuitem value="tt" label="&fontFixedWidth.label;"/>
                 <menuseparator/>
                 <menuitem value="Helvetica, Arial, sans-serif" label="&fontHelvetica.label;"/>
                 <menuitem value="Times New Roman, Times, serif" label="&fontTimes.label;"/>
                 <menuitem value="Courier New, Courier, monospace" label="&fontCourier.label;"/>
                 <menuseparator/>
               </menupopup>
             </menulist>
 
-            <label control="fontSizeSelect" value="&fontSize.label;" accesskey="&fontSize.accesskey;"/>
+            <label control="fontSizeSelect" data-l10n-id="font-size-label"/>
             <menulist id="fontSizeSelect" preference="msgcompose.font_size">
               <menupopup>
                 <menuitem value="x-small" label="&size-tinyCmd.label;"/>
                 <menuitem value="small" label="&size-smallCmd.label;"/>
                 <menuitem value="medium" label="&size-mediumCmd.label;"/>
                 <menuitem value="large" label="&size-largeCmd.label;"/>
                 <menuitem value="x-large" label="&size-extraLargeCmd.label;"/>
                 <menuitem value="xx-large" label="&size-hugeCmd.label;"/>
               </menupopup>
             </menulist>
           </hbox>
 
           <separator class="thin"/>
 
           <hbox align="center">
             <checkbox id="useReaderDefaults"
-                      label="&useReaderDefaults.label;"
-                      accesskey="&useReaderDefaults.accesskey;"
+                      data-l10n-id="default-colors-label"
                       preference="msgcompose.default_colors"/>
           </hbox>
           <hbox align="center" class="indent">
             <label id="textColorLabel"
                    control="textColorButton"
-                   value="&fontColor.label;"
-                   accesskey="&fontColor.accesskey;"/>
+                   data-l10n-id="font-color-label"/>
             <html:input type="color" id="textColorButton" preference="msgcompose.text_color"/>
             <separator orient="vertical" class="thin"/>
             <label id="backgroundColorLabel"
                    control="backgroundColorButton"
-                   value="&bgColor.label;"
-                   accesskey="&bgColor.accesskey;"/>
+                   data-l10n-id="bg-color-label"/>
             <html:input type="color" id="backgroundColorButton" preference="msgcompose.background_color"/>
           </hbox>
         </vbox>
         <vbox>
           <spacer flex="1"/>
-          <button label="&restoreHTMLDefaults.label;"
-                  accesskey="&restoreHTMLDefaults.accesskey;"
+          <button data-l10n-id="restore-html-label"
                   oncommand="gComposePane.restoreHTMLDefaults();"/>
         </vbox>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center">
         <checkbox id="defaultToParagraph"
-                  label="&defaultToParagraph.label;"
-                  accesskey="&defaultToParagraph.accesskey;"
+                  data-l10n-id="default-format-label"
                   preference="mail.compose.default_to_paragraph"/>
       </hbox>
 
       <hbox align="center">
-        <description flex="1">&sendOptionsDescription.label;</description>
-        <button label="&sendOptions.label;"
-                accesskey="&sendOptions.accesskey;"
+        <description flex="1" data-l10n-id="format-description"/>
+        <button data-l10n-id="send-options-label"
                 oncommand="gComposePane.sendOptionsDialog();"/>
       </hbox>
     </html:fieldset>
 
     <hbox id="compositionAddressingCategory"
           class="subcategory"
           data-category="paneCompose">
       <html:h1 data-l10n-id="composition-addressing-header"/>
     </hbox>
 
     <html:fieldset data-category="paneCompose">
       <!-- Address Autocomplete -->
       <separator class="thin"/>
 
-      <description>&autocompleteText.label;</description>
+      <description data-l10n-id="autocomplete-description"/>
 
       <hbox align="center">
-        <checkbox id="addressingAutocomplete" label="&addressingEnable.label;"
-                  preference="mail.enable_autocomplete"
-                  accesskey="&addressingEnable.accesskey;"/>
+        <checkbox id="addressingAutocomplete" data-l10n-id="ab-label"
+                  preference="mail.enable_autocomplete"/>
       </hbox>
 
       <hbox align="center">
-        <checkbox id="autocompleteLDAP" label="&directories.label;"
-                  preference="ldap_2.autoComplete.useDirectory"
-                  accesskey="&directories.accesskey;"/>
+        <checkbox id="autocompleteLDAP" data-l10n-id="directories-label"
+                  preference="ldap_2.autoComplete.useDirectory"/>
         <menulist is="menulist-addrbooks" id="directoriesList"
                   aria-labelledby="autocompleteLDAP"
                   preference="ldap_2.autoComplete.directoryServer"
-                  none="&directoriesNone.label;"
+                  data-l10n-id="directories-none-label"
+                  data-l10n-attrs="none"
                   remoteonly="true"
                   flex="1"/>
-        <button id="editButton" label="&editDirectories.label;"
+        <button id="editButton" data-l10n-id="edit-directories-label"
                 oncommand="gComposePane.editDirectories();"
-                preference="pref.ldap.disable_button.edit_directories"
-                accesskey="&editDirectories.accesskey;"/>
+                preference="pref.ldap.disable_button.edit_directories"/>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center" pack="start">
-        <checkbox id="emailCollectionOutgoing" label="&emailCollectionPicker.label;"
-                  accesskey="&emailCollectionPicker.accesskey;"
+        <checkbox id="emailCollectionOutgoing" data-l10n-id="email-picker-label"
                   preference="mail.collect_email_address_outgoing"/>
         <menulist is="menulist-addrbooks" id="localDirectoriesList"
                   aria-labelledby="emailCollectionOutgoing"
                   preference="mail.collect_addressbook"
                   localonly="true"
                   writable="true"
                   flex="1"/>
       </hbox>
 
       <hbox align="center" pack="start">
-        <label value="&showAsDefault.label;" accesskey="&showAsDefault.accesskey;"
+        <label data-l10n-id="default-directory-label"
                control="defaultStartupDirList"/>
         <menulist is="menulist-addrbooks" id="defaultStartupDirList"
                   oncommand="gComposePane.setDefaultStartupDir(this.value);"
-                  none="&showAsDefaultLast.label;"
+                  data-l10n-id="default-last-label"
+                  data-l10n-attrs="none"
                   alladdressbooks="true"
                   mailinglists="true"
                   flex="1"/>
       </hbox>
     </html:fieldset>
 
     <hbox id="compositionAttachmentsCategory"
           class="subcategory"
           data-category="paneCompose">
       <html:h1 data-l10n-id="composition-attachments-header"/>
     </hbox>
 
     <html:fieldset data-category="paneCompose">
       <hbox align="center">
         <checkbox id="attachment_reminder_label"
-                  label="&attachmentReminder.label;"
-                  accesskey="&attachmentReminder.accesskey;"
+                  data-l10n-id="attachment-label"
                   preference="mail.compose.attachment_reminder"/>
         <spacer flex="1"/>
         <button id="attachment_reminder_button"
-                label="&attachmentReminderOptions.label;"
-                accesskey="&attachmentReminderOptions.accesskey;"
+                data-l10n-id="attachment-options-label"
                 oncommand="gComposePane.attachmentReminderOptionsDialog();"/>
       </hbox>
       <vbox id="cloudFileBox" flex="1">
         <hbox id="cloudFileToggleAndThreshold" align="center">
           <checkbox id="enableThreshold"
-                    label="&enableCloudFileAccountOffer.label;"
+                    data-l10n-id="enable-cloud-share"
                     preference="mail.compose.big_attachments.notify"/>
           <html:input id="cloudFileThreshold" type="number" class="size3"
                       preference="mail.compose.big_attachments.threshold_kb"/>
-          <label control="cloudFileThreshold"
-                 value="&enableCloudFileAccountOffer.mb;"/>
+          <label control="cloudFileThreshold" data-l10n-id="cloud-share-size"/>
         </hbox>
         <hbox flex="1" style="height: 480px;">
           <vbox id="provider-listing">
             <richlistbox id="cloudFileView" orient="vertical" flex="1"
                          seltype="single"
                          onoverflow="gCloudFile.onListOverflow();"
                          onselect="gCloudFile.onSelectionChanged(event);">
             </richlistbox>
             <vbox id="addCloudFileAccountButtons">
             </vbox>
             <menulist id="addCloudFileAccount"
                       hidden="true"
-                      label="&addCloudFileAccount1.label;"
-                      accesskey="&addCloudFileAccount1.accesskey;"
-                      defaultlabel="&addCloudFileAccount1.label;"
+                      data-l10n-id="add-cloud-account"
+                      data-l10n-attrs="defaultlabel"
                       oncommand="gCloudFile.addCloudFileAccount(this.value);">
               <menupopup id="addCloudFileAccountListItems"/>
             </menulist>
             <button id="removeCloudFileAccount"
                     disabled="true"
-                    label="&removeCloudFileAccount.label;"
-                    accesskey="&removeCloudFileAccount.accesskey;"
+                    data-l10n-id="remove-cloud-account"
                     oncommand="gCloudFile.removeCloudFileAccount();"/>
             <label is="text-link"
                    id="moreProvidersLink"
                    href="https://addons.thunderbird.net/thunderbird/tag/filelink"
-                   value="&findCloudFileProviders.label;"/>
+                   data-l10n-id="find-cloud-providers"/>
           </vbox>
           <separator class="thin" orient="vertical"/>
           <vbox flex="1">
             <deck id="cloudFileSettingsDeck" flex="1">
               <vbox id="cloudFileDefaultPanel" flex="1">
-                <description>&addCloudFileAccount.description;</description>
+                <description data-l10n-id="cloud-account-description"/>
               </vbox>
               <vbox id="cloudFileSettingsWrapper" flex="1">
               </vbox>
             </deck>
           </vbox>
         </hbox>
       </vbox>
     </html:fieldset>
--- a/mail/components/preferences/compose.js
+++ b/mail/components/preferences/compose.js
@@ -39,20 +39,16 @@ Preferences.addAll([
   { id: "msgcompose.text_color", type: "string" },
   { id: "msgcompose.background_color", type: "string" },
   { id: "mail.compose.attachment_reminder", type: "bool" },
   { id: "mail.compose.default_to_paragraph", type: "bool" },
   { id: "mail.compose.big_attachments.notify", type: "bool" },
   { id: "mail.compose.big_attachments.threshold_kb", type: "int" },
 ]);
 
-document.getElementById("paneCompose").addEventListener("paneload", function() {
-  gComposePane.init();
-});
-
 var gComposePane = {
   mSpellChecker: null,
   mDictCount: 0,
 
   init() {
     this.enableAutocomplete();
 
     this.initLanguageMenu();
--- a/mail/components/preferences/downloads.js
+++ b/mail/components/preferences/downloads.js
@@ -122,15 +122,8 @@ var gDownloadDirSection = {
     return undefined;
   },
 };
 
 Preferences.get("browser.download.dir").on(
   "change",
   gDownloadDirSection.readDownloadDirPref.bind(gDownloadDirSection)
 );
-
-document.getElementById("paneCompose").addEventListener("paneload", () => {
-  Preferences.addSyncFromPrefListener(
-    document.getElementById("saveWhere"),
-    () => gDownloadDirSection.onReadUseDownloadDir()
-  );
-});
--- a/mail/components/preferences/general.inc.xhtml
+++ b/mail/components/preferences/general.inc.xhtml
@@ -1,133 +1,132 @@
 # 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/.
-  <prefpane id="paneGeneral" label="&paneGeneral.title;">
+  <prefpane id="paneGeneral">
     <script src="chrome://communicator/content/utilityOverlay.js"/>
     <script src="chrome://messenger/content/preferences/general.js"/>
     <script src="chrome://mozapps/content/preferences/fontbuilder.js"/>
 
     <commandset id="appPaneCommandSet">
       <command id="cmd_delete"
                oncommand="gGeneralPane.onDelete();"/>
     </commandset>
 
     <keyset id="appPaneKeyset">
       <key keycode="VK_BACK" modifiers="any" command="cmd_delete"/>
       <key keycode="VK_DELETE" modifiers="any" command="cmd_delete"/>
     </keyset>
 
     <keyset>
-      <key key="&focusSearch1.key;" modifiers="accel"
+      <key data-l10n-id="focus-search-shortcut" modifiers="accel"
            oncommand="gGeneralPane.focusFilterBox();"/>
-      <key key="&focusSearch2.key;" modifiers="accel"
+      <key data-l10n-id="focus-search-shortcut-alt" modifiers="accel"
            oncommand="gGeneralPane.focusFilterBox();"/>
     </keyset>
 
+    <linkset>
+      <html:link rel="localization" href="branding/brand.ftl"/>
+      <html:link rel="localization" href="messenger/preferences/preferences.ftl"/>
+    </linkset>
+
     <stringbundle id="bundlePreferences" src="chrome://messenger/locale/preferences/preferences.properties"/>
 #ifdef HAVE_SHELL_SERVICE
     <stringbundle id="bundleBrand" src="chrome://branding/locale/brand.properties"/>
 #endif
 
     <hbox id="generalCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="pane-general-title"/>
     </hbox>
 
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&messengerStartPage.label;</html:legend>
+      <html:legend data-l10n-id="general-legend"></html:legend>
       <vbox>
         <hbox align="start">
-          <checkbox id="mailnewsStartPageEnabled" label="&enableStartPage.label;"
+          <checkbox id="mailnewsStartPageEnabled"
                     preference="mailnews.start_page.enabled"
-                    accesskey="&enableStartPage.accesskey;"/>
+                    data-l10n-id="start-page-label"/>
         </hbox>
         <hbox align="center" class="input-container">
-          <label value="&location.label;" accesskey="&location1.accesskey;" control="mailnewsStartPageUrl"/>
+          <label data-l10n-id="location-label" control="mailnewsStartPageUrl"/>
           <html:input id="mailnewsStartPageUrl"
                       type="text"
                       preference="mailnews.start_page.url"/>
           <button id="browseForStartPageUrl"
-                  label="&useDefault.label;"
-                  accesskey="&useDefault.accesskey;"
+                  data-l10n-id="restore-default-label"
                   oncommand="gGeneralPane.restoreDefaultStartPage();">
           </button>
         </hbox>
       </vbox>
     </html:fieldset>
 
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&defaultSearchEngine.label;</html:legend>
+      <html:legend data-l10n-id="default-search-engine"></html:legend>
       <hbox align="center">
         <menulist id="defaultWebSearch">
           <menupopup id="defaultWebSearchPopup"/>
         </menulist>
         <button id="addSearchEngine"
-                label="&addSearchEngine.label;"
-                accesskey="&addSearchEngine.accesskey;"
+                data-l10n-id="add-search-engine"
                 oncommand="gGeneralPane.addSearchEngine();"/>
         <button id="removeSearchEngine"
-                label="&removeSearchEngine.label;"
-                accesskey="&removeSearchEngine.accesskey;"
+                data-l10n-id="remove-search-engine"
                 oncommand="gGeneralPane.removeSearchEngine();"/>
       </hbox>
     </html:fieldset>
 
 #ifdef HAVE_SHELL_SERVICE
     <html:fieldset id="systemDefaultsGroup" data-category="paneGeneral">
-      <html:legend>&systemIntegration.label;</html:legend>
+      <html:legend data-l10n-id="system-integration-legend"></html:legend>
       <vbox>
       <hbox id="checkDefaultBox" align="center">
         <checkbox id="alwaysCheckDefault"
                   preference="mail.shell.checkDefaultClient"
-                  label="&alwaysCheckDefault.label;"
-                  accesskey="&alwaysCheckDefault.accesskey;"/>
+                  data-l10n-id="always-check-default"/>
         <spacer flex="1"/>
-        <button id="checkDefaultButton" label="&checkDefaultsNow.label;"
-                accesskey="&checkDefaultsNow.accesskey;"
+        <button id="checkDefaultButton"
+                data-l10n-id="check-default-button"
                 oncommand="gGeneralPane.checkDefaultNow();"
                 preference="pref.general.disable_button.default_mail"/>
       </hbox>
 #ifdef XP_WIN
       <hbox align="start">
-        <checkbox label="&minimizeToTray.label;"
-                  accesskey="&minimizeToTray.accesskey;"
+        <checkbox data-l10n-id="minimize-to-tray-label"
                   preference="mail.minimizeToTray"/>
       </hbox>
 #endif
       <hbox id="searchIntegrationContainer">
         <checkbox id="searchIntegration"
                   preference="searchintegration.enable"
-                  label="&searchIntegration.label;"
-                  accesskey="&searchIntegration.accesskey;"/>
+                  data-l10n-id="search-integration-label"/>
       </hbox>
       </vbox>
     </html:fieldset>
 #endif
 
     <hbox id="languageAndAppearanceCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-language-and-appearance-header"/>
     </hbox>
 
     <!-- Fonts and Colors -->
     <html:fieldset id="fontsGroup" data-category="paneGeneral">
-      <html:legend>&fontsAndColors1.label;</html:legend>
+      <html:legend data-l10n-id="fonts-legend"></html:legend>
 
       <hbox id="fontSettings" flex="1">
         <vbox id="fontRow" flex="1">
           <hbox align="center">
-            <label accesskey="&defaultFont.accesskey;" control="defaultFont">&defaultFont.label;</label>
+            <label data-l10n-id="default-font-label" control="defaultFont"/>
             <menulist id="defaultFont" flex="1" sizetopopup="pref" crop="center">
               <menupopup crop="center"/>
             </menulist>
-            <label accesskey="&defaultSize.accesskey;" control="defaultFontSize">&defaultSize.label;</label>
+            <label data-l10n-id="default-size-label" control="defaultFontSize"/>
             <menulist id="defaultFontSize" flex="1">
               <menupopup crop="center">
                 <menuitem value="9" label="9"/>
                 <menuitem value="10" label="10"/>
                 <menuitem value="11" label="11"/>
                 <menuitem value="12" label="12"/>
                 <menuitem value="13" label="13"/>
                 <menuitem value="14" label="14"/>
@@ -150,76 +149,79 @@
                 <menuitem value="56" label="56"/>
                 <menuitem value="64" label="64"/>
                 <menuitem value="72" label="72"/>
               </menupopup>
             </menulist>
           </hbox>
         </vbox>
         <vbox id="colorsRow">
-          <button id="advancedFonts" flex="1" label="&fontOptions.label;"
-                  accesskey="&fontOptions.accesskey;" oncommand="gGeneralPane.configureFonts();"/>
-          <button id="colors" flex="1" label="&colorButton.label;"
-                  accesskey="&colorButton.accesskey;" oncommand="gGeneralPane.configureColors();"/>
+          <button id="advancedFonts"
+                  data-l10n-id="font-options-button"
+                  oncommand="gGeneralPane.configureFonts();"
+                  flex="1"/>
+          <button id="colors"
+                  data-l10n-id="color-options-button"
+                  oncommand="gGeneralPane.configureColors();"
+                  flex="1"/>
         </vbox>
       </hbox>
       <hbox>
-        <html:legend>&displayWidth.label;</html:legend>
+        <html:legend data-l10n-id="display-width-legend"></html:legend>
       </hbox>
       <hbox>
         <checkbox id="displayGlyph"
-                  label="&convertEmoticons.label;"
                   preference="mail.display_glyph"
-                  accesskey="&convertEmoticons.accesskey;"/>
+                  data-l10n-id="convert-emoticons-label"/>
         <spacer flex="1"/>
       </hbox>
 
       <separator class="thin"/>
 
-      <label control="displayText">&displayText.label;</label>
+      <label control="displayText" data-l10n-id="display-text-label"/>
       <hbox id="displayText" class="indent" align="center" role="group">
-        <label value="&style.label;" accesskey="&style.accesskey;" control="mailQuotedStyle"/>
+        <label data-l10n-id="style-label" control="mailQuotedStyle"/>
         <menulist id="mailQuotedStyle" preference="mail.quoted_style">
           <menupopup>
-            <menuitem value="0" label="&regularStyle.label;"/>
-            <menuitem value="1" label="&bold.label;"/>
-            <menuitem value="2" label="&italic.label;"/>
-            <menuitem value="3" label="&boldItalic.label;"/>
+            <menuitem value="0" data-l10n-id="regular-style-item"/>
+            <menuitem value="1" data-l10n-id="bold-style-item"/>
+            <menuitem value="2" data-l10n-id="italic-style-item"/>
+            <menuitem value="3" data-l10n-id="bold-italic-style-item"/>
           </menupopup>
         </menulist>
-        <label value="&size.label;" accesskey="&size.accesskey;" control="mailQuotedSize"/>
+        <label data-l10n-id="size-label" control="mailQuotedSize"/>
         <menulist id="mailQuotedSize" preference="mail.quoted_size">
           <menupopup>
-            <menuitem value="0" label="&regularSize.label;"/>
-            <menuitem value="1" label="&bigger.label;"/>
-            <menuitem value="2" label="&smaller.label;"/>
+            <menuitem value="0" data-l10n-id="regular-size-item"/>
+            <menuitem value="1" data-l10n-id="bigger-size-item"/>
+            <menuitem value="2" data-l10n-id="smaller-size-item"/>
           </menupopup>
         </menulist>
-        <label value="&quotedTextColor.label;" accesskey="&quotedTextColor.accesskey;" control="citationmenu"/>
+        <label data-l10n-id="quoted-text-color" control="citationmenu"/>
         <html:input type="color" id="citationmenu" preference="mail.citation_color"/>
       </hbox>
     </html:fieldset>
 
     <!-- Date and time formatting -->
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&dateTimeFormatting.label;</html:legend>
+      <html:legend data-l10n-id="datetime-formatting-legend"></html:legend>
       <radiogroup id="formatLocale" align="start"
                   preference="intl.regional_prefs.use_os_locales"
                   orient="vertical">
         <radio id="appLocale"
                value="false"/>
                <!-- label and accesskey will be set dynamically -->
         <radio id="rsLocale"
                value="true"/>
                <!-- label and accesskey will be set dynamically -->
       </radiogroup>
     </html:fieldset>
 
     <html:fieldset id="messengerLanguagesBox" data-category="paneGeneral" hidden="hidden">
-      <html:legend>&languageSelector.label;</html:legend>
+      <html:legend data-l10n-id="language-selector-legend"></html:legend>
         <vbox align="start">
         <description flex="1"
                      controls="chooseMessengerLanguage"
                      data-l10n-id="choose-messenger-language-description"/>
         <hbox>
           <menulist id="defaultMessengerLanguage"
                     oncommand="gGeneralPane.onMessengerLanguageChange(event)">
             <menupopup/>
@@ -236,210 +238,198 @@
             hidden="true">
         <image class="message-bar-icon"/>
         <vbox class="message-bar-content-container" align="stretch" flex="1"/>
       </hbox>
     </html:fieldset>
 
     <!-- Scrolling -->
     <html:fieldset id="scrollingGroup" data-category="paneGeneral">
-      <html:legend>&scrolling.label;</html:legend>
+      <html:legend data-l10n-id="scrolling-legend"></html:legend>
       <hbox>
         <checkbox id="useAutoScroll"
-                  label="&useAutoScroll.label;"
-                  accesskey="&useAutoScroll.accesskey;"
+                  data-l10n-id="autoscroll-label"
                   preference="general.autoScroll"/>
         <spacer flex="1"/>
       </hbox>
       <hbox>
         <checkbox id="useSmoothScrolling"
-                  label="&useSmoothScrolling.label;"
-                  accesskey="&useSmoothScrolling.accesskey;"
+                  data-l10n-id="smooth-scrolling-label"
                   preference="general.smoothScroll"/>
         <spacer flex="1"/>
       </hbox>
     </html:fieldset>
 
 
     <hbox id="incomingMailCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-incoming-mail-header"/>
     </hbox>
 
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&newMessagesArrive.label;</html:legend>
+      <html:legend data-l10n-id="new-message-arrival"></html:legend>
 #ifdef XP_MACOSX
       <hbox align="center">
-        <description flex="1">&changeDockIconOptions.label;</description>
-        <button id="dockOptions" label="&dockOptions.label;"
-                accesskey="&dockOptions.accesskey;"
-                oncommand="gGeneralPane.configureDockOptions();"/>
+        <description flex="1" data-l10n-id="change-dock-icon"/>
+        <button id="dockOptions"
+                oncommand="gGeneralPane.configureDockOptions();"
+                data-l10n-id="app-icon-options"/>
       </hbox>
-      <description class="bold">&notificationAlertSettings2.label;</description>
+      <description class="bold" data-l10n-id="notification-settings"/>
 #else
       <hbox align="center">
         <checkbox id="newMailNotificationAlert"
-                  label="&showAnimatedAlert.label;"
-                  accesskey="&showAnimatedAlert.accesskey;"
+                  data-l10n-id="animated-alert-label"
                   preference="mail.biff.show_alert"/>
         <spacer flex="1"/>
-        <button id="customizeMailAlert" label="&customizeMailAlert.label;" accesskey="&customizeMailAlert.accesskey;"
-                oncommand="gGeneralPane.customizeMailAlert();"/>
+        <button id="customizeMailAlert"
+                oncommand="gGeneralPane.customizeMailAlert();"
+                data-l10n-id="customize-alert-label"/>
       </hbox>
       <hbox>
-        <checkbox id="newMailNotificationTrayIcon" label="&showTrayIcon.label;"
+        <checkbox id="newMailNotificationTrayIcon"
 #ifndef XP_WIN
                   hidden="true"
 #endif
                   preference="mail.biff.show_tray_icon"
-                  accesskey="&showTrayIcon.accesskey;"/>
+                  data-l10n-id="tray-icon-label"/>
       </hbox>
 #endif
 
       <hbox align="center">
 #ifndef XP_MACOSX
-        <checkbox id="newMailNotification" accesskey="&playSound1.accesskey;"
-                  preference="mail.biff.play_sound" label="&playSound.label;"
-#else
-        <checkbox id="newMailNotification" accesskey="&playSoundMac.accesskey;"
-                  preference="mail.biff.play_sound" label="&playSoundMac.label;"
-#endif
+        <checkbox id="newMailNotification"
+                  preference="mail.biff.play_sound"
+                  data-l10n-id="play-sound-label"
                   oncommand="gGeneralPane.updatePlaySound();"/>
         <spacer flex="1"/>
-        <button id="playSound" label="&play.label;" accesskey="&play.accesskey;" oncommand="gGeneralPane.previewSound();"/>
+        <button id="playSound"
+                data-l10n-id="play-button"
+                oncommand="gGeneralPane.previewSound();"/>
       </hbox>
 
 #ifndef XP_MACOSX
       <radiogroup id="soundType"
                   class="indent"
                   preference="mail.biff.play_sound.type"
                   orient="vertical"
                   oncommand="gGeneralPane.updatePlaySound();"
                   aria-labelledby="newMailNotification">
         <hbox>
           <radio id="system"
                  value="0"
-                 label="&systemsound.label;"
-                 accesskey="&systemsound.accesskey;"/>
+                 data-l10n-id="system-sound-label"/>
           <spacer flex="1"/>
         </hbox>
         <hbox>
           <radio id="custom"
                  value="1"
-                 label="&customsound.label;"
-                 accesskey="&customsound.accesskey;"/>
+                 data-l10n-id="custom-sound-label"/>
           <spacer flex="1"/>
         </hbox>
       </radiogroup>
 #endif
       <hbox align="center" class="input-container">
         <html:input id="soundUrlLocation"
                     type="text"
                     class="input-filefield indent"
                     readonly="readonly"
                     preference="mail.biff.play_sound.url"
                     preference-editable="true"
                     aria-labelledby="custom"/>
         <button id="browseForSound"
-                label="&browse.label;"
-                accesskey="&browse.accesskey;"
+                data-l10n-id="browse-sound-label"
                 oncommand="gGeneralPane.browseForSoundFile();"/>
       </hbox>
     </html:fieldset>
 
     <hbox id="filesAttachmentCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-files-and-attachment-header"/>
     </hbox>
 
     <html:fieldset data-category="paneGeneral">
       <hbox>
         <search-textbox id="filter"
                         flex="1"
-                        placeholder="&filter.placeholder;"
+                        data-l10n-id="search-input"
+                        data-l10n-attrs="placeholder"
                         aria-controls="handlersView"
                         oncommand="gGeneralPane._rebuildView();"/>
       </hbox>
 
       <separator class="thin"/>
 
       <vbox>
         <listheader equalsize="always">
-          <treecol id="typeColumn" label="&typeColumn.label;" value="type"
-                   accesskey="&typeColumn.accesskey;" persist="sortDirection"
+          <treecol id="typeColumn" value="type"
+                   persist="sortDirection"
+                   data-l10n-id="type-column-label"
                    flex="1" onclick="gGeneralPane.sort(event);"
                    sortDirection="ascending" sort="typeDescription"/>
-          <treecol id="actionColumn" label="&actionColumn2.label;" value="action"
-                   accesskey="&actionColumn2.accesskey;" persist="sortDirection"
+          <treecol id="actionColumn" value="action"
+                   persist="sortDirection"
+                   data-l10n-id="action-column-label"
                    flex="1" onclick="gGeneralPane.sort(event);"/>
         </listheader>
         <richlistbox id="handlersView" height="180px"
                      preference="pref.downloads.disable_button.edit_actions"/>
       </vbox>
 
       <separator class="thin"/>
 
       <vbox align="start">
         <radiogroup id="saveWhere" flex="1"
                     preference="browser.download.useDownloadDir">
           <hbox id="saveToRow" align="center" class="input-container">
             <radio id="saveTo" value="true"
-                   label="&saveTo.label;"
-                   accesskey="&saveTo.accesskey;"
+                   data-l10n-id="save-to-label"
                    aria-labelledby="saveTo downloadFolder"/>
             <html:input id="downloadFolder"
                         class="input-filefield"
                         type="text"
                         readonly="readonly"
                         aria-labelledby="saveTo"/>
-            <button id="chooseFolder" oncommand="gDownloadDirSection.chooseFolder();"
-#ifdef XP_MACOSX
-                    accesskey="&chooseFolderMac.accesskey;"
-                    label="&chooseFolderMac.label;"/>
-#else
-                    accesskey="&chooseFolderWin.accesskey;"
-                    label="&chooseFolderWin.label;"/>
-#endif
+            <button id="chooseFolder"
+                    oncommand="gDownloadDirSection.chooseFolder();"
+                    data-l10n-id="choose-folder-label"/>
           </hbox>
           <hbox>
             <radio id="alwaysAsk"
                    value="false"
-                   label="&alwaysAsk.label;"
-                   accesskey="&alwaysAsk.accesskey;"/>
+                   data-l10n-id="always-ask-label"/>
           </hbox>
         </radiogroup>
       </vbox>
     </html:fieldset>
 
     <hbox id="tagsCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-tags-header"/>
     </hbox>
 
     <html:fieldset data-category="paneGeneral">
-      <label control="tagList">&displayTagsText.label;</label>
+      <label control="tagList" data-l10n-id="display-tags-text"/>
       <hbox>
         <richlistbox id="tagList"
                      flex="1"
                      height="180px"
                      ondblclick="gGeneralPane.editTag();"
                      onselect="gGeneralPane.onSelectTag();"/>
         <vbox id="tagButtons">
-          <button label="&newTagButton.label;" accesskey="&newTagButton.accesskey;"
+          <button data-l10n-id="new-tag-button"
                   oncommand="gGeneralPane.addTag();"/>
           <button id="editTagButton" disabled="true"
-                  label="&editTagButton1.label;"
-                  accesskey="&editTagButton1.accesskey;"
+                  data-l10n-id="edit-tag-button"
                   oncommand="gGeneralPane.editTag();"/>
           <button id="removeTagButton" disabled="true"
-                  label="&removeTagButton.label;"
-                  accesskey="&removeTagButton.accesskey;"
+                  data-l10n-id="delete-tag-button"
                   oncommand="gGeneralPane.removeTag();"/>
         </vbox>
       </hbox>
     </html:fieldset>
 
 
     <hbox id="readingAndDisplayCategory"
           class="subcategory"
@@ -447,116 +437,106 @@
       <html:h1 data-l10n-id="general-reading-and-display-header"/>
     </hbox>
 
     <html:fieldset data-category="paneGeneral">
       <vbox>
         <hbox>
           <checkbox id="automaticallyMarkAsRead"
                     preference="mailnews.mark_message_read.auto"
-                    label="&autoMarkAsRead.label;"
-                    accesskey="&autoMarkAsRead.accesskey;"/>
+                    data-l10n-id="auto-mark-as-read"/>
         </hbox>
 
         <radiogroup id="markAsReadAutoPreferences" orient="vertical"
                     class="indent"
                     align="start"
                     preference="mailnews.mark_message_read.delay">
           <radio id="mark_read_immediately"
-                 label="&markAsReadNoDelay.label;"
-                 value="false"
-                 accesskey="&markAsReadNoDelay.accesskey;"/>
+                 data-l10n-id="mark-read-no-delay"
+                 value="false"/>
           <hbox align="center">
             <radio id="markAsReadAfterDelay" value="true"
-                   label="&markAsReadDelay.label;"
-                   accesskey="&markAsReadDelay.accesskey;"/>
+                   data-l10n-id="mark-read-delay"/>
             <html:input id="markAsReadDelay" type="number" class="size3"
                         min="1" max="2147483"
                         preference="mailnews.mark_message_read.delay.interval"
                         aria-labelledby="markAsReadAfterDelay markAsReadDelay secondsLabel"/>
-            <label id="secondsLabel" value="&secondsLabel.label;"/>
+            <label id="secondsLabel" data-l10n-id="seconds-label"/>
           </hbox>
         </radiogroup>
       </vbox>
 
       <separator/>
 
       <vbox>
         <hbox>
-          <label value="&openMsgIn.label;"
+          <label data-l10n-id="open-msg-label"
                  control="mailOpenMessageBehavior"/>
         </hbox>
         <hbox>
           <radiogroup id="mailOpenMessageBehavior" class="indent"
                       preference="mail.openMessageBehavior"
                       orient="horizontal">
-            <radio id="newTab" value="2" label="&openMsgInNewTab.label;"
-                   accesskey="&openMsgInNewTab.accesskey;"/>
-            <radio id="newWindow" value="0" label="&reuseExpRadio0.label;"
-                   accesskey="&reuseExpRadio0.accesskey;"/>
+            <radio id="newTab" value="2" data-l10n-id="open-msg-tab"/>
+            <radio id="newWindow" value="0" data-l10n-id="open-msg-window"/>
             <radio id="existingWindow" value="1"
-                   label="&reuseExpRadio1.label;"
-                   accesskey="&reuseExpRadio1.accesskey;"/>
+                   data-l10n-id="open-msg-ex-window"/>
           </radiogroup>
         </hbox>
         <hbox>
           <checkbox id="closeMsgOnMoveOrDelete"
-                    label="&closeMsgOnMoveOrDelete.label;"
-                    accesskey="&closeMsgOnMoveOrDelete.accesskey;"
+                    data-l10n-id="close-move-delete"
                     preference="mail.close_message_window.on_delete"/>
         </hbox>
       </vbox>
 
       <separator/>
 
       <hbox>
-        <label value="&displayName.label;"/>
+        <label data-l10n-id="display-name-label"/>
         </hbox>
         <hbox>
         <checkbox id="showCondensedAddresses"
-                  label="&showCondensedAddresses.label;"
-                  accesskey="&showCondensedAddresses.accesskey;"
+                  data-l10n-id="condensed-addresses-label"
                   preference="mail.showCondensedAddresses"/>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center">
-        <description flex="1">&returnReceiptsInfo.label;</description>
+        <description flex="1" data-l10n-id="return-receipts-description"/>
         <button id="showReturnReceipts"
-                label="&showReturnReceipts.label;"
-                accesskey="&showReturnReceipts.accesskey;"
+                data-l10n-id="return-receipts-button"
                 oncommand="gGeneralPane.showReturnReceipts();"/>
       </hbox>
     </html:fieldset>
 
 #ifdef MOZ_UPDATER
     <hbox id="updatesCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-updates-header"/>
     </hbox>
 
     <!-- Update -->
     <html:fieldset id="updateApp" data-category="paneGeneral">
-      <html:legend>&updateApp2.label;</html:legend>
+      <html:legend data-l10n-id="update-app-legend"></html:legend>
       <hbox align="center">
         <vbox>
           <description>
             &updateApp.version.pre;<label id="version"/>&updateApp.version.post;
             <label is="text-link" id="releasenotes" hidden="true">&releaseNotes.link;</label>
           </description>
           <description id="distribution" class="text-blurb" hidden="true"/>
           <description id="distributionId" class="text-blurb" hidden="true"/>
         </vbox>
         <spacer flex="1"/>
         <vbox>
           <button id="showUpdateHistory"
-                  label="&updateHistory.label;"
-                  accesskey="&updateHistory.accesskey;"
+                  data-l10n-id="update-history-button"
                   preference="app.update.disable_button.showUpdateHistory"
                   oncommand="gGeneralPane.showUpdates();"/>
         </vbox>
       </hbox>
       <vbox id="updateBox">
         <deck id="updateDeck" orient="vertical">
           <hbox id="checkForUpdates" align="center">
             <spacer flex="1"/>
@@ -630,147 +610,142 @@
             <label>&update.unsupported.end;</label>
           </hbox>
           <hbox id="restarting" align="center">
             <image class="update-throbber"/><label>&update.restarting;</label>
           </hbox>
         </deck>
       </vbox>
       <separator/>
-      <description id="updateAllowDescription">&updateAppAllow.description;</description>
+      <description id="updateAllowDescription" data-l10n-id="allow-description"/>
       <vbox id="updateSettingsContainer">
         <radiogroup id="updateRadioGroup"
                     align="start">
           <radio id="autoDesktop"
                  value="true"
-                 label="&updateAuto.label;"
-                 accesskey="&updateAuto.accesskey;"/>
+                 data-l10n-id="automatic-updates-label"/>
           <radio id="manualDesktop"
                  value="false"
-                 label="&updateCheck.label;"
-                 accesskey="&updateCheck.accesskey;"/>
+                 data-l10n-id="check-updates-label"/>
         </radiogroup>
-        <description id="updateSettingCrossUserWarning" hidden="true">
-          &updateCrossUserSettingWarning.description;
-        </description>
+        <description id="updateSettingCrossUserWarning"
+                     data-l10n-id="cross-user-udpate-warning"
+                     hidden="true"/>
       </vbox>
 
 #ifdef MOZ_MAINTENANCE_SERVICE
       <separator class="thin"/>
       <checkbox id="useService"
-                label="&useService.label;"
-                accesskey="&useService.accesskey;"
+                data-l10n-id="use-service"
                 preference="app.update.service.enabled"/>
 #endif
     </html:fieldset>
 #endif
 
     <hbox id="networkAndDiskspaceCategory"
           class="subcategory"
           data-category="paneGeneral">
       <html:h1 data-l10n-id="general-network-and-diskspace-header"/>
     </hbox>
 
     <!-- Networking & Disk Space -->
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&connectionsInfo.caption;</html:legend>
+      <html:legend data-l10n-id="networking-legend"></html:legend>
       <hbox align="center">
-        <description flex="1" control="catProxiesButton">&proxiesConfigure.label;</description>
-        <button id="catProxiesButton" label="&showSettings.label;"
-                accesskey="&showSettings.accesskey;"
+        <description control="catProxiesButton"
+                     data-l10n-id="proxy-config-description"
+                     flex="1"/>
+        <button id="catProxiesButton"
+                data-l10n-id="network-settings-button"
                 oncommand="gGeneralPane.showConnections();"/>
       </hbox>
     </html:fieldset>
 
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&offlineInfo.caption;</html:legend>
+      <html:legend data-l10n-id="offline-legend"></html:legend>
       <hbox align="center">
-        <description flex="1" control="offlineSettingsButton">&offlineInfo.label;</description>
-        <button id="offlineSettingsButton" label="&showOffline.label;"
-                accesskey="&showOffline.accesskey;"
+        <description data-l10n-id="offline-settings"
+                     control="offlineSettingsButton"
+                     flex="1"/>
+        <button id="offlineSettingsButton"
+                data-l10n-id="offline-settings-button"
                 oncommand="gGeneralPane.showOffline();"/>
       </hbox>
     </html:fieldset>
 
     <html:fieldset data-category="paneGeneral">
-      <html:legend>&Diskspace;</html:legend>
+      <html:legend data-l10n-id="diskspace-legend"></html:legend>
       <hbox align="center">
         <label id="actualDiskCacheSize" flex="1"/>
         <button id="clearCacheButton"
-                label="&clearCacheNow.label;" accesskey="&clearCacheNow.accesskey;"
+                data-l10n-id="clear-cache-button"
                 oncommand="gGeneralPane.clearCache();"/>
       </hbox>
       <hbox>
         <checkbox preference="browser.cache.disk.smart_size.enabled"
                   id="allowSmartSize"
-                  label="&overrideSmartCacheSize.label;"
-                  accesskey="&overrideSmartCacheSize.accesskey;"/>
+                  data-l10n-id="smart-cache-label"/>
       </hbox>
       <hbox align="center" class="indent">
         <label id="useCacheBefore" control="cacheSize"
-               accesskey="&useCacheBefore.accesskey;" value="&useCacheBefore.label;"/>
+               data-l10n-id="use-cache-before"/>
         <html:input id="cacheSize" type="number" class="size4" max="1024"
                     preference="browser.cache.disk.capacity"
                     aria-labelledby="useCacheBefore cacheSize useCacheAfter"/>
-        <label id="useCacheAfter" flex="1">&useCacheAfter.label;</label>
+        <label id="useCacheAfter" data-l10n-id="use-cache-after" flex="1"/>
       </hbox>
       <hbox align="center">
           <checkbox id="offlineCompactFolder"
-                    label="&offlineCompactFolders.label;"
-                    accesskey="&offlineCompactFolders.accesskey;"
+                    data-l10n-id="offline-compact-folder"
                     aria-labelledby="offlineCompactFolder offlineCompactFolderMin compactFolderMB"
                     preference="mail.prompt_purge_threshhold"
                     oncommand="gGeneralPane.updateCompactOptions(this.checked);"/>
           <html:input id="offlineCompactFolderMin" type="number" class="size4"
                       min="1" max="2048" value="200"
                       preference="mail.purge_threshhold_mb"
                       aria-labelledby="offlineCompactFolder offlineCompactFolderMin compactFolderMB"/>
-          <label id="compactFolderMB" value="&offlineCompactFoldersMB.label;"/>
+          <label id="compactFolderMB" data-l10n-id="compact-folder-size" value=""/>
       </hbox>
     </html:fieldset>
 
     <html:fieldset data-category="paneGeneral">
       <html:legend data-l10n-id="general-indexing-label"></html:legend>
       <vbox>
         <hbox>
           <checkbox id="enableGloda"
                     preference="mailnews.database.global.indexer.enabled"
-                    label="&enableGlodaSearch.label;"
-                    accesskey="&enableGlodaSearch.accesskey;"/>
+                    data-l10n-id="enable-gloda-search-label"/>
         </hbox>
         <hbox align="center">
-          <label value="&storeType.label;"
-                 accesskey="&storeType.accesskey;"
-                 control="storeTypeMenulist"/>
+          <label control="storeTypeMenulist" data-l10n-id="store-type-label"/>
           <menulist id="storeTypeMenulist"
                     oncommand="gGeneralPane.updateDefaultStore(this.selectedItem.value)">
             <menupopup id="storeTypeMenupopup">
               <menuitem id="mboxStore"
-                        label="&mboxStore2.label;"
+                        data-l10n-id="mbox-store-label"
                         value="@mozilla.org/msgstore/berkeleystore;1"/>
               <menuitem id="maildirStore"
-                        label="&maildirStore.label;"
+                        data-l10n-id="maildir-store-label"
                         value="@mozilla.org/msgstore/maildirstore;1"/>
             </menupopup>
           </menulist>
         </hbox>
         <hbox>
           <checkbox id="allowHWAccel"
-                    label="&allowHWAccel.label;"
-                    accesskey="&allowHWAccel.accesskey;"
-                    preference="layers.acceleration.disabled"/>
+                    preference="layers.acceleration.disabled"
+                    data-l10n-id="allow-hw-accel"/>
         </hbox>
       </vbox>
       <vbox>
       </vbox>
     </html:fieldset>
 
     <separator class="thin" data-category="paneGeneral"/>
 
     <html:fieldset data-category="paneGeneral">
       <hbox pack="end">
-        <button id="configEditor" label="&configEdit.label;"
-                accesskey="&configEdit.accesskey;"
+        <button id="configEditor"
+                data-l10n-id="config-editor-button"
                 oncommand="gGeneralPane.showConfigEdit();"/>
       </hbox>
     </html:fieldset>
 
   </prefpane>
--- a/mail/components/preferences/general.js
+++ b/mail/components/preferences/general.js
@@ -115,24 +115,16 @@ if (AppConstants.MOZ_UPDATER) {
     id: "app.update.disable_button.showUpdateHistory",
     type: "bool",
   });
   if (AppConstants.MOZ_MAINTENANCE_SERVICE) {
     Preferences.add({ id: "app.update.service.enabled", type: "bool" });
   }
 }
 
-if (document.getElementById("paneGeneral")) {
-  document
-    .getElementById("paneGeneral")
-    .addEventListener("paneload", function() {
-      gGeneralPane.init();
-    });
-}
-
 var gGeneralPane = {
   // The set of types the app knows how to handle.  A hash of HandlerInfoWrapper
   // objects, indexed by type.
   _handledTypes: {},
 
   // The list of types we can show, sorted by the sort column/direction.
   // An array of HandlerInfoWrapper objects.  We build this list when we first
   // load the data and then rebuild it when users change a pref that affects
--- a/mail/components/preferences/jar.mn
+++ b/mail/components/preferences/jar.mn
@@ -1,14 +1,14 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 messenger.jar:
-*   content/messenger/preferences/aboutPreferences.xhtml
+*   content/messenger/preferences/preferences.xhtml
     content/messenger/preferences/preferences.js
     content/messenger/preferences/preferencesTab.js
     content/messenger/preferences/general.js
 #ifdef XP_MACOSX
     content/messenger/preferences/dockoptions.js
     content/messenger/preferences/dockoptions.xhtml
 #endif
     content/messenger/preferences/chat.js
--- a/mail/components/preferences/preferences.js
+++ b/mail/components/preferences/preferences.js
@@ -1,119 +1,122 @@
 /* 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/. */
 
 /* import-globals-from ../../../../toolkit/content/preferencesBindings.js */
-
-Preferences.forceEnableInstantApply();
+/* import-globals-from general.js */
+/* import-globals-from compose.js */
+/* import-globals-from downloads.js */
+/* import-globals-from privacy.js */
+/* import-globals-from chat.js */
+/* import-globals-from subdialogs.js */
 
 var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 var { AppConstants } = ChromeUtils.import(
   "resource://gre/modules/AppConstants.jsm"
 );
 var { MailServices } = ChromeUtils.import(
   "resource:///modules/MailServices.jsm"
 );
 var { ExtensionSupport } = ChromeUtils.import(
   "resource:///modules/ExtensionSupport.jsm"
 );
+var { calendarDeactivator } = ChromeUtils.import(
+  "resource:///modules/calendar/calCalendarDeactivator.jsm"
+);
 
 var paneDeck = document.getElementById("paneDeck");
-var prefPanes = [...document.getElementsByTagName("prefpane")];
-var selector = document.getElementById("selector");
+var defaultPane = "paneGeneral";
 
 ChromeUtils.defineModuleGetter(
   this,
   "AddonManager",
   "resource://gre/modules/AddonManager.jsm"
 );
 
-(function() {
-  for (let pane of prefPanes) {
-    if (
-      pane.id == "paneChat" &&
-      !Services.prefs.getBoolPref("mail.chat.enabled")
-    ) {
-      continue;
-    }
+document.addEventListener("DOMContentLoaded", init, { once: true });
+
+function init() {
+  Preferences.forceEnableInstantApply();
 
-    var radio = document.createXULElement("radio");
-    radio.setAttribute("pane", pane.id);
-    radio.setAttribute("value", pane.id);
-    radio.setAttribute("label", pane.getAttribute("label"));
-    radio.setAttribute("oncommand", `showPane("${pane.id}");`);
-    // Expose preference group choice to accessibility APIs as an unchecked list item
-    // The parent group is exposed to accessibility APIs as a list
-    if (pane.image) {
-      radio.setAttribute("src", pane.image);
-    }
-    radio.style.listStyleImage = pane.style.listStyleImage;
-    selector.appendChild(radio);
+  gSubDialog.init();
+  gGeneralPane.init();
+  gComposePane.init();
+  gPrivacyPane.init();
+  if (Services.prefs.getBoolPref("mail.chat.enabled")) {
+    gChatPane.init();
+  } else {
+    // Remove the pane from the DOM so it doesn't get incorrectly included in
+    // the search results.
+    document.getElementById("paneChat").remove();
+  }
 
-    setTimeout(function() {
-      pane.dispatchEvent(new CustomEvent("paneload"));
-    });
+  // If no calendar is currently enabled remove it from the DOM so it doesn't
+  // get incorrectly included in the search results.
+  if (!calendarDeactivator.isCalendarActivated) {
+    document.getElementById("paneLightning").remove();
+    document.getElementById("category-calendar").remove();
   }
 
-  if (prefPanes.length == 1) {
-    selector.setAttribute("collapsed", "true");
-  }
+  Preferences.addSyncFromPrefListener(
+    document.getElementById("saveWhere"),
+    () => gDownloadDirSection.onReadUseDownloadDir()
+  );
 
-  window.addEventListener("DOMContentLoaded", function() {
-    let lastSelected = document.documentElement.getAttribute("lastSelected");
-    if (lastSelected && document.getElementById(lastSelected)) {
-      showPane(lastSelected);
-    } else {
-      showPane(prefPanes[0].id);
-    }
+  let categories = document.getElementById("categories");
+  categories.addEventListener("select", event => {
+    showPane(event.target.value);
   });
 
-  document.documentElement.addEventListener("keydown", function(event) {
-    if (
-      event.keyCode == KeyEvent.DOM_VK_TAB ||
-      event.keyCode == KeyEvent.DOM_VK_UP ||
-      event.keyCode == KeyEvent.DOM_VK_DOWN ||
-      event.keyCode == KeyEvent.DOM_VK_LEFT ||
-      event.keyCode == KeyEvent.DOM_VK_RIGHT
-    ) {
-      selector.setAttribute("keyboard-navigation", "true");
+  document.documentElement.addEventListener("keydown", event => {
+    if (event.keyCode == KeyEvent.DOM_VK_TAB) {
+      categories.setAttribute("keyboard-navigation", "true");
     }
   });
-  selector.addEventListener("mousedown", function() {
+  categories.addEventListener("mousedown", function() {
     this.removeAttribute("keyboard-navigation");
   });
-})();
+
+  let lastSelected = document.documentElement.getAttribute("lastSelected");
+  if (
+    lastSelected &&
+    lastSelected != defaultPane &&
+    document.getElementById(lastSelected)
+  ) {
+    categories.selectedItem = categories.querySelector(
+      ".category[value=" + lastSelected + "]"
+    );
+  } else {
+    showPane(defaultPane);
+  }
+}
 
 /**
  * Actually switches to the specified pane, fires events, and remembers the pane.
  *
  * @param paneID ID of the prefpane to select
  */
 function showPane(paneID) {
-  if (!paneID) {
-    return;
-  }
-
   let pane = document.getElementById(paneID);
   if (!pane) {
     return;
   }
 
   let currentlySelected = paneDeck.querySelector(
     "#paneDeck > prefpane[selected]"
   );
+
   if (currentlySelected) {
     if (currentlySelected == pane) {
       return;
     }
     currentlySelected.removeAttribute("selected");
   }
 
-  selector.value = paneID;
   pane.setAttribute("selected", "true");
   pane.dispatchEvent(new CustomEvent("paneSelected", { bubbles: true }));
   document.getElementById("preferencesContainer").scrollTo(0, 0);
 
   document.documentElement.setAttribute("lastSelected", paneID);
   Services.xulStore.persist(document.documentElement, "lastSelected");
 }
 
rename from mail/components/preferences/aboutPreferences.xhtml
rename to mail/components/preferences/preferences.xhtml
--- a/mail/components/preferences/aboutPreferences.xhtml
+++ b/mail/components/preferences/preferences.xhtml
@@ -13,34 +13,18 @@
 <?xml-stylesheet href="chrome://global/skin/in-content/common.css"?>
 <?xml-stylesheet href="chrome://messenger/skin/preferences/preferences.css"?>
 <?xml-stylesheet href="chrome://calendar/skin/shared/calendar-preferences.css" type="text/css"?>
 <?xml-stylesheet href="chrome://calendar/skin/lightning.css"?>
 
 <!DOCTYPE preftab [
 <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
 %brandDTD;
-<!ENTITY % preferencesDTD SYSTEM "chrome://messenger/locale/preferences/preferences.dtd">
-%preferencesDTD;
-<!ENTITY % generalDTD SYSTEM "chrome://messenger/locale/preferences/general.dtd" >
-%generalDTD;
-<!ENTITY % displayDTD SYSTEM "chrome://messenger/locale/preferences/display.dtd" >
-%displayDTD;
-<!ENTITY % composeDTD SYSTEM "chrome://messenger/locale/preferences/compose.dtd">
-%composeDTD;
 <!ENTITY % editorOverlayDTD SYSTEM "chrome://messenger/locale/messengercompose/editorOverlay.dtd">
 %editorOverlayDTD;
-<!ENTITY % chatDTD SYSTEM "chrome://messenger/locale/preferences/chat.dtd">
-%chatDTD;
-<!ENTITY % privacyDTD SYSTEM "chrome://messenger/locale/preferences/privacy.dtd">
-%privacyDTD;
-<!ENTITY % securityDTD SYSTEM "chrome://messenger/locale/preferences/security.dtd">
-%securityDTD;
-<!ENTITY % applicationsDTD SYSTEM "chrome://messenger/locale/preferences/applications.dtd">
-%applicationsDTD;
 <!ENTITY % advancedDTD SYSTEM "chrome://messenger/locale/preferences/advanced.dtd">
 %advancedDTD;
 #ifdef XP_WIN
 <!ENTITY % searchIntegrationWinDTD SYSTEM "chrome://messenger/locale/searchIntegrationWin.dtd" >
 %searchIntegrationWinDTD;
 #else
 #ifdef XP_MACOSX
 <!ENTITY % searchIntegrationMacDTD SYSTEM "chrome://messenger/locale/searchIntegrationMac.dtd" >
@@ -72,61 +56,100 @@
 %viewsDTD;
 ]>
 
 <preftab id="MailPreferences" flex="1"
          windowtype="Mail:Preferences"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
          xmlns:xhtml="http://www.w3.org/1999/xhtml"
          xmlns:html="http://www.w3.org/1999/xhtml"
-         onload="gSubDialog.init();"
-#ifdef XP_WIN
-         title="&prefWindow.titleWin;">
-#endif
-#ifdef XP_UNIX
-#ifndef XP_MACOSX
-         title="&prefWindow.titleGNOME;">
-#else
-         title="&prefWindow.titleMAC;">
-#endif
-#endif
+         data-l10n-id="preferences-title">
+
   <script src="chrome://global/content/preferencesBindings.js"/>
 #ifdef MOZ_UPDATER
   <script src="chrome://messenger/content/aboutDialog-appUpdater.js"/>
 #endif
   <script src="chrome://global/content/globalOverlay.js"/>
   <script src="chrome://global/content/editMenuOverlay.js"/>
 
-  <stringbundle id="bundleBrand" src="chrome://branding/locale/brand.properties"/>
-  <stringbundle id="bundlePreferences"
-                src="chrome://messenger/locale/preferences/preferences.properties"/>
   <linkset>
     <html:link rel="localization" href="branding/brand.ftl"/>
     <html:link rel="localization" href="messenger/preferences/preferences.ftl"/>
     <html:link rel="localization" href="messenger/preferences/fonts.ftl"/>
     <html:link rel="localization" href="messenger/preferences/languages.ftl"/>
   </linkset>
 
   <stack id="preferences-stack" flex="1">
     <hbox id="prefBox" class="main-content" flex="1">
+
       <vbox id="pref-category-box">
-        <radiogroup id="selector" orient="vertical" class="paneSelector chromeclass-toolbar"
-                        role="listbox" flex="1"/> <!-- Expose to accessibility APIs as a listbox -->
+
+        <!-- category list -->
+        <richlistbox id="categories">
+          <richlistitem id="category-general"
+                        class="category"
+                        value="paneGeneral"
+                        data-l10n-id="category-general"
+                        align="center">
+            <image class="category-icon"/>
+            <label class="category-name" flex="1" data-l10n-id="pane-general-title"/>
+          </richlistitem>
+
+          <richlistitem id="category-compose"
+                        class="category"
+                        value="paneCompose"
+                        data-l10n-id="category-compose"
+                        align="center">
+            <image class="category-icon"/>
+            <label class="category-name" flex="1" data-l10n-id="pane-compose-title"/>
+          </richlistitem>
+
+          <richlistitem id="category-privacy"
+                        class="category"
+                        value="panePrivacy"
+                        data-l10n-id="category-privacy"
+                        align="center">
+            <image class="category-icon"/>
+            <label class="category-name" flex="1" data-l10n-id="pane-privacy-title"/>
+          </richlistitem>
+
+          <richlistitem id="category-chat"
+                        class="category"
+                        value="paneChat"
+                        data-l10n-id="category-chat"
+                        align="center">
+            <image class="category-icon"/>
+            <label class="category-name" flex="1" data-l10n-id="pane-chat-title"/>
+          </richlistitem>
+
+          <richlistitem id="category-calendar"
+                        class="category"
+                        value="paneLightning"
+                        data-l10n-id="category-calendar"
+                        align="center">
+            <image class="category-icon"/>
+            <label class="category-name" flex="1" data-l10n-id="pane-calendar-title"/>
+          </richlistitem>
+        </richlistbox>
+
         <spacer flex="1"/>
+
         <hbox class="sidebar-footer-button"
               pack="center"
               onclick="window.docShell.rootTreeItem.domWindow.openAddonsMgr();">
           <label is="text-link" id="addonsButton">
             <hbox align="center">
               <image class="sidebar-footer-icon addons-icon"/>
-              <label class="sidebar-footer-label" flex="1">&addonsButton.label;</label>
+              <label data-l10n-id="addons-button" class="sidebar-footer-label" flex="1"/>
             </hbox>
           </label>
         </hbox>
+
       </vbox>
+
       <hbox id="preferencesContainer" flex="1">
         <hbox class="paneDeckContainer" flex="1">
           <hbox id="paneDeck" flex="1">
 #include general.inc.xhtml
 #include compose.inc.xhtml
 #include privacy.inc.xhtml
 #include chat.inc.xhtml
 #include ../../../calendar/lightning/content/messenger-overlay-preferences.inc.xhtml
@@ -142,18 +165,17 @@
           topmost="true"
           hidden="true">
       <vbox class="dialogBox"
             pack="end"
             role="dialog"
             aria-labelledby="dialogTitle">
         <hbox class="dialogTitleBar" align="center">
           <label class="dialogTitle" flex="1"/>
-          <button class="dialogClose close-icon"
-                  aria-label="&preferencesCloseButton.label;"/>
+          <button class="dialogClose close-icon" data-l10n-id="close-button"/>
         </hbox>
         <browser class="dialogFrame"
                  autoscroll="false"
                  disablehistory="true"/>
       </vbox>
     </vbox>
   </stack>
 
--- a/mail/components/preferences/privacy.inc.xhtml
+++ b/mail/components/preferences/privacy.inc.xhtml
@@ -1,316 +1,295 @@
 # 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/.
-  <prefpane id="panePrivacy" label="&panePrivacySecurity.title;">
+  <prefpane id="panePrivacy">
     <script src="chrome://messenger/content/preferences/privacy.js"/>
 
     <stringbundle id="bundlePreferences" src="chrome://messenger/locale/preferences/preferences.properties"/>
 
     <hbox id="privacyCategory"
           class="subcategory"
           data-category="panePrivacy">
       <html:h1 data-l10n-id="privacy-main-header"/>
     </hbox>
 
     <!-- Mail Content -->
     <html:fieldset id="mailContentGroup" data-category="panePrivacy">
-      <html:legend>&captionMailContent.label;</html:legend>
+      <html:legend data-l10n-id="mail-content"></html:legend>
       <hbox id="remoteContentBox">
         <checkbox id="acceptRemoteContent"
                   preference="mailnews.message_display.disable_remote_image"
-                  label="&acceptRemoteContent.label;"
-                  accesskey="&acceptRemoteContent.accesskey;"/>
+                  data-l10n-id="remote-content-label"/>
         <spacer flex="1"/>
         <button id="remoteContentExceptions"
                 oncommand="gPrivacyPane.showRemoteContentExceptions();"
-                label="&remoteContentExceptions.label;"
-                accesskey="&remoteContentExceptions.accesskey;"/>
+                data-l10n-id="exceptions-button"/>
       </hbox>
       <hbox>
         <label is="text-link" id="acceptRemoteContentInfo"
                href="https://support.mozilla.org/kb/remote-content-in-messages"
-               value="&acceptRemoteContentInfo.label;"/>
+               data-l10n-id="remote-content-info"/>
       </hbox>
     </html:fieldset>
 
     <!-- Web Content -->
     <html:fieldset id="webContentGroup" data-category="panePrivacy">
-      <html:legend>&captionWebContent.label;</html:legend>
+      <html:legend data-l10n-id="web-content"></html:legend>
       <checkbox id="keepHistory"
                 preference="places.history.enabled"
-                label="&keepHistory.label;"
-                accesskey="&keepHistory.accesskey;"/>
+                data-l10n-id="history-label"/>
       <hbox id="cookiesBox">
         <checkbox id="acceptCookies"
                   preference="network.cookie.cookieBehavior"
-                  label="&acceptCookies.label;"
-                  accesskey="&acceptCookies.accesskey;"/>
+                  data-l10n-id="cookies-label"/>
         <spacer flex="1"/>
         <button id="cookieExceptions"
                 oncommand="gPrivacyPane.showCookieExceptions();"
-                label="&cookieExceptions.label;"
-                accesskey="&cookieExceptions.accesskey;"
+                data-l10n-id="exceptions-button"
                 preference="pref.privacy.disable_button.cookie_exceptions"/>
       </hbox>
       <hbox id="acceptThirdPartyRow" class="indent">
         <hbox id="acceptThirdPartyBox" align="center">
           <label id="acceptThirdPartyLabel" control="acceptThirdPartyMenu"
-                 accesskey="&acceptThirdParty.pre.accesskey;">&acceptThirdParty.pre.label;</label>
+                 data-l10n-id="third-party-label"/>
           <menulist id="acceptThirdPartyMenu" preference="network.cookie.cookieBehavior">
             <menupopup>
-              <menuitem label="&acceptThirdParty.always.label;" value="always"/>
-              <menuitem label="&acceptThirdParty.visited.label;" value="visited"/>
-              <menuitem label="&acceptThirdParty.never.label;" value="never"/>
+              <menuitem data-l10n-id="third-party-always" value="always"/>
+              <menuitem data-l10n-id="third-party-visited" value="visited"/>
+              <menuitem data-l10n-id="third-party-never" value="never"/>
             </menupopup>
           </menulist>
         </hbox>
       </hbox>
       <hbox id="keepRow" class="indent">
         <hbox id="keepBox" align="center">
           <label id="keepUntil"
                  control="keepCookiesUntil"
-                 accesskey="&keepUntil.accesskey;">&keepUntil.label;</label>
+                 data-l10n-id="keep-label"/>
           <menulist id="keepCookiesUntil"
                     preference="network.cookie.lifetimePolicy">
             <menupopup>
-              <menuitem label="&expire.label;" value="0"/>
-              <menuitem label="&close.label;" value="2"/>
-              <menuitem label="&askEachTime.label;" value="1"/>
+              <menuitem data-l10n-id="keep-expire" value="0"/>
+              <menuitem data-l10n-id="keep-close" value="2"/>
+              <menuitem data-l10n-id="keep-ask" value="1"/>
             </menupopup>
           </menulist>
         </hbox>
         <hbox flex="1"/>
-        <button id="showCookiesButton" label="&showCookies.label;"
-                accesskey="&showCookies.accesskey;"
+        <button id="showCookiesButton" data-l10n-id="cookies-button"
                 oncommand="gPrivacyPane.showCookies();"
                 preference="pref.privacy.disable_button.view_cookies"/>
       </hbox>
 
       <separator class="thin"/>
 
       <hbox align="center">
         <checkbox id="privacyDoNotTrackCheckbox"
                   class="tail-with-learn-more"
-                  label="&doNotTrackCheck.label;"
-                  accesskey="&doNotTrackCheck.accesskey;"
+                  data-l10n-id="do-not-track-label"
                   preference="privacy.donottrackheader.enabled"/>
         <label is="text-link" id="doNotTrackInfo"
                href="https://www.mozilla.org/dnt"
-               value="&doNotTrackLearnMore.label;"/>
+               data-l10n-id="learn-button"/>
       </hbox>
     </html:fieldset>
 
     <hbox id="privacyPasswordsCategory"
           class="subcategory"
           data-category="panePrivacy">
       <html:h1 data-l10n-id="privacy-passwords-header"/>
     </hbox>
 
     <separator data-category="panePrivacy"/>
 
     <html:fieldset data-category="panePrivacy">
       <hbox align="center">
-        <description>&savedPasswords.intro;</description>
+        <description data-l10n-id="passwords-description"/>
         <spacer flex="1"/>
         <button id="showPasswords"
-                label="&savedPasswords.label;"
-                accesskey="&savedPasswords.accesskey;"
+                data-l10n-id="passwords-button"
                 oncommand="gPrivacyPane.showPasswords();"
                 preference="pref.privacy.disable_button.view_passwords"/>
       </hbox>
       <!-- XXX button to do a showExceptions()? -->
 
       <separator class="thin"/>
 
-      <description>&masterPassword.intro;</description>
+      <description data-l10n-id="master-password-description"/>
       <hbox>
         <checkbox id="useMasterPassword"
-                  label="&useMasterPassword.label;"
-                  accesskey="&useMasterPassword.accesskey;"
+                  data-l10n-id="master-password-label"
                   oncommand="gPrivacyPane.updateMasterPasswordButton();"/>
         <spacer flex="1"/>
         <button id="changeMasterPassword"
-                label="&changeMasterPassword.label;"
-                accesskey="&changeMasterPassword.accesskey;"
+                data-l10n-id="master-password-button"
                 oncommand="gPrivacyPane.changeMasterPassword();"/>
       </hbox>
     </html:fieldset>
 
     <hbox id="privacyJunkCategory"
           class="subcategory"
           data-category="panePrivacy">
       <html:h1 data-l10n-id="privacy-junk-header"/>
     </hbox>
 
     <separator data-category="panePrivacy"/>
 
     <html:fieldset data-category="panePrivacy">
-      <description>&junkMail.intro;</description>
+      <description data-l10n-id="junk-description"/>
       <separator class="thin"/>
       <hbox>
         <checkbox id="manualMark"
-                  label="&manualMark.label;"
+                  data-l10n-id="junk-label"
                   preference="mail.spam.manualMark"
-                  oncommand="gPrivacyPane.updateManualMarkMode(this.checked);"
-                  accesskey="&manualMark.accesskey;"/>
+                  oncommand="gPrivacyPane.updateManualMarkMode(this.checked);"/>
         <spacer flex="1"/>
       </hbox>
       <radiogroup id="manualMarkMode"
                   class="indent"
                   preference="mail.spam.manualMarkMode"
                   aria-labelledby="manualMark">
         <hbox>
           <radio id="manualMarkMode0"
                  value="0"
-                 label="&manualMarkModeMove.label;"
-                 accesskey="&manualMarkModeMove.accesskey;"/>
+                 data-l10n-id="junk-move-label"/>
           <spacer flex="1"/>
         </hbox>
         <hbox>
           <radio id="manualMarkMode1"
                  value="1"
-                 label="&manualMarkModeDelete.label;"
-                 accesskey="&manualMarkModeDelete.accesskey;"/>
+                 data-l10n-id="junk-delete-label"/>
           <spacer flex="1"/>
         </hbox>
       </radiogroup>
       <hbox>
         <checkbox id="markAsReadOnSpam"
-                  label="&markAsReadOnSpam.label;"
-                  accesskey="&markAsReadOnSpam.accesskey;"
+                  data-l10n-id="junk-read-label"
                   preference="mail.spam.markAsReadOnSpam"/>
         <spacer flex="1"/>
       </hbox>
       <hbox align="start">
-        <checkbox id="enableJunkLogging" label="&enableAdaptiveJunkLogging.label;"
+        <checkbox id="enableJunkLogging" data-l10n-id="junk-log-label"
                   oncommand="gPrivacyPane.updateJunkLogButton(this.checked);"
-                  preference="mail.spam.logging.enabled"
-                  accesskey="&enableAdaptiveJunkLogging.accesskey;"/>
+                  preference="mail.spam.logging.enabled"/>
         <spacer flex="1"/>
-        <button id="openJunkLogButton" label="&openJunkLog.label;" accesskey="&openJunkLog.accesskey;"
+        <button id="openJunkLogButton" data-l10n-id="junk-log-button"
                 oncommand="gPrivacyPane.openJunkLog();"/>
       </hbox>
       <hbox align="start" style="padding-bottom:2em;">
         <spacer flex="1"/>
-        <button label="&resetTrainingData.label;" accesskey="&resetTrainingData.accesskey;"
+        <button data-l10n-id="reset-junk-button"
                 oncommand="gPrivacyPane.resetTrainingData()"/>
       </hbox>
     </html:fieldset>
 
 #ifdef MOZ_DATA_REPORTING
     <hbox id="privacyDataCollectionCategory"
           class="subcategory"
           data-category="panePrivacy">
       <html:h1 data-l10n-id="privacy-data-collection-header"/>
     </hbox>
 
 #ifdef MOZ_TELEMETRY_REPORTING
     <html:fieldset data-category="panePrivacy">
-      <html:legend>&telemetrySection.label;</html:legend>
-      <description>&telemetryDesc.label;</description>
+      <html:legend data-l10n-id="telemetry-legend"></html:legend>
+      <description data-l10n-id="telemetry-description"/>
       <hbox align="center">
         <checkbox id="submitTelemetryBox"
                   class="tail-with-learn-more"
                   preference="toolkit.telemetry.enabled"
-                  label="&enableTelemetry.label;"
-                  accesskey="&enableTelemetry.accesskey;"/>
+                  data-l10n-id="telemetry-label"/>
         <label is="text-link" id="telemetryLearnMore"
-               value="&telemetryLearnMore.label;"/>
+               data-l10n-id="learn-label"/>
       </hbox>
     </html:fieldset>
 #endif
 #ifdef MOZ_CRASHREPORTER
     <html:fieldset data-category="panePrivacy">
-      <html:legend>&crashReporterSection.label;</html:legend>
-      <description>&crashReporterDesc.label;</description>
+      <html:legend data-l10n-id="crash-legend"></html:legend>
+      <description data-l10n-id="crash-description"/>
       <hbox align="center">
         <checkbox id="submitCrashesBox" class="tail-with-learn-more"
                   oncommand="gPrivacyPane.updateSubmitCrashes();"
-                  label="&enableCrashReporter.label;"
-                  accesskey="&enableCrashReporter.accesskey;"/>
+                  data-l10n-id="crash-label"/>
         <label is="text-link" id="crashReporterLearnMore"
-               value="&crashReporterLearnMore.label;"/>
+               data-l10n-id="learn-label"/>
       </hbox>
     </html:fieldset>
 #endif
 #endif
 
     <hbox id="privacySecurityCategory"
           class="subcategory"
           data-category="panePrivacy">
       <html:h1 data-l10n-id="privacy-security-header"/>
     </hbox>
 
     <html:fieldset data-category="panePrivacy">
       <html:legend data-l10n-id="privacy-scam-detection-title"></html:legend>
-      <description>&phishingDetector1.intro;</description>
+      <description data-l10n-id="phishing-description"/>
       <separator class="thin"/>
       <hbox>
         <checkbox id="enablePhishingDetector"
-                  label="&enablePhishingDetector1.label;"
-                  accesskey="&enablePhishingDetector1.accesskey;"
+                  data-l10n-id="phishing-label"
                   preference="mail.phishing.detection.enabled"/>
         <spacer flex="1"/>
       </hbox>
     </html:fieldset>
 
     <!-- Anti Virus -->
     <html:fieldset data-category="panePrivacy">
       <html:legend data-l10n-id="privacy-anti-virus-title"></html:legend>
-      <description>&antiVirus.intro;</description>
+      <description data-l10n-id="antivirus-description"/>
       <separator class="thin"/>
       <hbox>
         <checkbox id="enableAntiVirusQuarantine"
-                  label="&antiVirus.label;"
-                  accesskey="&antiVirus.accesskey;"
+                  data-l10n-id="antivirus-label"
                   preference="mailnews.downloadToTempFile"/>
         <spacer flex="1"/>
       </hbox>
     </html:fieldset>
 
     <html:fieldset data-category="panePrivacy">
       <html:legend data-l10n-id="privacy-certificates-title"></html:legend>
-      <description id="CertSelectionDesc" control="certSelection">&certSelection.description;</description>
+      <description id="CertSelectionDesc" control="certSelection"
+                   data-l10n-id="certificate-description"/>
 
       <!--
         The values on these radio buttons may look like l12y issues, but
         they're not - this preference uses *those strings* as its values.
         I KID YOU NOT.
       -->
       <radiogroup id="certSelection" class="indent"
                   orient="horizontal" preftype="string"
                   preference="security.default_personal_cert"
                   aria-labelledby="CertGroupCaption CertSelectionDesc">
         <radio id="certSelectionAuto"
-               label="&certs.auto;" accesskey="&certs.auto.accesskey;"
+               data-l10n-id="certificate-auto"
                value="Select Automatically"/>
         <radio id="certSelectionAsk"
-               label="&certs.ask;" accesskey="&certs.ask.accesskey;"
+               data-l10n-id="certificate-ask"
                value="Ask Every Time"/>
       </radiogroup>
 
       <separator/>
 
       <hbox align="start">
         <checkbox id="enableOCSP"
-                  label="&enableOCSP.label;"
-                  accesskey="&enableOCSP.accesskey;"
+                  data-l10n-id="ocsp-label"
                   preference="security.OCSP.enabled"
                   flex="1"/>
         <spacer flex="1"/>
         <vbox>
           <button id="manageCertificatesButton"
-                  label="&manageCertificates2.label;"
-                  accesskey="&manageCertificates2.accesskey;"
+                  data-l10n-id="certificate-button"
                   oncommand="gPrivacyPane.showCertificates();"
                   preference="security.disable_button.openCertManager"/>
           <button id="viewSecurityDevicesButton"
-                  label="&viewSecurityDevices2.label;"
-                  accesskey="&viewSecurityDevices2.accesskey;"
+                  data-l10n-id="security-devices-button"
                   oncommand="gPrivacyPane.showSecurityDevices();"
                   preference="security.disable_button.openDeviceManager"/>
         </vbox>
       </hbox>
     </html:fieldset>
 
   </prefpane>
--- a/mail/components/preferences/privacy.js
+++ b/mail/components/preferences/privacy.js
@@ -55,20 +55,16 @@ Preferences.addAll([
   { id: "security.disable_button.openDeviceManager", type: "bool" },
   { id: "security.OCSP.enabled", type: "int" },
 ]);
 
 if (AppConstants.MOZ_TELEMETRY_REPORTING) {
   Preferences.add({ id: "toolkit.telemetry.enabled", type: "bool" });
 }
 
-document.getElementById("panePrivacy").addEventListener("paneload", function() {
-  gPrivacyPane.init();
-});
-
 var gPrivacyPane = {
   init() {
     this.updateManualMarkMode(Preferences.get("mail.spam.manualMark").value);
     this.updateJunkLogButton(
       Preferences.get("mail.spam.logging.enabled").value
     );
 
     this._initMasterPasswordUI();
--- a/mail/locales/en-US/chrome/messenger/preferences/advanced.dtd
+++ b/mail/locales/en-US/chrome/messenger/preferences/advanced.dtd
@@ -1,123 +1,13 @@
 <!-- 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 itemGeneral.label       "General">
-<!ENTITY dataChoicesTab.label    "Data Choices">
-<!ENTITY itemUpdate.label        "Update">
-<!ENTITY itemNetworking.label    "Network &amp; Disk Space">
-<!ENTITY itemCertificates.label  "Certificates">
-
-<!-- General Settings -->
-<!ENTITY enableGlodaSearch.label       "Enable Global Search and Indexer">
-<!ENTITY enableGlodaSearch.accesskey   "G">
-<!ENTITY dateTimeFormatting.label      "Date and Time Formatting">
-<!ENTITY languageSelector.label        "Language">
-<!ENTITY allowHWAccel.label            "Use hardware acceleration when available">
-<!ENTITY allowHWAccel.accesskey        "h">
-<!ENTITY storeType.label               "Message Store Type for new accounts:">
-<!ENTITY storeType.accesskey           "T">
-<!ENTITY mboxStore2.label              "File per folder (mbox)">
-<!ENTITY maildirStore.label            "File per message (maildir)">
-
-<!ENTITY scrolling.label               "Scrolling">
-<!ENTITY useAutoScroll.label           "Use autoscrolling">
-<!ENTITY useAutoScroll.accesskey       "U">
-<!ENTITY useSmoothScrolling.label      "Use smooth scrolling">
-<!ENTITY useSmoothScrolling.accesskey  "m">
-
-<!ENTITY systemIntegration.label       "System Integration">
-<!ENTITY alwaysCheckDefault.label      "Always check to see if &brandShortName; is the default mail client on startup">
-<!ENTITY alwaysCheckDefault.accesskey  "A">
-<!ENTITY searchIntegration.label       "Allow &searchIntegration.engineName; to search messages">
-<!ENTITY searchIntegration.accesskey   "S">
-<!ENTITY checkDefaultsNow.label        "Check Now…">
-<!ENTITY checkDefaultsNow.accesskey    "N">
-<!ENTITY configEdit.label              "Config Editor…">
-<!ENTITY configEdit.accesskey          "C">
-<!ENTITY returnReceiptsInfo.label      "Determine how &brandShortName; handles return receipts">
-<!ENTITY showReturnReceipts.label      "Return Receipts…">
-<!ENTITY showReturnReceipts.accesskey  "R">
-
-<!-- Data Choices -->
-<!ENTITY telemetrySection.label          "Telemetry">
-<!ENTITY telemetryDesc.label             "Shares performance, usage, hardware and customization data about your e-mail client with &vendorShortName; to help us make &brandShortName; better">
-<!ENTITY enableTelemetry.label           "Enable Telemetry">
-<!ENTITY enableTelemetry.accesskey       "T">
-<!ENTITY telemetryLearnMore.label        "Learn More">
-
-<!ENTITY crashReporterSection.label      "Crash Reporter">
-<!ENTITY crashReporterDesc.label         "&brandShortName; submits crash reports to help &vendorShortName; make your e-mail client more stable and secure">
-<!ENTITY enableCrashReporter.label       "Enable Crash Reporter">
-<!ENTITY enableCrashReporter.accesskey   "C">
-<!ENTITY crashReporterLearnMore.label    "Learn More">
-
 <!-- Update -->
-<!-- LOCALIZATION NOTE (updateApp.label):
-  Strings from aboutDialog.dtd are displayed in this section of the preferences.
-  Please check for possible accesskey conflicts.
--->
-<!ENTITY updateApp2.label                "&brandShortName; Updates">
 <!-- LOCALIZATION NOTE (updateApp.version.*): updateApp.version.pre is
   followed by a version number, keep the trailing space or replace it with
   a different character as needed. updateApp.version.post is displayed after
   the version number, and is empty on purpose for English. You can use it
   if required by your language.
  -->
 <!ENTITY updateApp.version.pre           "Version ">
 <!ENTITY updateApp.version.post          "">
-<!ENTITY updateAppAllow.description      "Allow &brandShortName; to">
-<!ENTITY updateAuto.label                "Automatically install updates (recommended: improved security)">
-<!ENTITY updateAuto.accesskey            "A">
-<!ENTITY updateCheck.label               "Check for updates, but let me choose whether to install them">
-<!ENTITY updateCheck.accesskey           "C">
-<!ENTITY updateHistory.label             "Show Update History">
-<!ENTITY updateHistory.accesskey         "p">
-
-<!ENTITY useService.label                "Use a background service to install updates">
-<!ENTITY useService.accesskey            "b">
-
-<!ENTITY updateCrossUserSettingWarning.description "This setting will apply to all Windows accounts and &brandShortName; profiles using this installation of &brandShortName;.">
-
-<!-- Networking and Disk Space -->
-<!ENTITY showSettings.label            "Settings…">
-<!ENTITY showSettings.accesskey        "S">
-<!ENTITY proxiesConfigure.label        "Configure how &brandShortName; connects to the Internet">
-<!ENTITY connectionsInfo.caption       "Connection">
-<!ENTITY offlineInfo.caption           "Offline">
-<!ENTITY offlineInfo.label             "Configure offline settings">
-<!ENTITY showOffline.label             "Offline…">
-<!ENTITY showOffline.accesskey         "O">
-
-<!ENTITY Diskspace                       "Disk Space">
-<!ENTITY offlineCompactFolders.label     "Compact all folders when it will save over">
-<!ENTITY offlineCompactFolders.accesskey "a">
-<!ENTITY offlineCompactFoldersMB.label   "MB in total">
-
-<!-- LOCALIZATION NOTE:
-  The entities useCacheBefore.label and useCacheAfter.label appear on a single
-  line in preferences as follows:
-
-  &useCacheBefore.label  [ textbox for cache size in MB ]   &useCacheAfter.label;
--->
-<!ENTITY useCacheBefore.label            "Use up to">
-<!ENTITY useCacheBefore.accesskey        "U">
-<!ENTITY useCacheAfter.label             "MB of space for the cache">
-<!ENTITY overrideSmartCacheSize.label    "Override automatic cache management">
-<!ENTITY overrideSmartCacheSize.accesskey "v">
-<!ENTITY clearCacheNow.label             "Clear Now">
-<!ENTITY clearCacheNow.accesskey         "C">
-
-<!-- Certificates -->
-<!ENTITY certSelection.description       "When a server requests my personal certificate:">
-<!ENTITY certs.auto                      "Select one automatically">
-<!ENTITY certs.auto.accesskey            "S">
-<!ENTITY certs.ask                       "Ask me every time">
-<!ENTITY certs.ask.accesskey             "A">
-<!ENTITY enableOCSP.label                "Query OCSP responder servers to confirm the current validity of certificates">
-<!ENTITY enableOCSP.accesskey            "Q">
-
-<!ENTITY manageCertificates2.label "Manage Certificates…">
-<!ENTITY manageCertificates2.accesskey "M">
-<!ENTITY viewSecurityDevices2.label "Security Devices…">
-<!ENTITY viewSecurityDevices2.accesskey "D">
deleted file mode 100755
--- a/mail/locales/en-US/chrome/messenger/preferences/applications.dtd
+++ /dev/null
@@ -1,36 +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  typeColumn.label            "Content Type">
-<!ENTITY  typeColumn.accesskey        "T">
-
-<!ENTITY  actionColumn2.label         "Action">
-<!ENTITY  actionColumn2.accesskey     "A">
-
-<!ENTITY  focusSearch1.key            "f">
-<!ENTITY  focusSearch2.key            "k">
-
-<!ENTITY  filter.placeholder          "Search">
-
-<!ENTITY saveTo.label                 "Save files to">
-<!ENTITY saveTo.accesskey             "S">
-<!ENTITY alwaysAsk.label              "Always ask me where to save files">
-<!ENTITY alwaysAsk.accesskey          "A">
-<!ENTITY chooseFolderWin.label        "Browse…">
-<!ENTITY chooseFolderWin.accesskey    "B">
-<!ENTITY chooseFolderMac.label        "Choose…">
-<!ENTITY chooseFolderMac.accesskey    "C">
-
-<!ENTITY attachments.incoming.label   "Incoming">
-<!ENTITY attachments.outgoing.label   "Outgoing">
-
-<!ENTITY addCloudFileAccount1.label       "Add…">
-<!ENTITY addCloudFileAccount1.accesskey   "A">
-<!ENTITY addCloudFileAccount.description  "Add a new Filelink storage service">
-<!ENTITY removeCloudFileAccount.label     "Remove">
-<!ENTITY removeCloudFileAccount.accesskey "R">
-<!ENTITY findCloudFileProviders.label     "Find more providers…">
-
-<!ENTITY enableCloudFileAccountOffer.label "Offer to share for files larger than">
-<!ENTITY enableCloudFileAccountOffer.mb "MB">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/chat.dtd
+++ /dev/null
@@ -1,64 +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  generalTab.label            "General">
-
-<!ENTITY  startupAction.label         "When &brandShortName; starts:">
-<!ENTITY  startupAction.accesskey     "s">
-<!ENTITY  startupOffline.label        "Keep my Chat Accounts offline">
-<!ENTITY  startupConnectAuto.label    "Connect my chat accounts automatically">
-
-<!-- LOCALIZATION NOTE: reportIdleAfter.label is displayed first, then
-there's a field where the user can enter a number, and itemTime is
-displayed at the end of the line. The translations of the
-reportIdleAfter.label and idleTime parts don't have to mean the exact
-same thing as in English; please try instead to translate the whole
-sentence. -->
-<!ENTITY  reportIdleAfter.label         "Let my contacts know that I am Idle after">
-<!ENTITY  reportIdleAfter.accesskey     "I">
-<!ENTITY  idleTime                      "minutes of inactivity">
-
-<!ENTITY  andSetStatusToAway.label      "and set my status to Away with this status message:">
-<!ENTITY  andSetStatusToAway.accesskey  "A">
-
-<!ENTITY  sendTyping.label              "Send typing notifications in conversations">
-<!ENTITY  sendTyping.accesskey          "t">
-
-<!ENTITY  chatNotifications.label             "When messages directed at you arrive:">
-<!ENTITY  desktopChatNotifications.label      "Show a notification:">
-<!ENTITY  desktopChatNotifications.accesskey  "c">
-<!ENTITY  completeNotification.label          "with sender's name and message preview">
-<!ENTITY  buddyInfoOnly.label                 "with sender's name only">
-<!ENTITY  dummyNotification.label             "without any info">
-<!ENTITY  getAttention.label                  "Flash the taskbar item">
-<!ENTITY  getAttention.accesskey              "F">
-<!ENTITY  getAttentionMac.label               "Animate dock icon">
-<!ENTITY  getAttentionMac.accesskey           "o">
-<!ENTITY  chatSound.accesskey                 "d">
-<!ENTITY  chatSound.label                     "Play a sound">
-<!ENTITY  play.label                          "Play">
-<!ENTITY  play.accesskey                      "P">
-<!ENTITY  systemSound.label                   "Default system sound for new mail">
-<!ENTITY  systemSound.accesskey               "D">
-<!ENTITY  customsound.label                   "Use the following sound file">
-<!ENTITY  customsound.accesskey               "U">
-<!ENTITY  browse.label                        "Browse…">
-<!ENTITY  browse.accesskey                    "B">
-
-<!ENTITY messageStyleTab.title             "Message Styles">
-<!ENTITY messageStylePreview.label         "Preview:">
-<!ENTITY messageStyleTheme.label           "Theme:">
-<!ENTITY messageStyleTheme.accesskey       "T">
-<!ENTITY messageStyleThunderbirdTheme.label "Thunderbird">
-<!ENTITY messageStyleBubblesTheme.label    "Bubbles">
-<!ENTITY messageStyleDarkTheme.label       "Dark">
-<!ENTITY messageStylePaperSheetsTheme.label "Paper Sheets">
-<!ENTITY messageStyleSimpleTheme.label     "Simple">
-<!ENTITY messageStyleDefaultTheme.label    "Default">
-<!ENTITY messageStyleVariant.label         "Variant:">
-<!ENTITY messageStyleVariant.accesskey     "V">
-<!ENTITY messageStyleShowHeader.label      "Show Header">
-<!ENTITY messageStyleShowHeader.accesskey  "H">
-<!ENTITY messageStyleNoPreview.title       "No preview available">
-<!ENTITY messageStyleNoPreview.description "This theme is not valid or is currently unavailable (disabled addon, safe-mode, …).">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/compose.dtd
+++ /dev/null
@@ -1,70 +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 itemGeneral.label                   "General">
-<!ENTITY itemAutoComplete.label              "Addressing">
-<!ENTITY itemSpellCheck.label                "Spelling">
-
-<!ENTITY dialogCompose.title                 "Composing">
-
-<!ENTITY forwardMsg.label                     "Forward messages:">
-<!ENTITY forwardMsg.accesskey                 "F">
-<!ENTITY inline.label                         "Inline">
-<!ENTITY asAttachment.label                   "As Attachment">
-<!ENTITY addExtension.label                   "add extension to file name">
-<!ENTITY addExtension.accesskey               "e">
-
-<!ENTITY htmlComposeHeader.label              "HTML">
-<!ENTITY font.label                           "Font:">
-<!ENTITY font.accesskey                       "n">
-<!ENTITY fontSize.label                       "Size:">
-<!ENTITY fontSize.accesskey                   "z">
-<!ENTITY useReaderDefaults.label              "Use reader's default colors">
-<!ENTITY useReaderDefaults.accesskey          "d">
-<!ENTITY fontColor.label                      "Text Color:">
-<!ENTITY fontColor.accesskey                  "T">
-<!ENTITY bgColor.label                        "Background Color:">
-<!ENTITY bgColor.accesskey                    "B">
-<!ENTITY restoreHTMLDefaults.label            "Restore Defaults">
-<!ENTITY restoreHTMLDefaults.accesskey        "R">
-<!ENTITY defaultToParagraph.label             "Use Paragraph format instead of Body Text by default">
-<!ENTITY defaultToParagraph.accesskey         "P">
-
-<!ENTITY spellCheck.label                     "Check spelling before sending">
-<!ENTITY spellCheck.accesskey                 "C">
-<!ENTITY spellCheckInline.label               "Enable spellcheck as you type">
-<!ENTITY spellCheckInline1.accesskey          "E">
-<!ENTITY languagePopup.label                  "Language:">
-<!ENTITY languagePopup.accessKey              "L">
-<!ENTITY downloadDictionaries.label           "Download More Dictionaries">
-
-<!ENTITY warnOnSendAccelKey.label             "Confirm when using keyboard shortcut to send message">
-<!ENTITY warnOnSendAccelKey.accesskey         "C">
-<!ENTITY autoSave.label                       "Auto Save every">
-<!ENTITY autoSave.accesskey                   "A">
-<!ENTITY autoSaveEnd.label                    "minutes">
-
-<!ENTITY emailCollectionPicker.label           "Automatically add outgoing e-mail addresses to my:">
-<!ENTITY emailCollectionPicker.accesskey       "A">
-<!ENTITY addressingTitle.label                 "Address Autocompletion">
-<!ENTITY autocompleteText.label                "When addressing messages, look for matching entries in:">
-<!ENTITY addressingEnable.label                "Local Address Books">
-<!ENTITY addressingEnable.accesskey            "L">
-<!ENTITY directories.label                     "Directory Server:">
-<!ENTITY directories.accesskey                 "D">
-<!ENTITY directoriesNone.label                 "None">
-<!ENTITY editDirectories.label                 "Edit Directories…">
-<!ENTITY editDirectories.accesskey             "E">
-<!ENTITY showAsDefault.label                   "Default startup directory in the address book window:">
-<!ENTITY showAsDefault.accesskey               "S">
-<!ENTITY showAsDefaultLast.label               "Last used directory">
-
-<!ENTITY sendOptionsDescription.label          "Configure text format behavior">
-<!ENTITY sendOptions.label                     "Send Options…">
-<!ENTITY sendOptions.accesskey                 "S">
-
-<!ENTITY attachmentReminder.label              "Check for missing attachments">
-<!ENTITY attachmentReminder.accesskey          "m">
-<!ENTITY attachmentReminderOptions.label       "Keywords…">
-<!ENTITY attachmentReminderOptions.accesskey   "K">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/display.dtd
+++ /dev/null
@@ -1,73 +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 itemFormatting.label             "Formatting">
-<!ENTITY itemTags.label                   "Tags">
-<!ENTITY itemAdvanced.label               "Advanced">
-
-<!ENTITY style.label                      "Style:">
-<!ENTITY style.accesskey                  "y">
-<!ENTITY regularStyle.label               "Regular">
-<!ENTITY bold.label                       "Bold">
-<!ENTITY italic.label                     "Italic">
-<!ENTITY boldItalic.label                 "Bold Italic">
-<!ENTITY size.label                       "Size:">
-<!ENTITY size.accesskey                   "z">
-<!ENTITY regularSize.label                "Regular">
-<!ENTITY bigger.label                     "Bigger">
-<!ENTITY smaller.label                    "Smaller">
-<!ENTITY quotedTextColor.label            "Color:">
-<!ENTITY quotedTextColor.accesskey        "o">
-<!ENTITY displayWidth.label               "Plain Text Messages">
-<!ENTITY displayText.label                "When displaying quoted plain text messages:">
-
-<!-- LOCALIZATION NOTE : (emoticonsAndStructs.label) 'Emoticons' are also known as 'Smileys', e.g. :-)   -->
-<!ENTITY convertEmoticons.label        "Display emoticons as graphics">
-<!ENTITY convertEmoticons.accesskey    "e">
-
-<!-- labels -->
-<!ENTITY displayTagsText.label     "Tags can be used to categorize and prioritize your messages.">
-<!ENTITY newTagButton.label        "New…">
-<!ENTITY newTagButton.accesskey    "N">
-<!ENTITY editTagButton1.label      "Edit…">
-<!ENTITY editTagButton1.accesskey  "E">
-<!ENTITY removeTagButton.label     "Delete">
-<!ENTITY removeTagButton.accesskey "D">
-
-<!-- Fonts and Colors -->
-<!ENTITY fontsAndColors1.label   "Fonts &amp; Colors">
-<!ENTITY defaultFont.label       "Default font:">
-<!ENTITY defaultFont.accesskey   "D">
-<!ENTITY defaultSize.label       "Size:">
-<!ENTITY defaultSize.accesskey   "S">
-<!ENTITY fontOptions.accesskey   "A">
-<!ENTITY fontOptions.label       "Advanced…">
-<!ENTITY colorButton.label       "Colors…">
-<!ENTITY colorButton.accesskey   "C">
-
-<!-- Advanced -->
-<!ENTITY reading.caption                  "Reading">
-<!ENTITY displayName.label                "Display name:">
-<!ENTITY showCondensedAddresses.label     "Show only display name for people in my address book">
-<!ENTITY showCondensedAddresses.accesskey "S">
-
-<!ENTITY autoMarkAsRead.label             "Automatically mark messages as read">
-<!ENTITY autoMarkAsRead.accesskey         "A">
-<!ENTITY markAsReadNoDelay.label          "Immediately on display">
-<!ENTITY markAsReadNoDelay.accesskey      "o">
-<!-- LOCALIZATION NOTE (markAsReadDelay.label): This will concatenate to
-     "After displaying for [___] seconds",
-     using (markAsReadDelay.label) and a number (secondsLabel.label). -->
-<!ENTITY markAsReadDelay.label            "After displaying for">
-<!ENTITY markAsReadDelay.accesskey        "d">
-<!ENTITY secondsLabel.label               "seconds">
-<!ENTITY openMsgIn.label                  "Open messages in:">
-<!ENTITY openMsgInNewTab.label            "A new tab">
-<!ENTITY openMsgInNewTab.accesskey        "t">
-<!ENTITY reuseExpRadio0.label             "A new message window">
-<!ENTITY reuseExpRadio0.accesskey         "n">
-<!ENTITY reuseExpRadio1.label             "An existing message window">
-<!ENTITY reuseExpRadio1.accesskey         "e">
-<!ENTITY closeMsgOnMoveOrDelete.label     "Close message window/tab on move or delete">
-<!ENTITY closeMsgOnMoveOrDelete.accesskey "C">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/general.dtd
+++ /dev/null
@@ -1,47 +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 messengerStartPage.label         "&brandShortName; Start Page">
-<!ENTITY enableStartPage.label            "When &brandShortName; launches, show the Start Page in the message area">
-<!ENTITY enableStartPage.accesskey        "W">
-<!ENTITY location.label                   "Location:">
-<!ENTITY location1.accesskey               "o">
-<!ENTITY useDefault.label                 "Restore Default">
-<!ENTITY useDefault.accesskey             "R">
-
-<!ENTITY changeDockIconOptions.label      "Change preferences for the app icon">
-<!ENTITY dockOptions.label                "App Icon Options…">
-<!ENTITY dockOptions.accesskey            "n">
-
-<!ENTITY newMessagesArrive.label          "When new messages arrive:">
-<!ENTITY playSound.label                  "Play a sound">
-<!ENTITY playSound1.accesskey             "d">
-<!ENTITY playSoundMac.label               "Play the following sound file:">
-<!ENTITY playSoundMac.accesskey           "d">
-<!ENTITY showAnimatedAlert.label          "Show an alert">
-<!ENTITY showAnimatedAlert.accesskey      "S">
-<!ENTITY notificationAlertSettings2.label "Alerts and the default sound can be disabled on the Notification pane of System Preferences.">
-<!ENTITY customizeMailAlert.label         "Customize…">
-<!ENTITY customizeMailAlert.accesskey     "C">
-
-<!ENTITY showTrayIcon.label               "Show a tray icon">
-<!ENTITY showTrayIcon.accesskey           "t">
-
-<!ENTITY play.label                       "Play">
-<!ENTITY play.accesskey                   "P">
-<!ENTITY systemsound.label                "Default system sound for new mail">
-<!ENTITY systemsound.accesskey            "y">
-<!ENTITY customsound.label                "Use the following sound file">
-<!ENTITY customsound.accesskey            "U">
-<!ENTITY browse.label                     "Browse…">
-<!ENTITY browse.accesskey                 "B">
-
-<!ENTITY defaultSearchEngine.label        "Default Search Engine">
-<!ENTITY addSearchEngine.label            "Add from file">
-<!ENTITY addSearchEngine.accesskey        "A">
-<!ENTITY removeSearchEngine.label         "Remove">
-<!ENTITY removeSearchEngine.accesskey     "v">
-
-<!ENTITY minimizeToTray.label             "When &brandShortName; is minimized, move it to the tray">
-<!ENTITY minimizeToTray.accesskey         "m">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/preferences.dtd
+++ /dev/null
@@ -1,29 +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  windowClose.key                  "w">
-<!ENTITY  preferencesDefaultTitleMac.title "Preferences">
-<!ENTITY  preferencesDefaultTitleWin.title "Options">
-<!ENTITY  preferencesCloseButton.label     "Close">
-<!ENTITY  preferencesCloseButton.accesskey "C">
-
-<!ENTITY  prefWindow.titleWin     "Options">
-<!ENTITY  prefWindow.titleGNOME   "&brandShortName; Preferences">
-<!ENTITY  prefWindow.titleMAC     "Preferences">
-
-<!ENTITY paneGeneral.title        "General">
-<!ENTITY paneDisplay.title        "Display">
-<!ENTITY paneComposition.title    "Composition">
-<!ENTITY paneChat.title           "Chat">
-<!ENTITY paneAttachments.title    "Attachments">
-<!ENTITY panePrivacy.title        "Privacy">
-<!ENTITY panePrivacySecurity.title "Privacy &amp; Security">
-<!ENTITY paneLightning.title      "Calendar">
-<!ENTITY paneAdvanced.title       "Advanced">
-<!ENTITY paneAccount.title        "Accounts">
-
-<!ENTITY addonsButton.label       "Extensions &amp; Themes">
-
-<!ENTITY okButton.title           "OK">
-<!ENTITY okButton.accesskey       "O">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/privacy.dtd
+++ /dev/null
@@ -1,38 +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/. -->
-
-<!-- Mail Content -->
-<!ENTITY captionMailContent.label "Mail Content">
-
-<!ENTITY acceptRemoteContent.label "Allow remote content in messages">
-<!ENTITY acceptRemoteContent.accesskey "m">
-<!ENTITY remoteContentExceptions.label "Exceptions…">
-<!ENTITY remoteContentExceptions.accesskey "x">
-<!ENTITY acceptRemoteContentInfo.label "Learn more about the privacy issues of remote content">
-
-<!-- Web Content -->
-<!ENTITY captionWebContent.label "Web Content">
-
-<!ENTITY keepHistory.label "Remember websites and links I've visited">
-<!ENTITY keepHistory.accesskey "R">
-<!ENTITY acceptCookies.label "Accept cookies from sites">
-<!ENTITY acceptCookies.accesskey "A">
-<!ENTITY acceptThirdParty.pre.label "Accept third-party cookies:">
-<!ENTITY acceptThirdParty.pre.accesskey "c">
-<!ENTITY acceptThirdParty.always.label "Always">
-<!ENTITY acceptThirdParty.never.label "Never">
-<!ENTITY acceptThirdParty.visited.label "From visited">
-<!ENTITY keepUntil.label "Keep until:">
-<!ENTITY keepUntil.accesskey "K">
-<!ENTITY expire.label "they expire">
-<!ENTITY close.label "I close &brandShortName;">
-<!ENTITY askEachTime.label "ask me every time">
-<!ENTITY cookieExceptions.label "Exceptions…">
-<!ENTITY cookieExceptions.accesskey "E">
-<!ENTITY showCookies.label "Show Cookies…">
-<!ENTITY showCookies.accesskey "S">
-
-<!ENTITY doNotTrackCheck.label "Send websites a “Do Not Track” signal that you don’t want to be tracked">
-<!ENTITY doNotTrackCheck.accesskey "n">
-<!ENTITY doNotTrackLearnMore.label "Learn more">
deleted file mode 100644
--- a/mail/locales/en-US/chrome/messenger/preferences/security.dtd
+++ /dev/null
@@ -1,47 +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 itemJunk.label          "Junk">
-<!ENTITY itemPhishing.label      "E-mail Scams">
-<!ENTITY itemPasswords.label     "Passwords">
-<!ENTITY itemAntiVirus.label     "Antivirus">
-
-<!-- Junk Mail Controls -->
-<!ENTITY junkMail.intro "Set your default junk mail settings. Account-specific junk mail settings can be configured in Account Settings.">
-<!ENTITY manualMark.label "When I mark messages as junk:">
-<!ENTITY manualMark.accesskey "W">
-<!ENTITY manualMarkModeMove.label "Move them to the account's &quot;Junk&quot; folder">
-<!ENTITY manualMarkModeMove.accesskey "o">
-<!ENTITY manualMarkModeDelete.label "Delete them">
-<!ENTITY manualMarkModeDelete.accesskey "D">
-<!ENTITY markAsReadOnSpam.label "Mark messages determined to be Junk as read">
-<!ENTITY markAsReadOnSpam.accesskey "M">
-<!ENTITY enableAdaptiveJunkLogging.label "Enable adaptive junk filter logging">
-<!ENTITY enableAdaptiveJunkLogging.accesskey "E">
-<!ENTITY openJunkLog.label "Show log">
-<!ENTITY openJunkLog.accesskey "S">
-<!ENTITY resetTrainingData.label "Reset Training Data">
-<!ENTITY resetTrainingData.accesskey "R">
-
-<!-- Phishing Detector -->
-<!ENTITY phishingDetector1.intro  "&brandShortName; can analyze messages for suspected email scams by looking for common techniques used to deceive you.">
-<!ENTITY enablePhishingDetector1.label    "Tell me if the message I'm reading is a suspected email scam">
-<!ENTITY enablePhishingDetector1.accesskey  "T">
-<!ENTITY useDownloadedList.label "Use a downloaded list of suspected email scams">
-<!ENTITY useDownloadedList.accesskey "U">
-
-<!-- Passwords -->
-<!ENTITY savedPasswords.intro           "&brandShortName; can remember passwords for all of your accounts.">
-<!ENTITY useMasterPassword.label        "Use a master password">
-<!ENTITY useMasterPassword.accesskey    "U">
-<!ENTITY masterPassword.intro           "A Master Password protects all your passwords, but you must enter it once per session.">
-<!ENTITY changeMasterPassword.label     "Change Master Password…">
-<!ENTITY changeMasterPassword.accesskey "C">
-<!ENTITY savedPasswords.label           "Saved Passwords…">
-<!ENTITY savedPasswords.accesskey       "S">
-
-<!-- Anti Virus -->
-<!ENTITY antiVirus.intro      "&brandShortName; can make it easy for antivirus software to analyze incoming mail messages for viruses before they are stored locally.">
-<!ENTITY antiVirus.label      "Allow antivirus clients to quarantine individual incoming messages">
-<!ENTITY antiVirus.accesskey  "A">
--- a/mail/locales/en-US/messenger/preferences/preferences.ftl
+++ b/mail/locales/en-US/messenger/preferences/preferences.ftl
@@ -1,17 +1,41 @@
 # 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/.
 
+close-button =
+    .aria-label = Close
+
+preferences-title =
+    .title = { PLATFORM() ->
+        [windows] Options
+        *[other] Preferences
+    }
 
 pane-general-title = General
 category-general =
     .tooltiptext = { pane-general-title }
 
+pane-compose-title = Composition
+category-compose =
+    .tooltiptext = Composition
+
+pane-privacy-title = Privacy & Security
+category-privacy =
+    .tooltiptext = Privacy & Security
+
+pane-chat-title = Chat
+category-chat =
+    .tooltiptext = Chat
+
+pane-calendar-title = Calendar
+category-calendar =
+    .tooltiptext = Calendar
+
 general-language-and-appearance-header = Language & Appearance
 
 general-incoming-mail-header = Incoming Mails
 
 general-files-and-attachment-header = Files & Attachments
 
 general-tags-header = Tags
 
@@ -79,21 +103,744 @@ update-in-progress-title = Update In Pro
 
 update-in-progress-message = Do you want { -brand-short-name } to continue with this update?
 
 update-in-progress-ok-button = &Discard
 # Continue is the cancel button so pressing escape or using a platform standard
 # method of closing the UI will not discard the update.
 update-in-progress-cancel-button = &Continue
 
+addons-button = Extensions & Themes
+
 ## OS Authentication dialog
 
 # This message can be seen by trying to add a Master Password.
 master-password-os-auth-dialog-message-win = To create a Master Password, enter your Windows login credentials. This helps protect the security of your accounts.
 
 # This message can be seen by trying to add a Master Password.
 # The macOS strings are preceded by the operating system with "Thunderbird is trying to "
 # and includes subtitle of "Enter password for the user "xxx" to allow this." These
 # notes are only valid for English. Please test in your locale.
 master-password-os-auth-dialog-message-macosx = create a Master Password
 
 # Don't change this label.
 master-password-os-auth-dialog-caption = { -brand-full-name }
+
+## General Tab
+
+focus-search-shortcut =
+    .key = f
+focus-search-shortcut-alt =
+    .key = k
+
+general-legend = { -brand-short-name } Start Page
+
+start-page-label =
+    .label = When { -brand-short-name } launches, show the Start Page in the message area
+    .accesskey = W
+
+location-label =
+    .value = Location:
+    .accesskey = o
+restore-default-label =
+    .label = Restore Default
+    .accesskey = R
+
+default-search-engine = Default Search Engine
+add-search-engine =
+    .label = Add from file
+    .accesskey = A
+remove-search-engine =
+    .label = Remove
+    .accesskey = v
+
+minimize-to-tray-label =
+    .label = When { -brand-short-name } is minimized, move it to the tray
+    .accesskey = m
+
+new-message-arrival = When new messages arrive:
+play-sound-label =
+    .label = { PLATFORM() ->
+        [macos] Play the following sound file:
+        *[other] Play a sound
+    }
+    .accesskey = d
+play-button =
+    .label = Play
+    .accesskey = P
+
+change-dock-icon = Change preferences for the app icon
+app-icon-options =
+    .label = App Icon Options…
+    .accesskey = n
+
+notification-settings = Alerts and the default sound can be disabled on the Notification pane of System Preferences.
+
+animated-alert-label =
+    .label = Show an alert
+    .accesskey = S
+customize-alert-label =
+    .label = Customize…
+    .accesskey = C
+
+tray-icon-label =
+    .label = Show a tray icon
+    .accesskey = t
+
+system-sound-label =
+    .label = Default system sound for new mail
+    .accesskey = D
+custom-sound-label =
+    .label = Use the following sound file
+    .accesskey = U
+browse-sound-label =
+    .label = Browse…
+    .accesskey = B
+
+enable-gloda-search-label =
+    .label = Enable Global Search and Indexer
+    .accesskey = G
+
+datetime-formatting-legend = Date and Time Formatting
+language-selector-legend = Language
+
+allow-hw-accel =
+    .label = Use hardware acceleration when available
+    .accesskey = h
+
+store-type-label =
+    .value = Message Store Type for new accounts:
+    .accesskey = T
+
+mbox-store-label =
+    .label = File per folder (mbox)
+maildir-store-label =
+    .label = File per message (maildir)
+
+scrolling-legend = Scrolling
+autoscroll-label =
+    .label = Use autoscrolling
+    .accesskey = U
+smooth-scrolling-label =
+    .label = Use smooth scrolling
+    .accesskey = m
+
+system-integration-legend = System Integration
+always-check-default =
+    .label = Always check to see if { -brand-short-name } is the default mail client on startup
+    .accesskey = A
+check-default-button =
+    .label = Check Now…
+    .accesskey = N
+
+# Note: This is the search engine name for all the different platforms.
+# Platforms that don't support it should be left blank.
+search-engine-name = { PLATFORM() ->
+    [macos] Spotlight
+    [windows] Windows Search
+    *[other] { "" }
+}
+
+search-integration-label =
+    .label = Allow { search-engine-name } to search messages
+    .accesskey = S
+
+config-editor-button =
+    .label = Config Editor…
+    .accesskey = C
+
+return-receipts-description = Determine how { -brand-short-name } handles return receipts
+return-receipts-button =
+    .label = Return Receipts…
+    .accesskey = R
+
+update-app-legend = { -brand-short-name } Updates
+
+allow-description = Allow { -brand-short-name } to
+automatic-updates-label =
+    .label = Automatically install updates (recommended: improved security)
+    .accesskey = A
+check-updates-label =
+    .label = Check for updates, but let me choose whether to install them
+    .accesskey = C
+
+update-history-button =
+    .label = Show Update History
+    .accesskey = p
+
+use-service =
+    .label = Use a background service to install updates
+    .accesskey = b
+
+cross-user-udpate-warning = This setting will apply to all Windows accounts and { -brand-short-name } profiles using this installation of { -brand-short-name }.
+
+networking-legend = Connection
+proxy-config-description = Configure how { -brand-short-name } connects to the Internet
+
+network-settings-button =
+    .label = Settings…
+    .accesskey = S
+
+offline-legend = Offline
+offline-settings = Configure offline settings
+
+offline-settings-button =
+    .label = Offline…
+    .accesskey = O
+
+diskspace-legend = Disk Space
+offline-compact-folder =
+    .label = Compact all folders when it will save over
+    .accesskey = a
+
+compact-folder-size =
+    .value = MB in total
+
+## Note: The entities use-cache-before and use-cache-after appear on a single
+## line in preferences as follows:
+## use-cache-before [ textbox for cache size in MB ] use-cache-after
+use-cache-before =
+    .value = Use up to
+    .accesskey = U
+
+use-cache-after = MB of space for the cache
+
+##
+
+smart-cache-label =
+    .label = Override automatic cache management
+    .accesskey = v
+
+clear-cache-button =
+    .label = Clear Now
+    .accesskey = C
+
+fonts-legend = Fonts & Colors
+
+default-font-label =
+    .value = Default font:
+    .accesskey = D
+
+default-size-label =
+    .value = Size:
+    .accesskey = S
+
+font-options-button =
+    .label = Advanced…
+    .accesskey = A
+
+color-options-button =
+    .label = Colors…
+    .accesskey = C
+
+display-width-legend = Plain Text Messages
+
+# Note : convert-emoticons-label 'Emoticons' are also known as 'Smileys', e.g. :-)
+convert-emoticons-label =
+    .label = Display emoticons as graphics
+    .accesskey = e
+
+display-text-label = When displaying quoted plain text messages:
+
+style-label =
+    .value = Style:
+    .accesskey = y
+
+regular-style-item =
+    .label = Regular
+bold-style-item =
+    .label = Bold
+italic-style-item =
+    .label = Italic
+bold-italic-style-item =
+    .label = Bold Italic
+
+size-label =
+    .value = Size:
+    .accesskey = z
+
+regular-size-item =
+    .label = Regular
+bigger-size-item =
+    .label = Bigger
+smaller-size-item =
+    .label = Smaller
+
+quoted-text-color =
+    .label = Color:
+    .accesskey = o
+
+search-input =
+    .placeholder = Search
+
+type-column-label =
+    .label = Content Type
+    .accesskey = T
+
+action-column-label =
+    .label = Action
+    .accesskey = A
+
+save-to-label =
+    .label = Save files to
+    .accesskey = S
+
+choose-folder-label =
+    .label = { PLATFORM() ->
+        [macos] Choose…
+        *[other] Browse…
+    }
+    .accesskey = { PLATFORM() ->
+        [macos] C
+        *[other] B
+    }
+
+always-ask-label =
+    .label = Always ask me where to save files
+    .accesskey = A
+
+
+display-tags-text = Tags can be used to categorize and prioritize your messages.
+
+new-tag-button =
+    .label = New…
+    .accesskey = N
+
+edit-tag-button =
+    .label = Edit…
+    .accesskey = E
+
+delete-tag-button =
+    .label = Delete
+    .accesskey = D
+
+auto-mark-as-read =
+    .label = Automatically mark messages as read
+    .accesskey = A
+
+mark-read-no-delay =
+    .label = Immediately on display
+    .accesskey = o
+
+## Note: This will concatenate to "After displaying for [___] seconds",
+## using (mark-read-delay) and a number (seconds-label).
+mark-read-delay =
+    .label = After displaying for
+    .accesskey = d
+
+seconds-label = seconds
+
+##
+
+open-msg-label =
+    .value = Open messages in:
+
+open-msg-tab =
+    .label = A new tab
+    .accesskey = t
+
+open-msg-window =
+    .label = A new message window
+    .accesskey = n
+
+open-msg-ex-window =
+    .label = An existing message window
+    .accesskey = e
+
+close-move-delete =
+    .label = Close message window/tab on move or delete
+    .accesskey = C
+
+display-name-label =
+    .value = Display name:
+
+condensed-addresses-label =
+    .label = Show only display name for people in my address book
+    .accesskey = S
+
+## Compose Tab
+
+forward-label =
+    .value = Forward messages:
+    .accesskey = F
+
+inline-label =
+    .label = Inline
+
+as-attachment-label =
+    .label = As Attachment
+
+extension-label =
+    .label = add extension to file name
+    .accesskey = e
+
+## Note: This will concatenate to "Auto Save every [___] minutes",
+## using (auto-save-label) and a number (auto-save-end).
+auto-save-label =
+    .label = Auto Save every
+    .accesskey = A
+
+auto-save-end = minutes
+
+##
+
+warn-on-send-accel-key =
+    .label = Confirm when using keyboard shortcut to send message
+    .accesskey = C
+
+spellcheck-label =
+    .label = Check spelling before sending
+    .accesskey = C
+
+spellcheck-inline-label =
+    .label = Enable spellcheck as you type
+    .accesskey = E
+
+language-popup-label =
+    .value = Language:
+    .accesskey = L
+
+download-dictionaries-link = Download More Dictionaries
+
+font-label =
+    .value = Font:
+    .accesskey = n
+
+font-size-label =
+    .value = Size:
+    .accesskey = z
+
+default-colors-label =
+    .label = Use reader's default colors
+    .accesskey = d
+
+font-color-label =
+    .value = Text Color:
+    .accesskey = T
+
+bg-color-label =
+    .value = Background Color:
+    .accesskey = B
+
+restore-html-label =
+    .label = Restore Defaults
+    .accesskey = R
+
+default-format-label =
+    .label = Use Paragraph format instead of Body Text by default
+    .accesskey = P
+
+format-description = Configure text format behavior
+
+send-options-label =
+    .label = Send Options…
+    .accesskey = S
+
+autocomplete-description = When addressing messages, look for matching entries in:
+
+ab-label =
+    .label = Local Address Books
+    .accesskey = L
+
+directories-label =
+    .label = Directory Server:
+    .accesskey = D
+
+directories-none-label =
+    .none = None
+
+edit-directories-label =
+    .label = Edit Directories…
+    .accesskey = E
+
+email-picker-label =
+    .label = Automatically add outgoing e-mail addresses to my:
+    .accesskey = A
+
+default-directory-label =
+    .value = Default startup directory in the address book window:
+    .accesskey = S
+
+default-last-label =
+    .none = Last used directory
+
+attachment-label =
+    .label = Check for missing attachments
+    .accesskey = m
+
+attachment-options-label =
+    .label = Keywords…
+    .accesskey = K
+
+enable-cloud-share =
+    .label = Offer to share for files larger than
+cloud-share-size =
+    .value = MB
+
+add-cloud-account =
+    .label = Add…
+    .accesskey = A
+    .defaultlabel = Add…
+
+remove-cloud-account =
+    .label = Remove
+    .accesskey = R
+
+find-cloud-providers =
+    .value = Find more providers…
+
+cloud-account-description = Add a new Filelink storage service
+
+
+## Privacy Tab
+
+mail-content = Mail Content
+
+remote-content-label =
+    .label = Allow remote content in messages
+    .accesskey = m
+
+exceptions-button =
+    .label = Exceptions…
+    .accesskey = E
+
+remote-content-info =
+    .value = Learn more about the privacy issues of remote content
+
+web-content = Web Content
+
+history-label =
+    .label = Remember websites and links I've visited
+    .accesskey = R
+
+cookies-label =
+    .label = Accept cookies from sites
+    .accesskey = A
+
+third-party-label =
+    .value = Accept third-party cookies:
+    .accesskey = c
+
+third-party-always =
+    .label = Always
+third-party-never =
+    .label = Never
+third-party-visited =
+    .label = From visited
+
+keep-label =
+    .value = Keep until:
+    .accesskey = K
+
+keep-expire =
+    .label = they expire
+keep-close =
+    .label = I close { -brand-short-name }
+keep-ask =
+    .label = ask me every time
+
+cookies-button =
+    .label = Show Cookies…
+    .accesskey = S
+
+do-not-track-label =
+    .label = Send websites a “Do Not Track” signal that you don’t want to be tracked
+    .accesskey = n
+
+learn-button =
+    .label = Learn more
+
+passwords-description = { -brand-short-name } can remember passwords for all of your accounts.
+
+passwords-button =
+    .label = Saved Passwords…
+    .accesskey = S
+
+master-password-description = A Master Password protects all your passwords, but you must enter it once per session.
+
+master-password-label =
+    .label = Use a master password
+    .accesskey = U
+
+master-password-button =
+    .label = Change Master Password…
+    .accesskey = C
+
+
+junk-description = Set your default junk mail settings. Account-specific junk mail settings can be configured in Account Settings.
+
+junk-label =
+    .label = When I mark messages as junk:
+    .accesskey = W
+
+junk-move-label =
+    .label = Move them to the account's "Junk" folder
+    .accesskey = o
+
+junk-delete-label =
+    .label = Delete them
+    .accesskey = D
+
+junk-read-label =
+    .label = Mark messages determined to be Junk as read
+    .accesskey = M
+
+junk-log-label =
+    .label = Enable adaptive junk filter logging
+    .accesskey = E
+
+junk-log-button =
+    .label = Show log
+    .accesskey = S
+
+reset-junk-button =
+    .label = Reset Training Data
+    .accesskey = R
+
+telemetry-legend = Telemetry
+telemetry-description = Shares performance, usage, hardware and customization data about your e-mail client with { -vendor-short-name } to help us make { -brand-short-name } better
+
+telemetry-label =
+    .label = Enable Telemetry
+    .accesskey = T
+
+learn-label =
+    .value = Learn More
+
+crash-legend = Crash Reporter
+crash-description = { -brand-short-name } submits crash reports to help { -vendor-short-name } make your e-mail client more stable and secure
+
+crash-label =
+    .label = Enable Crash Reporter
+    .accesskey = C
+
+phishing-description = { -brand-short-name } can analyze messages for suspected email scams by looking for common techniques used to deceive you.
+
+phishing-label =
+    .label = Tell me if the message I'm reading is a suspected email scam
+    .accesskey = T
+
+antivirus-description = { -brand-short-name } can make it easy for antivirus software to analyze incoming mail messages for viruses before they are stored locally.
+
+antivirus-label =
+    .label = Allow antivirus clients to quarantine individual incoming messages
+    .accesskey = A
+
+certificate-description = When a server requests my personal certificate:
+
+certificate-auto =
+    .label = Select one automatically
+    .accesskey = S
+
+certificate-ask =
+    .label = Ask me every time
+    .accesskey = A
+
+ocsp-label =
+    .label = Query OCSP responder servers to confirm the current validity of certificates
+    .accesskey = Q
+
+certificate-button =
+    .label = Manage Certificates…
+    .accesskey = M
+
+security-devices-button =
+    .label = Security Devices…
+    .accesskey = D
+
+## Chat Tab
+
+startup-label =
+    .value = When { -brand-short-name } starts:
+    .accesskey = s
+
+offline-label =
+    .label = Keep my Chat Accounts offline
+
+auto-connect-label =
+    .label = Connect my chat accounts automatically
+
+## Note: idle-label is displayed first, then there's a field where the user
+## can enter a number, and itemTime is displayed at the end of the line.
+## The translations of the idle-label and idle-time-label parts don't have
+## to mean the exact same thing as in English; please try instead to
+## translate the whole sentence.
+idle-label =
+    .label = Let my contacts know that I am Idle after
+    .accesskey = I
+
+idle-time-label = minutes of inactivity
+
+##
+
+away-message-label =
+    .label = and set my status to Away with this status message:
+    .accesskey = A
+
+send-typing-label =
+    .label = Send typing notifications in conversations
+    .accesskey = t
+
+notification-label = When messages directed at you arrive:
+
+show-notification-label =
+    .label = Show a notification:
+    .accesskey = c
+
+notification-all =
+    .label = with sender's name and message preview
+notification-name =
+    .label = with sender's name only
+notification-empty =
+    .label = without any info
+
+notification-type-label =
+    .label = { PLATFORM() ->
+        [macos] Animate dock icon
+        *[other] Flash the taskbar item
+    }
+    .accesskey = { PLATFORM() ->
+        [macos] o
+        *[other] F
+    }
+
+sound-label =
+    .label = Play a sound
+    .accesskey = d
+
+play-button =
+    .label = Play
+    .accesskey = P
+
+custom-sound-label =
+    .label = Use the following sound file
+    .accesskey = U
+
+browse-sound-button =
+    .label = Browse…
+    .accesskey = B
+
+theme-label =
+    .value = Theme:
+    .accesskey = T
+
+style-thunderbird =
+    .label = Thunderbird
+style-bubbles =
+    .label = Bubbles
+style-dark =
+    .label = Dark
+style-paper =
+    .label = Paper Sheets
+style-simple =
+    .label = Simple
+
+preview-label = Preview:
+no-preview-label = No preview available
+no-preview-description = This theme is not valid or is currently unavailable (disabled addon, safe-mode, …).
+
+chat-variant-label =
+    .value = Variant:
+    .accesskey = V
+
+chat-header-label =
+    .label = Show Header
+    .accesskey = H
--- a/mail/locales/jar.mn
+++ b/mail/locales/jar.mn
@@ -172,34 +172,26 @@
   locale/@AB_CD@/messenger/messengercompose/EditorReplace.dtd           (%chrome/messenger/messengercompose/EditorReplace.dtd)
   locale/@AB_CD@/messenger/messengercompose/EditorSpellCheck.dtd        (%chrome/messenger/messengercompose/EditorSpellCheck.dtd)
   locale/@AB_CD@/messenger/messengercompose/EditorPersonalDictionary.dtd (%chrome/messenger/messengercompose/EditorPersonalDictionary.dtd)
   locale/@AB_CD@/messenger/messengercompose/EditorTableProperties.dtd   (%chrome/messenger/messengercompose/EditorTableProperties.dtd)
   locale/@AB_CD@/messenger/messengercompose/EdNamedAnchorProperties.dtd (%chrome/messenger/messengercompose/EdNamedAnchorProperties.dtd)
   locale/@AB_CD@/messenger/messengercompose/EdDialogOverlay.dtd         (%chrome/messenger/messengercompose/EdDialogOverlay.dtd)
   locale/@AB_CD@/messenger/messengercompose/EdAdvancedEdit.dtd          (%chrome/messenger/messengercompose/EdAdvancedEdit.dtd)
   locale/@AB_CD@/messenger/messengercompose/EdConvertToTable.dtd        (%chrome/messenger/messengercompose/EdConvertToTable.dtd)
-  locale/@AB_CD@/messenger/preferences/preferences.dtd                  (%chrome/messenger/preferences/preferences.dtd)
-  locale/@AB_CD@/messenger/preferences/general.dtd                      (%chrome/messenger/preferences/general.dtd)
   #ifdef XP_MACOSX
   locale/@AB_CD@/messenger/preferences/dockoptions.dtd                  (%chrome/messenger/preferences/dockoptions.dtd)
   #endif
-  locale/@AB_CD@/messenger/preferences/display.dtd                      (%chrome/messenger/preferences/display.dtd)
   locale/@AB_CD@/messenger/preferences/colors.dtd                       (%chrome/messenger/preferences/colors.dtd)
-  locale/@AB_CD@/messenger/preferences/chat.dtd                         (%chrome/messenger/preferences/chat.dtd)
   locale/@AB_CD@/messenger/preferences/messagestyle.properties          (%chrome/messenger/preferences/messagestyle.properties)
-  locale/@AB_CD@/messenger/preferences/compose.dtd                      (%chrome/messenger/preferences/compose.dtd)
-  locale/@AB_CD@/messenger/preferences/privacy.dtd                      (%chrome/messenger/preferences/privacy.dtd)
   locale/@AB_CD@/messenger/preferences/sendoptions.dtd                  (%chrome/messenger/preferences/sendoptions.dtd)
-  locale/@AB_CD@/messenger/preferences/security.dtd                     (%chrome/messenger/preferences/security.dtd)
   locale/@AB_CD@/messenger/preferences/advanced.dtd                     (%chrome/messenger/preferences/advanced.dtd)
   locale/@AB_CD@/messenger/preferences/attachmentReminder.dtd           (%chrome/messenger/preferences/attachmentReminder.dtd)
   locale/@AB_CD@/messenger/preferences/receipts.dtd                     (%chrome/messenger/preferences/receipts.dtd)
   locale/@AB_CD@/messenger/preferences/connection.dtd                   (%chrome/messenger/preferences/connection.dtd)
-  locale/@AB_CD@/messenger/preferences/applications.dtd                 (%chrome/messenger/preferences/applications.dtd)
   locale/@AB_CD@/messenger/preferences/applications.properties          (%chrome/messenger/preferences/applications.properties)
   locale/@AB_CD@/messenger/preferences/applicationManager.dtd           (%chrome/messenger/preferences/applicationManager.dtd)
   locale/@AB_CD@/messenger/preferences/applicationManager.properties    (%chrome/messenger/preferences/applicationManager.properties)
   locale/@AB_CD@/messenger/preferences/fonts.dtd                        (%chrome/messenger/preferences/fonts.dtd)
   locale/@AB_CD@/messenger/preferences/offline.dtd                      (%chrome/messenger/preferences/offline.dtd)
 #ifndef XP_MACOSX
   locale/@AB_CD@/messenger/preferences/notifications.dtd                (%chrome/messenger/preferences/notifications.dtd)
 #endif
--- a/mail/test/browser/shared-modules/PrefTabHelpers.jsm
+++ b/mail/test/browser/shared-modules/PrefTabHelpers.jsm
@@ -17,20 +17,20 @@ var fdh = ChromeUtils.import(
   "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
 );
 var cth = ChromeUtils.import(
   "resource://testing-common/mozmill/ContentTabHelpers.jsm"
 );
 
 /**
  * Open the preferences tab with the given pane displayed. The pane needs to
- * be one of the prefpane ids in mail/components/preferences/aboutPreferences.xhtml.
+ * be one of the prefpane ids in mail/components/preferences/preferences.xhtml.
  *
  * @param aPaneID The ID of the pref pane to display (see
- *     mail/components/preferences/aboutPreferences.xhtml for valid IDs.)
+ *     mail/components/preferences/preferences.xhtml for valid IDs.)
  */
 function open_pref_tab(aPaneID, aScrollTo) {
   let tab = cth.open_content_tab_with_click(
     function() {
       fdh.mc.window.openOptionsDialog(aPaneID, aScrollTo);
     },
     "about:preferences",
     fdh.mc,
--- a/mail/themes/linux/mail/preferences/preferences.css
+++ b/mail/themes/linux/mail/preferences/preferences.css
@@ -1,24 +1,21 @@
 /* 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/. */
 
 @import url("chrome://messenger/skin/shared/preferences/preferences.css");
 @namespace html "http://www.w3.org/1999/xhtml";
 
 .dialogBox,
-#MailPreferences prefpane {
+#MailPreferences prefpane,
+#categories {
   font-size: 1.11em;
 }
 
-radio[pane] > .radio-label-box {
-  font-size: 1.2em;
-}
-
 .treecol-sortdirection {
   /* override the Linux only toolkit rule */
   -moz-appearance: none;
 }
 
 menulist.actionsMenu::part(dropmarker) {
   margin-block: 11px;
 }
--- a/mail/themes/osx/mail/preferences/preferences.css
+++ b/mail/themes/osx/mail/preferences/preferences.css
@@ -1,28 +1,21 @@
 /* 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/. */
 
 @import url("chrome://messenger/skin/shared/preferences/preferences.css");
 @namespace html "http://www.w3.org/1999/xhtml";
 
 .dialogBox,
-#MailPreferences prefpane {
+#MailPreferences prefpane,
+#categories {
   font-size: 1.36em;
 }
 
-radio[pane] > .radio-label-box {
-  font-size: 1.46em;
-}
-
-radio[pane][focused="true"] > .radio-check {
-  outline: none;
-}
-
 html|h2 {
   border-bottom-width: 0;
   padding-bottom: 2px !important;
   padding-inline-start: 0;
 }
 
 html|legend {
   margin: 0;
@@ -36,24 +29,16 @@ html|input[type="number"]::-moz-number-s
 html|input[type="number"]::-moz-number-spin-down {
   min-height: 11px;
 }
 
 menulist:not([popuponly="true"]) {
   min-height: 30px;
 }
 
-radio[pane] {
-  text-shadow: none;
-}
-
-radio[pane][selected] {
-  border-image: none;
-}
-
 .actionsMenu::part(icon) {
   margin-top: 2px;
 }
 
 .sidebar-footer-label {
   font-size: 1.224em;
 }
 
--- a/mail/themes/shared/mail/preferences/applications.css
+++ b/mail/themes/shared/mail/preferences/applications.css
@@ -4,17 +4,17 @@
 
 /**
  * Line up the actions menu with action labels above and below it.
  * Equalize the distance from the left side of the action box to the left side
  * of the icon for both the menu and the non-menu versions of the action box.
  * Also make sure the labels are the same distance away from the icons.
  */
 
-#handlersView > richlistitem {
+#preferencesContainer #handlersView > richlistitem {
   min-height: 36px;
   padding: 0;
 }
 
 richlistitem[appHandlerIcon="ask"],
 menuitem[appHandlerIcon="ask"] {
   list-style-image: url("chrome://messenger/skin/preferences/alwaysAsk.png");
 }
--- a/mail/themes/shared/mail/preferences/preferences.css
+++ b/mail/themes/shared/mail/preferences/preferences.css
@@ -114,16 +114,21 @@ tabpanel > hbox > description {
 #defaultWebSearch::part(icon) {
   margin-inline: 5px 8px;
   width: 16px;
   height: 16px;
 }
 
 /* Category List */
 
+#categories {
+  overflow: visible !important; /* Cancel scrollbar and do not clip overflow content when window size goes very small */
+  padding: 1px; /* Adding padding around richlistitem in order to make entire keyboard focusing outline visible */
+}
+
 .paneSelector {
   padding: 71px 0 0;
   margin: 0;
 }
 
 radio[pane] {
   -moz-box-orient: horizontal;
   -moz-box-align: center;
@@ -225,33 +230,33 @@ radio[pane][selected] > .radio-check {
     margin-inline-end: 35px;
   }
 
   #preferencesContainer {
     padding-inline: 15px;
   }
 }
 
-radio[pane=paneGeneral] > .radio-check {
+#category-general > .category-icon {
   list-style-image: url("chrome://messenger/skin/shared/preferences/general.svg");
 }
 
-radio[pane=panePrivacy] > .radio-check {
+#category-privacy > .category-icon {
   list-style-image: url("chrome://messenger/skin/shared/preferences/security.svg");
 }
 
-radio[pane=paneCompose] > .radio-check {
+#category-compose > .category-icon {
   list-style-image: url("chrome://messenger/skin/icons/newmsg.svg");
 }
 
-radio[pane=paneChat] > .radio-check {
+#category-chat > .category-icon {
   list-style-image: url("chrome://messenger/skin/shared/preferences/chat.svg");
 }
 
-radio[pane=paneLightning] > .radio-check {
+#category-calendar > .category-icon {
   list-style-image: url("chrome://messenger/skin/shared/preferences/calendar.svg");
 }
 
 html|input[type="number"] {
   margin-inline-start: 4px;
   padding: 1px;
 }
 /* sizes: chars + 8px padding + 1px borders + spin buttons 25+2+10px  */
@@ -413,40 +418,40 @@ html|input.indent {
 #monospace {
   min-width: 30ch;
 }
 
 /**
  * toolkit element overrides
  */
 
-richlistbox {
+#preferencesContainer richlistbox {
   -moz-appearance: none;
   background-color: var(--in-content-box-background);
   color: var(--in-content-text-color);
 }
 
-richlistbox richlistitem {
+#preferencesContainer richlistbox richlistitem {
   padding: 0.3em;
   margin: 0;
   border: none;
   border-radius: 0;
   background-image: none;
 }
 
-richlistbox richlistitem:hover {
+#preferencesContainer richlistbox richlistitem:hover {
   background-color: var(--in-content-item-hover);
 }
 
-richlistitem[selected="true"] {
+#preferencesContainer richlistitem[selected="true"] {
   background-color: var(--in-content-item-selected-unfocused);
   color: inherit;
 }
 
-richlistbox:focus > richlistitem[selected="true"] {
+#preferencesContainer richlistbox:focus > richlistitem[selected="true"] {
   background-color: var(--in-content-item-selected);
   color: var(--in-content-selected-text) !important;
 }
 
 #defaultWebSearch {
   margin-inline: 0 4px;
 }
 
--- a/mail/themes/windows/mail/preferences/preferences.css
+++ b/mail/themes/windows/mail/preferences/preferences.css
@@ -1,24 +1,21 @@
 /* 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/. */
 
 @import url("chrome://messenger/skin/shared/preferences/preferences.css");
 @namespace html "http://www.w3.org/1999/xhtml";
 
 .dialogBox,
-#MailPreferences prefpane {
+#MailPreferences prefpane,
+#categories {
   font-size: 1.25em;
 }
 
-radio[pane] > .radio-label-box {
-  font-size: 1.34em;
-}
-
 html|fieldset {
   border-style: none;
 }
 
 html|legend {
   padding-inline: 0;
   background-color: transparent;
 }
new file mode 100644
--- /dev/null
+++ b/python/l10n/tb_fluent_migrations/bug_1615501_preferences.py
@@ -0,0 +1,1098 @@
+# 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.helpers import transforms_from
+from fluent.migrate import CONCAT, REPLACE
+from fluent.migrate.helpers import COPY, TERM_REFERENCE, MESSAGE_REFERENCE
+
+def migrate(ctx):
+    """Bug 1615501 - Fluent migration recipe for Preferences Tab, part {index}."""
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+close-button =
+    .aria-label = { COPY(from_path, "preferencesCloseButton.label") }
+preferences-title =
+    .title = { PLATFORM() ->
+        [windows] { COPY(from_path, "prefWindow.titleWin") }
+        *[other] { COPY(from_path, "prefWindow.titleMAC") }
+    }
+pane-compose-title = { COPY(from_path, "paneComposition.title") }
+category-compose =
+    .tooltiptext = { COPY(from_path, "paneComposition.title") }
+pane-privacy-title = { COPY(from_path, "panePrivacySecurity.title") }
+category-privacy =
+    .tooltiptext = { COPY(from_path, "panePrivacySecurity.title") }
+pane-chat-title = { COPY(from_path, "paneChat.title") }
+category-chat =
+    .tooltiptext = { COPY(from_path, "paneChat.title") }
+addons-button = { COPY(from_path, "addonsButton.label") }
+""", from_path="mail/chrome/messenger/preferences/preferences.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+pane-calendar-title = { COPY(from_path, "lightning.preferencesLabel") }
+category-calendar =
+    .tooltiptext = { COPY(from_path, "lightning.preferencesLabel") }
+""", from_path="calendar/chrome/lightning/lightning.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+location-label =
+    .value = { COPY(from_path, "location.label") }
+    .accesskey = { COPY(from_path, "location1.accesskey") }
+restore-default-label =
+    .label = { COPY(from_path, "useDefault.label") }
+    .accesskey = { COPY(from_path, "useDefault.accesskey") }
+
+default-search-engine = { COPY(from_path, "defaultSearchEngine.label") }
+add-search-engine =
+    .label = { COPY(from_path, "addSearchEngine.label") }
+    .accesskey = { COPY(from_path, "addSearchEngine.accesskey") }
+remove-search-engine =
+    .label = { COPY(from_path, "removeSearchEngine.label") }
+    .accesskey = { COPY(from_path, "removeSearchEngine.accesskey") }
+
+new-message-arrival = { COPY(from_path, "newMessagesArrive.label") }
+play-sound-label =
+    .label = { PLATFORM() ->
+        [macos] { COPY(from_path, "playSoundMac.label") }
+        *[other] { COPY(from_path, "playSound.label") }
+    }
+    .accesskey = { COPY(from_path, "playSound1.accesskey") }
+play-button =
+    .label = { COPY(from_path, "play.label") }
+    .accesskey = { COPY(from_path, "play.accesskey") }
+
+change-dock-icon = { COPY(from_path, "changeDockIconOptions.label") }
+app-icon-options =
+    .label = { COPY(from_path, "dockOptions.label") }
+    .accesskey = { COPY(from_path, "dockOptions.accesskey") }
+
+notification-settings = { COPY(from_path, "notificationAlertSettings2.label") }
+
+animated-alert-label =
+    .label = { COPY(from_path, "showAnimatedAlert.label") }
+    .accesskey = { COPY(from_path, "showAnimatedAlert.accesskey") }
+customize-alert-label =
+    .label = { COPY(from_path, "customizeMailAlert.label") }
+    .accesskey = { COPY(from_path, "customizeMailAlert.accesskey") }
+
+tray-icon-label =
+    .label = { COPY(from_path, "showTrayIcon.label") }
+    .accesskey = { COPY(from_path, "showTrayIcon.accesskey") }
+
+custom-sound-label =
+    .label = { COPY(from_path, "customsound.label") }
+    .accesskey = { COPY(from_path, "customsound.accesskey") }
+browse-sound-label =
+    .label = { COPY(from_path, "browse.label") }
+    .accesskey = { COPY(from_path, "browse.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/general.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("general-legend"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/general.dtd",
+                    "messengerStartPage.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("start-page-label"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/general.dtd",
+                            "enableStartPage.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/general.dtd",
+                            "enableStartPage.accesskey"
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id = FTL.Identifier("minimize-to-tray-label"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/general.dtd",
+                            "minimizeToTray.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/general.dtd",
+                            "minimizeToTray.accesskey"
+                        )
+                    )
+                ]
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+enable-gloda-search-label =
+    .label = { COPY(from_path, "enableGlodaSearch.label") }
+    .accesskey = { COPY(from_path, "enableGlodaSearch.accesskey") }
+
+datetime-formatting-legend = { COPY(from_path, "dateTimeFormatting.label") }
+language-selector-legend = { COPY(from_path, "languageSelector.label") }
+
+allow-hw-accel =
+    .label = { COPY(from_path, "allowHWAccel.label") }
+    .accesskey = { COPY(from_path, "allowHWAccel.accesskey") }
+
+store-type-label =
+    .value = { COPY(from_path, "storeType.label") }
+    .accesskey = { COPY(from_path, "storeType.accesskey") }
+
+mbox-store-label =
+    .label = { COPY(from_path, "mboxStore2.label") }
+maildir-store-label =
+    .label = { COPY(from_path, "maildirStore.label") }
+
+scrolling-legend = { COPY(from_path, "scrolling.label") }
+autoscroll-label =
+    .label = { COPY(from_path, "useAutoScroll.label") }
+    .accesskey = { COPY(from_path, "useAutoScroll.accesskey") }
+smooth-scrolling-label =
+    .label = { COPY(from_path, "useSmoothScrolling.label") }
+    .accesskey = { COPY(from_path, "useSmoothScrolling.accesskey") }
+
+system-integration-legend = { COPY(from_path, "systemIntegration.label") }
+check-default-button =
+    .label = { COPY(from_path, "checkDefaultsNow.label") }
+    .accesskey = { COPY(from_path, "checkDefaultsNow.accesskey") }
+
+search-engine-name = { PLATFORM() ->
+    [macos] { COPY("mail/chrome/messenger/searchIntegrationMac.dtd", "searchIntegration.engineName") }
+    [windows] { COPY("mail/chrome/messenger/searchIntegrationWin.dtd", "searchIntegration.engineName") }
+    *[other] { COPY("mail/chrome/messenger/searchIntegrationDefault.dtd", "searchIntegration.engineName") }
+}
+
+config-editor-button =
+    .label = { COPY(from_path, "configEdit.label") }
+    .accesskey = { COPY(from_path, "configEdit.accesskey") }
+
+return-receipts-button =
+    .label = { COPY(from_path, "showReturnReceipts.label") }
+    .accesskey = { COPY(from_path, "showReturnReceipts.accesskey") }
+
+automatic-updates-label =
+    .label = { COPY(from_path, "updateAuto.label") }
+    .accesskey = { COPY(from_path, "updateAuto.accesskey") }
+
+check-updates-label =
+    .label = { COPY(from_path, "updateCheck.label") }
+    .accesskey = { COPY(from_path, "updateCheck.accesskey") }
+
+update-history-button =
+    .label = { COPY(from_path, "updateHistory.label") }
+    .accesskey = { COPY(from_path, "updateHistory.accesskey") }
+
+use-service =
+    .label = { COPY(from_path, "useService.label") }
+    .accesskey = { COPY(from_path, "useService.accesskey") }
+
+network-settings-button =
+    .label = { COPY(from_path, "showSettings.label") }
+    .accesskey = { COPY(from_path, "showSettings.accesskey") }
+
+networking-legend = { COPY(from_path, "connectionsInfo.caption") }
+offline-legend = { COPY(from_path, "offlineInfo.caption") }
+offline-settings = { COPY(from_path, "offlineInfo.label") }
+
+offline-settings-button =
+    .label = { COPY(from_path, "showOffline.label") }
+    .accesskey = { COPY(from_path, "showOffline.accesskey") }
+
+diskspace-legend = { COPY(from_path, "Diskspace") }
+
+offline-compact-folder =
+    .label = { COPY(from_path, "offlineCompactFolders.label") }
+    .accesskey = { COPY(from_path, "offlineCompactFolders.accesskey") }
+
+compact-folder-size =
+    .value = { COPY(from_path, "offlineCompactFoldersMB.label") }
+
+use-cache-before =
+    .value = { COPY(from_path, "useCacheBefore.label") }
+    .accesskey = { COPY(from_path, "useCacheBefore.accesskey") }
+
+use-cache-after = { COPY(from_path, "useCacheAfter.label") }
+
+smart-cache-label =
+    .label = { COPY(from_path, "overrideSmartCacheSize.label") }
+    .accesskey = { COPY(from_path, "overrideSmartCacheSize.accesskey") }
+
+clear-cache-button =
+    .label = { COPY(from_path, "clearCacheNow.label") }
+    .accesskey = { COPY(from_path, "clearCacheNow.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/advanced.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("return-receipts-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "returnReceiptsInfo.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("update-app-legend"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "updateApp2.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("allow-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "updateAppAllow.description",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("cross-user-udpate-warning"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "updateCrossUserSettingWarning.description",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("proxy-config-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "proxiesConfigure.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("always-check-default"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "alwaysCheckDefault.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "alwaysCheckDefault.accesskey"
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id = FTL.Identifier("search-integration-label"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "searchIntegration.label",
+                            {
+                                "&searchIntegration.engineName;": MESSAGE_REFERENCE("search-engine-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "searchIntegration.accesskey"
+                        )
+                    )
+                ]
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+focus-search-shortcut =
+    .key = { COPY(from_path, "focusSearch1.key") }
+focus-search-shortcut-alt =
+    .key = { COPY(from_path, "focusSearch2.key") }
+
+search-input =
+    .placeholder = { COPY(from_path, "filter.placeholder") }
+
+type-column-label =
+    .label = { COPY(from_path, "typeColumn.label") }
+    .accesskey = { COPY(from_path, "typeColumn.accesskey") }
+
+action-column-label =
+    .label = { COPY(from_path, "actionColumn2.label") }
+    .accesskey = { COPY(from_path, "actionColumn2.accesskey") }
+
+save-to-label =
+    .label = { COPY(from_path, "saveTo.label") }
+    .accesskey = { COPY(from_path, "saveTo.accesskey") }
+
+choose-folder-label =
+    .label = { PLATFORM() ->
+        [macos] { COPY(from_path, "chooseFolderMac.label") }
+        *[other] { COPY(from_path, "chooseFolderWin.label") }
+    }
+    .accesskey = { PLATFORM() ->
+        [macos] { COPY(from_path, "chooseFolderMac.accesskey") }
+        *[other] { COPY(from_path, "chooseFolderWin.accesskey") }
+    }
+
+always-ask-label =
+    .label = { COPY(from_path, "alwaysAsk.label") }
+    .accesskey = { COPY(from_path, "alwaysAsk.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/applications.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+fonts-legend = { COPY(from_path, "fontsAndColors1.label") }
+
+default-font-label =
+    .value = { COPY(from_path, "defaultFont.label") }
+    .accesskey = { COPY(from_path, "defaultFont.accesskey") }
+
+default-size-label =
+    .value = { COPY(from_path, "defaultSize.label") }
+    .accesskey = { COPY(from_path, "defaultSize.accesskey") }
+
+font-options-button =
+    .label = { COPY(from_path, "fontOptions.label") }
+    .accesskey = { COPY(from_path, "fontOptions.accesskey") }
+
+color-options-button =
+    .label = { COPY(from_path, "colorButton.label") }
+    .accesskey = { COPY(from_path, "colorButton.accesskey") }
+
+display-width-legend = { COPY(from_path, "displayWidth.label") }
+
+convert-emoticons-label =
+    .label = { COPY(from_path, "convertEmoticons.label") }
+    .accesskey = { COPY(from_path, "convertEmoticons.accesskey") }
+
+display-text-label = { COPY(from_path, "displayText.label") }
+
+style-label =
+    .value = { COPY(from_path, "style.label") }
+    .accesskey = { COPY(from_path, "style.accesskey") }
+
+regular-style-item =
+    .label = { COPY(from_path, "regularStyle.label") }
+bold-style-item =
+    .label = { COPY(from_path, "bold.label") }
+italic-style-item =
+    .label = { COPY(from_path, "italic.label") }
+bold-italic-style-item =
+    .label = { COPY(from_path, "boldItalic.label") }
+
+size-label =
+    .value = { COPY(from_path, "size.label") }
+    .accesskey = { COPY(from_path, "size.accesskey") }
+
+regular-size-item =
+    .label = { COPY(from_path, "regularSize.label") }
+bigger-size-item =
+    .label = { COPY(from_path, "bigger.label") }
+smaller-size-item =
+    .label = { COPY(from_path, "smaller.label") }
+
+quoted-text-color =
+    .label = { COPY(from_path, "quotedTextColor.label") }
+    .accesskey = { COPY(from_path, "quotedTextColor.accesskey") }
+
+display-tags-text = { COPY(from_path, "displayTagsText.label") }
+
+new-tag-button =
+    .label = { COPY(from_path, "newTagButton.label") }
+    .accesskey = { COPY(from_path, "newTagButton.accesskey") }
+
+edit-tag-button =
+    .label = { COPY(from_path, "editTagButton1.label") }
+    .accesskey = { COPY(from_path, "editTagButton1.accesskey") }
+
+delete-tag-button =
+    .label = { COPY(from_path, "removeTagButton.label") }
+    .accesskey = { COPY(from_path, "removeTagButton.accesskey") }
+
+auto-mark-as-read =
+    .label = { COPY(from_path, "autoMarkAsRead.label") }
+    .accesskey = { COPY(from_path, "autoMarkAsRead.accesskey") }
+
+mark-read-no-delay =
+    .label = { COPY(from_path, "markAsReadNoDelay.label") }
+    .accesskey = { COPY(from_path, "markAsReadNoDelay.accesskey") }
+
+mark-read-delay =
+    .label = { COPY(from_path, "markAsReadDelay.label") }
+    .accesskey = { COPY(from_path, "markAsReadDelay.accesskey") }
+
+seconds-label = { COPY(from_path, "secondsLabel.label") }
+
+open-msg-label =
+    .value = { COPY(from_path, "openMsgIn.label") }
+
+open-msg-tab =
+    .label = { COPY(from_path, "openMsgInNewTab.label") }
+    .accesskey = { COPY(from_path, "openMsgInNewTab.accesskey") }
+
+open-msg-window =
+    .label = { COPY(from_path, "reuseExpRadio0.label") }
+    .accesskey = { COPY(from_path, "reuseExpRadio0.accesskey") }
+
+open-msg-ex-window =
+    .label = { COPY(from_path, "reuseExpRadio1.label") }
+    .accesskey = { COPY(from_path, "reuseExpRadio1.accesskey") }
+
+close-move-delete =
+    .label = { COPY(from_path, "closeMsgOnMoveOrDelete.label") }
+    .accesskey = { COPY(from_path, "closeMsgOnMoveOrDelete.accesskey") }
+
+display-name-label =
+    .value = { COPY(from_path, "displayName.label") }
+
+condensed-addresses-label =
+    .label = { COPY(from_path, "showCondensedAddresses.label") }
+    .accesskey = { COPY(from_path, "showCondensedAddresses.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/display.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("return-receipts-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "returnReceiptsInfo.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("always-check-default"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "alwaysCheckDefault.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/advanced.dtd",
+                            "alwaysCheckDefault.accesskey"
+                        )
+                    )
+                ]
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+forward-label =
+    .value = { COPY(from_path, "forwardMsg.label") }
+    .accesskey = { COPY(from_path, "forwardMsg.accesskey") }
+
+inline-label =
+    .label = { COPY(from_path, "inline.label") }
+
+as-attachment-label =
+    .label = { COPY(from_path, "asAttachment.label") }
+
+extension-label =
+    .label = { COPY(from_path, "addExtension.label") }
+    .accesskey = { COPY(from_path, "addExtension.accesskey") }
+
+auto-save-label =
+    .label = { COPY(from_path, "autoSave.label") }
+    .accesskey = { COPY(from_path, "autoSave.accesskey") }
+
+auto-save-end = { COPY(from_path, "autoSaveEnd.label") }
+
+warn-on-send-accel-key =
+    .label = { COPY(from_path, "warnOnSendAccelKey.label") }
+    .accesskey = { COPY(from_path, "warnOnSendAccelKey.accesskey") }
+
+spellcheck-label =
+    .label = { COPY(from_path, "spellCheck.label") }
+    .accesskey = { COPY(from_path, "spellCheck.accesskey") }
+
+spellcheck-inline-label =
+    .label = { COPY(from_path, "spellCheckInline.label") }
+    .accesskey = { COPY(from_path, "spellCheckInline1.accesskey") }
+
+language-popup-label =
+    .value = { COPY(from_path, "languagePopup.label") }
+    .accesskey = { COPY(from_path, "languagePopup.accessKey") }
+
+download-dictionaries-link = { COPY(from_path, "downloadDictionaries.label") }
+
+font-label =
+    .value = { COPY(from_path, "font.label") }
+    .accesskey = { COPY(from_path, "font.accesskey") }
+
+font-size-label =
+    .value = { COPY(from_path, "fontSize.label") }
+    .accesskey = { COPY(from_path, "fontSize.accesskey") }
+
+default-colors-label =
+    .label = { COPY(from_path, "useReaderDefaults.label") }
+    .accesskey = { COPY(from_path, "useReaderDefaults.accesskey") }
+
+font-color-label =
+    .value = { COPY(from_path, "fontColor.label") }
+    .accesskey = { COPY(from_path, "fontColor.accesskey") }
+
+bg-color-label =
+    .value = { COPY(from_path, "bgColor.label") }
+    .accesskey = { COPY(from_path, "bgColor.accesskey") }
+
+restore-html-label =
+    .label = { COPY(from_path, "restoreHTMLDefaults.label") }
+    .accesskey = { COPY(from_path, "restoreHTMLDefaults.accesskey") }
+
+default-format-label =
+    .label = { COPY(from_path, "defaultToParagraph.label") }
+    .accesskey = { COPY(from_path, "defaultToParagraph.accesskey") }
+
+format-description = { COPY(from_path, "sendOptionsDescription.label") }
+
+send-options-label =
+    .label = { COPY(from_path, "sendOptions.label") }
+    .accesskey = { COPY(from_path, "sendOptions.accesskey") }
+
+autocomplete-description = { COPY(from_path, "autocompleteText.label") }
+
+ab-label =
+    .label = { COPY(from_path, "addressingEnable.label") }
+    .accesskey = { COPY(from_path, "addressingEnable.accesskey") }
+
+directories-label =
+    .label = { COPY(from_path, "directories.label") }
+    .accesskey = { COPY(from_path, "directories.accesskey") }
+
+directories-none-label =
+    .none = { COPY(from_path, "directoriesNone.label") }
+
+edit-directories-label =
+    .label = { COPY(from_path, "editDirectories.label") }
+    .accesskey = { COPY(from_path, "editDirectories.accesskey") }
+
+email-picker-label =
+    .label = { COPY(from_path, "emailCollectionPicker.label") }
+    .accesskey = { COPY(from_path, "emailCollectionPicker.accesskey") }
+
+default-directory-label =
+    .value = { COPY(from_path, "showAsDefault.label") }
+    .accesskey = { COPY(from_path, "showAsDefault.accesskey") }
+
+default-last-label =
+    .none = { COPY(from_path, "showAsDefaultLast.label") }
+
+attachment-label =
+    .label = { COPY(from_path, "attachmentReminder.label") }
+    .accesskey = { COPY(from_path, "attachmentReminder.accesskey") }
+
+attachment-options-label =
+    .label = { COPY(from_path, "attachmentReminderOptions.label") }
+    .accesskey = { COPY(from_path, "attachmentReminderOptions.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/compose.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+enable-cloud-share =
+    .label = { COPY(from_path, "enableCloudFileAccountOffer.label") }
+cloud-share-size =
+    .value = { COPY(from_path, "enableCloudFileAccountOffer.mb") }
+
+add-cloud-account =
+    .label = { COPY(from_path, "addCloudFileAccount1.label") }
+    .accesskey = { COPY(from_path, "addCloudFileAccount1.accesskey") }
+    .defaultlabel = { COPY(from_path, "addCloudFileAccount1.label") }
+
+remove-cloud-account =
+    .label = { COPY(from_path, "removeCloudFileAccount.label") }
+    .accesskey = { COPY(from_path, "removeCloudFileAccount.accesskey") }
+
+find-cloud-providers =
+    .value = { COPY(from_path, "findCloudFileProviders.label") }
+
+cloud-account-description = { COPY(from_path, "addCloudFileAccount.description") }
+""", from_path="mail/chrome/messenger/preferences/applications.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+mail-content = { COPY(from_path, "captionMailContent.label") }
+
+remote-content-label =
+    .label = { COPY(from_path, "acceptRemoteContent.label") }
+    .accesskey = { COPY(from_path, "acceptRemoteContent.accesskey") }
+
+exceptions-button =
+    .label = { COPY(from_path, "remoteContentExceptions.label") }
+    .accesskey = { COPY(from_path, "cookieExceptions.accesskey") }
+
+remote-content-info =
+    .value = { COPY(from_path, "acceptRemoteContentInfo.label") }
+
+web-content = { COPY(from_path, "captionWebContent.label") }
+
+history-label =
+    .label = { COPY(from_path, "keepHistory.label") }
+    .accesskey = { COPY(from_path, "keepHistory.accesskey") }
+
+cookies-label =
+    .label = { COPY(from_path, "acceptCookies.label") }
+    .accesskey = { COPY(from_path, "acceptCookies.accesskey") }
+
+third-party-label =
+    .value = { COPY(from_path, "acceptThirdParty.pre.label") }
+    .accesskey = { COPY(from_path, "acceptThirdParty.pre.accesskey") }
+
+third-party-always =
+    .label = { COPY(from_path, "acceptThirdParty.always.label") }
+third-party-never =
+    .label = { COPY(from_path, "acceptThirdParty.never.label") }
+third-party-visited =
+    .label = { COPY(from_path, "acceptThirdParty.visited.label") }
+
+keep-label =
+    .value = { COPY(from_path, "keepUntil.label") }
+    .accesskey = { COPY(from_path, "keepUntil.accesskey") }
+
+keep-expire =
+    .label = { COPY(from_path, "expire.label") }
+keep-ask =
+    .label = { COPY(from_path, "askEachTime.label") }
+
+cookies-button =
+    .label = { COPY(from_path, "showCookies.label") }
+    .accesskey = { COPY(from_path, "showCookies.accesskey") }
+
+do-not-track-label =
+    .label = { COPY(from_path, "doNotTrackCheck.label") }
+    .accesskey = { COPY(from_path, "doNotTrackCheck.accesskey") }
+
+learn-button =
+    .label = { COPY(from_path, "doNotTrackLearnMore.label") }
+""", from_path="mail/chrome/messenger/preferences/privacy.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("keep-close"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("label"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/privacy.dtd",
+                            "close.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                ]
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+passwords-button =
+    .label = { COPY(from_path, "savedPasswords.label") }
+    .accesskey = { COPY(from_path, "savedPasswords.accesskey") }
+
+master-password-description = { COPY(from_path, "masterPassword.intro") }
+
+master-password-label =
+    .label = { COPY(from_path, "useMasterPassword.label") }
+    .accesskey = { COPY(from_path, "useMasterPassword.accesskey") }
+
+master-password-button =
+    .label = { COPY(from_path, "changeMasterPassword.label") }
+    .accesskey = { COPY(from_path, "changeMasterPassword.accesskey") }
+
+junk-description = { COPY(from_path, "junkMail.intro") }
+
+junk-label =
+    .label = { COPY(from_path, "manualMark.label") }
+    .accesskey = { COPY(from_path, "manualMark.accesskey") }
+
+junk-move-label =
+    .label = { COPY(from_path, "manualMarkModeMove.label") }
+    .accesskey = { COPY(from_path, "manualMarkModeMove.accesskey") }
+
+junk-delete-label =
+    .label = { COPY(from_path, "manualMarkModeDelete.label") }
+    .accesskey = { COPY(from_path, "manualMarkModeDelete.accesskey") }
+
+junk-read-label =
+    .label = { COPY(from_path, "markAsReadOnSpam.label") }
+    .accesskey = { COPY(from_path, "markAsReadOnSpam.accesskey") }
+
+junk-log-label =
+    .label = { COPY(from_path, "enableAdaptiveJunkLogging.label") }
+    .accesskey = { COPY(from_path, "enableAdaptiveJunkLogging.accesskey") }
+
+junk-log-button =
+    .label = { COPY(from_path, "openJunkLog.label") }
+    .accesskey = { COPY(from_path, "openJunkLog.accesskey") }
+
+reset-junk-button =
+    .label = { COPY(from_path, "resetTrainingData.label") }
+    .accesskey = { COPY(from_path, "resetTrainingData.accesskey") }
+
+phishing-label =
+    .label = { COPY(from_path, "enablePhishingDetector1.label") }
+    .accesskey = { COPY(from_path, "enablePhishingDetector1.accesskey") }
+
+antivirus-label =
+    .label = { COPY(from_path, "antiVirus.label") }
+    .accesskey = { COPY(from_path, "antiVirus.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/security.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("passwords-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/security.dtd",
+                    "savedPasswords.intro",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("phishing-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/security.dtd",
+                    "phishingDetector1.intro",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("antivirus-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/security.dtd",
+                    "antiVirus.intro",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                    },
+                )
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+telemetry-legend = { COPY(from_path, "telemetrySection.label") }
+
+telemetry-label =
+    .label = { COPY(from_path, "enableTelemetry.label") }
+    .accesskey = { COPY(from_path, "enableTelemetry.accesskey") }
+
+learn-label =
+    .value = { COPY(from_path, "telemetryLearnMore.label") }
+
+crash-legend = { COPY(from_path, "crashReporterSection.label") }
+
+crash-label =
+    .label = { COPY(from_path, "enableCrashReporter.label") }
+    .accesskey = { COPY(from_path, "enableCrashReporter.accesskey") }
+
+certificate-description = { COPY(from_path, "certSelection.description") }
+
+certificate-auto =
+    .label = { COPY(from_path, "certs.auto") }
+    .accesskey = { COPY(from_path, "certs.auto.accesskey") }
+
+certificate-ask =
+    .label = { COPY(from_path, "certs.ask") }
+    .accesskey = { COPY(from_path, "certs.ask.accesskey") }
+
+ocsp-label =
+    .label = { COPY(from_path, "enableOCSP.label") }
+    .accesskey = { COPY(from_path, "enableOCSP.accesskey") }
+
+certificate-button =
+    .label = { COPY(from_path, "manageCertificates2.label") }
+    .accesskey = { COPY(from_path, "manageCertificates2.accesskey") }
+
+security-devices-button =
+    .label = { COPY(from_path, "viewSecurityDevices2.label") }
+    .accesskey = { COPY(from_path, "viewSecurityDevices2.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/advanced.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("telemetry-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "telemetryDesc.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name"),
+                        "&vendorShortName;": TERM_REFERENCE("vendor-short-name")
+                    },
+                )
+            ),
+            FTL.Message(
+                id = FTL.Identifier("crash-description"),
+                value = REPLACE(
+                    "mail/chrome/messenger/preferences/advanced.dtd",
+                    "crashReporterDesc.label",
+                    {
+                        "&brandShortName;": TERM_REFERENCE("brand-short-name"),
+                        "&vendorShortName;": TERM_REFERENCE("vendor-short-name")
+                    },
+                )
+            ),
+        ]
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        transforms_from(
+"""
+offline-label =
+    .label = { COPY(from_path, "startupOffline.label") }
+
+auto-connect-label =
+    .label = { COPY(from_path, "startupConnectAuto.label") }
+
+idle-label =
+    .label = { COPY(from_path, "reportIdleAfter.label") }
+    .accesskey = { COPY(from_path, "reportIdleAfter.accesskey") }
+
+idle-time-label = { COPY(from_path, "idleTime") }
+
+away-message-label =
+    .label = { COPY(from_path, "andSetStatusToAway.label") }
+    .accesskey = { COPY(from_path, "andSetStatusToAway.accesskey") }
+
+send-typing-label =
+    .label = { COPY(from_path, "sendTyping.label") }
+    .accesskey = { COPY(from_path, "sendTyping.accesskey") }
+
+notification-label = { COPY(from_path, "chatNotifications.label") }
+
+show-notification-label =
+    .label = { COPY(from_path, "desktopChatNotifications.label") }
+    .accesskey = { COPY(from_path, "desktopChatNotifications.accesskey") }
+
+notification-all =
+    .label = { COPY(from_path, "completeNotification.label") }
+notification-name =
+    .label = { COPY(from_path, "buddyInfoOnly.label") }
+notification-empty =
+    .label = { COPY(from_path, "dummyNotification.label") }
+
+notification-type-label =
+    .label = { PLATFORM() ->
+        [macos] { COPY(from_path, "getAttentionMac.label") }
+        *[other] { COPY(from_path, "getAttention.label") }
+    }
+    .accesskey = { PLATFORM() ->
+        [macos] { COPY(from_path, "getAttentionMac.accesskey") }
+        *[other] { COPY(from_path, "getAttention.accesskey") }
+    }
+
+sound-label =
+    .label = { COPY(from_path, "chatSound.label") }
+    .accesskey = { COPY(from_path, "chatSound.accesskey") }
+
+play-button =
+    .label = { COPY(from_path, "play.label") }
+    .accesskey = { COPY(from_path, "play.accesskey") }
+
+system-sound-label =
+    .label = { COPY(from_path, "systemSound.label") }
+    .accesskey = { COPY(from_path, "systemSound.accesskey") }
+
+custom-sound-label =
+    .label = { COPY(from_path, "customsound.label") }
+    .accesskey = { COPY(from_path, "customsound.accesskey") }
+
+browse-sound-button =
+    .label = { COPY(from_path, "browse.label") }
+    .accesskey = { COPY(from_path, "browse.accesskey") }
+
+theme-label =
+    .value = { COPY(from_path, "messageStyleTheme.label") }
+    .accesskey = { COPY(from_path, "messageStyleTheme.accesskey") }
+
+style-thunderbird =
+    .label = { COPY(from_path, "messageStyleThunderbirdTheme.label") }
+style-bubbles =
+    .label = { COPY(from_path, "messageStyleBubblesTheme.label") }
+style-dark =
+    .label = { COPY(from_path, "messageStyleDarkTheme.label") }
+style-paper =
+    .label = { COPY(from_path, "messageStylePaperSheetsTheme.label") }
+style-simple =
+    .label = { COPY(from_path, "messageStyleSimpleTheme.label") }
+
+preview-label = { COPY(from_path, "messageStylePreview.label") }
+no-preview-label = { COPY(from_path, "messageStyleNoPreview.title") }
+no-preview-description = { COPY(from_path, "messageStyleNoPreview.description") }
+
+chat-variant-label =
+    .value = { COPY(from_path, "messageStyleVariant.label") }
+    .accesskey = { COPY(from_path, "messageStyleVariant.accesskey") }
+
+chat-header-label =
+    .label = { COPY(from_path, "messageStyleShowHeader.label") }
+    .accesskey = { COPY(from_path, "messageStyleShowHeader.accesskey") }
+""", from_path="mail/chrome/messenger/preferences/chat.dtd"
+        )
+    )
+
+    ctx.add_transforms(
+        "mail/messenger/preferences/preferences.ftl",
+        "mail/messenger/preferences/preferences.ftl",
+        [
+            FTL.Message(
+                id = FTL.Identifier("startup-label"),
+                attributes = [
+                    FTL.Attribute(
+                        id = FTL.Identifier("value"),
+                        value = REPLACE(
+                            "mail/chrome/messenger/preferences/chat.dtd",
+                            "startupAction.label",
+                            {
+                                "&brandShortName;": TERM_REFERENCE("brand-short-name")
+                            },
+                        )
+                    ),
+                    FTL.Attribute(
+                        id = FTL.Identifier("accesskey"),
+                        value = COPY(
+                            "mail/chrome/messenger/preferences/chat.dtd",
+                            "startupAction.accesskey"
+                        )
+                    )
+                ]
+            ),
+        ]
+    )