Bug 1517493 - migrated pageInfo.dtd and pageInfo.properties to pageInfo.ftl r=jaws,flod,Gijs
authorChristian Frey <christianhfrey@gmail.com>
Fri, 22 Feb 2019 15:26:15 +0000
changeset 518468 03aece6cda47ff158485d986e19ba230ea4c8834
parent 518467 0a4aefb36aff504e179121c8de0039c0df9e8106
child 518469 190cd12fb84edeb908239595b78578cffe507d70
push id10862
push userffxbld-merge
push dateMon, 11 Mar 2019 13:01:11 +0000
treeherdermozilla-beta@a2e7f5c935da [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjaws, flod, Gijs
bugs1517493
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1517493 - migrated pageInfo.dtd and pageInfo.properties to pageInfo.ftl r=jaws,flod,Gijs Differential Revision: https://phabricator.services.mozilla.com/D16931
browser/base/content/pageinfo/pageInfo.js
browser/base/content/pageinfo/pageInfo.xul
browser/base/content/pageinfo/permissions.js
browser/base/content/pageinfo/security.js
browser/locales/en-US/browser/pageInfo.ftl
browser/locales/en-US/chrome/browser/pageInfo.dtd
browser/locales/en-US/chrome/browser/pageInfo.properties
browser/locales/jar.mn
intl/l10n/DOMLocalization.jsm
python/l10n/fluent_migrations/bug_1517493_pageInfo.py
testing/firefox-ui/tests/functional/security/manifest.ini
testing/firefox-ui/tests/puppeteer/manifest.ini
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -167,28 +167,16 @@ gImageView.getCellProperties = function(
     props += "broken";
 
   if (col.element.id == "image-address")
     props += " ltr";
 
   return props;
 };
 
-gImageView.getCellText = function(row, column) {
-  var value = this.data[row][column.index];
-  if (column.index == COL_IMAGE_SIZE) {
-    if (value == -1) {
-      return gStrings.unknown;
-    }
-    var kbSize = Number(Math.round(value / 1024 * 100) / 100);
-    return gBundle.getFormattedString("mediaFileSize", [kbSize]);
-  }
-  return value || "";
-};
-
 gImageView.onPageMediaSort = function(columnname) {
   var tree = document.getElementById(this.treeid);
   var treecol = tree.columns.getNamedColumn(columnname);
 
   var comparator;
   var index = treecol.index;
   if (index == COL_IMAGE_SIZE || index == COL_IMAGE_COUNT) {
     comparator = function numComparator(a, b) { return a - b; };
@@ -292,31 +280,30 @@ var onFinished = [ ];
 var onUnloadRegistry = [ ];
 
 /* Called when PageInfo window is loaded.  Arguments are:
  *  window.arguments[0] - (optional) an object consisting of
  *                         - doc: (optional) document to use for source. if not provided,
  *                                the calling window's document will be used
  *                         - initialTab: (optional) id of the inital tab to display
  */
-function onLoadPageInfo() {
-  gBundle = document.getElementById("pageinfobundle");
-  gStrings.unknown = gBundle.getString("unknown");
-  gStrings.notSet = gBundle.getString("notset");
-  gStrings.mediaImg = gBundle.getString("mediaImg");
-  gStrings.mediaBGImg = gBundle.getString("mediaBGImg");
-  gStrings.mediaBorderImg = gBundle.getString("mediaBorderImg");
-  gStrings.mediaListImg = gBundle.getString("mediaListImg");
-  gStrings.mediaCursor = gBundle.getString("mediaCursor");
-  gStrings.mediaObject = gBundle.getString("mediaObject");
-  gStrings.mediaEmbed = gBundle.getString("mediaEmbed");
-  gStrings.mediaLink = gBundle.getString("mediaLink");
-  gStrings.mediaInput = gBundle.getString("mediaInput");
-  gStrings.mediaVideo = gBundle.getString("mediaVideo");
-  gStrings.mediaAudio = gBundle.getString("mediaAudio");
+async function onLoadPageInfo() {
+  gStrings.unknown = await document.l10n.formatValue("image-size-unknown");
+  gStrings.notSet = await document.l10n.formatValue("not-set-alternative-text");
+  gStrings.mediaImg = await document.l10n.formatValue("media-img");
+  gStrings.mediaBGImg = await document.l10n.formatValue("media-bg-img");
+  gStrings.mediaBorderImg = await document.l10n.formatValue("media-border-img");
+  gStrings.mediaListImg = await document.l10n.formatValue("media-list-img");
+  gStrings.mediaCursor = await document.l10n.formatValue("media-cursor");
+  gStrings.mediaObject = await document.l10n.formatValue("media-object");
+  gStrings.mediaEmbed = await document.l10n.formatValue("media-embed");
+  gStrings.mediaLink = await document.l10n.formatValue("media-link");
+  gStrings.mediaInput = await document.l10n.formatValue("media-input");
+  gStrings.mediaVideo = await document.l10n.formatValue("media-video");
+  gStrings.mediaAudio = await document.l10n.formatValue("media-audio");
 
   var args = "arguments" in window &&
              window.arguments.length >= 1 &&
              window.arguments[0];
 
   // init media view
   var imageTree = document.getElementById("imagetree");
   imageTree.view = gImageView;
@@ -333,34 +320,33 @@ function loadPageInfo(frameOuterWindowID
   let imageInfo = imageElement;
 
   // Look for pageInfoListener in content.js. Sends message to listener with arguments.
   mm.sendAsyncMessage("PageInfo:getData", {strings: gStrings, frameOuterWindowID});
 
   let pageInfoData;
 
   // Get initial pageInfoData needed to display the general, permission and security tabs.
-  mm.addMessageListener("PageInfo:data", function onmessage(message) {
+  mm.addMessageListener("PageInfo:data", async function onmessage(message) {
     mm.removeMessageListener("PageInfo:data", onmessage);
     pageInfoData = message.data;
     let docInfo = pageInfoData.docInfo;
     let windowInfo = pageInfoData.windowInfo;
     let uri = Services.io.newURI(docInfo.documentURIObject.spec);
     let principal = docInfo.principal;
     gDocInfo = docInfo;
 
     gImageElement = imageInfo;
-
-    var titleFormat = windowInfo.isTopWindow ? "pageInfo.page.title"
-                                             : "pageInfo.frame.title";
-    document.title = gBundle.getFormattedString(titleFormat, [docInfo.location]);
+    var titleFormat = windowInfo.isTopWindow ? "page-info-page"
+                                             : "page-info-frame";
+    document.l10n.setAttributes(document.documentElement, titleFormat, {"website": docInfo.location});
 
     document.getElementById("main-window").setAttribute("relatedUrl", docInfo.location);
 
-    makeGeneralTab(pageInfoData.metaViewRows, docInfo);
+    await makeGeneralTab(pageInfoData.metaViewRows, docInfo);
     onLoadPermission(uri, principal);
     securityOnLoad(uri, windowInfo);
   });
 
   // Get the media elements from content script to setup the media tab.
   mm.addMessageListener("PageInfo:mediaData", function onmessage(message) {
     // Page info window was closed.
     if (window.closed) {
@@ -460,96 +446,106 @@ function openCacheEntry(key, cb) {
     },
     onCacheEntryAvailable(entry, isNew, appCache, status) {
       cb(entry);
     },
   };
   diskStorage.asyncOpenURI(Services.io.newURI(key), "", nsICacheStorage.OPEN_READONLY, checkCacheListener);
 }
 
-function makeGeneralTab(metaViewRows, docInfo) {
-  var title = (docInfo.title) ? docInfo.title : gBundle.getString("noPageTitle");
-  document.getElementById("titletext").value = title;
+async function makeGeneralTab(metaViewRows, docInfo) {
+  // Sets Title in the General Tab, set to "Untitled Page" if no title found
+  if (docInfo.title) {
+    document.getElementById("titletext").value = docInfo.title;
+  } else {
+    document.l10n.setAttributes(document.getElementById("titletext"), "no-page-title");
+  }
 
   var url = docInfo.location;
   setItemValue("urltext", url);
 
   var referrer = ("referrer" in docInfo && docInfo.referrer);
   setItemValue("refertext", referrer);
 
-  var mode = ("compatMode" in docInfo && docInfo.compatMode == "BackCompat") ? "generalQuirksMode" : "generalStrictMode";
-  document.getElementById("modetext").value = gBundle.getString(mode);
+  var mode = ("compatMode" in docInfo && docInfo.compatMode == "BackCompat") ? "general-quirks-mode" : "general-strict-mode";
+  document.l10n.setAttributes(document.getElementById("modetext"), mode);
 
   // find out the mime type
   var mimeType = docInfo.contentType;
   setItemValue("typetext", mimeType);
 
   // get the document characterset
   var encoding = docInfo.characterSet;
   document.getElementById("encodingtext").value = encoding;
 
   let length = metaViewRows.length;
 
   var metaGroup = document.getElementById("metaTags");
   if (!length)
     metaGroup.style.visibility = "hidden";
   else {
-    var metaTagsCaption = document.getElementById("metaTagsCaption");
-    if (length == 1)
-      metaTagsCaption.value = gBundle.getString("generalMetaTag");
-    else
-      metaTagsCaption.value = gBundle.getFormattedString("generalMetaTags", [length]);
+    document.l10n.setAttributes(document.getElementById("metaTagsCaption"),
+                                "general-meta-tags", {"tags": length});
+
     var metaTree = document.getElementById("metatree");
     metaTree.view = gMetaView;
 
     // Add the metaViewRows onto the general tab's meta info tree.
     gMetaView.addRows(metaViewRows);
 
     metaGroup.style.removeProperty("visibility");
   }
 
-  // get the date of last modification
-  var modifiedText = formatDate(docInfo.lastModified, gStrings.notSet);
+  var modifiedText = formatDate(docInfo.lastModified, await document.l10n.formatValue("not-set-date"));
   document.getElementById("modifiedtext").value = modifiedText;
 
   // get cache info
   var cacheKey = url.replace(/#.*$/, "");
   openCacheEntry(cacheKey, function(cacheEntry) {
     var sizeText;
     if (cacheEntry) {
       var pageSize = cacheEntry.dataSize;
       var kbSize = formatNumber(Math.round(pageSize / 1024 * 100) / 100);
-      sizeText = gBundle.getFormattedString("generalSize", [kbSize, formatNumber(pageSize)]);
+      document.l10n.setAttributes(document.getElementById("sizetext"),
+                                  "properties-general-size",
+                                  {"kb": kbSize, "bytes": formatNumber(pageSize)});
+    } else {
+      setItemValue("sizetext", sizeText);
     }
-    setItemValue("sizetext", sizeText);
   });
 }
 
-function addImage(imageViewRow) {
+async function addImage(imageViewRow) {
   let [url, type, alt, elem, isBg] = imageViewRow;
-
   if (!url)
     return;
 
   if (!gImageHash.hasOwnProperty(url))
     gImageHash[url] = { };
   if (!gImageHash[url].hasOwnProperty(type))
     gImageHash[url][type] = { };
   if (!gImageHash[url][type].hasOwnProperty(alt)) {
     gImageHash[url][type][alt] = gImageView.data.length;
-    var row = [url, type, -1, alt, 1, elem, isBg];
+    var row = [url, type, gStrings.unknown, alt, 1, elem, isBg];
     gImageView.addRow(row);
 
     // Fill in cache data asynchronously
     openCacheEntry(url, function(cacheEntry) {
       // The data at row[2] corresponds to the data size.
       if (cacheEntry) {
-        row[2] = cacheEntry.dataSize;
-        // Invalidate the row to trigger a repaint.
-        gImageView.tree.invalidateRow(gImageView.data.indexOf(row));
+        let value = cacheEntry.dataSize;
+        // If value is not -1 then replace with actual value, else keep as "unknown"
+        if (value != -1) {
+          let kbSize = Number(Math.round(value / 1024 * 100) / 100);
+          document.l10n.formatValue("media-file-size", {"size": kbSize}).then(function(response) {
+            row[2] = response;
+            // Invalidate the row to trigger a repaint.
+            gImageView.tree.invalidateRow(gImageView.data.indexOf(row));
+          });
+        }
       }
     });
 
     // Add the observer, only once.
     if (gImageView.data.length == 1) {
       document.getElementById("mediaTab").hidden = false;
       Services.obs.addObserver(imagePermissionObserver, "perm-changed");
     }
@@ -616,20 +612,20 @@ function getSelectedRows(tree) {
   return rowArray;
 }
 
 function getSelectedRow(tree) {
   var rows = getSelectedRows(tree);
   return (rows.length == 1) ? rows[0] : -1;
 }
 
-function selectSaveFolder(aCallback) {
+async function selectSaveFolder(aCallback) {
   const nsIFile = Ci.nsIFile;
   const nsIFilePicker = Ci.nsIFilePicker;
-  let titleText = gBundle.getString("mediaSelectFolder");
+  let titleText = await document.l10n.formatValue("media-select-folder");
   let fp = Cc["@mozilla.org/filepicker;1"].
            createInstance(nsIFilePicker);
   let fpCallback = function fpCallback_done(aResult) {
     if (aResult == nsIFilePicker.returnOK) {
       aCallback(fp.file.QueryInterface(nsIFile));
     } else {
       aCallback(null);
     }
@@ -754,49 +750,52 @@ function makePreview(row) {
   setItemValue("imageurltext", url);
   setItemValue("imagetext", item.imageText);
   setItemValue("imagelongdesctext", item.longDesc);
 
   // get cache info
   var cacheKey = url.replace(/#.*$/, "");
   openCacheEntry(cacheKey, function(cacheEntry) {
     // find out the file size
-    var sizeText;
     if (cacheEntry) {
       let imageSize = cacheEntry.dataSize;
       var kbSize = Math.round(imageSize / 1024 * 100) / 100;
-      sizeText = gBundle.getFormattedString("generalSize",
-                                            [formatNumber(kbSize), formatNumber(imageSize)]);
-    } else
-      sizeText = gBundle.getString("mediaUnknownNotCached");
-    setItemValue("imagesizetext", sizeText);
+      document.l10n.setAttributes(document.getElementById("imagesizetext"),
+                                  "properties-general-size",
+                                  {"kb": formatNumber(kbSize), "bytes": formatNumber(imageSize)});
+    } else {
+      document.l10n.setAttributes(document.getElementById("imagesizetext"),
+                                  "media-unknown-not-cached");
+    }
 
     var mimeType = item.mimeType || this.getContentTypeFromHeaders(cacheEntry);
     var numFrames = item.numFrames;
 
     var imageType;
     if (mimeType) {
       // We found the type, try to display it nicely
       let imageMimeType = /^image\/(.*)/i.exec(mimeType);
       if (imageMimeType) {
         imageType = imageMimeType[1].toUpperCase();
         if (numFrames > 1)
-          imageType = gBundle.getFormattedString("mediaAnimatedImageType",
-                                                 [imageType, numFrames]);
+          document.l10n.setAttributes(document.getElementById("imagetypetext"),
+                                      "media-animated-image-type",
+                                      {"type": imageType, "frames": numFrames});
         else
-          imageType = gBundle.getFormattedString("mediaImageType", [imageType]);
+          document.l10n.setAttributes(document.getElementById("imagetypetext"),
+                                      "media-image-type",
+                                      {"type": imageType});
       } else {
         // the MIME type doesn't begin with image/, display the raw type
-        imageType = mimeType;
+        setItemValue("imagetypetext", mimeType);
       }
     } else {
       // We couldn't find the type, fall back to the value in the treeview
-      imageType = gImageView.data[row][COL_IMAGE_TYPE];
+      setItemValue("imagetypetext", gImageView.data[row][COL_IMAGE_TYPE]);
     }
-    setItemValue("imagetypetext", imageType);
 
     var imageContainer = document.getElementById("theimagecontainer");
     var oldImage = document.getElementById("thepreviewimage");
 
     var isProtocolAllowed = checkProtocol(gImageView.data[row]);
 
     var newImage = new Image;
     newImage.id = "thepreviewimage";
@@ -842,31 +841,31 @@ function makePreview(row) {
         }
 
         width = newImage.width;
         height = newImage.height;
 
         document.getElementById("theimagecontainer").collapsed = false;
         document.getElementById("brokenimagecontainer").collapsed = true;
 
-        let imageSize = "";
         if (url) {
           if (width != physWidth || height != physHeight) {
-            imageSize = gBundle.getFormattedString("mediaDimensionsScaled",
-                                                   [formatNumber(physWidth),
-                                                    formatNumber(physHeight),
-                                                    formatNumber(width),
-                                                    formatNumber(height)]);
+            document.l10n.setAttributes(document.getElementById("imagedimensiontext"),
+                                        "media-dimensions-scaled",
+                                        {"dimx": formatNumber(physWidth),
+                                         "dimy": formatNumber(physHeight),
+                                         "scaledx": formatNumber(width),
+                                         "scaledy": formatNumber(height)});
           } else {
-            imageSize = gBundle.getFormattedString("mediaDimensions",
-                                                   [formatNumber(width),
-                                                    formatNumber(height)]);
+            document.l10n.setAttributes(document.getElementById("imagedimensiontext"),
+                                        "media-dimensions",
+                                        {"dimx": formatNumber(width),
+                                         "dimy": formatNumber(height)});
           }
         }
-        setItemValue("imagedimensiontext", imageSize);
       }, {once: true});
 
       newImage.setAttribute("triggeringprincipal", triggeringPrinStr);
       newImage.setAttribute("src", url);
     } else {
       // Handle the case where newImage is not used for width & height
       if (item.HTMLVideoElement && isProtocolAllowed) {
         newImage = document.createElementNS("http://www.w3.org/1999/xhtml", "video");
@@ -891,23 +890,22 @@ function makePreview(row) {
         document.getElementById("brokenimagecontainer").collapsed = true;
       } else {
         // fallback image for protocols not allowed (e.g., javascript:)
         // or elements not [yet] handled (e.g., object, embed).
         document.getElementById("brokenimagecontainer").collapsed = false;
         document.getElementById("theimagecontainer").collapsed = true;
       }
 
-      let imageSize = "";
       if (url && !isAudio) {
-        imageSize = gBundle.getFormattedString("mediaDimensions",
-                                               [formatNumber(width),
-                                                formatNumber(height)]);
+        document.l10n.setAttributes(document.getElementById("imagedimensiontext"),
+                                    "media-dimensions",
+                                    {"dimx": formatNumber(width),
+                                     "dimy": formatNumber(height)});
       }
-      setItemValue("imagedimensiontext", imageSize);
     }
 
     makeBlockImage(url);
 
     imageContainer.removeChild(oldImage);
     imageContainer.appendChild(newImage);
   });
 }
@@ -921,17 +919,17 @@ function makeBlockImage(url) {
   if (!(/^https?:/.test(url)) || imagePref == 2)
     // We can't block the images from this host because either is is not
     // for http(s) or we don't load images at all
     checkbox.hidden = true;
   else {
     var uri = Services.io.newURI(url);
     if (uri.host) {
       checkbox.hidden = false;
-      checkbox.label = gBundle.getFormattedString("mediaBlockImage", [uri.host]);
+      document.l10n.setAttributes(checkbox, "media-block-image", {"website": uri.host});
       var perm = permissionManager.testPermission(uri, "image");
       checkbox.checked = perm == nsIPermissionManager.DENY_ACTION;
     } else
       checkbox.hidden = true;
   }
 }
 
 var imagePermissionObserver = {
--- a/browser/base/content/pageinfo/pageInfo.xul
+++ b/browser/base/content/pageinfo/pageInfo.xul
@@ -2,385 +2,384 @@
 # 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/.
 
 <?xml-stylesheet href="chrome://browser/content/pageinfo/pageInfo.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/pageInfo.css" type="text/css"?>
 
 <!DOCTYPE window [
-  <!ENTITY % pageInfoDTD SYSTEM "chrome://browser/locale/pageInfo.dtd">
-  %pageInfoDTD;
 #ifdef XP_MACOSX
 #include ../browser-doctype.inc
 #endif
 ]>
 
 <window id="main-window"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+  xmlns:html="http://www.w3.org/1999/xhtml"
+  data-l10n-id="page-info-window"
+  data-l10n-attrs="style"
   windowtype="Browser:page-info"
   onload="onLoadPageInfo()"
   onunload="onUnloadPageInfo()"
   align="stretch"
   screenX="10" screenY="10"
-  width="&pageInfoWindow.width;" height="&pageInfoWindow.height;"
   persist="screenX screenY width height sizemode">
 
 #ifdef XP_MACOSX
 #include ../macWindow.inc.xul
 #endif
 
+  <linkset>
+    <html:link rel="localization" href="browser/pageInfo.ftl"/>
+  </linkset>
   <script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
   <script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
   <script type="application/javascript" src="chrome://global/content/treeUtils.js"/>
   <script type="application/javascript" src="chrome://browser/content/pageinfo/pageInfo.js"/>
   <script type="application/javascript" src="chrome://browser/content/pageinfo/permissions.js"/>
   <script type="application/javascript" src="chrome://browser/content/pageinfo/security.js"/>
   <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
 
   <stringbundleset id="pageinfobundleset">
-    <stringbundle id="pageinfobundle" src="chrome://browser/locale/pageInfo.properties"/>
     <stringbundle id="pkiBundle" src="chrome://pippki/locale/pippki.properties"/>
     <stringbundle id="browserBundle" src="chrome://browser/locale/browser.properties"/>
   </stringbundleset>
 
   <commandset id="pageInfoCommandSet">
     <command id="cmd_close"     oncommand="window.close();"/>
     <command id="cmd_help"      oncommand="doHelpButton();"/>
     <command id="cmd_copy"      oncommand="doCopy();"/>
     <command id="cmd_selectall" oncommand="doSelectAll();"/>
   </commandset>
 
   <keyset id="pageInfoKeySet">
-    <key key="&closeWindow.key;" modifiers="accel" command="cmd_close"/>
+    <key data-l10n-id="close-window" modifiers="accel" command="cmd_close"/>
     <key keycode="VK_ESCAPE"                       command="cmd_close"/>
 #ifdef XP_MACOSX
     <key key="."                 modifiers="meta"  command="cmd_close"/>
 #else
     <key keycode="VK_F1"                           command="cmd_help"/>
 #endif
-    <key key="&copy.key;"        modifiers="accel" command="cmd_copy"/>
-    <key key="&selectall.key;"   modifiers="accel" command="cmd_selectall"/>
-    <key key="&selectall.key;"   modifiers="alt"   command="cmd_selectall"/>
+    <key data-l10n-id="copy"        modifiers="accel" command="cmd_copy"/>
+    <key data-l10n-id="select-all"  modifiers="accel" command="cmd_selectall"/>
+    <key data-l10n-id="select-all"  modifiers="alt"   command="cmd_selectall"/>
   </keyset>
 
   <menupopup id="picontext">
-    <menuitem id="menu_selectall" label="&selectall.label;" command="cmd_selectall" accesskey="&selectall.accesskey;"/>
-    <menuitem id="menu_copy"      label="&copy.label;"      command="cmd_copy"      accesskey="&copy.accesskey;"/>
+    <menuitem id="menu_selectall" data-l10n-id="menu-select-all" command="cmd_selectall"/>
+    <menuitem id="menu_copy"      data-l10n-id="menu-copy"      command="cmd_copy"/>
   </menupopup>
 
   <vbox id="topBar">
     <radiogroup id="viewGroup" class="chromeclass-toolbar" orient="horizontal">
-      <radio id="generalTab"  label="&generalTab;"  accesskey="&generalTab.accesskey;"
+      <radio id="generalTab"  data-l10n-id="general-tab"
            oncommand="showTab('general');"/>
-      <radio id="mediaTab"    label="&mediaTab;"    accesskey="&mediaTab.accesskey;"
+      <radio id="mediaTab"    data-l10n-id="media-tab"
            oncommand="showTab('media');" hidden="true"/>
-      <radio id="permTab"     label="&permTab;"     accesskey="&permTab.accesskey;"
+      <radio id="permTab"     data-l10n-id="perm-tab"
            oncommand="showTab('perm');"/>
-      <radio id="securityTab" label="&securityTab;" accesskey="&securityTab.accesskey;"
+      <radio id="securityTab" data-l10n-id="security-tab"
            oncommand="showTab('security');"/>
     </radiogroup>
   </vbox>
 
   <deck id="mainDeck" flex="1">
     <!-- General page information -->
     <vbox id="generalPanel">
       <grid id="generalGrid">
         <columns>
           <column/>
           <column class="gridSeparator"/>
           <column flex="1"/>
         </columns>
         <rows id="generalRows">
           <row id="generalTitle">
-            <label control="titletext" value="&generalTitle;"/>
+            <label control="titletext" data-l10n-id="general-title"/>
             <separator/>
             <textbox readonly="true" id="titletext"/>
           </row>
           <row id="generalURLRow">
-            <label control="urltext" value="&generalURL;"/>
+            <label control="urltext" data-l10n-id="general-url"/>
             <separator/>
             <textbox readonly="true" id="urltext"/>
           </row>
           <row id="generalSeparatorRow1">
             <separator class="thin"/>
           </row>
           <row id="generalTypeRow">
-            <label control="typetext" value="&generalType;"/>
+            <label control="typetext" data-l10n-id="general-type"/>
             <separator/>
             <textbox readonly="true" id="typetext"/>
           </row>
           <row id="generalModeRow">
-            <label control="modetext" value="&generalMode;"/>
+            <label control="modetext" data-l10n-id="general-mode"/>
             <separator/>
             <textbox readonly="true" crop="end" id="modetext"/>
           </row>
           <row id="generalEncodingRow">
-            <label control="encodingtext" value="&generalEncoding2;"/>
+            <label control="encodingtext" data-l10n-id="general-encoding"/>
             <separator/>
             <textbox readonly="true" id="encodingtext"/>
           </row>
           <row id="generalSizeRow">
-            <label control="sizetext" value="&generalSize;"/>
+            <label control="sizetext" data-l10n-id="general-size"/>
             <separator/>
             <textbox readonly="true" id="sizetext"/>
           </row>
           <row id="generalReferrerRow">
-            <label control="refertext" value="&generalReferrer;"/>
+            <label control="refertext" data-l10n-id="general-referrer"/>
             <separator/>
             <textbox readonly="true" id="refertext"/>
           </row>
           <row id="generalSeparatorRow2">
             <separator class="thin"/>
           </row>
           <row id="generalModifiedRow">
-            <label control="modifiedtext" value="&generalModified;"/>
+            <label control="modifiedtext" data-l10n-id="general-modified"/>
             <separator/>
             <textbox readonly="true" id="modifiedtext"/>
           </row>
         </rows>
       </grid>
       <separator class="thin"/>
       <vbox id="metaTags" flex="1">
         <label control="metatree" id="metaTagsCaption" class="header"/>
         <tree id="metatree" flex="1" hidecolumnpicker="true" contextmenu="picontext">
           <treecols>
-            <treecol id="meta-name"    label="&generalMetaName;"
+            <treecol id="meta-name"    data-l10n-id="general-meta-name"
                      persist="width" flex="1"
                      onclick="gMetaView.onPageMediaSort('meta-name');"/>
             <splitter class="tree-splitter"/>
-            <treecol id="meta-content" label="&generalMetaContent;"
+            <treecol id="meta-content" data-l10n-id="general-meta-content"
                      persist="width" flex="4"
                      onclick="gMetaView.onPageMediaSort('meta-content');"/>
           </treecols>
           <treechildren id="metatreechildren" flex="1"/>
-        </tree>        
+        </tree>
       </vbox>
       <hbox pack="end">
-        <button command="cmd_help" label="&helpButton.label;" dlgtype="help"/>
+        <button command="cmd_help" data-l10n-id="help-button" dlgtype="help"/>
       </hbox>
     </vbox>
 
     <!-- Media information -->
     <vbox id="mediaPanel">
       <tree id="imagetree" onselect="onImageSelect();" contextmenu="picontext"
             ondragstart="onBeginLinkDrag(event,'image-address','image-alt')">
         <treecols>
           <treecol primary="true" persist="width" flex="10"
-                        width="10" id="image-address" label="&mediaAddress;"
+                        width="10" id="image-address" data-l10n-id="media-address"
                         onclick="gImageView.onPageMediaSort('image-address');"/>
           <splitter class="tree-splitter"/>
           <treecol persist="hidden width" flex="2"
-                        width="2"  id="image-type"    label="&mediaType;"
+                        width="2"  id="image-type"    data-l10n-id="media-type"
                         onclick="gImageView.onPageMediaSort('image-type');"/>
           <splitter class="tree-splitter"/>
           <treecol hidden="true" persist="hidden width" flex="2"
-                        width="2"  id="image-size"  label="&mediaSize;" value="size"
+                        width="2"  id="image-size"  data-l10n-id="media-size" value="size"
                         onclick="gImageView.onPageMediaSort('image-size');"/>
           <splitter class="tree-splitter"/>
           <treecol hidden="true" persist="hidden width" flex="4"
-                        width="4"  id="image-alt"    label="&mediaAltHeader;"
+                        width="4"  id="image-alt"    data-l10n-id="media-alt-header"
                         onclick="gImageView.onPageMediaSort('image-alt');"/>
           <splitter class="tree-splitter"/>
           <treecol hidden="true" persist="hidden width" flex="1"
-                        width="1"  id="image-count"    label="&mediaCount;"
+                        width="1"  id="image-count"    data-l10n-id="media-count"
                         onclick="gImageView.onPageMediaSort('image-count');"/>
         </treecols>
         <treechildren id="imagetreechildren" flex="1"/>
       </tree>
       <splitter orient="vertical" id="mediaSplitter"/>
       <vbox flex="1" id="mediaPreviewBox" collapsed="true">
         <grid id="mediaGrid">
           <columns>
             <column id="mediaLabelColumn"/>
             <column class="gridSeparator"/>
             <column flex="1"/>
           </columns>
           <rows id="mediaRows">
             <row id="mediaLocationRow">
-              <label control="imageurltext" value="&mediaLocation;"/>
+              <label control="imageurltext" data-l10n-id="media-location"/>
               <separator/>
               <textbox readonly="true" id="imageurltext"/>
             </row>
             <row id="mediaTypeRow">
-              <label control="imagetypetext" value="&generalType;"/>
+              <label control="imagetypetext" data-l10n-id="general-type"/>
               <separator/>
-              <textbox readonly="true" id="imagetypetext"/>
+              <textbox id="imagetypetext"/>
             </row>
             <row id="mediaSizeRow">
-              <label control="imagesizetext" value="&generalSize;"/>
+              <label control="imagesizetext" data-l10n-id="general-size"/>
               <separator/>
               <textbox readonly="true" id="imagesizetext"/>
             </row>
             <row id="mediaDimensionRow">
-              <label control="imagedimensiontext" value="&mediaDimension;"/>
+              <label control="imagedimensiontext" data-l10n-id="media-dimension"/>
               <separator/>
               <textbox readonly="true" id="imagedimensiontext"/>
             </row>
             <row id="mediaTextRow">
-              <label control="imagetext" value="&mediaText;"/>
+              <label control="imagetext" data-l10n-id="media-text"/>
               <separator/>
               <textbox readonly="true" id="imagetext"/>
             </row>
             <row id="mediaLongdescRow">
-              <label control="imagelongdesctext" value="&mediaLongdesc;"/>
+              <label control="imagelongdesctext" data-l10n-id="media-long-desc"/>
               <separator/>
               <textbox readonly="true" id="imagelongdesctext"/>
             </row>
           </rows>
         </grid>
         <hbox id="imageSaveBox" align="end">
           <vbox id="blockImageBox">
             <checkbox id="blockImage" hidden="true" oncommand="onBlockImage()"
-                      accesskey="&mediaBlockImage.accesskey;"/>
-            <label control="thepreviewimage" value="&mediaPreview;" class="header"/>
+                      data-l10n-id="media-block-image"/>
+            <label control="thepreviewimage" data-l10n-id="media-preview" class="header"/>
           </vbox>
           <spacer id="imageSaveBoxSpacer" flex="1"/>
-          <button label="&selectall.label;" accesskey="&selectall.accesskey;"
+          <button data-l10n-id="menu-select-all"
                   id="selectallbutton"
                   oncommand="doSelectAllMedia();"/>
-          <button label="&mediaSaveAs;" accesskey="&mediaSaveAs.accesskey;"
+          <button data-l10n-id="media-save-as"
                   icon="save" id="imagesaveasbutton"
                   oncommand="saveMedia();"/>
         </hbox>
         <vbox id="imagecontainerbox" flex="1" pack="center">
           <hbox id="theimagecontainer" pack="center">
             <image id="thepreviewimage"/>
           </hbox>
           <hbox id="brokenimagecontainer" pack="center" collapsed="true">
             <image id="brokenimage" src="resource://gre-resources/broken-image.png"/>
           </hbox>
         </vbox>
       </vbox>
       <hbox id="mediaSaveBox" collapsed="true">
         <spacer id="mediaSaveBoxSpacer" flex="1"/>
-        <button label="&mediaSaveAs;" accesskey="&mediaSaveAs2.accesskey;"
+        <button data-l10n-id="media-save-image-as"
                 icon="save" id="mediasaveasbutton"
                 oncommand="saveMedia();"/>
       </hbox>
       <hbox pack="end">
-        <button command="cmd_help" label="&helpButton.label;" dlgtype="help"/>
+        <button command="cmd_help" data-l10n-id="help-button" dlgtype="help"/>
       </hbox>
     </vbox>
 
     <!-- Permissions -->
     <vbox id="permPanel">
       <hbox id="permHostBox">
-        <label value="&permissionsFor;" control="hostText" />
+        <label data-l10n-id="permissions-for" control="hostText" />
         <textbox id="hostText" class="header" readonly="true"
                  crop="end" flex="1"/>
       </hbox>
 
       <vbox id="permList" flex="1"/>
       <hbox pack="end">
-        <button command="cmd_help" label="&helpButton.label;" dlgtype="help"/>
+        <button command="cmd_help" data-l10n-id="help-button" dlgtype="help"/>
       </hbox>
     </vbox>
 
     <!-- Security & Privacy -->
     <vbox id="securityPanel">
       <!-- Identity Section -->
       <groupbox>
-        <label class="header" value="&securityView.identity.header;"/>
+        <label class="header" data-l10n-id="security-view-identity"/>
         <grid>
           <columns>
             <column/>
             <column flex="1"/>
           </columns>
           <rows>
             <!-- Domain -->
             <row>
-              <label value="&securityView.identity.domain;"
+              <label data-l10n-id="security-view-identity-domain"
                      control="security-identity-domain-value"/>
               <textbox id="security-identity-domain-value" readonly="true"/>
             </row>
             <!-- Owner -->
             <row>
               <label id="security-identity-owner-label"
                      class="fieldLabel"
-                     value="&securityView.identity.owner;"
+                     data-l10n-id="security-view-identity-owner"
                      control="security-identity-owner-value"/>
               <textbox id="security-identity-owner-value" readonly="true"/>
             </row>
             <!-- Verifier -->
             <row>
-              <label value="&securityView.identity.verifier;"
+              <label data-l10n-id="security-view-identity-verifier"
                      control="security-identity-verifier-value"/>
               <hbox align="center">
                 <textbox id="security-identity-verifier-value" readonly="true"
                          flex="1"/>
-                <button id="security-view-cert" label="&securityView.certView;"
-                        accesskey="&securityView.accesskey;"
+                <button id="security-view-cert" data-l10n-id="security-view"
                         oncommand="security.viewCert();"/>
               </hbox>
             </row>
             <!-- Certificate Validity -->
             <row id="security-identity-validity-row">
-              <label value="&securityView.identity.validity;"
+              <label data-l10n-id="security-view-identity-validity"
                      control="security-identity-validity-value"/>
               <textbox id="security-identity-validity-value" readonly="true"/>
             </row>
           </rows>
         </grid>
       </groupbox>
 
       <!-- Privacy & History section -->
       <groupbox>
-        <label class="header" value="&securityView.privacy.header;"/>
+        <label class="header" data-l10n-id="security-view-privacy"/>
         <grid>
           <columns>
             <column flex="1"/>
             <column flex="1"/>
           </columns>
           <rows>
             <!-- History -->
             <row>
-              <label control="security-privacy-history-value">&securityView.privacy.history;</label>
+              <label control="security-privacy-history-value" data-l10n-id="security-view-privacy-history-value"/>
               <label id="security-privacy-history-value"
-                     value="&securityView.unknown;"/>
+                     data-l10n-id="security-view-unknown"/>
             </row>
             <!-- Site Data & Cookies -->
-            <row>
-              <label control="security-privacy-sitedata-value">&securityView.privacy.siteData;</label>
+            <row id="security-privacy-sitedata-row">
+              <label control="security-privacy-sitedata-value" data-l10n-id="security-view-privacy-sitedata-value"/>
               <hbox id="security-privacy-sitedata-box" align="center">
-                <label id="security-privacy-sitedata-value"
-                       flex="1">&securityView.unknown;</label>
+                <label id="security-privacy-sitedata-value" data-l10n-id="security-view-unknown"
+                       flex="1"/>
                 <button id="security-clear-sitedata"
                         disabled="true"
-                        label="&securityView.privacy.clearSiteData;"
-                        accesskey="&securityView.privacy.clearSiteData.accessKey;"
+                        data-l10n-id="security-view-privacy-clearsitedata"
                         oncommand="security.clearSiteData();"/>
               </hbox>
             </row>
             <!-- Passwords -->
             <row>
-              <label control="security-privacy-passwords-value">&securityView.privacy.passwords;</label>
+              <label control="security-privacy-passwords-value" data-l10n-id="security-view-privacy-passwords-value"/>
               <hbox id="security-privacy-passwords-box" align="center">
                 <label id="security-privacy-passwords-value"
-                       value="&securityView.unknown;"
+                       data-l10n-id="security-view-unknown"
                        flex="1"/>
                 <button id="security-view-password"
-                        label="&securityView.privacy.viewPasswords;"
-                        accesskey="&securityView.privacy.viewPasswords.accessKey;"
+                        data-l10n-id="security-view-privacy-viewpasswords"
                         oncommand="security.viewPasswords();"/>
               </hbox>
             </row>
           </rows>
         </grid>
       </groupbox>
 
       <!-- Technical Details section -->
       <groupbox>
-        <label class="header" value="&securityView.technical.header;"/>
+        <label class="header" data-l10n-id="security-view-technical"/>
         <label id="security-technical-shortform"/>
         <description id="security-technical-longform1"/>
         <description id="security-technical-longform2"/>
         <description id="security-technical-certificate-transparency"/>
       </groupbox>
 
       <hbox pack="end">
-        <button command="cmd_help" label="&helpButton.label;" dlgtype="help"/>
+        <button command="cmd_help" data-l10n-id="help-button" dlgtype="help"/>
       </hbox>
     </vbox>
     <!-- Others added by overlay -->
   </deck>
 
 </window>
--- a/browser/base/content/pageinfo/permissions.js
+++ b/browser/base/content/pageinfo/permissions.js
@@ -133,17 +133,17 @@ function createRow(aPartId) {
 
   let controls = document.createXULElement("hbox");
   controls.setAttribute("role", "group");
   controls.setAttribute("aria-labelledby", labelId);
 
   let checkbox = document.createXULElement("checkbox");
   checkbox.setAttribute("id", aPartId + "Def");
   checkbox.setAttribute("oncommand", "onCheckboxClick('" + aPartId + "');");
-  checkbox.setAttribute("label", gBundle.getString("permissions.useDefault"));
+  document.l10n.setAttributes(checkbox, "permissions-use-default");
   controls.appendChild(checkbox);
 
   let spacer = document.createXULElement("spacer");
   spacer.setAttribute("flex", "1");
   controls.appendChild(spacer);
 
   let radiogroup = document.createXULElement("radiogroup");
   radiogroup.setAttribute("id", radiogroupId);
--- a/browser/base/content/pageinfo/security.js
+++ b/browser/base/content/pageinfo/security.js
@@ -133,44 +133,40 @@ var security = {
     return null;
   },
 
   async _updateSiteDataInfo() {
     // Save site data info for deleting.
     this.siteData = await SiteDataManager.getSites(
       SiteDataManager.getBaseDomainFromHost(this.uri.host));
 
-    let pageInfoBundle = document.getElementById("pageinfobundle");
     let clearSiteDataButton = document.getElementById("security-clear-sitedata");
     let siteDataLabel = document.getElementById("security-privacy-sitedata-value");
 
     if (!this.siteData.length) {
-      let noStr = pageInfoBundle.getString("securitySiteDataNo");
-      siteDataLabel.textContent = noStr;
+      document.l10n.setAttributes(siteDataLabel, "security-site-data-no");
       clearSiteDataButton.setAttribute("disabled", "true");
       return;
     }
 
-    let usageText;
     let usage = this.siteData.reduce((acc, site) => acc + site.usage, 0);
     if (usage > 0) {
       let size = DownloadUtils.convertByteUnits(usage);
       let hasCookies = this.siteData.some(site => site.cookies.length > 0);
       if (hasCookies) {
-        usageText = pageInfoBundle.getFormattedString("securitySiteDataCookies", size);
+        document.l10n.setAttributes(siteDataLabel, "security-site-data-cookies", {"value": size[0], "unit": size[1]});
       } else {
-        usageText = pageInfoBundle.getFormattedString("securitySiteDataOnly", size);
+         document.l10n.setAttributes(siteDataLabel, "security-site-data-only", {"value": size[0], "unit": size[1]});
       }
     } else {
       // We're storing cookies, else the list would have been empty.
-      usageText = pageInfoBundle.getString("securitySiteDataCookiesOnly");
+       document.l10n.setAttributes(siteDataLabel, "security-site-data-cookies-only");
     }
 
     clearSiteDataButton.removeAttribute("disabled");
-    siteDataLabel.textContent = usageText;
   },
 
   /**
    * Clear Site Data and Cookies
    */
   clearSiteData() {
     if (this.siteData && this.siteData.length) {
       let hosts = this.siteData.map(site => site.host);
@@ -195,83 +191,80 @@ function securityOnLoad(uri, windowInfo)
 
   var info = security._getSecurityInfo();
   if (!info || uri.scheme === "about") {
     document.getElementById("securityTab").hidden = true;
     return;
   }
   document.getElementById("securityTab").hidden = false;
 
-  const pageInfoBundle = document.getElementById("pageinfobundle");
-
   /* Set Identity section text */
   setText("security-identity-domain-value", info.hostName);
 
-  var owner, verifier, validity;
+  var validity;
   if (info.cert && !info.isBroken) {
     validity = info.cert.validity.notAfterLocalDay;
 
     // Try to pull out meaningful values.  Technically these fields are optional
     // so we'll employ fallbacks where appropriate.  The EV spec states that Org
     // fields must be specified for subject and issuer so that case is simpler.
     if (info.isEV) {
-      owner = info.cert.organization;
-      verifier = info.cAName;
+      setText("security-identity-owner-value", info.cert.organization);
+      setText("security-identity-verifier-value", info.cAName);
     } else {
       // Technically, a non-EV cert might specify an owner in the O field or not,
       // depending on the CA's issuing policies.  However we don't have any programmatic
       // way to tell those apart, and no policy way to establish which organization
       // vetting standards are good enough (that's what EV is for) so we default to
       // treating these certs as domain-validated only.
-      owner = pageInfoBundle.getString("securityNoOwner");
-      verifier = info.cAName || info.cert.issuerCommonName || info.cert.issuerName;
+      document.l10n.setAttributes(document.getElementById("security-identity-owner-value"),
+        "security-no-owner");
+      setText("security-identity-verifier-value", info.cAName || info.cert.issuerCommonName || info.cert.issuerName);
     }
   } else {
     // We don't have valid identity credentials.
-    owner = pageInfoBundle.getString("securityNoOwner");
-    verifier = pageInfoBundle.getString("notset");
+    document.l10n.setAttributes(document.getElementById("security-identity-owner-value"),
+                                "security-no-owner");
+    document.l10n.setAttributes(document.getElementById("security-identity-verifier-value"),
+                                "not-set-verified-by");
   }
 
-  setText("security-identity-owner-value", owner);
-  setText("security-identity-verifier-value", verifier);
   if (validity) {
     setText("security-identity-validity-value", validity);
   } else {
     document.getElementById("security-identity-validity-row").hidden = true;
   }
 
   /* Manage the View Cert button*/
   var viewCert = document.getElementById("security-view-cert");
   if (info.cert) {
     security._cert = info.cert;
     viewCert.collapsed = false;
   } else
     viewCert.collapsed = true;
 
   /* Set Privacy & History section text */
-  var yesStr = pageInfoBundle.getString("yes");
-  var noStr = pageInfoBundle.getString("no");
 
   // Only show quota usage data for websites, not internal sites.
   if (uri.scheme == "http" || uri.scheme == "https") {
     SiteDataManager.updateSites().then(() => security._updateSiteDataInfo());
   } else {
     document.getElementById("security-privacy-sitedata-row").hidden = true;
   }
 
-  setText("security-privacy-passwords-value",
-          realmHasPasswords(uri) ? yesStr : noStr);
-
-  var visitCount = previousVisitCount(info.hostName);
+  if (realmHasPasswords(uri)) {
+    document.l10n.setAttributes(document.getElementById("security-privacy-passwords-value"),
+                                "saved-passwords-yes");
+  } else {
+    document.l10n.setAttributes(document.getElementById("security-privacy-passwords-value"),
+                                "saved-passwords-no");
+  }
 
-  let visitCountStr = visitCount > 0
-    ? PluralForm.get(visitCount, pageInfoBundle.getString("securityVisitsNumber"))
-        .replace("#1", visitCount.toLocaleString())
-    : pageInfoBundle.getString("securityNoVisits");
-  setText("security-privacy-history-value", visitCountStr);
+  document.l10n.setAttributes(document.getElementById("security-privacy-history-value"),
+                              "security-visits-number", {"visits": previousVisitCount(info.hostName)});
 
   /* Set the Technical Detail section messages */
   const pkiBundle = document.getElementById("pkiBundle");
   var hdr;
   var msg1;
   var msg2;
 
   if (info.isBroken) {
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/browser/pageInfo.ftl
@@ -0,0 +1,256 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/. --
+
+page-info-window =
+    .style = width: 600px; min-height: 550px;
+
+copy =
+    .key = C
+menu-copy =
+    .label = Copy
+    .accesskey = C
+
+select-all =
+    .key = A
+menu-select-all =
+    .label = Select All
+    .accesskey = A
+
+close-window =
+    .key = A
+
+general-tab =
+    .label = General
+    .accesskey = G
+general-title =
+    .value = Title:
+general-url =
+    .value = Address:
+general-type =
+    .value = Type:
+general-mode =
+    .value = Render Mode:
+general-size =
+    .value = Size:
+general-referrer =
+    .value = Referring URL:
+general-modified =
+    .value = Modified:
+general-encoding =
+    .value = Text Encoding:
+general-meta-name =
+    .label = Name
+general-meta-content =
+    .label = Content
+
+media-tab =
+    .label = Media
+    .accesskey = M
+media-location =
+    .value = Location:
+media-text =
+    .value = Associated Text:
+media-alt-header =
+    .label = Alternate Text
+media-address =
+    .label = Address
+media-type =
+    .label = Type
+media-size =
+    .label = Size
+media-count =
+    .label = Count
+media-dimension =
+    .value = Dimensions:
+media-long-desc =
+    .value = Long Description:
+media-save-as =
+    .label = Save As…
+    .accesskey = A
+media-save-image-as =
+    .label = Save As…
+    .accesskey = e
+media-preview =
+    .value = Media Preview:
+
+perm-tab =
+    .label = Permissions
+    .accesskey = P
+permissions-for =
+    .value = Permissions for:
+
+security-tab =
+    .label = Security
+    .accesskey = S
+security-view =
+    .label = View Certificate
+    .accesskey = V
+security-view-unknown = Unknown
+    .value = Unknown
+security-view-identity =
+    .value = Website Identity
+security-view-identity-owner =
+    .value = Owner:
+security-view-identity-domain =
+    .value = Website:
+security-view-identity-verifier =
+    .value = Verified by:
+security-view-identity-validity =
+    .value = Expires on:
+security-view-privacy =
+    .value = Privacy & History
+
+security-view-privacy-history-value = Have I visited this website prior to today?
+security-view-privacy-sitedata-value = Is this website storing information on my computer?
+
+security-view-privacy-clearsitedata =
+    .label = Clear Cookies and Site Data
+    .accesskey = C
+
+security-view-privacy-passwords-value = Have I saved any passwords for this website?
+
+security-view-privacy-viewpasswords =
+    .label = View Saved Passwords
+    .accesskey = w
+security-view-technical =
+    .value = Technical Details
+
+help-button =
+    .label = Help
+
+security-site-data-cookies-only = Yes, cookies
+security-site-data-no = No
+
+## These strings are used to tell the user if the website is storing cookies
+## and data on the users computer in the security tab of pageInfo
+## Variables:
+##   $value (number) - Amount of data being stored
+##   $unit (string) - The unit of data being stored (Usually KB)
+security-site-data-cookies = Yes, cookies and { $value } { $unit } of site data
+security-site-data-only = Yes, { $value } { $unit } of site data
+
+security-site-data-cookies-only = Yes, cookies
+security-site-data-no = No
+
+image-size-unknown = Unknown
+not-set-verified-by = Not specified
+not-set-alternative-text = Not specified
+not-set-date = Not specified
+media-img = Image
+media-bg-img = Background
+media-border-img = Border
+media-list-img = Bullet
+media-cursor = Cursor
+media-object = Object
+media-embed = Embed
+media-link = Icon
+media-input = Input
+media-video = Video
+media-audio = Audio
+saved-passwords-yes = Yes
+saved-passwords-no = No
+
+no-page-title =
+    .value = Untitled Page:
+general-quirks-mode =
+    .value = Quirks mode
+general-strict-mode =
+    .value = Standards compliance mode
+security-no-owner = This website does not supply ownership information.
+media-select-folder = Select a Folder to Save the Images
+media-unknown-not-cached =
+    .value = Unknown (not cached)
+permissions-use-default =
+    .label = Use Default
+security-no-visits = No
+
+# This string is used to display the number of meta tags
+# in the General Tab
+# Variables:
+#   $tags (number) - The number of meta tags
+general-meta-tags =
+    .value =
+        { $tags ->
+             [one] Meta (1 tag)
+            *[other] Meta ({ $tags } tags)
+        }
+
+# This string is used to display the number of times
+# the user has visited the website prior
+# Variables:
+#   $visits (number) - The number of previous visits
+security-visits-number =
+    { $visits ->
+         [0] No
+         [one] Yes, once
+        *[other] Yes, { $visits } times
+    }
+
+# This string is used to display the size of a media file
+# Variables:
+#   $kb (number) - The size of an image in Kilobytes
+#   $bytes (number) - The size of an image in Bytes
+properties-general-size =
+    .value = { $bytes ->
+         [one] { $kb } KB ({ $bytes } byte)
+        *[other] { $kb } KB ({ $bytes } bytes)
+    }
+
+# This string is used to display the type and number
+# of frames of a animated image
+# Variables:
+#   $type (string) - The type of a animated image
+#   $frames (number) - The number of frames in an animated image
+media-animated-image-type =
+    .value = { $frames ->
+         [one] { $type } Image (animated, { $frames } frame)
+        *[other] { $type } Image (animated, { $frames } frames)
+    }
+
+# This string is used to display the type of
+# an image
+# Variables:
+#   $type (string) - The type of an image
+media-image-type =
+    .value = { $type } Image
+
+# This string is used to display the size of a scaled image
+# in both scaled and unscaled pixels
+# Variables:
+#   $dimx (number) - The horizontal size of an image
+#   $dimy (number) - The vertical size of an image
+#   $scaledx (number) - The scaled horizontal size of an image
+#   $scaledy (number) - The scaled vertical size of an image
+media-dimensions-scaled =
+    .value = { $dimx }px × { $dimy }px (scaled to { $scaledx }px × { $scaledy }px)
+
+# This string is used to display the size of an image in pixels
+# Variables:
+#   $dimx (number) - The horizontal size of an image
+#   $dimy (number) - The vertical size of an image
+media-dimensions =
+    .value = { $dimx }px × { $dimy }px
+
+# This string is used to display the size of a media
+# file in kilobytes
+# Variables:
+#   $size (number) - The size of the media file in kilobytes
+media-file-size = { $size } KB
+
+# This string is used to display the website name next to the
+# "Block Images" checkbox in the media tab
+# Variables:
+#   $website (string) - The website name
+media-block-image =
+    .label = Block Images from { $website }
+    .accesskey = B
+
+# This string is used to display the URL of the website on top of the
+# pageInfo dialog box
+# Variables:
+#   $website (string) - The url of the website pageInfo is getting info for
+page-info-page =
+    .title = Page Info - { $website }
+page-info-frame =
+    .title = Frame Info - { $website }
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/pageInfo.dtd
+++ /dev/null
@@ -1,75 +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  pageInfoWindow.width  "600">
-<!ENTITY  pageInfoWindow.height "550">
-
-<!ENTITY  copy.key              "C">
-<!ENTITY  copy.label            "Copy">
-<!ENTITY  copy.accesskey        "C">
-<!ENTITY  selectall.key         "A">
-<!ENTITY  selectall.label       "Select All">
-<!ENTITY  selectall.accesskey   "A">
-<!ENTITY  closeWindow.key       "w">
-
-<!ENTITY  generalTab            "General">
-<!ENTITY  generalTab.accesskey  "G">
-<!ENTITY  generalTitle          "Title:">
-<!ENTITY  generalURL            "Address:">
-<!ENTITY  generalType           "Type:">
-<!ENTITY  generalMode           "Render Mode:">
-<!ENTITY  generalSize           "Size:">
-<!ENTITY  generalReferrer       "Referring URL:">
-<!ENTITY  generalSource         "Cache Source:">
-<!ENTITY  generalModified       "Modified:">
-<!ENTITY  generalEncoding2      "Text Encoding:">
-<!ENTITY  generalMetaName       "Name">
-<!ENTITY  generalMetaContent    "Content">
-
-<!ENTITY  mediaTab              "Media">
-<!ENTITY  mediaTab.accesskey    "M">
-<!ENTITY  mediaLocation         "Location:">
-<!ENTITY  mediaText             "Associated Text:">
-<!ENTITY  mediaAltHeader        "Alternate Text">
-<!ENTITY  mediaAddress          "Address">
-<!ENTITY  mediaType             "Type">
-<!ENTITY  mediaSize             "Size">
-<!ENTITY  mediaCount            "Count">
-<!ENTITY  mediaDimension        "Dimensions:">
-<!ENTITY  mediaLongdesc         "Long Description:">
-<!ENTITY  mediaBlockImage.accesskey "B">
-<!ENTITY  mediaSaveAs           "Save As…">
-<!ENTITY  mediaSaveAs.accesskey "A">
-<!ENTITY  mediaSaveAs2.accesskey "e">
-<!ENTITY  mediaPreview          "Media Preview:">
-
-<!ENTITY  permTab               "Permissions">
-<!ENTITY  permTab.accesskey     "P">
-<!ENTITY  permissionsFor        "Permissions for:">
-
-<!ENTITY  securityTab           "Security">
-<!ENTITY  securityTab.accesskey "S">
-<!ENTITY  securityView.certView "View Certificate">
-<!ENTITY  securityView.accesskey "V">
-<!ENTITY  securityView.unknown   "Unknown">
-
-
-<!ENTITY  securityView.identity.header   "Website Identity">
-<!ENTITY  securityView.identity.owner    "Owner:">
-<!ENTITY  securityView.identity.domain   "Website:">
-<!ENTITY  securityView.identity.verifier "Verified by:">
-<!ENTITY  securityView.identity.validity "Expires on:">
-
-<!ENTITY  securityView.privacy.header                   "Privacy &amp; History">
-<!ENTITY  securityView.privacy.history                  "Have I visited this website prior to today?">
-<!ENTITY  securityView.privacy.siteData                 "Is this website storing information on my computer?">
-<!ENTITY  securityView.privacy.clearSiteData            "Clear Cookies and Site Data">
-<!ENTITY  securityView.privacy.clearSiteData.accessKey  "C">
-<!ENTITY  securityView.privacy.passwords                "Have I saved any passwords for this website?">
-<!ENTITY  securityView.privacy.viewPasswords            "View Saved Passwords">
-<!ENTITY  securityView.privacy.viewPasswords.accessKey  "w">
-
-<!ENTITY  securityView.technical.header                 "Technical Details">
-
-<!ENTITY  helpButton.label                              "Help">
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/pageInfo.properties
+++ /dev/null
@@ -1,62 +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/.
-
-pageInfo.page.title=Page Info - %S
-pageInfo.frame.title=Frame Info - %S
-
-noPageTitle=Untitled Page:
-unknown=Unknown
-notset=Not specified
-yes=Yes
-no=No
-
-mediaImg=Image
-mediaVideo=Video
-mediaAudio=Audio
-mediaBGImg=Background
-mediaBorderImg=Border
-mediaListImg=Bullet
-mediaCursor=Cursor
-mediaObject=Object
-mediaEmbed=Embed
-mediaLink=Icon
-mediaInput=Input
-mediaFileSize=%S KB
-mediaSize=%Spx \u00D7 %Spx
-mediaSelectFolder=Select a Folder to Save the Images
-mediaBlockImage=Block Images from %S
-mediaUnknownNotCached=Unknown (not cached)
-mediaImageType=%S Image
-mediaAnimatedImageType=%S Image (animated, %S frames)
-mediaDimensions=%Spx \u00D7 %Spx
-mediaDimensionsScaled=%Spx \u00D7 %Spx (scaled to %Spx \u00D7 %Spx)
-
-generalQuirksMode=Quirks mode
-generalStrictMode=Standards compliance mode
-generalSize=%S KB (%S bytes)
-generalMetaTag=Meta (1 tag)
-generalMetaTags=Meta (%S tags)
-
-securityNoOwner=This website does not supply ownership information.
-# LOCALIZATION NOTE (securityVisitsNumber):
-# Semi-colon list of plural forms.
-# See: https://developer.mozilla.org/en/docs/Localization_and_Plurals
-# #1 is the number of visits and can be used in all plural forms as needed, e.g.
-# for '1': 'Yes, #1 time'
-securityVisitsNumber=Yes, once;Yes, #1 times
-securityNoVisits=No
-
-# LOCALIZATION NOTE(securitySiteDataCookies,securitySiteDataOnly): This is for site data disk usage.
-#   It confirms that a website is indeed using this much space.
-#   e.g. Is this website storing site data? "Yes, 50.23 MB"
-#   %1$S = size (in bytes or megabytes, ...)
-#   %2$S = unit of measure (bytes, KB, MB, ...)
-securitySiteDataCookies=Yes, cookies and %1$S %2$S of site data
-securitySiteDataOnly=Yes, %1$S %2$S of site data
-# LOCALIZATION NOTE(securitySiteDataCookiesOnly,securitySiteDataNo):
-# This is for site data and cookies usage. It answers the question "Is this website storing cookies and/or site data?"
-securitySiteDataCookiesOnly=Yes, cookies
-securitySiteDataNo=No
-
-permissions.useDefault=Use Default
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -17,18 +17,16 @@
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/accounts.properties             (%chrome/browser/accounts.properties)
     locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
     locale/browser/customizableui/customizableWidgets.properties (%chrome/browser/customizableui/customizableWidgets.properties)
     locale/browser/lightweightThemes.properties    (%chrome/browser/lightweightThemes.properties)
     locale/browser/uiDensity.properties            (%chrome/browser/uiDensity.properties)
-    locale/browser/pageInfo.dtd                    (%chrome/browser/pageInfo.dtd)
-    locale/browser/pageInfo.properties             (%chrome/browser/pageInfo.properties)
     locale/browser/pocket.properties               (%chrome/browser/pocket.properties)
     locale/browser/search.properties               (%chrome/browser/search.properties)
     locale/browser/siteData.properties             (%chrome/browser/siteData.properties)
     locale/browser/sitePermissions.properties      (%chrome/browser/sitePermissions.properties)
     locale/browser/setDesktopBackground.dtd        (%chrome/browser/setDesktopBackground.dtd)
     locale/browser/shellservice.properties         (%chrome/browser/shellservice.properties)
     locale/browser/tabbrowser.properties           (%chrome/browser/tabbrowser.properties)
     locale/browser/taskbar.properties              (%chrome/browser/taskbar.properties)
--- a/intl/l10n/DOMLocalization.jsm
+++ b/intl/l10n/DOMLocalization.jsm
@@ -60,17 +60,17 @@ const LOCALIZABLE_ATTRIBUTES = {
   },
   "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul": {
     global: [
       "accesskey", "aria-label", "aria-valuetext", "aria-moz-hint", "label",
       "title", "tooltiptext"],
     description: ["value"],
     key: ["key", "keycode"],
     label: ["value"],
-    textbox: ["placeholder"],
+    textbox: ["placeholder", "value"],
   },
 };
 
 
 /**
  * Translate an element.
  *
  * Translate the element's text content and attributes. Some HTML markup is
new file mode 100644
--- /dev/null
+++ b/python/l10n/fluent_migrations/bug_1517493_pageInfo.py
@@ -0,0 +1,327 @@
+# coding=utf8
+
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.helpers import VARIABLE_REFERENCE, TERM_REFERENCE
+from fluent.migrate import REPLACE, COPY, CONCAT, PLURALS, REPLACE_IN_TEXT
+
+def migrate(ctx):
+    """Bug 1517493 - Move strings from pageInfo.dtd and subsection of strings from pageInfo.properties to Fluent, part {index}"""
+
+    ctx.add_transforms(
+        "browser/browser/pageInfo.ftl",
+        "browser/browser/pageInfo.ftl",
+        [
+            FTL.Message(
+                id=FTL.Identifier("security-site-data-cookies"),
+                value=REPLACE(
+                    "browser/chrome/browser/pageInfo.properties",
+                    "securitySiteDataCookies",
+                    {
+                        "%1$S": VARIABLE_REFERENCE("value"),
+                        "%2$S": VARIABLE_REFERENCE("unit")
+                    },
+                    normalize_printf=True
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("security-site-data-only"),
+                value=REPLACE(
+                    "browser/chrome/browser/pageInfo.properties",
+                    "securitySiteDataOnly",
+                    {
+                        "%1$S": VARIABLE_REFERENCE("value"),
+                        "%2$S": VARIABLE_REFERENCE("unit")
+                    },
+                    normalize_printf=True
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("page-info-window"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("style"),
+                        CONCAT(
+                            FTL.TextElement("width: "),
+                            COPY(
+                                "browser/chrome/browser/pageInfo.dtd",
+                                "pageInfoWindow.width"
+                            ),
+                            FTL.TextElement("px; min-height: "),
+                            COPY(
+                                "browser/chrome/browser/pageInfo.dtd",
+                                "pageInfoWindow.height"
+                            ),
+                            FTL.TextElement("px;")
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("media-image-type"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("value"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "mediaImageType",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("type"),
+                            },
+                            normalize_printf=True
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("media-dimensions-scaled"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("value"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "mediaDimensionsScaled",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("dimx"),
+                                "%2$S": VARIABLE_REFERENCE("dimy"),
+                                "%3$S": VARIABLE_REFERENCE("scaledx"),
+                                "%4$S": VARIABLE_REFERENCE("scaledy"),
+                            },
+                            normalize_printf=True
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("media-dimensions"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("value"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "mediaDimensions",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("dimx"),
+                                "%2$S": VARIABLE_REFERENCE("dimy"),
+                            },
+                            normalize_printf=True
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("media-file-size"),
+                value=REPLACE(
+                    "browser/chrome/browser/pageInfo.properties",
+                    "mediaFileSize",
+                    {
+                        "%1$S": VARIABLE_REFERENCE("size"),
+                    },
+                    normalize_printf=True
+                )
+            ),
+            FTL.Message(
+                id=FTL.Identifier("media-block-image"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("label"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "mediaBlockImage",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("website")
+                            },
+                            normalize_printf=True
+                        )
+                    ),
+                    FTL.Attribute(
+                        FTL.Identifier("accesskey"),
+                        COPY(
+                            "browser/chrome/browser/pageInfo.dtd",
+                            "mediaBlockImage.accesskey"
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("page-info-page"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("title"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "pageInfo.page.title",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("website"),
+                            },
+                            normalize_printf=True
+                        )
+                    )
+                ]
+            ),
+            FTL.Message(
+                id=FTL.Identifier("page-info-frame"),
+                attributes=[
+                    FTL.Attribute(
+                        FTL.Identifier("title"),
+                        REPLACE(
+                            "browser/chrome/browser/pageInfo.properties",
+                            "pageInfo.frame.title",
+                            {
+                                "%1$S": VARIABLE_REFERENCE("website"),
+                            },
+                            normalize_printf=True
+                        )
+                    )
+                ]
+            )
+        ]
+    )
+
+    ctx.add_transforms(
+        "browser/browser/pageInfo.ftl",
+        "browser/browser/pageInfo.ftl",
+        transforms_from(
+"""
+security-site-data-cookies-only = { COPY("browser/chrome/browser/pageInfo.properties","securitySiteDataCookiesOnly") }
+security-site-data-no = { COPY("browser/chrome/browser/pageInfo.properties","securitySiteDataNo") }
+image-size-unknown = { COPY("browser/chrome/browser/pageInfo.properties","unknown") }
+copy =
+    .key = { COPY("browser/chrome/browser/pageInfo.dtd","copy.key") }
+menu-copy =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","copy.label") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","copy.accesskey") }
+select-all =
+    .key = { COPY("browser/chrome/browser/pageInfo.dtd","selectall.key") }
+menu-select-all =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","selectall.label") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","selectall.accesskey") }
+close-window =
+    .key = { COPY("browser/chrome/browser/pageInfo.dtd","selectall.key") }
+general-tab =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","generalTab") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","generalTab.accesskey") }
+general-title =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalTitle") }
+general-url =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalURL") }
+general-type =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalType") }
+general-mode =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalMode") }
+general-size =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalSize") }
+general-referrer =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalReferrer") }
+general-modified =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalModified") }
+general-encoding =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","generalEncoding2") }
+general-meta-name =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","generalMetaName") }
+general-meta-content =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","generalMetaContent") }
+media-tab =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaTab") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","mediaTab.accesskey") }
+media-location =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","mediaLocation") }
+media-text =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","mediaText") }
+media-alt-header =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaAltHeader") }
+media-address =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaAddress") }
+media-type =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaType") }
+media-size =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaSize") }
+media-count =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaCount") }
+media-dimension =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","mediaDimension") }
+media-long-desc =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","mediaLongdesc") }
+media-save-as =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaSaveAs") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","mediaSaveAs.accesskey") }
+media-save-image-as =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","mediaSaveAs") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","mediaSaveAs2.accesskey") }
+media-preview =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","mediaPreview") }
+perm-tab =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","permTab") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","permTab.accesskey") }
+permissions-for =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","permissionsFor") }
+security-tab =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","securityTab") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","securityTab.accesskey") }
+security-view =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.certView") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.accesskey") }
+security-view-unknown = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.unknown") }
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.unknown") }
+security-view-identity =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.identity.header") }
+security-view-identity-owner =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.identity.owner") }
+security-view-identity-domain =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.identity.domain") }
+security-view-identity-verifier =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.identity.verifier") }
+security-view-identity-validity =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.identity.validity") }
+security-view-privacy =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.header") }
+security-view-privacy-history-value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.history") }
+security-view-privacy-sitedata-value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.siteData") }
+security-view-privacy-clearsitedata =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.clearSiteData") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.clearSiteData.accessKey") }
+security-view-privacy-passwords-value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.passwords") }
+security-view-privacy-viewpasswords =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.viewPasswords") }
+    .accesskey = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.privacy.viewPasswords.accessKey") }
+security-view-technical =
+    .value = { COPY("browser/chrome/browser/pageInfo.dtd","securityView.technical.header") }
+help-button =
+    .label = { COPY("browser/chrome/browser/pageInfo.dtd","helpButton.label") }
+unknown = { COPY("browser/chrome/browser/pageInfo.properties","unknown") }
+not-set-verified-by = { COPY("browser/chrome/browser/pageInfo.properties","notset") }
+not-set-alternative-text = { COPY("browser/chrome/browser/pageInfo.properties","notset") }
+not-set-date = { COPY("browser/chrome/browser/pageInfo.properties","notset") }
+media-img = { COPY("browser/chrome/browser/pageInfo.properties","mediaImg") }
+media-bg-img = { COPY("browser/chrome/browser/pageInfo.properties","mediaBGImg") }
+media-border-img = { COPY("browser/chrome/browser/pageInfo.properties","mediaBorderImg") }
+media-list-img = { COPY("browser/chrome/browser/pageInfo.properties","mediaListImg") }
+media-cursor = { COPY("browser/chrome/browser/pageInfo.properties","mediaCursor") }
+media-object = { COPY("browser/chrome/browser/pageInfo.properties","mediaObject") }
+media-embed = { COPY("browser/chrome/browser/pageInfo.properties","mediaEmbed") }
+media-link = { COPY("browser/chrome/browser/pageInfo.properties","mediaLink") }
+media-input = { COPY("browser/chrome/browser/pageInfo.properties","mediaInput") }
+media-video = { COPY("browser/chrome/browser/pageInfo.properties","mediaVideo") }
+media-audio = { COPY("browser/chrome/browser/pageInfo.properties","mediaAudio") }
+saved-passwords-yes = { COPY("browser/chrome/browser/pageInfo.properties","yes") }
+saved-passwords-no = { COPY("browser/chrome/browser/pageInfo.properties","no") }
+no-page-title =
+    .value = { COPY("browser/chrome/browser/pageInfo.properties","noPageTitle") }
+general-quirks-mode =
+    .value = { COPY("browser/chrome/browser/pageInfo.properties","generalQuirksMode") }
+general-strict-mode =
+    .value = { COPY("browser/chrome/browser/pageInfo.properties","generalStrictMode") }
+security-no-owner = { COPY("browser/chrome/browser/pageInfo.properties","securityNoOwner") }
+media-select-folder = { COPY("browser/chrome/browser/pageInfo.properties","mediaSelectFolder") }
+media-unknown-not-cached =
+    .value = { COPY("browser/chrome/browser/pageInfo.properties","mediaUnknownNotCached") }
+permissions-use-default =
+    .label = { COPY("browser/chrome/browser/pageInfo.properties","permissions.useDefault") }
+security-no-visits = { COPY("browser/chrome/browser/pageInfo.properties","no") }
+"""
+        )
+    )
--- a/testing/firefox-ui/tests/functional/security/manifest.ini
+++ b/testing/firefox-ui/tests/functional/security/manifest.ini
@@ -1,17 +1,20 @@
 [DEFAULT]
 tags = remote
 
 [test_dv_certificate.py]
+skip-if = true # bug 1523133
 [test_enable_privilege.py]
 tags = local
 [test_ev_certificate.py]
+skip-if = true # bug 1523133
 [test_mixed_content_page.py]
 [test_mixed_script_content_blocking.py]
 [test_no_certificate.py]
+skip-if = true # bug 1523133
 tags = local
 [test_security_notification.py]
 [test_ssl_disabled_error_page.py]
 [test_ssl_status_after_restart.py]
 [test_submit_unencrypted_info_warning.py]
 [test_unknown_issuer.py]
 [test_untrusted_connection_error_page.py]
--- a/testing/firefox-ui/tests/puppeteer/manifest.ini
+++ b/testing/firefox-ui/tests/puppeteer/manifest.ini
@@ -11,16 +11,17 @@ tags = remote
 [test_software_update.py]
 [test_utils.py]
 
 # UI tests
 [test_about_window.py]
 [test_menubar.py]
 [test_notifications.py]
 [test_page_info_window.py]
+skip-if = true # bug 1523133
 [test_tabbar.py]
 [test_toolbars.py]
 disabled = Bug 1369556
 tags = remote
 [test_update_wizard.py]
 tags = remote
 [test_windows.py]
 skip-if = (os == "win" && bits == 64) #Bug 1214191