Merge mozilla-central to mozilla-inbound. a=merge on a CLOSED TREE

This commit is contained in:
Andreea Pavel 2018-06-30 13:10:01 +03:00
Родитель 80abb71067 91a9c110e2
Коммит 1bf7ac45bb
829 изменённых файлов: 51492 добавлений и 20743 удалений

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

@ -11,7 +11,7 @@ blessings = "==1.7"
jsmin = "==2.1.0"
json-e = "==2.5.0"
pipenv = "==2018.5.18"
pytest = "==3.2.5"
pytest = "==3.6.2"
python-hglib = "==2.4"
requests = "==2.9.1"
six = "==1.10.0"

45
Pipfile.lock сгенерированный
Просмотреть файл

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "7e168601e5f93e71900ebc68d8c18ff17edb6d5e224bcc83286b9bafaac41fe8"
"sha256": "609a35f65e9a4c07e0e1473ec982c6b5028622e9a795b6cfb8555ad8574804f3"
},
"pipfile-spec": 6,
"requires": {},
@ -14,6 +14,13 @@
]
},
"default": {
"atomicwrites": {
"hashes": [
"sha256:240831ea22da9ab882b551b31d4225591e5e447a68c5e188db5b89ca1d487585",
"sha256:a24da68318b08ac9c9c45029f4a10371ab5b20e4226738e150e6e7c571630ae6"
],
"version": "==1.1.5"
},
"attrs": {
"hashes": [
"sha256:4b90b09eeeb9b88c35bc642cbac057e45a5fd85367b985bd2809c62b7b939265",
@ -38,6 +45,14 @@
],
"version": "==2018.4.16"
},
"funcsigs": {
"hashes": [
"sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca",
"sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50"
],
"markers": "python_version < '3.0'",
"version": "==1.0.2"
},
"jsmin": {
"hashes": [
"sha256:5d07bf0251a4128e5e8e8eef603849b6b5741c337bff087731a248f9cc774f56"
@ -52,6 +67,14 @@
"index": "pypi",
"version": "==2.5.0"
},
"more-itertools": {
"hashes": [
"sha256:2b6b9893337bfd9166bee6a62c2b0c9fe7735dcf85948b387ec8cba30e85d8e8",
"sha256:6703844a52d3588f951883005efcf555e49566a48afd4db4e965d69b883980d3",
"sha256:a18d870ef2ffca2b8463c0070ad17b5978056f403fb64e3f15fe62a52db21cc0"
],
"version": "==4.2.0"
},
"pipenv": {
"hashes": [
"sha256:04b9a8b02a3ff12a5502b335850cfdb192adcfd1d6bbdb7a7c47cae9ab9ddece",
@ -60,20 +83,28 @@
"index": "pypi",
"version": "==2018.5.18"
},
"pluggy": {
"hashes": [
"sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff",
"sha256:d345c8fe681115900d6da8d048ba67c25df42973bda370783cd58826442dcd7c",
"sha256:e160a7fcf25762bb60efc7e171d4497ff1d8d2d75a3d0df7a21b76821ecbf5c5"
],
"version": "==0.6.0"
},
"py": {
"hashes": [
"sha256:29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881",
"sha256:983f77f3331356039fdd792e9220b7b8ee1aa6bd2b25f567a963ff1de5a64f6a"
"sha256:3fd59af7435864e1a243790d322d763925431213b6b8529c6ca71081ace3bbf7",
"sha256:e31fb2767eb657cbde86c454f02e99cb846d3cd9d61b318525140214fdc0e98e"
],
"version": "==1.5.3"
"version": "==1.5.4"
},
"pytest": {
"hashes": [
"sha256:241d7e7798d79192a123ceaf64c602b4d233eacf6d6e42ae27caa97f498b7dc6",
"sha256:6d5bd4f7113b444c55a3bbb5c738a3dd80d43563d063fc42dcb0aaefbdd78b81"
"sha256:8ea01fc4fcc8e1b1e305252b4bc80a1528019ab99fd3b88666c9dc38d754406c",
"sha256:90898786b3d0b880b47645bae7b51aa9bbf1e9d1e4510c2cfd15dd65c70ea0cd"
],
"index": "pypi",
"version": "==3.2.5"
"version": "==3.6.2"
},
"python-hglib": {
"hashes": [

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

@ -51,35 +51,6 @@ var StarUI = {
return this.panel = element;
},
// Array of command elements to disable when the panel is opened.
get _blockedCommands() {
delete this._blockedCommands;
return this._blockedCommands =
["cmd_close", "cmd_closeWindow"].map(id => this._element(id));
},
_blockCommands: function SU__blockCommands() {
this._blockedCommands.forEach(function(elt) {
// make sure not to permanently disable this item (see bug 409155)
if (elt.hasAttribute("wasDisabled"))
return;
if (elt.getAttribute("disabled") == "true") {
elt.setAttribute("wasDisabled", "true");
} else {
elt.setAttribute("wasDisabled", "false");
elt.setAttribute("disabled", "true");
}
});
},
_restoreCommandsState: function SU__restoreCommandsState() {
this._blockedCommands.forEach(function(elt) {
if (elt.getAttribute("wasDisabled") != "true")
elt.removeAttribute("disabled");
elt.removeAttribute("wasDisabled");
});
},
// nsIDOMEventListener
handleEvent(aEvent) {
switch (aEvent.type) {
@ -102,7 +73,6 @@ var StarUI = {
this._anchorElement.removeAttribute("open");
this._anchorElement = null;
this._restoreCommandsState();
let removeBookmarksOnPopupHidden = this._removeBookmarksOnPopupHidden;
this._removeBookmarksOnPopupHidden = false;
let guidsForRemoval = this._itemGuids;
@ -227,8 +197,6 @@ var StarUI = {
this._isNewBookmark = aIsNewBookmark;
this._itemGuids = null;
this._blockCommands(); // un-done in the popuphidden handler
this._element("editBookmarkPanelTitle").value =
this._isNewBookmark ?
gNavigatorBundle.getString("editBookmarkPanel.newBookmarkTitle") :

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

@ -7864,9 +7864,15 @@ var TabContextMenu = {
document.getElementById("context_undoCloseTab").disabled =
SessionStore.getClosedTabCount(window) == 0;
// Only one of pin/unpin should be visible
document.getElementById("context_pinTab").hidden = this.contextTab.pinned;
document.getElementById("context_unpinTab").hidden = !this.contextTab.pinned;
// Only one of pin/unpin/multiselect-pin/multiselect-unpin should be visible
let contextPinTab = document.getElementById("context_pinTab");
contextPinTab.hidden = this.contextTab.pinned || multiselectionContext;
let contextUnpinTab = document.getElementById("context_unpinTab");
contextUnpinTab.hidden = !this.contextTab.pinned || multiselectionContext;
let contextPinSelectedTabs = document.getElementById("context_pinSelectedTabs");
contextPinSelectedTabs.hidden = this.contextTab.pinned || !multiselectionContext;
let contextUnpinSelectedTabs = document.getElementById("context_unpinSelectedTabs");
contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !multiselectionContext;
// Disable "Close Tabs to the Right" if there are no tabs
// following it.

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

@ -109,6 +109,12 @@
<menuitem id="context_unpinTab" label="&unpinTab.label;" hidden="true"
accesskey="&unpinTab.accesskey;"
oncommand="gBrowser.unpinTab(TabContextMenu.contextTab);"/>
<menuitem id="context_pinSelectedTabs" label="&pinSelectedTabs.label;" hidden="true"
accesskey="&pinSelectedTabs.accesskey;"
oncommand="gBrowser.pinMultiSelectedTabs();"/>
<menuitem id="context_unpinSelectedTabs" label="&unpinSelectedTabs.label;" hidden="true"
accesskey="&unpinSelectedTabs.accesskey;"
oncommand="gBrowser.unpinMultiSelectedTabs();"/>
<menuitem id="context_duplicateTab" label="&duplicateTab.label;"
accesskey="&duplicateTab.accesskey;"
oncommand="duplicateTabIn(TabContextMenu.contextTab, 'tab');"/>

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

@ -3685,6 +3685,18 @@ window._gBrowser = {
}
},
pinMultiSelectedTabs() {
for (let tab of this.selectedTabs) {
this.pinTab(tab);
}
},
unpinMultiSelectedTabs() {
for (let tab of this.selectedTabs) {
this.unpinTab(tab);
}
},
activateBrowserForPrintPreview(aBrowser) {
this._printPreviewBrowsers.add(aBrowser);
if (this._switcher) {

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

@ -26,9 +26,9 @@ const whitelist = {
modules: new Set([
// From the test harness
"chrome://mochikit/content/ShutdownLeaksCollector.jsm",
"chrome://specialpowers/content/MockColorPicker.jsm",
"chrome://specialpowers/content/MockFilePicker.jsm",
"chrome://specialpowers/content/MockPermissionPrompt.jsm",
"resource://specialpowers/MockColorPicker.jsm",
"resource://specialpowers/MockFilePicker.jsm",
"resource://specialpowers/MockPermissionPrompt.jsm",
// General utilities
"resource://gre/modules/AppConstants.jsm",

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

@ -23,6 +23,7 @@ support-files =
[browser_multiselect_tabs_close_using_shortcuts.js]
[browser_multiselect_tabs_close.js]
[browser_multiselect_tabs_mute_unmute.js]
[browser_multiselect_tabs_pin_unpin.js]
[browser_multiselect_tabs_positional_attrs.js]
[browser_multiselect_tabs_using_Ctrl.js]
[browser_multiselect_tabs_using_Shift.js]

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

@ -0,0 +1,75 @@
const PREF_MULTISELECT_TABS = "browser.tabs.multiselect";
add_task(async function setPref() {
await SpecialPowers.pushPrefEnv({
set: [[PREF_MULTISELECT_TABS, true]]
});
});
add_task(async function test() {
let tab1 = await addTab();
let tab2 = await addTab();
let tab3 = await addTab();
let menuItemPinTab = document.getElementById("context_pinTab");
let menuItemUnpinTab = document.getElementById("context_unpinTab");
let menuItemPinSelectedTabs = document.getElementById("context_pinSelectedTabs");
let menuItemUnpinSelectedTabs = document.getElementById("context_unpinSelectedTabs");
is(gBrowser.multiSelectedTabsCount, 0, "Zero multiselected tabs");
await BrowserTestUtils.switchTab(gBrowser, tab1);
await triggerClickOn(tab2, { ctrlKey: true });
ok(tab1.multiselected, "Tab1 is multiselected");
ok(tab2.multiselected, "Tab2 is multiselected");
ok(!tab3.multiselected, "Tab3 is not multiselected");
// Check the context menu with a non-multiselected tab
updateTabContextMenu(tab3);
ok(!tab3.pinned, "Tab3 is unpinned");
is(menuItemPinTab.hidden, false, "Pin Tab is visible");
is(menuItemUnpinTab.hidden, true, "Unpin Tab is hidden");
is(menuItemPinSelectedTabs.hidden, true, "Pin Selected Tabs is hidden");
is(menuItemUnpinSelectedTabs.hidden, true, "Unpin Selected Tabs is hidden");
// Check the context menu with a multiselected and unpinned tab
updateTabContextMenu(tab2);
ok(!tab2.pinned, "Tab2 is unpinned");
is(menuItemPinTab.hidden, true, "Pin Tab is hidden");
is(menuItemUnpinTab.hidden, true, "Unpin Tab is hidden");
is(menuItemPinSelectedTabs.hidden, false, "Pin Selected Tabs is visible");
is(menuItemUnpinSelectedTabs.hidden, true, "Unpin Selected Tabs is hidden");
let tab1Pinned = BrowserTestUtils.waitForEvent(tab1, "TabPinned");
let tab2Pinned = BrowserTestUtils.waitForEvent(tab2, "TabPinned");
menuItemPinSelectedTabs.click();
await tab1Pinned;
await tab2Pinned;
ok(tab1.pinned, "Tab1 is pinned");
ok(tab2.pinned, "Tab2 is pinned");
ok(!tab3.pinned, "Tab3 is unpinned");
// Check the context menu with a multiselected and pinned tab
updateTabContextMenu(tab2);
ok(tab2.pinned, "Tab2 is pinned");
is(menuItemPinTab.hidden, true, "Pin Tab is hidden");
is(menuItemUnpinTab.hidden, true, "Unpin Tab is hidden");
is(menuItemPinSelectedTabs.hidden, true, "Pin Selected Tabs is hidden");
is(menuItemUnpinSelectedTabs.hidden, false, "Unpin Selected Tabs is visible");
let tab1Unpinned = BrowserTestUtils.waitForEvent(tab1, "TabUnpinned");
let tab2Unpinned = BrowserTestUtils.waitForEvent(tab2, "TabUnpinned");
menuItemUnpinSelectedTabs.click();
await tab1Unpinned;
await tab2Unpinned;
ok(!tab1.pinned, "Tab1 is unpinned");
ok(!tab2.pinned, "Tab2 is unpinned");
ok(!tab3.pinned, "Tab3 is unpinned");
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
BrowserTestUtils.removeTab(tab3);
});

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

@ -114,6 +114,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -121,6 +122,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -338,6 +340,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -345,6 +348,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -380,6 +384,7 @@
},
"Additional": {
"type": "array",
"strict": false,
"items": {
"type": "URL"
}
@ -395,6 +400,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -441,6 +447,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -448,6 +455,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -468,6 +476,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -475,6 +484,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -495,6 +505,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -502,6 +513,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -522,6 +534,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -529,6 +542,7 @@
"Block": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}
@ -553,6 +567,7 @@
"properties": {
"Allow": {
"type": "array",
"strict": false,
"items": {
"type": "origin"
}

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

@ -8,6 +8,7 @@ ChromeUtils.defineModuleGetter(this, "ExtensionSettingsStore",
"resource://gre/modules/ExtensionSettingsStore.jsm");
var {
chromeModifierKeyMap,
ExtensionError,
} = ExtensionUtils;
@ -290,15 +291,8 @@ this.commands = class extends ExtensionAPI {
* @returns {string} The constructed value for the Key's 'modifiers' attribute.
*/
getModifiersAttribute(chromeModifiers) {
let modifiersMap = {
"Alt": "alt",
"Command": "accel",
"Ctrl": "accel",
"MacCtrl": "control",
"Shift": "shift",
};
return Array.from(chromeModifiers, modifier => {
return modifiersMap[modifier];
return chromeModifierKeyMap[modifier];
}).join(" ");
}

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

@ -8,20 +8,8 @@
"types": [
{
"id": "KeyName",
"choices": [
{
"type": "string",
"pattern": "^\\s*(Alt|Ctrl|Command|MacCtrl)\\s*\\+\\s*(Shift\\s*\\+\\s*)?([A-Z0-9]|Comma|Period|Home|End|PageUp|PageDown|Space|Insert|Delete|Up|Down|Left|Right)\\s*$"
},
{
"type": "string",
"pattern": "^\\s*((Alt|Ctrl|Command|MacCtrl)\\s*\\+\\s*)?(Shift\\s*\\+\\s*)?(F[1-9]|F1[0-2])\\s*$"
},
{
"type": "string",
"pattern": "^(MediaNextTrack|MediaPlayPause|MediaPrevTrack|MediaStop)$"
}
]
"type": "string",
"format": "manifestShortcutKey"
},
{
"$extend": "WebExtensionManifest",

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

@ -170,6 +170,15 @@ add_task(async function test_user_defined_commands() {
accelKey: true,
},
},
{
name: "toggle-ctrl-alt-v",
shortcut: "Ctrl+Alt+V",
key: "V",
modifiers: {
accelKey: true,
altKey: true,
},
},
];

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

@ -4,22 +4,40 @@
add_task(async function test_manifest_commands() {
let normalized = await ExtensionTestUtils.normalizeManifest({
"commands": {
"toggle-feature": {
"suggested_key": {"default": "Shifty+Y"},
"description": "Send a 'toggle-feature' event to the extension",
const validShortcuts = ["Ctrl+Y", "MacCtrl+Y", "Command+Y", "Alt+Shift+Y", "Ctrl+Alt+Y", "F1", "MediaNextTrack"];
const invalidShortcuts = ["Shift+Y", "Y", "Ctrl+Ctrl+Y", "Ctrl+Command+Y"];
async function validateShortcut(shortcut, isValid) {
let normalized = await ExtensionTestUtils.normalizeManifest({
"commands": {
"toggle-feature": {
"suggested_key": {"default": shortcut},
"description": "Send a 'toggle-feature' event to the extension",
},
},
},
});
});
if (isValid) {
ok(!normalized.error,
"There should be no manifest errors.");
} else {
let expectedError = (
String.raw`Error processing commands.toggle-feature.suggested_key.default: Error: ` +
String.raw`Value "${shortcut}" must consist of ` +
String.raw`either a combination of one or two modifiers, including ` +
String.raw`a mandatory primary modifier and a key, separated by '+', ` +
String.raw`or a media key. For details see: ` +
String.raw`https://developer.mozilla.org/en-US/Add-ons/WebExtensions/manifest.json/commands#Key_combinations`
);
let expectedError = (
String.raw`commands.toggle-feature.suggested_key.default: Value "Shifty+Y" must either: ` +
String.raw`match the pattern /^\s*(Alt|Ctrl|Command|MacCtrl)\s*\+\s*(Shift\s*\+\s*)?([A-Z0-9]|Comma|Period|Home|End|PageUp|PageDown|Space|Insert|Delete|Up|Down|Left|Right)\s*$/, ` +
String.raw`match the pattern /^\s*((Alt|Ctrl|Command|MacCtrl)\s*\+\s*)?(Shift\s*\+\s*)?(F[1-9]|F1[0-2])\s*$/, or ` +
String.raw`match the pattern /^(MediaNextTrack|MediaPlayPause|MediaPrevTrack|MediaStop)$/`
);
ok(normalized.error.includes(expectedError),
`The manifest error ${JSON.stringify(normalized.error)} must contain ${JSON.stringify(expectedError)}`);
}
}
ok(normalized.error.includes(expectedError),
`The manifest error ${JSON.stringify(normalized.error)} must contain ${JSON.stringify(expectedError)}`);
for (let shortcut of validShortcuts) {
validateShortcut(shortcut, true);
}
for (let shortcut of invalidShortcuts) {
validateShortcut(shortcut, false);
}
});

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

@ -18,7 +18,7 @@ const TOPIC_LOCALES_CHANGE = "intl:app-locales-changed";
// Automated tests ensure packaged locales are in this list. Copied output of:
// https://github.com/mozilla/activity-stream/blob/master/bin/render-activity-stream-html.js
const ACTIVITY_STREAM_LOCALES = "en-US ach an ar ast az be bg bn-BD bn-IN br bs ca cak crh cs cy da de dsb el en-CA en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mai mk ml mr ms my nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru si sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" ");
const ACTIVITY_STREAM_LOCALES = "en-US ach an ar ast az be bg bn-BD bn-IN br bs ca cak crh cs cy da de dsb el en-CA en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ja-JP-mac ka kab kk km kn ko lij lo lt ltg lv mai mk ml mr ms my nb-NO ne-NP nl nn-NO oc pa-IN pl pt-BR pt-PT rm ro ru si sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW mix".split(" ");
const ABOUT_URL = "about:newtab";

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

@ -114,7 +114,6 @@
<vbox id="editBMPanel_keywordRow"
collapsed="true">
<observes element="additionalInfoBroadcaster" attribute="hidden"/>
<label value="&editBookmarkOverlay.keyword.label;"
accesskey="&editBookmarkOverlay.keyword.accesskey;"
control="editBMPanel_keywordField"/>
@ -122,8 +121,4 @@
onchange="gEditItemOverlay.onKeywordFieldChange();"/>
</vbox>
</vbox>
<!-- If the ids are changing or additional fields are being added, be sure
to sync the values in places.js -->
<broadcaster id="additionalInfoBroadcaster"/>
</vbox>

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

@ -28,13 +28,6 @@ const HISTORY_LIBRARY_SEARCH_TELEMETRY = "PLACES_HISTORY_LIBRARY_SEARCH_TIME_MS"
var PlacesOrganizer = {
_places: null,
// IDs of fields from editBookmark that should be hidden when infoBox
// is minimal. IDs should be kept in sync with the IDs of the elements
// observing additionalInfoBroadcaster.
_additionalInfoFields: [
"editBMPanel_keywordRow",
],
_initFolderTree() {
this._places.place = `place:type=${Ci.nsINavHistoryQueryOptions.RESULTS_AS_LEFT_PANE_QUERY}&excludeItems=1&expandQueries=0`;
},
@ -584,41 +577,6 @@ var PlacesOrganizer = {
fp.open(fpCallback);
},
_detectAndSetDetailsPaneMinimalState:
function PO__detectAndSetDetailsPaneMinimalState(aNode) {
/**
* The details of simple folder-items (as opposed to livemarks) or the
* of livemark-children are not likely to fill the infoBox anyway,
* thus we remove the "More/Less" button and show all details.
*
* the wasminimal attribute here is used to persist the "more/less"
* state in a bookmark->folder->bookmark scenario.
*/
var infoBox = document.getElementById("infoBox");
var infoBoxExpanderWrapper = document.getElementById("infoBoxExpanderWrapper");
var additionalInfoBroadcaster = document.getElementById("additionalInfoBroadcaster");
if (!aNode) {
infoBoxExpanderWrapper.hidden = true;
return;
}
if (aNode.itemId != -1 &&
PlacesUtils.nodeIsFolder(aNode) && !aNode._feedURI) {
if (infoBox.getAttribute("minimal") == "true")
infoBox.setAttribute("wasminimal", "true");
infoBox.removeAttribute("minimal");
infoBoxExpanderWrapper.hidden = true;
} else {
if (infoBox.getAttribute("wasminimal") == "true")
infoBox.setAttribute("minimal", "true");
infoBox.removeAttribute("wasminimal");
infoBoxExpanderWrapper.hidden =
this._additionalInfoFields.every(id =>
document.getElementById(id).collapsed);
}
additionalInfoBroadcaster.hidden = infoBox.getAttribute("minimal") == "true";
},
_fillDetailsPane: function PO__fillDetailsPane(aNodeList) {
var infoBox = document.getElementById("infoBox");
var detailsDeck = document.getElementById("detailsDeck");
@ -659,8 +617,6 @@ var PlacesOrganizer = {
gEditItemOverlay.initPanel({ node: selectedNode,
hiddenRows: ["folderPicker"] });
this._detectAndSetDetailsPaneMinimalState(selectedNode);
} else if (!selectedNode && aNodeList[0]) {
if (aNodeList.every(PlacesUtils.nodeIsURI)) {
let uris = aNodeList.map(node => Services.io.newURI(node.uri));
@ -670,7 +626,6 @@ var PlacesOrganizer = {
"location",
"keyword",
"name"]});
this._detectAndSetDetailsPaneMinimalState(selectedNode);
} else {
detailsDeck.selectedIndex = 0;
let selectItemDesc = document.getElementById("selectItemDescription");
@ -703,27 +658,6 @@ var PlacesOrganizer = {
}
}
},
toggleAdditionalInfoFields: function PO_toggleAdditionalInfoFields() {
var infoBox = document.getElementById("infoBox");
var infoBoxExpander = document.getElementById("infoBoxExpander");
var infoBoxExpanderLabel = document.getElementById("infoBoxExpanderLabel");
var additionalInfoBroadcaster = document.getElementById("additionalInfoBroadcaster");
if (infoBox.getAttribute("minimal") == "true") {
infoBox.removeAttribute("minimal");
infoBoxExpanderLabel.value = infoBoxExpanderLabel.getAttribute("lesslabel");
infoBoxExpanderLabel.accessKey = infoBoxExpanderLabel.getAttribute("lessaccesskey");
infoBoxExpander.className = "expander-up";
additionalInfoBroadcaster.removeAttribute("hidden");
} else {
infoBox.setAttribute("minimal", "true");
infoBoxExpanderLabel.value = infoBoxExpanderLabel.getAttribute("morelabel");
infoBoxExpanderLabel.accessKey = infoBoxExpanderLabel.getAttribute("moreaccesskey");
infoBoxExpander.className = "expander-down";
additionalInfoBroadcaster.setAttribute("hidden", "true");
}
},
};
/**

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

@ -441,25 +441,8 @@
</description>
<spacer flex="3"/>
</vbox>
<vbox id="infoBox" minimal="true">
<vbox id="infoBox">
#include editBookmarkPanel.inc.xul
<hbox id="infoBoxExpanderWrapper" align="center">
<button type="image" id="infoBoxExpander"
class="expander-down"
oncommand="PlacesOrganizer.toggleAdditionalInfoFields();"
observes="paneElementsBroadcaster"/>
<label id="infoBoxExpanderLabel"
lesslabel="&detailsPane.less.label;"
lessaccesskey="&detailsPane.less.accesskey;"
morelabel="&detailsPane.more.label;"
moreaccesskey="&detailsPane.more.accesskey;"
value="&detailsPane.more.label;"
accesskey="&detailsPane.more.accesskey;"
control="infoBoxExpander"/>
</hbox>
</vbox>
</deck>
</vbox>

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

@ -62,7 +62,6 @@ skip-if = (verify && debug && (os == 'mac' || os == 'linux'))
[browser_library_delete_tags.js]
[browser_library_delete.js]
[browser_library_downloads.js]
[browser_library_infoBox.js]
[browser_library_left_pane_middleclick.js]
[browser_library_left_pane_select_hierarchy.js]
[browser_library_middleclick.js]

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

@ -48,11 +48,6 @@ add_task(async function() {
library.ContentTree.view.selectNode(node);
synthesizeClickOnSelectedTreeCell(library.ContentTree.view);
// Expand the additional info for the first bookmark.
if (i === 0) {
library.document.getElementById("infoBoxExpander").click();
}
is(library.document.getElementById("editBMPanel_keywordField").value, "",
"The keyword field should be empty");
info("Add a keyword to the bookmark");

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

@ -1,160 +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/. */
/**
* Test appropriate visibility of infoBoxExpanderWrapper and
* additionalInfoFields in infoBox section of library
*/
let gLibrary;
add_task(async function() {
// Open Library.
gLibrary = await promiseLibrary();
registerCleanupFunction(async () => {
gLibrary.close();
await PlacesUtils.history.clear();
});
gLibrary.PlacesOrganizer._places.focus();
info("Bug 430148 - Remove or hide the more/less button in details pane...");
let PO = gLibrary.PlacesOrganizer;
let ContentTree = gLibrary.ContentTree;
let infoBoxExpanderWrapper = getAndCheckElmtById("infoBoxExpanderWrapper");
await PlacesTestUtils.addVisits("http://www.mozilla.org/");
// open all bookmarks node
PO.selectLeftPaneBuiltIn("AllBookmarks");
isnot(PO._places.selectedNode, null,
"Correctly selected all bookmarks node.");
checkInfoBoxSelected();
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for all bookmarks node.");
checkAddInfoFieldsCollapsed(PO);
// open history node
PO.selectLeftPaneBuiltIn("History");
isnot(PO._places.selectedNode, null, "Correctly selected history node.");
checkInfoBoxSelected();
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for history node.");
checkAddInfoFieldsCollapsed(PO);
// open history child node
var historyNode = PO._places.selectedNode.
QueryInterface(Ci.nsINavHistoryContainerResultNode);
historyNode.containerOpen = true;
var childNode = historyNode.getChild(0);
isnot(childNode, null, "History node first child is not null.");
PO._places.selectNode(childNode);
checkInfoBoxSelected();
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for history child node.");
checkAddInfoFieldsCollapsed(PO);
// open history item
var view = ContentTree.view.view;
ok(view.rowCount > 0, "History item exists.");
view.selection.select(0);
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for history item.");
checkAddInfoFieldsCollapsed(PO);
historyNode.containerOpen = false;
// open bookmarks menu node
PO.selectLeftPaneBuiltIn("BookmarksMenu");
isnot(PO._places.selectedNode, null,
"Correctly selected bookmarks menu node.");
checkInfoBoxSelected();
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for bookmarks menu node.");
checkAddInfoFieldsCollapsed(PO);
// open recently bookmarked node
await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.menuGuid,
url: "place:" + PlacesUtils.bookmarks.userContentRoots.map(guid => `parent=${guid}`).join("&") +
"&queryType=" + Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS +
"&sort=" + Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_DESCENDING +
"&maxResults=10" +
"&excludeQueries=1",
title: "Recent Bookmarks",
index: 0
});
await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.menuGuid,
url: "http://mozilla.org/",
title: "Mozilla",
index: 1
});
var menuNode = PO._places.selectedNode.
QueryInterface(Ci.nsINavHistoryContainerResultNode);
menuNode.containerOpen = true;
childNode = menuNode.getChild(0);
isnot(childNode, null, "Bookmarks menu child node exists.");
is(childNode.title, "Recent Bookmarks",
"Correctly selected recently bookmarked node.");
PO._places.selectNode(childNode);
checkInfoBoxSelected();
ok(infoBoxExpanderWrapper.hidden,
"Expander button is hidden for recently bookmarked node.");
checkAddInfoFieldsCollapsed(PO);
// open first bookmark
view = ContentTree.view.view;
ContentTree.view.focus();
ok(view.rowCount > 0, "Bookmark item exists.");
view.selection.select(0);
checkInfoBoxSelected();
ok(!infoBoxExpanderWrapper.hidden,
"Expander button is not hidden for bookmark item.");
checkAddInfoFieldsNotCollapsed(PO);
ok(true, "Checking additional info fields visibiity for bookmark item");
var expanderButton = getAndCheckElmtById("infoBoxExpander");
// make sure additional fields are hidden by default
PO._additionalInfoFields.forEach(function(id) {
ok(getAndCheckElmtById(id).hidden,
"Additional info field correctly hidden by default: #" + id);
});
// toggle fields and make sure they are hidden/unhidden as expected
expanderButton.click();
PO._additionalInfoFields.forEach(function(id) {
ok(!getAndCheckElmtById(id).hidden,
"Additional info field correctly unhidden after toggle: #" + id);
});
expanderButton.click();
PO._additionalInfoFields.forEach(function(id) {
ok(getAndCheckElmtById(id).hidden,
"Additional info field correctly hidden after toggle: #" + id);
});
menuNode.containerOpen = false;
});
function checkInfoBoxSelected() {
is(getAndCheckElmtById("detailsDeck").selectedIndex, 1,
"Selected element in detailsDeck is infoBox.");
}
function checkAddInfoFieldsCollapsed(PO) {
PO._additionalInfoFields.forEach(id => {
ok(getAndCheckElmtById(id).collapsed,
`Additional info field should be collapsed: #${id}`);
});
}
function checkAddInfoFieldsNotCollapsed(PO) {
ok(PO._additionalInfoFields.some(id => !getAndCheckElmtById(id).collapsed),
`Some additional info field should not be collapsed.`);
}
function getAndCheckElmtById(id) {
var elmt = gLibrary.document.getElementById(id);
isnot(elmt, null, "Correctly got element: #" + id);
return elmt;
}

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

@ -19,6 +19,10 @@ module.exports = {
"eslint:recommended",
"plugin:mozilla/recommended" // require("eslint-plugin-mozilla")
],
"globals": {
// Remove this when m-c updates their eslint: See https://github.com/mozilla/activity-stream/pull/4219
"RPMSendAsyncMessage": true
},
"overrides": [{
// Use a configuration that's more appropriate for JSMs
"files": "**/*.jsm",

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

@ -7,6 +7,9 @@ const path = require("path");
const {prerender} = require("./prerender");
const DEFAULT_LOCALE = "en-US";
// Note: DEFAULT_OPTIONS.baseUrl should match BASE_URL in aboutNewTabService.js
// in mozilla-central.
const DEFAULT_OPTIONS = {
addonPath: "..",
baseUrl: "resource://activity-stream/"
@ -166,6 +169,7 @@ function getTextDirection(locale) {
* {str} options.direction The language direction to render in dir="" attribute
* {str} options.baseUrl The base URL for all local assets
* {bool} options.debug Should we use dev versions of JS libraries?
* {bool} options.noscripts Should we include scripts in the prerendered files?
* @param {str} html The prerendered HTML created with React.renderToString (optional)
* @return {str} An HTML document as a string
*/
@ -186,6 +190,18 @@ function templateHTML(options, html) {
if (isPrerendered) {
scripts.unshift(`${options.baseUrl}prerendered/static/activity-stream-initial-state.js`);
}
const scriptTag = `
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of ${JSON.stringify(scripts, null, 2)}) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>`;
return `<!doctype html>
<html lang="${options.locale}" dir="${options.direction}">
<head>
@ -200,18 +216,7 @@ function templateHTML(options, html) {
<div id="root">${isPrerendered ? html : ""}</div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
<script>
// Don't directly load the following scripts as part of html to let the page
// finish loading to render the content sooner.
for (const src of ${JSON.stringify(scripts, null, 2)}) {
// These dynamically inserted scripts by default are async, but we need them
// to load in the desired order (i.e., bundle last).
const script = document.body.appendChild(document.createElement("script"));
script.async = false;
script.src = src;
}
</script>
</div>${options.noscripts ? "" : scriptTag}
</body>
</html>
`;
@ -256,14 +261,18 @@ function writeFiles(name, destPath, filesMap, {html, state}, options) {
const STATIC_FILES = new Map([
["activity-stream-debug.html", ({options}) => templateHTML(options)],
["activity-stream-debug-noscripts.html", ({options}) => templateHTML(Object.assign({}, options, {noscripts: true}))],
["activity-stream-initial-state.js", ({state}) => templateJs("gActivityStreamPrerenderedState", "static", state)],
["activity-stream-prerendered-debug.html", ({html, options}) => templateHTML(options, html)]
["activity-stream-prerendered-debug.html", ({html, options}) => templateHTML(options, html)],
["activity-stream-prerendered-debug-noscripts.html", ({html, options}) => templateHTML(Object.assign({}, options, {noscripts: true}), html)]
]);
const LOCALIZED_FILES = new Map([
["activity-stream-prerendered.html", ({html, options}) => templateHTML(options, html)],
["activity-stream-prerendered-noscripts.html", ({html, options}) => templateHTML(Object.assign({}, options, {noscripts: true}), html)],
["activity-stream-strings.js", ({options: {locale, strings}}) => templateJs("gActivityStreamStrings", locale, strings)],
["activity-stream.html", ({options}) => templateHTML(options)]
["activity-stream.html", ({options}) => templateHTML(options)],
["activity-stream-noscripts.html", ({options}) => templateHTML(Object.assign({}, options, {noscripts: true}))]
]);
/**

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

@ -48,6 +48,20 @@ export const ASRouterUtils = {
sendTelemetry(ping) {
const payload = ac.ASRouterUserEvent(ping);
global.RPMSendAsyncMessage(AS_GENERAL_OUTGOING_MESSAGE_NAME, payload);
},
getEndpoint() {
if (window.location.href.includes("endpoint")) {
const params = new URLSearchParams(window.location.href.slice(window.location.href.indexOf("endpoint")));
try {
const endpoint = new URL(params.get("endpoint"));
return {
url: endpoint.href,
snippetId: params.get("snippetId")
};
} catch (e) {}
}
return null;
}
};
@ -171,8 +185,15 @@ export class ASRouterUISurface extends React.PureComponent {
}
componentWillMount() {
const endpoint = ASRouterUtils.getEndpoint();
ASRouterUtils.addListener(this.onMessageFromParent);
ASRouterUtils.sendMessage({type: "CONNECT_UI_REQUEST"});
// If we are loading about:welcome we want to trigger the onboarding messages
if (this.props.document.location.href === "about:welcome") {
ASRouterUtils.sendMessage({type: "TRIGGER", data: {trigger: "firstRun"}});
} else {
ASRouterUtils.sendMessage({type: "CONNECT_UI_REQUEST", data: {endpoint}});
}
}
componentWillUnmount() {

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

@ -7,6 +7,7 @@
padding: 8px 15px;
margin-inline-start: 12px;
color: inherit;
.tall & {
margin-inline-start: 20px;
}

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

@ -3,6 +3,7 @@
overflow: hidden;
}
}
.modalOverlayOuter {
background: $white;
opacity: 0.93;
@ -96,7 +97,7 @@
margin-top: 20px;
width: 150px;
height: 30px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px;
}
}

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

@ -8,7 +8,8 @@ Field name | Type | Required | Description | Example / Note
`publish_end` | `date` | No | When to stop showing the message | `1524474850876`
`content` | `object` | Yes | An object containing all variables/props to be rendered in the template. Subset of allowed tags detailed below. | [See example below](#html-subset)
`campaign` | `string` | No | Campaign id that the message belongs to | `RustWebAssembly`
`targeting` | `string` `JEXL` | Yes | A [JEXL expression](http://normandy.readthedocs.io/en/latest/user/filter_expressions.html#jexl-basics) with all targeting information needed in order to decide if the message is shown | Not yet implemented, [some examples](http://normandy.readthedocs.io/en/latest/user/filter_expressions.html#examples)
`targeting` | `string` `JEXL` | No | A [JEXL expression](http://normandy.readthedocs.io/en/latest/user/filter_expressions.html#jexl-basics) with all targeting information needed in order to decide if the message is shown | Not yet implemented, [some examples](http://normandy.readthedocs.io/en/latest/user/filter_expressions.html#examples)
`trigger` | `string` | No | An event or condition upon which the message will be immediately shown. This can be combined with `targeting`. Messages that define a trigger will not be shown during non-trigger-based passive message rotation.
### Message example
```javascript

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

@ -27,6 +27,10 @@
"targeting": {
"type": "string",
"description": "a JEXL expression representing targeting information"
},
"trigger": {
"type": "string",
"description": "A string representing what the trigger to show this message is."
}
},
"required": ["id", "template", "content"]

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

@ -25,12 +25,12 @@
height: 170px;
text-align: left;
padding: 10px;
border-bottom: 1px solid #D8D8D8;
border-bottom: 1px solid $grey-30;
display: flex;
margin-bottom: 11px;
&:last-child {
border: none;
border: 0;
}
.onboardingContent {
@ -72,19 +72,19 @@
}
&.addons {
background-image: url("resource://activity-stream/data/content/assets/illustration-addons@2x.png");
background-image: url('resource://activity-stream/data/content/assets/illustration-addons@2x.png');
}
&.privatebrowsing {
background-image: url("resource://activity-stream/data/content/assets/illustration-privatebrowsing@2x.png");
background-image: url('resource://activity-stream/data/content/assets/illustration-privatebrowsing@2x.png');
}
&.screenshots {
background-image: url("resource://activity-stream/data/content/assets/illustration-screenshots@2x.png");
background-image: url('resource://activity-stream/data/content/assets/illustration-screenshots@2x.png');
}
&.gift {
background-image: url("resource://activity-stream/data/content/assets/illustration-gift@2x.png");
background-image: url('resource://activity-stream/data/content/assets/illustration-gift@2x.png');
}
}
@ -106,18 +106,18 @@
line-height: 22px;
@media(max-width: 650px) {
margin-bottom: 0px;
margin-bottom: 0;
}
}
}
.onboardingButton {
background-color: $grey-90-10;
border: none;
border: 0;
width: 150px;
height: 30px;
margin-bottom: 23px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px;
// at 850px, the button shimmies down and to the right
@ -139,7 +139,7 @@
height: 220px;
width: 1px;
position: absolute;
background-color: #D8D8D8;
background-color: $grey-30;
margin-top: 40px;
margin-left: 215px;

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

@ -1,16 +1,35 @@
{
"title": "SimpleSnippet",
"description": "A simple template with an icon, text, and optional button.",
"version": "1.0.0",
"version": "1.1.1",
"type": "object",
"definitions": {
"plainText": {
"description": "Plain text (no HTML allowed)",
"type": "string"
},
"richText": {
"description": "Text with HTML subset allowed: i, b, u, strong, em, br",
"type": "string"
},
"link_url": {
"description": "Target for links or buttons",
"type": "string",
"format": "uri"
}
},
"properties": {
"title": {
"type": "string",
"description": "Snippet title displayed before snippet text"
"allOf": [
{"$ref": "#/definitions/plainText"},
{"description": "Snippet title displayed before snippet text"}
]
},
"text": {
"type": "string",
"description": "Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"
"allOf": [
{"$ref": "#/definitions/plainText"},
{"description": "Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}
]
},
"icon": {
"type": "string",
@ -21,12 +40,16 @@
"description": "Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."
},
"button_url": {
"type": "string",
"description": "A url, button_label links to this"
"allOf": [
{"$ref": "#/definitions/link_url"},
{"description": "A url, button_label links to this"}
]
},
"button_label": {
"type": "string",
"description": "Text for a button next to main snippet text that links to button_url. Requires button_url."
"allOf": [
{"$ref": "#/definitions/plainText"},
{"description": "Text for a button next to main snippet text that links to button_url. Requires button_url."}
]
},
"button_color": {
"type": "string",
@ -48,8 +71,10 @@
"links": {
"additionalProperties": {
"url": {
"type": "string",
"description": "The url where the link points to."
"allOf": [
{"$ref": "#/definitions/link_url"},
{"description": "The url where the link points to."}
]
},
"metric": {
"type": "string",

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

@ -31,6 +31,7 @@
margin-inline-end: 12px;
flex-shrink: 0;
}
&.tall .icon {
margin-inline-end: 20px;
}

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

@ -16,7 +16,8 @@ export class ASRouterAdmin extends React.PureComponent {
}
componentWillMount() {
ASRouterUtils.sendMessage({type: "ADMIN_CONNECT_STATE"});
const endpoint = ASRouterUtils.getEndpoint();
ASRouterUtils.sendMessage({type: "ADMIN_CONNECT_STATE", data: {endpoint}});
ASRouterUtils.addListener(this.onMessage);
}

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

@ -86,6 +86,12 @@ export class _Base extends React.PureComponent {
return null;
}
// Until we can delete the existing onboarding tour, just hide the onboarding button when users are in
// the new simplified onboarding experiment. CSS hacks ftw
if (prefs.asrouterOnboardingCohort > 0) {
global.document.body.classList.add("hide-onboarding");
}
return (<IntlProvider locale={locale} messages={strings}>
<ErrorBoundary className="base-content-fallback">
<BaseContent {...this.props} />

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

@ -71,6 +71,10 @@
overflow: hidden;
position: relative;
.dark-theme & {
background-color: $grey-60;
}
&::after {
border-bottom: 1px solid var(--newtab-card-hairline-color);
bottom: 0;

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

@ -11,6 +11,7 @@ export class _StartupOverlay extends React.PureComponent {
this.clickSkip = this.clickSkip.bind(this);
this.initScene = this.initScene.bind(this);
this.removeOverlay = this.removeOverlay.bind(this);
this.onInputInvalid = this.onInputInvalid.bind(this);
this.state = {emailInput: ""};
this.initScene();
@ -34,7 +35,10 @@ export class _StartupOverlay extends React.PureComponent {
}
onInputChange(e) {
let error = e.target.previousSibling;
this.setState({emailInput: e.target.value});
error.classList.remove("active");
e.target.classList.remove("invalid");
}
onSubmit() {
@ -47,6 +51,13 @@ export class _StartupOverlay extends React.PureComponent {
this.removeOverlay();
}
onInputInvalid(e) {
let error = e.target.previousSibling;
error.classList.add("active");
e.target.classList.add("invalid");
e.preventDefault(); // Override built-in form validation popup
}
render() {
let termsLink = (<a href="https://accounts.firefox.com/legal/terms" target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_terms_of_service" /></a>);
let privacyLink = (<a href="https://accounts.firefox.com/legal/privacy" target="_blank" rel="noopener noreferrer"><FormattedMessage id="firstrun_privacy_notice" /></a>);
@ -69,7 +80,8 @@ export class _StartupOverlay extends React.PureComponent {
<input name="entrypoint" type="hidden" value="activity-stream-firstrun" />
<input name="utm_source" type="hidden" value="activity-stream" />
<input name="utm_campaign" type="hidden" value="firstrun" />
<input className="email-input" name="email" type="email" required="true" placeholder={this.props.intl.formatMessage({id: "firstrun_email_input_placeholder"})} onChange={this.onInputChange} />
<span className="error">{this.props.intl.formatMessage({id: "firstrun_invalid_input"})}</span>
<input className="email-input" name="email" type="email" required="true" onInvalid={this.onInputInvalid} placeholder={this.props.intl.formatMessage({id: "firstrun_email_input_placeholder"})} onChange={this.onInputChange} />
<div className="extra-links">
<FormattedMessage
id="firstrun_extra_legal_links"

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

@ -93,10 +93,14 @@
text-align: center;
padding: 10px;
form {
position: relative;
}
.extra-links {
font-size: 12px;
max-width: 340px;
margin: 14px 50px;
margin: 17px 50px;
color: #676F7E;
cursor: default;
@ -131,7 +135,15 @@
&:focus {
border-color: $blue-50;
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3);
box-shadow: 0 0 0 3px $email-input-focus;
}
&.invalid {
border-color: $red-60;
}
&.invalid:focus {
box-shadow: 0 0 0 3px $email-input-invalid;
}
}
@ -172,9 +184,9 @@
.skip-button {
font-size: 13px;
margin-top: 35px;
margin-top: 20px;
margin-bottom: 20px;
background-color: #FCFCFC;
background-color: $grey-10;
color: $blue-50;
border: 1px solid $blue-50;
border-radius: 2px;
@ -183,9 +195,9 @@
transition: background-color 150ms, color 150ms, border-color 150ms;
&[disabled] {
background-color: #EBEBEB;
border-color: #B1B1B1;
color: #6A6A6A;
background-color: $grey-20;
border-color: $grey-40;
color: $grey-50;
cursor: default;
opacity: 0.5;
}
@ -246,10 +258,8 @@
background: url('chrome://branding/content/about-logo.png') top center no-repeat;
background-size: 90px 90px;
}
}
[dir='rtl'] {
.firstrun-title {
&:dir(rtl) {
background-position: top right;
}
}
@ -284,3 +294,47 @@
opacity: 0;
transform: translateY(-5px);
}
.error {
display: none;
}
.error.active {
display: block;
padding: 5px 12px;
animation: fade-down 450ms;
font-size: 12px;
font-weight: 500;
color: $white;
background-color: $red-60;
position: absolute;
inset-inline-start: 50px;
top: -28px;
border-radius: 2px;
&::before {
inset-inline-start: 12px;
background: $red-60;
bottom: -8px;
content: '.';
height: 16px;
position: absolute;
text-indent: -999px;
transform: rotate(45deg);
white-space: nowrap;
width: 16px;
z-index: -1;
}
}
@keyframes fade-down {
0% {
opacity: 0;
transform: translateY(-15px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}

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

@ -17,6 +17,10 @@ body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
font-size: 16px;
overflow-y: scroll;
&.hide-onboarding > #onboarding-overlay-button {
display: none !important;
}
}
h1,

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

@ -51,6 +51,8 @@ $pocket-teal: #50BCB6;
$bookmark-icon-fill: #0A84FF;
$download-icon-fill: #12BC00;
$pocket-icon-fill: #D70022;
$email-input-focus: rgba($blue-50, 0.3);
$email-input-invalid: rgba($red-60, 0.3);
// Photon transitions from http://design.firefox.com/photon/motion/duration-and-easing.html
$photon-easing: cubic-bezier(0.07, 0.95, 0, 1);

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

@ -230,6 +230,8 @@ body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
font-size: 16px;
overflow-y: scroll; }
body.hide-onboarding > #onboarding-overlay-button {
display: none !important; }
h1,
h2 {
@ -870,10 +872,12 @@ main {
color: #0C0C0D;
text-align: center;
padding: 10px; }
.firstrun-sign-in form {
position: relative; }
.firstrun-sign-in .extra-links {
font-size: 12px;
max-width: 340px;
margin: 14px 50px;
margin: 17px 50px;
color: #676F7E;
cursor: default; }
.firstrun-sign-in .extra-links a {
@ -900,6 +904,10 @@ main {
.firstrun-sign-in .email-input:focus {
border-color: #0A84FF;
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
.firstrun-sign-in .email-input.invalid {
border-color: #D70022; }
.firstrun-sign-in .email-input.invalid:focus {
box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
.firstrun-sign-in .form-header {
font-size: 22px;
margin: 15px auto; }
@ -926,9 +934,9 @@ main {
border-color: #002275; }
.firstrun-sign-in .skip-button {
font-size: 13px;
margin-top: 35px;
margin-top: 20px;
margin-bottom: 20px;
background-color: #FCFCFC;
background-color: #F9F9FA;
color: #0A84FF;
border: 1px solid #0A84FF;
border-radius: 2px;
@ -936,9 +944,9 @@ main {
padding: 5px 10px;
transition: background-color 150ms, color 150ms, border-color 150ms; }
.firstrun-sign-in .skip-button[disabled] {
background-color: #EBEBEB;
border-color: #B1B1B1;
color: #6A6A6A;
background-color: #EDEDF0;
border-color: #B1B1B3;
color: #737373;
cursor: default;
opacity: 0.5; }
.firstrun-sign-in .skip-button:not([disabled]):hover {
@ -984,9 +992,8 @@ main {
.firstrun-title {
background: url("chrome://branding/content/about-logo.png") top center no-repeat;
background-size: 90px 90px; } }
[dir='rtl'] .firstrun-title {
background-position: top right; }
.firstrun-title:dir(rtl) {
background-position: top right; }
.fxaccounts-container {
position: absolute;
@ -1015,6 +1022,42 @@ main {
opacity: 0;
transform: translateY(-5px); }
.error {
display: none; }
.error.active {
display: block;
padding: 5px 12px;
animation: fade-down 450ms;
font-size: 12px;
font-weight: 500;
color: #FFF;
background-color: #D70022;
position: absolute;
inset-inline-start: 50px;
top: -28px;
border-radius: 2px; }
.error.active::before {
inset-inline-start: 12px;
background: #D70022;
bottom: -8px;
content: '.';
height: 16px;
position: absolute;
text-indent: -999px;
transform: rotate(45deg);
white-space: nowrap;
width: 16px;
z-index: -1; }
@keyframes fade-down {
0% {
opacity: 0;
transform: translateY(-15px); }
100% {
opacity: 1;
transform: translateY(0); } }
.topic {
color: var(--newtab-section-navigation-text-color);
font-size: 12px;
@ -1314,6 +1357,8 @@ main {
height: 122px;
overflow: hidden;
position: relative; }
.dark-theme .card-outer .card-preview-image-outer {
background-color: #4A4A4F; }
.card-outer .card-preview-image-outer::after {
border-bottom: 1px solid var(--newtab-card-hairline-color);
bottom: 0;
@ -1788,7 +1833,7 @@ main {
margin-top: 20px;
width: 150px;
height: 30px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
.SimpleSnippet.tall {
@ -1849,11 +1894,11 @@ main {
height: 170px;
text-align: left;
padding: 10px;
border-bottom: 1px solid #D8D8D8;
border-bottom: 1px solid #D7D7DB;
display: flex;
margin-bottom: 11px; }
.onboardingMessage:last-child {
border: none; }
border: 0; }
.onboardingMessage .onboardingContent {
padding-left: 10px;
height: 100%; }
@ -1904,14 +1949,14 @@ main {
line-height: 22px; }
@media (max-width: 650px) {
.onboardingMessage .onboardingContent > span > p {
margin-bottom: 0px; } }
margin-bottom: 0; } }
.onboardingMessage .onboardingButton {
background-color: rgba(12, 12, 13, 0.1);
border: none;
border: 0;
width: 150px;
height: 30px;
margin-bottom: 23px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
@media (max-width: 850px) {
.onboardingMessage .onboardingButton {
@ -1927,7 +1972,7 @@ main {
height: 220px;
width: 1px;
position: absolute;
background-color: #D8D8D8;
background-color: #D7D7DB;
margin-top: 40px;
margin-left: 215px; }
@media (max-width: 850px) {

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -233,6 +233,8 @@ body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
font-size: 16px;
overflow-y: scroll; }
body.hide-onboarding > #onboarding-overlay-button {
display: none !important; }
h1,
h2 {
@ -873,10 +875,12 @@ main {
color: #0C0C0D;
text-align: center;
padding: 10px; }
.firstrun-sign-in form {
position: relative; }
.firstrun-sign-in .extra-links {
font-size: 12px;
max-width: 340px;
margin: 14px 50px;
margin: 17px 50px;
color: #676F7E;
cursor: default; }
.firstrun-sign-in .extra-links a {
@ -903,6 +907,10 @@ main {
.firstrun-sign-in .email-input:focus {
border-color: #0A84FF;
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
.firstrun-sign-in .email-input.invalid {
border-color: #D70022; }
.firstrun-sign-in .email-input.invalid:focus {
box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
.firstrun-sign-in .form-header {
font-size: 22px;
margin: 15px auto; }
@ -929,9 +937,9 @@ main {
border-color: #002275; }
.firstrun-sign-in .skip-button {
font-size: 13px;
margin-top: 35px;
margin-top: 20px;
margin-bottom: 20px;
background-color: #FCFCFC;
background-color: #F9F9FA;
color: #0A84FF;
border: 1px solid #0A84FF;
border-radius: 2px;
@ -939,9 +947,9 @@ main {
padding: 5px 10px;
transition: background-color 150ms, color 150ms, border-color 150ms; }
.firstrun-sign-in .skip-button[disabled] {
background-color: #EBEBEB;
border-color: #B1B1B1;
color: #6A6A6A;
background-color: #EDEDF0;
border-color: #B1B1B3;
color: #737373;
cursor: default;
opacity: 0.5; }
.firstrun-sign-in .skip-button:not([disabled]):hover {
@ -987,9 +995,8 @@ main {
.firstrun-title {
background: url("chrome://branding/content/about-logo.png") top center no-repeat;
background-size: 90px 90px; } }
[dir='rtl'] .firstrun-title {
background-position: top right; }
.firstrun-title:dir(rtl) {
background-position: top right; }
.fxaccounts-container {
position: absolute;
@ -1018,6 +1025,42 @@ main {
opacity: 0;
transform: translateY(-5px); }
.error {
display: none; }
.error.active {
display: block;
padding: 5px 12px;
animation: fade-down 450ms;
font-size: 12px;
font-weight: 500;
color: #FFF;
background-color: #D70022;
position: absolute;
inset-inline-start: 50px;
top: -28px;
border-radius: 2px; }
.error.active::before {
inset-inline-start: 12px;
background: #D70022;
bottom: -8px;
content: '.';
height: 16px;
position: absolute;
text-indent: -999px;
transform: rotate(45deg);
white-space: nowrap;
width: 16px;
z-index: -1; }
@keyframes fade-down {
0% {
opacity: 0;
transform: translateY(-15px); }
100% {
opacity: 1;
transform: translateY(0); } }
.topic {
color: var(--newtab-section-navigation-text-color);
font-size: 12px;
@ -1317,6 +1360,8 @@ main {
height: 122px;
overflow: hidden;
position: relative; }
.dark-theme .card-outer .card-preview-image-outer {
background-color: #4A4A4F; }
.card-outer .card-preview-image-outer::after {
border-bottom: 1px solid var(--newtab-card-hairline-color);
bottom: 0;
@ -1791,7 +1836,7 @@ main {
margin-top: 20px;
width: 150px;
height: 30px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
.SimpleSnippet.tall {
@ -1852,11 +1897,11 @@ main {
height: 170px;
text-align: left;
padding: 10px;
border-bottom: 1px solid #D8D8D8;
border-bottom: 1px solid #D7D7DB;
display: flex;
margin-bottom: 11px; }
.onboardingMessage:last-child {
border: none; }
border: 0; }
.onboardingMessage .onboardingContent {
padding-left: 10px;
height: 100%; }
@ -1907,14 +1952,14 @@ main {
line-height: 22px; }
@media (max-width: 650px) {
.onboardingMessage .onboardingContent > span > p {
margin-bottom: 0px; } }
margin-bottom: 0; } }
.onboardingMessage .onboardingButton {
background-color: rgba(12, 12, 13, 0.1);
border: none;
border: 0;
width: 150px;
height: 30px;
margin-bottom: 23px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
@media (max-width: 850px) {
.onboardingMessage .onboardingButton {
@ -1930,7 +1975,7 @@ main {
height: 220px;
width: 1px;
position: absolute;
background-color: #D8D8D8;
background-color: #D7D7DB;
margin-top: 40px;
margin-left: 215px; }
@media (max-width: 850px) {

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -230,6 +230,8 @@ body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
font-size: 16px;
overflow-y: scroll; }
body.hide-onboarding > #onboarding-overlay-button {
display: none !important; }
h1,
h2 {
@ -870,10 +872,12 @@ main {
color: #0C0C0D;
text-align: center;
padding: 10px; }
.firstrun-sign-in form {
position: relative; }
.firstrun-sign-in .extra-links {
font-size: 12px;
max-width: 340px;
margin: 14px 50px;
margin: 17px 50px;
color: #676F7E;
cursor: default; }
.firstrun-sign-in .extra-links a {
@ -900,6 +904,10 @@ main {
.firstrun-sign-in .email-input:focus {
border-color: #0A84FF;
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3); }
.firstrun-sign-in .email-input.invalid {
border-color: #D70022; }
.firstrun-sign-in .email-input.invalid:focus {
box-shadow: 0 0 0 3px rgba(215, 0, 34, 0.3); }
.firstrun-sign-in .form-header {
font-size: 22px;
margin: 15px auto; }
@ -926,9 +934,9 @@ main {
border-color: #002275; }
.firstrun-sign-in .skip-button {
font-size: 13px;
margin-top: 35px;
margin-top: 20px;
margin-bottom: 20px;
background-color: #FCFCFC;
background-color: #F9F9FA;
color: #0A84FF;
border: 1px solid #0A84FF;
border-radius: 2px;
@ -936,9 +944,9 @@ main {
padding: 5px 10px;
transition: background-color 150ms, color 150ms, border-color 150ms; }
.firstrun-sign-in .skip-button[disabled] {
background-color: #EBEBEB;
border-color: #B1B1B1;
color: #6A6A6A;
background-color: #EDEDF0;
border-color: #B1B1B3;
color: #737373;
cursor: default;
opacity: 0.5; }
.firstrun-sign-in .skip-button:not([disabled]):hover {
@ -984,9 +992,8 @@ main {
.firstrun-title {
background: url("chrome://branding/content/about-logo.png") top center no-repeat;
background-size: 90px 90px; } }
[dir='rtl'] .firstrun-title {
background-position: top right; }
.firstrun-title:dir(rtl) {
background-position: top right; }
.fxaccounts-container {
position: absolute;
@ -1015,6 +1022,42 @@ main {
opacity: 0;
transform: translateY(-5px); }
.error {
display: none; }
.error.active {
display: block;
padding: 5px 12px;
animation: fade-down 450ms;
font-size: 12px;
font-weight: 500;
color: #FFF;
background-color: #D70022;
position: absolute;
inset-inline-start: 50px;
top: -28px;
border-radius: 2px; }
.error.active::before {
inset-inline-start: 12px;
background: #D70022;
bottom: -8px;
content: '.';
height: 16px;
position: absolute;
text-indent: -999px;
transform: rotate(45deg);
white-space: nowrap;
width: 16px;
z-index: -1; }
@keyframes fade-down {
0% {
opacity: 0;
transform: translateY(-15px); }
100% {
opacity: 1;
transform: translateY(0); } }
.topic {
color: var(--newtab-section-navigation-text-color);
font-size: 12px;
@ -1314,6 +1357,8 @@ main {
height: 122px;
overflow: hidden;
position: relative; }
.dark-theme .card-outer .card-preview-image-outer {
background-color: #4A4A4F; }
.card-outer .card-preview-image-outer::after {
border-bottom: 1px solid var(--newtab-card-hairline-color);
bottom: 0;
@ -1788,7 +1833,7 @@ main {
margin-top: 20px;
width: 150px;
height: 30px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
.SimpleSnippet.tall {
@ -1849,11 +1894,11 @@ main {
height: 170px;
text-align: left;
padding: 10px;
border-bottom: 1px solid #D8D8D8;
border-bottom: 1px solid #D7D7DB;
display: flex;
margin-bottom: 11px; }
.onboardingMessage:last-child {
border: none; }
border: 0; }
.onboardingMessage .onboardingContent {
padding-left: 10px;
height: 100%; }
@ -1904,14 +1949,14 @@ main {
line-height: 22px; }
@media (max-width: 650px) {
.onboardingMessage .onboardingContent > span > p {
margin-bottom: 0px; } }
margin-bottom: 0; } }
.onboardingMessage .onboardingButton {
background-color: rgba(12, 12, 13, 0.1);
border: none;
border: 0;
width: 150px;
height: 30px;
margin-bottom: 23px;
padding: 4px 0 6px 0;
padding: 4px 0 6px;
font-size: 15px; }
@media (max-width: 850px) {
.onboardingMessage .onboardingButton {
@ -1927,7 +1972,7 @@ main {
height: 220px;
width: 1px;
position: absolute;
background-color: #D8D8D8;
background-color: #D7D7DB;
margin-top: 40px;
margin-left: 215px; }
@media (max-width: 850px) {

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -391,27 +391,28 @@ module.exports = ReactIntl;
/* 3 */
/***/ (function(module, exports) {
var g;
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || Function("return this")() || (1,eval)("this");
} catch(e) {
// This works if the window reference is available
if(typeof window === "object")
g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || Function("return this")() || (1,eval)("this");
} catch(e) {
// This works if the window reference is available
if(typeof window === "object")
g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/* 4 */
@ -967,6 +968,20 @@ const ASRouterUtils = {
sendTelemetry(ping) {
const payload = __WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].ASRouterUserEvent(ping);
global.RPMSendAsyncMessage(__WEBPACK_IMPORTED_MODULE_2_content_src_lib_init_store__["a" /* OUTGOING_MESSAGE_NAME */], payload);
},
getEndpoint() {
if (window.location.href.includes("endpoint")) {
const params = new URLSearchParams(window.location.href.slice(window.location.href.indexOf("endpoint")));
try {
const endpoint = new URL(params.get("endpoint"));
return {
url: endpoint.href,
snippetId: params.get("snippetId")
};
} catch (e) {}
}
return null;
}
};
/* harmony export (immutable) */ __webpack_exports__["b"] = ASRouterUtils;
@ -1095,8 +1110,15 @@ class ASRouterUISurface extends __WEBPACK_IMPORTED_MODULE_6_react___default.a.Pu
}
componentWillMount() {
const endpoint = ASRouterUtils.getEndpoint();
ASRouterUtils.addListener(this.onMessageFromParent);
ASRouterUtils.sendMessage({ type: "CONNECT_UI_REQUEST" });
// If we are loading about:welcome we want to trigger the onboarding messages
if (this.props.document.location.href === "about:welcome") {
ASRouterUtils.sendMessage({ type: "TRIGGER", data: { trigger: "firstRun" } });
} else {
ASRouterUtils.sendMessage({ type: "CONNECT_UI_REQUEST", data: { endpoint } });
}
}
componentWillUnmount() {
@ -6663,6 +6685,12 @@ class _Base extends __WEBPACK_IMPORTED_MODULE_8_react___default.a.PureComponent
return null;
}
// Until we can delete the existing onboarding tour, just hide the onboarding button when users are in
// the new simplified onboarding experiment. CSS hacks ftw
if (prefs.asrouterOnboardingCohort > 0) {
global.document.body.classList.add("hide-onboarding");
}
return __WEBPACK_IMPORTED_MODULE_8_react___default.a.createElement(
__WEBPACK_IMPORTED_MODULE_1_react_intl__["IntlProvider"],
{ locale: locale, messages: strings },
@ -6768,7 +6796,8 @@ class ASRouterAdmin extends __WEBPACK_IMPORTED_MODULE_1_react___default.a.PureCo
}
componentWillMount() {
__WEBPACK_IMPORTED_MODULE_0__asrouter_asrouter_content__["b" /* ASRouterUtils */].sendMessage({ type: "ADMIN_CONNECT_STATE" });
const endpoint = __WEBPACK_IMPORTED_MODULE_0__asrouter_asrouter_content__["b" /* ASRouterUtils */].getEndpoint();
__WEBPACK_IMPORTED_MODULE_0__asrouter_asrouter_content__["b" /* ASRouterUtils */].sendMessage({ type: "ADMIN_CONNECT_STATE", data: { endpoint } });
__WEBPACK_IMPORTED_MODULE_0__asrouter_asrouter_content__["b" /* ASRouterUtils */].addListener(this.onMessage);
}
@ -8706,6 +8735,7 @@ class _StartupOverlay extends __WEBPACK_IMPORTED_MODULE_3_react___default.a.Pure
this.clickSkip = this.clickSkip.bind(this);
this.initScene = this.initScene.bind(this);
this.removeOverlay = this.removeOverlay.bind(this);
this.onInputInvalid = this.onInputInvalid.bind(this);
this.state = { emailInput: "" };
this.initScene();
@ -8729,7 +8759,10 @@ class _StartupOverlay extends __WEBPACK_IMPORTED_MODULE_3_react___default.a.Pure
}
onInputChange(e) {
let error = e.target.previousSibling;
this.setState({ emailInput: e.target.value });
error.classList.remove("active");
e.target.classList.remove("invalid");
}
onSubmit() {
@ -8742,6 +8775,13 @@ class _StartupOverlay extends __WEBPACK_IMPORTED_MODULE_3_react___default.a.Pure
this.removeOverlay();
}
onInputInvalid(e) {
let error = e.target.previousSibling;
error.classList.add("active");
e.target.classList.add("invalid");
e.preventDefault(); // Override built-in form validation popup
}
render() {
let termsLink = __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(
"a",
@ -8804,7 +8844,12 @@ class _StartupOverlay extends __WEBPACK_IMPORTED_MODULE_3_react___default.a.Pure
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("input", { name: "entrypoint", type: "hidden", value: "activity-stream-firstrun" }),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("input", { name: "utm_source", type: "hidden", value: "activity-stream" }),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("input", { name: "utm_campaign", type: "hidden", value: "firstrun" }),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("input", { className: "email-input", name: "email", type: "email", required: "true", placeholder: this.props.intl.formatMessage({ id: "firstrun_email_input_placeholder" }), onChange: this.onInputChange }),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(
"span",
{ className: "error" },
this.props.intl.formatMessage({ id: "firstrun_invalid_input" })
),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("input", { className: "email-input", name: "email", type: "email", required: "true", onInvalid: this.onInputInvalid, placeholder: this.props.intl.formatMessage({ id: "firstrun_email_input_placeholder" }), onChange: this.onInputChange }),
__WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(
"div",
{ className: "extra-links" },

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -8,7 +8,7 @@
<em:type>2</em:type>
<em:bootstrap>true</em:bootstrap>
<em:unpack>false</em:unpack>
<em:version>2018.06.22.1337-8d599e17</em:version>
<em:version>2018.06.29.1315-e10832e3</em:version>
<em:name>Activity Stream</em:name>
<em:description>A rich visual history feed and a reimagined home page make it easier than ever to find exactly what you're looking for in Firefox.</em:description>
<em:multiprocessCompatible>true</em:multiprocessCompatible>

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

@ -19,6 +19,12 @@ const SNIPPETS_ENDPOINT_PREF = "browser.newtabpage.activity-stream.asrouter.snip
// Note: currently a restart is required when this pref is changed, this will be fixed in Bug 1462114
const SNIPPETS_ENDPOINT = Services.prefs.getStringPref(SNIPPETS_ENDPOINT_PREF,
"https://activity-stream-icons.services.mozilla.com/v1/messages.json.br");
// List of hosts for endpoints that serve router messages.
// Key is allowed host, value is a name for the endpoint host.
const WHITELIST_HOSTS = {
"activity-stream-icons.services.mozilla.com": "production",
"snippets-admin.mozilla.org": "preview"
};
const MessageLoaderUtils = {
/**
@ -226,7 +232,22 @@ class _ASRouter {
this.messageChannel.sendAsyncMessage(OUTGOING_MESSAGE_NAME, {type: "ADMIN_SET_STATE", data: state});
}
async _getBundledMessages(originalMessage, target, force = false) {
async _findMessage(msgs, target, data = {}) {
let message;
let {trigger} = data;
if (trigger) {
// Find a message that matches the targeting context as well as the trigger context
message = await ASRouterTargeting.findMatchingMessageWithTrigger(msgs, target, trigger);
}
if (!message) {
// If there was no messages with this trigger, try finding a regular targeted message
message = await ASRouterTargeting.findMatchingMessage(msgs, target);
}
return message;
}
async _getBundledMessages(originalMessage, target, data, force = false) {
let result = [{content: originalMessage.content, id: originalMessage.id}];
// First, find all messages of same template. These are potential matching targeting candidates
@ -245,7 +266,7 @@ class _ASRouter {
} else {
while (bundledMessagesOfSameTemplate.length) {
// Find a message that matches the targeting context - or break if there are no matching messages
const message = await ASRouterTargeting.findMatchingMessage(bundledMessagesOfSameTemplate, target);
const message = await this._findMessage(bundledMessagesOfSameTemplate, target, data);
if (!message) {
/* istanbul ignore next */ // Code coverage in mochitests
break;
@ -273,11 +294,11 @@ class _ASRouter {
return state.messages.filter(item => !state.blockList.includes(item.id));
}
async _sendMessageToTarget(message, target, force = false) {
async _sendMessageToTarget(message, target, data, force = false) {
let bundledMessages;
// If this message needs to be bundled with other messages of the same template, find them and bundle them together
if (message && message.bundled) {
bundledMessages = await this._getBundledMessages(message, target, force);
bundledMessages = await this._getBundledMessages(message, target, data, force);
}
if (message && !message.bundled) {
// If we only need to send 1 message, send the message
@ -290,19 +311,27 @@ class _ASRouter {
}
}
async sendNextMessage(target) {
async sendNextMessage(target, action = {}) {
let {data} = action;
const msgs = this._getUnblockedMessages();
let message = await ASRouterTargeting.findMatchingMessage(msgs, target);
let message = null;
const previewMsgs = this.state.messages.filter(item => item.provider === "preview");
// Always send preview messages when available
if (previewMsgs.length) {
[message] = previewMsgs;
} else {
message = await this._findMessage(msgs, target, data);
}
await this.setState({lastMessageId: message ? message.id : null});
await this._sendMessageToTarget(message, target);
await this._sendMessageToTarget(message, target, data);
}
async setMessageById(id, target, force = true) {
async setMessageById(id, target, force = true, action = {}) {
await this.setState({lastMessageId: id});
const newMessage = this.getMessageById(id);
await this._sendMessageToTarget(newMessage, target, force);
await this._sendMessageToTarget(newMessage, target, force, action.data);
}
async blockById(idOrIds) {
@ -327,15 +356,43 @@ class _ASRouter {
}
}
_validPreviewEndpoint(url) {
try {
const endpoint = new URL(url);
if (!WHITELIST_HOSTS[endpoint.host]) {
Cu.reportError(`The preview URL host ${endpoint.host} is not in the whitelist.`);
}
if (endpoint.protocol !== "https:") {
Cu.reportError("The URL protocol is not https.");
}
return (endpoint.protocol === "https:" && WHITELIST_HOSTS[endpoint.host]);
} catch (e) {
return false;
}
}
async _addPreviewEndpoint(url) {
const providers = [...this.state.providers];
if (this._validPreviewEndpoint(url) && !providers.find(p => p.url === url)) {
// Set update cycle to 0 to fetch new content on every page refresh
providers.push({id: "preview", type: "remote", url, updateCycleInMs: 0});
await this.setState({providers});
}
}
async onMessage({data: action, target}) {
switch (action.type) {
case "CONNECT_UI_REQUEST":
case "GET_NEXT_MESSAGE":
case "TRIGGER":
// Wait for our initial message loading to be done before responding to any UI requests
await this.waitForInitialized;
if (action.data && action.data.endpoint) {
await this._addPreviewEndpoint(action.data.endpoint.url);
}
// Check if any updates are needed first
await this.loadMessagesFromAllProviders();
await this.sendNextMessage(target);
await this.sendNextMessage(target, action);
break;
case ra.OPEN_PRIVATE_BROWSER_WINDOW:
// Forcefully open about:privatebrowsing
@ -374,10 +431,15 @@ class _ASRouter {
});
break;
case "OVERRIDE_MESSAGE":
await this.setMessageById(action.data.id, target);
await this.setMessageById(action.data.id, target, true, action);
break;
case "ADMIN_CONNECT_STATE":
target.sendAsyncMessage(OUTGOING_MESSAGE_NAME, {type: "ADMIN_SET_STATE", data: this.state});
if (action.data && action.data.endpoint) {
this._addPreviewEndpoint(action.data.endpoint.url);
await this.loadMessagesFromAllProviders();
} else {
target.sendAsyncMessage(OUTGOING_MESSAGE_NAME, {type: "ADMIN_SET_STATE", data: this.state});
}
break;
}
}

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

@ -33,15 +33,11 @@ const TargetingGetters = {
}
};
function EnvironmentTargeting(target) {
return {isFirstRun: target.url === "about:welcome"};
}
this.ASRouterTargeting = {
Environment: TargetingGetters,
isMatch(filterExpression, target, context = this.Environment) {
return FilterExpressions.eval(filterExpression, {...context, ...EnvironmentTargeting(target)});
return FilterExpressions.eval(filterExpression, context);
},
/**
@ -58,7 +54,20 @@ this.ASRouterTargeting = {
let candidate;
while (!match && arrayOfItems.length) {
candidate = removeRandomItemFromArray(arrayOfItems);
if (candidate && (!candidate.targeting || await this.isMatch(candidate.targeting, target, context))) {
if (candidate && !candidate.trigger && (!candidate.targeting || await this.isMatch(candidate.targeting, target, context))) {
match = candidate;
}
}
return match;
},
async findMatchingMessageWithTrigger(messages, target, trigger, context) {
const arrayOfItems = [...messages];
let match;
let candidate;
while (!match && arrayOfItems.length) {
candidate = removeRandomItemFromArray(arrayOfItems);
if (candidate && candidate.trigger === trigger && (!candidate.targeting || await this.isMatch(candidate.targeting, target, context))) {
match = candidate;
}
}

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

@ -15,7 +15,7 @@ const ONBOARDING_MESSAGES = [
button_label: "Try It Now",
button_action: "OPEN_PRIVATE_BROWSER_WINDOW"
},
targeting: "isFirstRun"
trigger: "firstRun"
},
{
id: "ONBOARDING_2",
@ -29,7 +29,7 @@ const ONBOARDING_MESSAGES = [
button_action: "OPEN_URL",
button_action_params: "https://screenshots.firefox.com/#tour"
},
targeting: "isFirstRun"
trigger: "firstRun"
},
{
id: "ONBOARDING_3",
@ -43,7 +43,8 @@ const ONBOARDING_MESSAGES = [
button_action: "OPEN_ABOUT_PAGE",
button_action_params: "addons"
},
targeting: "isFirstRun && isInExperimentCohort == 1"
targeting: "isInExperimentCohort == 1",
trigger: "firstRun"
},
{
id: "ONBOARDING_4",
@ -57,7 +58,8 @@ const ONBOARDING_MESSAGES = [
button_action: "OPEN_URL",
button_action_params: "https://addons.mozilla.org/en-US/firefox/addon/ghostery/"
},
targeting: "isFirstRun && isInExperimentCohort == 2"
targeting: "isInExperimentCohort == 2",
trigger: "firstRun"
}
];

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

@ -60,7 +60,6 @@ class HistoryObserver extends Observer {
onEndUpdateBatch() {}
onTitleChanged() {}
onFrecencyChanged() {}

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

@ -152,7 +152,11 @@ this.Store = class Store {
// Accessing the db causes the object stores to be created / migrated.
// This needs to happen before other instances try to access the db, which
// would update only a subset of the stores to the latest version.
await this.dbStorage.db; // eslint-disable-line no-unused-expressions
try {
await this.dbStorage.db; // eslint-disable-line no-unused-expressions
} catch (e) {
this.dbStorage.telemetry = null;
}
}
/**

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

@ -22,6 +22,7 @@ type_label_visited=Vesitau
type_label_bookmarked=Con marcapachinas
type_label_recommended=Tendencia
type_label_pocket=Alzau en Pocket
type_label_downloaded=Descargau
# LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
# menu and are meant as a call to action for a given page.
@ -44,6 +45,23 @@ menu_action_save_to_pocket=Alzar en Pocket
menu_action_delete_pocket=Borrar de Pocket
menu_action_archive_pocket=Archivar en Pocket
# LOCALIZATION NOTE (menu_action_show_file_*): These are platform specific strings
# found in the context menu of an item that has been downloaded. The intention behind
# "this action" is that it will show where the downloaded file exists on the file system
# for each operating system.
menu_action_show_file_mac_os=Amostrar en o Finder
menu_action_show_file_windows=Ubrir la carpeta an que se troba
menu_action_show_file_linux=Ubrir la carpeta an que se troba
menu_action_show_file_default=Amostrar lo fichero
menu_action_open_file=Ubrir fichero
# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
# link that belongs to this downloaded item"
menu_action_copy_download_link=Copiar vinclo de descarga
menu_action_go_to_download_page=Ir ta la pachina de descarga
menu_action_remove_download=Borrar de l'historial
# LOCALIZATION NOTE (search_button): This is screenreader only text for the
# search button.
search_button=Mirar
@ -73,40 +91,29 @@ section_disclaimer_topstories_buttontext=Entendiu
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Conteniu d'inicio de Firefox
prefs_home_description=Tría qué contenisu quiers veyer en a tuya pachina d'inicio de Firefox.
prefs_restore_defaults_button=Restaurar valors per defecto
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
prefs_section_rows_option={num} ringlera;{num} ringleras
prefs_search_header=Busqueda web
prefs_topsites_description=Los puestos que mas vesitas
prefs_topstories_description=Contenius d'alta calidat que no te quiers perder
# LOCALIZATION NOTE (prefs_topstories_show_sponsored_label): {provider} is
# replaced by the name of the content provider for this section, e.g., "Pocket"
prefs_topstories_show_sponsored_label=Articlos patrocinaus per {provider}
prefs_topstories_description2=Contenius interesants de tot lo web, personalizau pa tu
prefs_topstories_options_sponsored_label=Articlos esponsorizaus
prefs_topstories_sponsored_learn_more=Saber-ne mas
prefs_highlights_description=Una tría d'os puestos que has alzau u vesitau
prefs_highlights_options_visited_label=Pachinas visitadas
prefs_highlights_options_download_label=Descarga mas recient
prefs_highlights_options_pocket_label=Pachinas alzadas en Pocket
prefs_snippets_description=Actualizacions de Mozilla y Firefox
settings_pane_button_label=Personaliza la tuya pachina de Nueva Pestanya
settings_pane_header=Preferencias de Nueva Pestanya
settings_pane_body2=Tría lo que veyes en esta pachina.
settings_pane_search_header=Mirar
settings_pane_search_body=Mirar la Web dende la tuya nueva pestanya.
settings_pane_topsites_header=Puestos mas vesitaus
settings_pane_topsites_body=Accede a los puestos web que mas vesitas.
settings_pane_topsites_options_showmore=Amostrar dos ringleras
settings_pane_highlights_header=Destacaus
settings_pane_highlights_body2=Torna a trobar lo mas interesant que has vesitau en zagueras, u que has marcau con marcapchinas.
settings_pane_highlights_options_bookmarks=Marcapachinas
settings_pane_highlights_options_visited=Puestos vesitaus
# LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
# traditionally on about:home. Alternative translation options: "Small Note" or
# something that expresses the idea of "a small message, shortened from
# something else, and non-essential but also not entirely trivial and useless."
settings_pane_snippets_header=Retallos
settings_pane_snippets_body=leye noticias curtas de Mozilla sobre lo Firefox, la cultura d'internet y, de cabo ta quan, bell meme.
settings_pane_done_button=Feito
settings_pane_topstories_options_sponsored=Amostrar articlos patrocinaus
# LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
# dialog.
@ -136,9 +143,6 @@ pocket_read_more=Temas populars:
# LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
# end of the list of popular topic links.
pocket_read_even_more=Amostrar mas articlos
# LOCALIZATION NOTE (pocket_description): This is shown in the settings pane
# to provide more information about Pocket.
pocket_description=Descubre gracias a Pocket, que dende agora fa parte de Mozilla, contenius d'alta calidat que d'atra manera te puetz perder.
highlights_empty_state=Empecipia a navegar, y t'iremos amostrando aquí grans articlos, videos y atras pachinas que has vesitau u marcau en zagueras.
# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
@ -167,7 +171,31 @@ section_menu_action_remove_section=Borrar la sección
section_menu_action_collapse_section=Plegar la sección
section_menu_action_expand_section=Desplegar la sección
section_menu_action_manage_section=Chestionar la sección
section_menu_action_manage_webext=Chestionar la extensión
section_menu_action_add_topsite=Anyadir un puesto popular
section_menu_action_move_up=Puyar
section_menu_action_move_down=Baixar
section_menu_action_privacy_notice=Nota sobre privacidat
# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
# firstrun of the browser, they give an introduction to Firefox and Sync.
firstrun_title=Prene lo Firefox con tu
firstrun_content=Obtiene los tuyos marcapachinas, historials, claus y atros achustes en totz los tuyos dispositivos.
firstrun_learn_more_link=Aprende mas sobre las cuentas de Firefox
# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
firstrun_form_header=Escribe lo tuyo email
firstrun_form_sub_header=pa continar enta Firefox Sync.
firstrun_email_input_placeholder=Correu-e
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
firstrun_extra_legal_links=Si contina, ye confirmando que ye d'acuerdo con as {terms} y {privacy}.
firstrun_terms_of_service=Condicions d'uso
firstrun_privacy_notice=Nota sobre privacidat
firstrun_continue_to_login=Continar
firstrun_skip_login=Blinca-te este paso

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

@ -101,7 +101,7 @@ prefs_topstories_description2=Εξαιρετικό περιεχόμενο από
prefs_topstories_options_sponsored_label=Χορηγούμενες ιστορίες
prefs_topstories_sponsored_learn_more=Μάθετε περισσότερα
prefs_highlights_description=Μια συλλογή ιστοσελίδων που έχετε αποθηκεύσει ή επισκεφθεί
prefs_highlights_options_visited_label=Σελίδες που επισκεφθήκατε
prefs_highlights_options_visited_label=Σελίδες που έχετε επισκεφθεί
prefs_highlights_options_download_label=Πιο πρόσφατες λήψεις
prefs_highlights_options_pocket_label=Αποθηκευμένες σελίδες του Pocket
prefs_snippets_description=Ενημερώσεις από τη Mozilla και το Firefox

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

@ -190,6 +190,7 @@ firstrun_form_header=Enter your email
firstrun_form_sub_header=to continue to Firefox Sync
firstrun_email_input_placeholder=Email
firstrun_invalid_input=Valid email required
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.

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

@ -148,6 +148,7 @@ highlights_empty_state=બ્રાઉઝ કરવું પ્રારંભ
# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
# in the space that would have shown a few stories, this is shown instead.
# {provider} is replaced by the name of the content provider for this section.
topstories_empty_state=તમે પકડાઈ ગયા છો. {provider} તરફથી વધુ ટોચની વાતો માટે પછીથી પાછા તપાસો. રાહ નથી જોઈ શકતા? સમગ્ર વેબ પરથી વધુ સુંદર વાર્તાઓ શોધવા માટે એક લોકપ્રિય વિષય પસંદ કરો.
# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
# import their browser profile from another browser they might be using.

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

@ -34,8 +34,8 @@ menu_action_open_new_window=Apri in una nuova finestra
menu_action_open_private_window=Apri in una nuova finestra anonima
menu_action_dismiss=Rimuovi
menu_action_delete=Elimina dalla cronologia
menu_action_pin=Fissa alla bacheca
menu_action_unpin=Rimuovi dalla bacheca
menu_action_pin=Appunta
menu_action_unpin=Rilascia
confirm_history_delete_p1=Eliminare tutte le occorrenze di questa pagina dalla cronologia?
# LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a

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

@ -0,0 +1,201 @@
newtab_page_title=新規タブ
header_top_sites=トップサイト
header_highlights=ハイライト
# LOCALIZATION NOTE(header_recommended_by): This is followed by the name
# of the corresponding content provider.
header_recommended_by={provider} のおすすめ
# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
# the context menu button is focused/active. Title is the label or hostname of
# the site.
context_menu_button_sr={title} のコンテキストメニューを開く
# LOCALIZATION NOTE(section_context_menu_button_sr): This is for screen readers when
# the section edit context menu button is focused/active.
section_context_menu_button_sr=セクションのコンテキストメニューを開く
# LOCALIZATION NOTE (type_label_*): These labels are associated to pages to give
# context on how the element is related to the user, e.g. type indicates that
# the page is bookmarked, or is currently open on another device
type_label_visited=訪問済み
type_label_bookmarked=ブックマーク済み
type_label_recommended=話題の記事
type_label_pocket=Pocket に保存しました
type_label_downloaded=ダウンロード済み
# LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
# menu and are meant as a call to action for a given page.
# LOCALIZATION NOTE (menu_action_bookmark): Bookmark is a verb, as in "Add to
# bookmarks"
menu_action_bookmark=ブックマーク
menu_action_remove_bookmark=ブックマークを削除
menu_action_open_new_window=新規ウインドウで開く
menu_action_open_private_window=新規プライベートウインドウで開く
menu_action_dismiss=閉じる
menu_action_delete=履歴から削除
menu_action_pin=ピン留め
menu_action_unpin=ピン留めを外す
confirm_history_delete_p1=本当にこのページに関して保存されているあらゆる情報を履歴から削除しますか?
# LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
# page from history.
confirm_history_delete_notice_p2=この操作は取り消せません。
menu_action_save_to_pocket=Pocket に保存
menu_action_delete_pocket=Pocket から削除
menu_action_archive_pocket=Pocket にアーカイブ
# LOCALIZATION NOTE (menu_action_show_file_*): These are platform specific strings
# found in the context menu of an item that has been downloaded. The intention behind
# "this action" is that it will show where the downloaded file exists on the file system
# for each operating system.
menu_action_show_file_mac_os=Finder に表示
menu_action_show_file_windows=保存フォルダーを開く
menu_action_show_file_linux=保存フォルダーを開く
menu_action_show_file_default=ファイルを表示
menu_action_open_file=ファイルを開く
# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
# link that belongs to this downloaded item"
menu_action_copy_download_link=ダウンロード元の URL をコピー
menu_action_go_to_download_page=ダウンロード元のページを開く
menu_action_remove_download=履歴から削除
# LOCALIZATION NOTE (search_button): This is screenreader only text for the
# search button.
search_button=検索
# LOCALIZATION NOTE (search_header): Displayed at the top of the panel
# showing search suggestions. {search_engine_name} is replaced with the name of
# the current default search engine. e.g. 'Google Search'
search_header={search_engine_name} 検索
# LOCALIZATION NOTE (search_web_placeholder): This is shown in the searchbox when
# the user hasn't typed anything yet.
search_web_placeholder=ウェブを検索
# LOCALIZATION NOTE (section_disclaimer_topstories): This is shown below
# the topstories section title to provide additional information about
# how the stories are selected.
section_disclaimer_topstories=あなたが読んだページに基づいて選ばれた、ウェブ上で最も興味深い記事。Mozilla の一員となった Pocket がお届けします。
section_disclaimer_topstories_linktext=詳しくはこちら。
# LOCALIZATION NOTE (section_disclaimer_topstories_buttontext): The text of
# the button used to acknowledge, and hide this disclaimer in the future.
section_disclaimer_topstories_buttontext=了解しました
# LOCALIZATION NOTE (prefs_*, settings_*): These are shown in about:preferences
# for a "Firefox Home" section. "Firefox" should be treated as a brand and kept
# in English, while "Home" should be localized matching the about:preferences
# sidebar mozilla-central string for the panel that has preferences related to
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Firefox ホームコンテンツ
prefs_home_description=Firefox のホーム画面に表示するコンテンツを選びましょう。
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
prefs_section_rows_option={num} 行
prefs_search_header=ウェブ検索
prefs_topsites_description=よく訪れるサイト
prefs_topstories_description2=ウェブ上の様々な場所から集められた、あなたにピッタリの優れたコンテンツ
prefs_topstories_options_sponsored_label=広告記事
prefs_topstories_sponsored_learn_more=詳しくはこちら
prefs_highlights_description=保存したり訪れたりしたサイトうち主なもの
prefs_highlights_options_visited_label=訪れたページ
prefs_highlights_options_download_label=最近のダウンロード
prefs_highlights_options_pocket_label=Pocket に保存されたページ
prefs_snippets_description=Mozilla と Firefox に関する最新情報
settings_pane_button_label=新規タブページをカスタマイズ
settings_pane_topsites_header=トップサイト
settings_pane_highlights_header=ハイライト
settings_pane_highlights_options_bookmarks=ブックマーク
# LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
# traditionally on about:home. Alternative translation options: "Small Note" or
# something that expresses the idea of "a small message, shortened from
# something else, and non-essential but also not entirely trivial and useless."
settings_pane_snippets_header=スニペット
# LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
# dialog.
edit_topsites_button_text=編集
edit_topsites_edit_button=このサイトを編集
# LOCALIZATION NOTE (topsites_form_*): This is shown in the New/Edit Topsite modal.
topsites_form_add_header=新着トップサイト
topsites_form_edit_header=トップサイトを編集
topsites_form_title_label=タイトル
topsites_form_title_placeholder=タイトルを入力
topsites_form_url_label=URL
topsites_form_image_url_label=カスタム画像 URL
topsites_form_url_placeholder=URL を入力するかペースト
topsites_form_use_image_link=カスタム画像を使用...
# LOCALIZATION NOTE (topsites_form_*_button): These are verbs/actions.
topsites_form_preview_button=プレビュー
topsites_form_add_button=追加
topsites_form_save_button=保存
topsites_form_cancel_button=キャンセル
topsites_form_url_validation=正しい URL を入力してください
topsites_form_image_validation=画像を読み込めませんでした。別の URL を試してください。
# LOCALIZATION NOTE (pocket_read_more): This is shown at the bottom of the
# trending stories section and precedes a list of links to popular topics.
pocket_read_more=人気のトピック:
# LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
# end of the list of popular topic links.
pocket_read_even_more=他の記事を見る
highlights_empty_state=ブラウジング中にあなたが最近訪れたりブックマークしたりした、優れた記事、動画、その他ページの一部をここに表示します。
# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
# in the space that would have shown a few stories, this is shown instead.
# {provider} is replaced by the name of the content provider for this section.
topstories_empty_state=すべて既読です。また後で戻って {provider} からのおすすめ記事をチェックしてください。もし待ちきれないなら、人気のトピックを選択すれば、他にもウェブ上の優れた記事を見つけられます。
# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
# import their browser profile from another browser they might be using.
manual_migration_explanation2=他のブラウザーからブックマークや履歴、パスワードを読み込んで Firefox を使ってみましょう。
# LOCALIZATION NOTE (manual_migration_cancel_button): This message is shown on a button that cancels the
# process of importing another browsers profile into Firefox.
manual_migration_cancel_button=今はしない
# LOCALIZATION NOTE (manual_migration_import_button): This message is shown on a button that starts the process
# of importing another browsers profile profile into Firefox.
manual_migration_import_button=今すぐ読み込む
# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
# action link are shown in each section of UI that fails to render
error_fallback_default_info=このコンテンツの読み込み中に何か問題が発生しました。
error_fallback_default_refresh_suggestion=ページを再読み込みしてもう一度試してください。
# LOCALIZATION NOTE (section_menu_action_*). These strings are displayed in the section
# context menu and are meant as a call to action for the given section.
section_menu_action_remove_section=セクションを削除
section_menu_action_collapse_section=セクションを折りたたむ
section_menu_action_expand_section=セクションを広げる
section_menu_action_manage_section=セクションを管理
section_menu_action_manage_webext=拡張機能を管理
section_menu_action_add_topsite=トップサイトを追加
section_menu_action_move_up=上へ移動
section_menu_action_move_down=下へ移動
section_menu_action_privacy_notice=プライバシー通知
# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
# firstrun of the browser, they give an introduction to Firefox and Sync.
firstrun_title=Firefox をあなたとともに
firstrun_content=すべての端末で、ブックマーク、履歴、パスワード、その他の設定を取得できます。
firstrun_learn_more_link=Firefox Accounts に関する詳細情報
# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
firstrun_form_header=メールアドレスを入力してください
firstrun_form_sub_header=Firefox Sync の利用を続けるために必要です
firstrun_email_input_placeholder=メールアドレス
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
firstrun_extra_legal_links=続行すると、{terms} と {privacy} に同意したものとみなします。
firstrun_terms_of_service=サービス利用規約
firstrun_privacy_notice=プライバシーに関する通知
firstrun_continue_to_login=続ける
firstrun_skip_login=この手順をスキップ

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

@ -41,7 +41,7 @@ confirm_history_delete_p1=本当にこのページに関して保存されてい
# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
# page from history.
confirm_history_delete_notice_p2=この操作は取り消せません。
menu_action_save_to_pocket=Pocket 保存
menu_action_save_to_pocket=Pocket 保存
menu_action_delete_pocket=Pocket から削除
menu_action_archive_pocket=Pocket にアーカイブ
@ -91,11 +91,10 @@ section_disclaimer_topstories_buttontext=了解しました
# what is shown for the homepage, new windows, and new tabs.
prefs_home_header=Firefox ホームコンテンツ
prefs_home_description=Firefox のホーム画面に表示するコンテンツを選びましょう。
prefs_restore_defaults_button=初期設定に戻す
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
prefs_section_rows_option={num} 行;{num} 行
prefs_section_rows_option={num} 行
prefs_search_header=ウェブ検索
prefs_topsites_description=よく訪れるサイト
prefs_topstories_description2=ウェブ上の様々な場所から集められた、あなたにピッタリの優れたコンテンツ
@ -107,25 +106,14 @@ prefs_highlights_options_download_label=最近のダウンロード
prefs_highlights_options_pocket_label=Pocket に保存されたページ
prefs_snippets_description=Mozilla と Firefox に関する最新情報
settings_pane_button_label=新しいタブページをカスタマイズ
settings_pane_header=新しいタブの設定
settings_pane_body2=このページに表示する内容を選択してください。
settings_pane_search_header=検索
settings_pane_search_body=新しいタブからウェブを検索します。
settings_pane_topsites_header=トップサイト
settings_pane_topsites_body=よく訪れるサイトへアクセス。
settings_pane_topsites_options_showmore=2 行で表示
settings_pane_highlights_header=ハイライト
settings_pane_highlights_body2=最近訪れたりブックマークしたりした興味のあるページへ戻る方法を見つけましょう。
settings_pane_highlights_options_bookmarks=ブックマーク
settings_pane_highlights_options_visited=訪れたサイト
# LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
# traditionally on about:home. Alternative translation options: "Small Note" or
# something that expresses the idea of "a small message, shortened from
# something else, and non-essential but also not entirely trivial and useless."
settings_pane_snippets_header=スニペット
settings_pane_snippets_body=Firefox、インターネット文化、時々無作為にお届けする小ネタなど、簡潔で役立つ Mozilla からの最新情報を読んでください。
settings_pane_done_button=完了
settings_pane_topstories_options_sponsored=広告記事を表示
# LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
# dialog.
@ -155,9 +143,6 @@ pocket_read_more=人気のトピック:
# LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
# end of the list of popular topic links.
pocket_read_even_more=他の記事を見る
# LOCALIZATION NOTE (pocket_description): This is shown in the settings pane
# to provide more information about Pocket.
pocket_description=Mozilla の一員となった Pocket の力を借りて、見逃してしまうかもしれない質の高い情報を見つけましょう。
highlights_empty_state=ブラウジング中にあなたが最近訪れたりブックマークしたりした、優れた記事、動画、その他ページの一部をここに表示します。
# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
@ -167,7 +152,7 @@ topstories_empty_state=すべて既読です。また後で戻って {provider}
# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
# import their browser profile from another browser they might be using.
manual_migration_explanation2=他のブラウザーからブックマークや履歴、パスワードを取り込んで Firefox を使ってみましょう。
manual_migration_explanation2=他のブラウザーからブックマークや履歴、パスワードをインポートして Firefox を使ってみましょう。
# LOCALIZATION NOTE (manual_migration_cancel_button): This message is shown on a button that cancels the
# process of importing another browsers profile into Firefox.
manual_migration_cancel_button=今はしない
@ -178,7 +163,7 @@ manual_migration_import_button=今すぐインポート
# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
# action link are shown in each section of UI that fails to render
error_fallback_default_info=このコンテンツの読み込み中に何か問題が発生しました。
error_fallback_default_refresh_suggestion=ページを再読み込みして再確認してください。
error_fallback_default_refresh_suggestion=ページを再読み込みしてもう一度試してください。
# LOCALIZATION NOTE (section_menu_action_*). These strings are displayed in the section
# context menu and are meant as a call to action for the given section.
@ -186,7 +171,31 @@ section_menu_action_remove_section=セクションを削除
section_menu_action_collapse_section=セクションを折りたたむ
section_menu_action_expand_section=セクションを広げる
section_menu_action_manage_section=セクションを管理
section_menu_action_manage_webext=拡張機能を管理
section_menu_action_add_topsite=トップサイトを追加
section_menu_action_move_up=上へ移動
section_menu_action_move_down=下へ移動
section_menu_action_privacy_notice=プライバシー通知
# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
# firstrun of the browser, they give an introduction to Firefox and Sync.
firstrun_title=Firefox をあなたとともに
firstrun_content=すべての端末で、ブックマーク、履歴、パスワード、その他の設定を取得できます。
firstrun_learn_more_link=Firefox Accounts に関する詳細情報
# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
firstrun_form_header=メールアドレスを入力してください
firstrun_form_sub_header=Firefox Sync の利用を続けるために必要です
firstrun_email_input_placeholder=メールアドレス
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
firstrun_extra_legal_links=続行すると、{terms} と {privacy} に同意したものとみなします。
firstrun_terms_of_service=サービス利用規約
firstrun_privacy_notice=プライバシーに関する通知
firstrun_continue_to_login=続ける
firstrun_skip_login=この手順をスキップ

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

@ -0,0 +1,112 @@
# LOCALIZATION NOTE(header_recommended_by): This is followed by the name
# of the corresponding content provider.
# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
# the context menu button is focused/active. Title is the label or hostname of
# the site.
# LOCALIZATION NOTE(section_context_menu_button_sr): This is for screen readers when
# the section edit context menu button is focused/active.
# LOCALIZATION NOTE (type_label_*): These labels are associated to pages to give
# context on how the element is related to the user, e.g. type indicates that
# the page is bookmarked, or is currently open on another device
# LOCALIZATION NOTE (menu_action_*): These strings are displayed in a context
# menu and are meant as a call to action for a given page.
# LOCALIZATION NOTE (menu_action_bookmark): Bookmark is a verb, as in "Add to
# bookmarks"
menu_action_pin=Chita'an
# LOCALIZATION NOTE (confirm_history_delete_notice_p2): this string is displayed in
# the same dialog as confirm_history_delete_p1. "This action" refers to deleting a
# page from history.
# LOCALIZATION NOTE (menu_action_show_file_*): These are platform specific strings
# found in the context menu of an item that has been downloaded. The intention behind
# "this action" is that it will show where the downloaded file exists on the file system
# for each operating system.
menu_action_open_file=Kuna tutu
# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
# link that belongs to this downloaded item"
# LOCALIZATION NOTE (search_button): This is screenreader only text for the
# search button.
search_button=Nduku
# LOCALIZATION NOTE (search_header): Displayed at the top of the panel
# showing search suggestions. {search_engine_name} is replaced with the name of
# the current default search engine. e.g. 'Google Search'
search_header={search_engine_name} Nduku
# LOCALIZATION NOTE (search_web_placeholder): This is shown in the searchbox when
# the user hasn't typed anything yet.
search_web_placeholder=Nduku nu Web
# LOCALIZATION NOTE (section_disclaimer_topstories): This is shown below
# the topstories section title to provide additional information about
# how the stories are selected.
# LOCALIZATION NOTE (section_disclaimer_topstories_buttontext): The text of
# the button used to acknowledge, and hide this disclaimer in the future.
# LOCALIZATION NOTE (prefs_*, settings_*): These are shown in about:preferences
# for a "Firefox Home" section. "Firefox" should be treated as a brand and kept
# in English, while "Home" should be localized matching the about:preferences
# sidebar mozilla-central string for the panel that has preferences related to
# what is shown for the homepage, new windows, and new tabs.
# LOCALIZATION NOTE (prefs_section_rows_option): This is a semi-colon list of
# plural forms used in a drop down of multiple row options (1 row, 2 rows).
# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
prefs_topstories_sponsored_learn_more=Skua'a kuakaa
# LOCALIZATION NOTE(settings_pane_snippets_header): For the "Snippets" feature
# traditionally on about:home. Alternative translation options: "Small Note" or
# something that expresses the idea of "a small message, shortened from
# something else, and non-essential but also not entirely trivial and useless."
# LOCALIZATION NOTE (edit_topsites_*): This is shown in the Edit Top Sites modal
# dialog.
edit_topsites_button_text=Sama
# LOCALIZATION NOTE (topsites_form_*): This is shown in the New/Edit Topsite modal.
# LOCALIZATION NOTE (topsites_form_*_button): These are verbs/actions.
topsites_form_add_button=Chikaa
topsites_form_save_button=Chika vaà
topsites_form_cancel_button=Kunchatu
# LOCALIZATION NOTE (pocket_read_more): This is shown at the bottom of the
# trending stories section and precedes a list of links to popular topics.
# LOCALIZATION NOTE (pocket_read_even_more): This is shown as a link at the
# end of the list of popular topic links.
# LOCALIZATION NOTE (topstories_empty_state): When there are no recommendations,
# in the space that would have shown a few stories, this is shown instead.
# {provider} is replaced by the name of the content provider for this section.
# LOCALIZATION NOTE (manual_migration_explanation2): This message is shown to encourage users to
# import their browser profile from another browser they might be using.
# LOCALIZATION NOTE (manual_migration_cancel_button): This message is shown on a button that cancels the
# process of importing another browsers profile into Firefox.
# LOCALIZATION NOTE (manual_migration_import_button): This message is shown on a button that starts the process
# of importing another browsers profile profile into Firefox.
# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
# action link are shown in each section of UI that fails to render
# LOCALIZATION NOTE (section_menu_action_*). These strings are displayed in the section
# context menu and are meant as a call to action for the given section.
section_menu_action_move_up=Kanta kuchi
section_menu_action_move_down=Kanta ninu
# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
# firstrun of the browser, they give an introduction to Firefox and Sync.
# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.

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

@ -187,7 +187,7 @@ firstrun_learn_more_link=Ketahui selanjutnya perihal Akaun Firefox
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
firstrun_form_header=Masukkan e-mel anda
firstrun_form_sub_header=untuk ke Firefox Sync.
firstrun_form_sub_header=untuk ke Firefox Sync
firstrun_email_input_placeholder=E-mel

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

@ -108,7 +108,7 @@ firstrun_content=Zakładki, historia, hasła i inne ustawienia mogą być dost
firstrun_learn_more_link=Więcej informacji
firstrun_form_header=Wprowadź adres e-mail
firstrun_form_sub_header=i zacznij korzystać z Firefox Sync
firstrun_email_input_placeholder=Adres E-mail
firstrun_email_input_placeholder=Adres e-mail
firstrun_extra_legal_links=Kontynuując, akceptujesz {terms} i {privacy}.
firstrun_terms_of_service=warunki korzystania z usługi
firstrun_privacy_notice=uwagi dotyczące prywatności

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

@ -163,7 +163,7 @@ manual_migration_import_button=Импортировать сейчас
# LOCALIZATION NOTE (error_fallback_default_*): This message and suggested
# action link are shown in each section of UI that fails to render
error_fallback_default_info=К сожалению что-то пошло не так при загрузке этого содержимого.
error_fallback_default_refresh_suggestion=Обновите страницу, чтобы повторить попытку.
error_fallback_default_refresh_suggestion=Обновить страницу, чтобы попробовать ещё раз.
# LOCALIZATION NOTE (section_menu_action_*). These strings are displayed in the section
# context menu and are meant as a call to action for the given section.

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

@ -49,10 +49,18 @@ menu_action_archive_pocket=பாக்கெட்டில் காப்ப
# found in the context menu of an item that has been downloaded. The intention behind
# "this action" is that it will show where the downloaded file exists on the file system
# for each operating system.
menu_action_show_file_mac_os=தேடலில் காண்பி
menu_action_show_file_windows=கோப்பகத்திலிருந்து திற
menu_action_show_file_linux=கோப்பகத்திலிருந்து திற
menu_action_show_file_default=கோப்பைக் காட்டு
menu_action_open_file=கோப்பைத் திற
# LOCALIZATION NOTE (menu_action_copy_download_link, menu_action_go_to_download_page):
# "Download" here, in both cases, is not a verb, it is a noun. As in, "Copy the
# link that belongs to this downloaded item"
menu_action_copy_download_link=பதிவிறக்க இணைப்பை நகலெடு
menu_action_go_to_download_page=பதிவிறக்க பக்கத்திற்கு செல்
menu_action_remove_download=வரலாற்றிலிருந்து நீக்கு
# LOCALIZATION NOTE (search_button): This is screenreader only text for the
# search button.
@ -90,8 +98,12 @@ prefs_section_rows_option={num} வரிசை;{num} வரிசைகள்
prefs_search_header=வலைதள தேடல்
prefs_topsites_description=நீங்கள் மிகவும் பார்வையிடும் தளங்கள்
prefs_topstories_description2=இணையத்திலிருந்து சிறந்த உள்ளடக்கங்கள், உங்களுக்காக தனிப்பயனாக்கப்பட்டவை
prefs_topstories_options_sponsored_label=விளம்பரக் கதைகள்
prefs_topstories_sponsored_learn_more=மேலும் அறிய
prefs_highlights_description=நீங்கள் சேமித்த அல்லது பார்வையிட்ட தளங்களின் தேர்வு
prefs_highlights_options_visited_label=பார்வையிட்டத் தளம்
prefs_highlights_options_download_label=அண்மைய பதிவிறக்கம்
prefs_highlights_options_pocket_label=பக்கங்கள் பாக்கெட்டில் சேமிக்கப்பட்டது
prefs_snippets_description=மொசில்லா மற்றும் பயர்பாக்சிலிருந்து புதுப்பிப்புகள்
settings_pane_button_label=உங்கள் புதிய கீற்றுப் பக்கத்தை விருப்பமை
settings_pane_topsites_header=சிறந்த தளங்கள்
@ -159,6 +171,7 @@ section_menu_action_remove_section=பகுதியை நீக்கவு
section_menu_action_collapse_section=பகுதியைச் சுருக்கு
section_menu_action_expand_section=பகுதியை விரி
section_menu_action_manage_section=பகுதியை நிர்வகி
section_menu_action_manage_webext=நீட்சிகளை நிர்வகி
section_menu_action_add_topsite=முதன்மை தளத்தைச் சேர்
section_menu_action_move_up=மேலே நகர்த்து
section_menu_action_move_down=கீழே நகர்த்து
@ -166,12 +179,23 @@ section_menu_action_privacy_notice=தனியுரிமை அறிவி
# LOCALIZATION NOTE (firstrun_*). These strings are displayed only once, on the
# firstrun of the browser, they give an introduction to Firefox and Sync.
firstrun_title=பயர்பாக்சை உடன் எடுத்துச் செல்லுங்கள்
firstrun_content=உங்கள் அனைத்துச் சாதனங்களிலும் உள்ள உங்களின் புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெறுங்கள்.
firstrun_learn_more_link=பயர்பாக்சு கணக்கைப் பற்றி மேலும் தெரிந்து கொள்ளவும்
# LOCALIZATION NOTE (firstrun_form_header and firstrun_form_sub_header):
# firstrun_form_sub_header is a continuation of firstrun_form_header, they are one sentence.
# firstrun_form_header is displayed more boldly as the call to action.
firstrun_form_header=உங்களின் மின்னஞ்சலை உள்ளிடுக
firstrun_form_sub_header=பயர்பாக்சு ஒத்திசையைத் தொடர.
firstrun_email_input_placeholder=மின்னஞ்சல்
# LOCALIZATION NOTE (firstrun_extra_legal_links): {terms} is equal to firstrun_terms_of_service, and
# {privacy} is equal to firstrun_privacy_notice. {terms} and {privacy} are clickable links.
firstrun_extra_legal_links=தொடர்வதன் மூலம், தாங்கள் {terms} மற்றும் {privacy} ஒப்புக்கொள்கின்றீர்கள்.
firstrun_terms_of_service=சேவையின் விதிமுறைகள்
firstrun_privacy_notice=தனியுரிமை அறிவிப்பு
firstrun_continue_to_login=தொடர்க
firstrun_skip_login=இந்த படிநிலையைத் தவிர்

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

@ -9,7 +9,7 @@ header_recommended_by={provider}చే సిఫార్సు చేయబడ
# LOCALIZATION NOTE(context_menu_button_sr): This is for screen readers when
# the context menu button is focused/active. Title is the label or hostname of
# the site.
context_menu_button_sr={title} కోసం సందర్భోచిత మెనుని తెరవండి
context_menu_button_sr={title} కోసం సందర్భోచిత మెనూని తెరవు
# LOCALIZATION NOTE(section_context_menu_button_sr): This is for screen readers when
# the section edit context menu button is focused/active.

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ach" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Dirica matidi manyen</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ach" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Dirica matidi manyen</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"><div data-reactroot=""><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Yeny kakube</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Yeny kakube" title="Yeny kakube"/><button id="searchSubmit" class="search-button" title="Yeny"><span class="sr-only"><span>Yeny</span></span></button></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Kakube maloyo</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Yub kakube man"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Lami tam obedo Pocket</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="topic"><span><span>Lok macuk gi lamal:</span></span><ul></ul></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Wiye madito</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Yub potbuk me dirica matidi mamegi manyen"></button></div></div></main></div></div></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Enter your email",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "Email",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="an" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Nueva Pestanya</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -10,7 +10,7 @@ window.gActivityStreamStrings = {
"type_label_bookmarked": "Con marcapachinas",
"type_label_recommended": "Tendencia",
"type_label_pocket": "Alzau en Pocket",
"type_label_downloaded": "Downloaded",
"type_label_downloaded": "Descargau",
"menu_action_bookmark": "Anyadir marcapachinas",
"menu_action_remove_bookmark": "Sacar lo marcapachinas",
"menu_action_open_new_window": "Ubrir en una nueva finestra",
@ -24,14 +24,14 @@ window.gActivityStreamStrings = {
"menu_action_save_to_pocket": "Alzar en Pocket",
"menu_action_delete_pocket": "Borrar de Pocket",
"menu_action_archive_pocket": "Archivar en Pocket",
"menu_action_show_file_mac_os": "Show in Finder",
"menu_action_show_file_windows": "Open Containing Folder",
"menu_action_show_file_linux": "Open Containing Folder",
"menu_action_show_file_default": "Show File",
"menu_action_open_file": "Open File",
"menu_action_copy_download_link": "Copy Download Link",
"menu_action_go_to_download_page": "Go to Download Page",
"menu_action_remove_download": "Remove from History",
"menu_action_show_file_mac_os": "Amostrar en o Finder",
"menu_action_show_file_windows": "Ubrir la carpeta an que se troba",
"menu_action_show_file_linux": "Ubrir la carpeta an que se troba",
"menu_action_show_file_default": "Amostrar lo fichero",
"menu_action_open_file": "Ubrir fichero",
"menu_action_copy_download_link": "Copiar vinclo de descarga",
"menu_action_go_to_download_page": "Ir ta la pachina de descarga",
"menu_action_remove_download": "Borrar de l'historial",
"search_button": "Mirar",
"search_header": "Mirar con {search_engine_name}",
"search_web_placeholder": "Mirar en o Web",
@ -43,13 +43,13 @@ window.gActivityStreamStrings = {
"prefs_section_rows_option": "{num} ringlera;{num} ringleras",
"prefs_search_header": "Busqueda web",
"prefs_topsites_description": "Los puestos que mas vesitas",
"prefs_topstories_description2": "Great content from around the web, personalized for you",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_description2": "Contenius interesants de tot lo web, personalizau pa tu",
"prefs_topstories_options_sponsored_label": "Articlos esponsorizaus",
"prefs_topstories_sponsored_learn_more": "Saber-ne mas",
"prefs_highlights_description": "Una tría d'os puestos que has alzau u vesitau",
"prefs_highlights_options_visited_label": "Visited Pages",
"prefs_highlights_options_download_label": "Most Recent Download",
"prefs_highlights_options_pocket_label": "Pages Saved to Pocket",
"prefs_highlights_options_visited_label": "Pachinas visitadas",
"prefs_highlights_options_download_label": "Descarga mas recient",
"prefs_highlights_options_pocket_label": "Pachinas alzadas en Pocket",
"prefs_snippets_description": "Actualizacions de Mozilla y Firefox",
"settings_pane_button_label": "Personaliza la tuya pachina de Nueva Pestanya",
"settings_pane_topsites_header": "Puestos mas vesitaus",
@ -85,35 +85,21 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Plegar la sección",
"section_menu_action_expand_section": "Desplegar la sección",
"section_menu_action_manage_section": "Chestionar la sección",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Chestionar la extensión",
"section_menu_action_add_topsite": "Anyadir un puesto popular",
"section_menu_action_move_up": "Puyar",
"section_menu_action_move_down": "Baixar",
"section_menu_action_privacy_notice": "Nota sobre privacidat",
"firstrun_title": "Take Firefox with You",
"firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
"firstrun_learn_more_link": "Learn more about Firefox Accounts",
"firstrun_form_header": "Enter your email",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "Email",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",
"firstrun_continue_to_login": "Continue",
"firstrun_skip_login": "Skip this step",
"prefs_restore_defaults_button": "Restaurar valors per defecto",
"prefs_topstories_description": "Contenius d'alta calidat que no te quiers perder",
"prefs_topstories_show_sponsored_label": "Articlos patrocinaus per {provider}",
"settings_pane_header": "Preferencias de Nueva Pestanya",
"settings_pane_body2": "Tría lo que veyes en esta pachina.",
"settings_pane_search_header": "Mirar",
"settings_pane_search_body": "Mirar la Web dende la tuya nueva pestanya.",
"settings_pane_topsites_body": "Accede a los puestos web que mas vesitas.",
"settings_pane_topsites_options_showmore": "Amostrar dos ringleras",
"settings_pane_highlights_body2": "Torna a trobar lo mas interesant que has vesitau en zagueras, u que has marcau con marcapchinas.",
"settings_pane_highlights_options_visited": "Puestos vesitaus",
"settings_pane_snippets_body": "leye noticias curtas de Mozilla sobre lo Firefox, la cultura d'internet y, de cabo ta quan, bell meme.",
"settings_pane_done_button": "Feito",
"settings_pane_topstories_options_sponsored": "Amostrar articlos patrocinaus",
"pocket_description": "Descubre gracias a Pocket, que dende agora fa parte de Mozilla, contenius d'alta calidat que d'atra manera te puetz perder."
"firstrun_title": "Prene lo Firefox con tu",
"firstrun_content": "Obtiene los tuyos marcapachinas, historials, claus y atros achustes en totz los tuyos dispositivos.",
"firstrun_learn_more_link": "Aprende mas sobre las cuentas de Firefox",
"firstrun_form_header": "Escribe lo tuyo email",
"firstrun_form_sub_header": "pa continar enta Firefox Sync.",
"firstrun_email_input_placeholder": "Correu-e",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "Si contina, ye confirmando que ye d'acuerdo con as {terms} y {privacy}.",
"firstrun_terms_of_service": "Condicions d'uso",
"firstrun_privacy_notice": "Nota sobre privacidat",
"firstrun_continue_to_login": "Continar",
"firstrun_skip_login": "Blinca-te este paso"
};

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>لسان جديد</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "أدخِل بريدك الإلكتروني",
"firstrun_form_sub_header": "لمواصلة استخدام «تزامُن فَيَرفُكس»",
"firstrun_email_input_placeholder": "البريد الإلكتروني",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "بمواصلة هذه العملية أنت توافق على {terms} و{privacy}.",
"firstrun_terms_of_service": "بنود الخدمة",
"firstrun_privacy_notice": "تنويه الخصوصية",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ast" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Llingüeta nueva</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ast" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Llingüeta nueva</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"><div data-reactroot=""><div class="outer-wrapper fixed-to-top"><main><div class="non-collapsible-section"><div class="search-wrapper"><label for="newtab-search-text" class="search-label"><span class="sr-only"><span>Guetar na web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Guetar na web" title="Guetar na web"/><button id="searchSubmit" class="search-button" title="Guetar"><span class="sr-only"><span>Guetar</span></span></button></div></div><div class="body-wrapper"><div class="sections-list"><section class="collapsible-section top-sites animation-enabled" data-section-id="topsites"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-topsites"></span><span>Más visitaos</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="top-sites-list"><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder "><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li><li class="top-site-outer placeholder hide-for-narrow"><div class="top-site-inner"><a><div class="tile" aria-hidden="true"><div class="screenshot" style="background-image:none"></div></div><div class="title "><span dir="auto"></span></div></a><button class="context-menu-button edit-button icon" title="Editar esti sitiu"></button></div></li></ul><div class="edit-topsites-wrapper"></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="topstories"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-pocket"></span><span>Recomendáu por Pocket</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="topic"><span><span>Temes populares:</span></span><ul></ul></div></div></section><section class="collapsible-section section normal-cards animation-enabled" data-section-id="highlights"><div class="section-top-bar"><h3 class="section-title"><span class="click-target"><span class="icon icon-small-spacer icon-highlights"></span><span>Destacaos</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Open the section context menu</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul></div></section></div><div class="prefs-button"><button class="icon icon-settings" title="Personalizar páxina Llingüeta nueva"></button></div></div></main></div></div></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Enter your email",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "Email",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="az" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Yeni Vərəq</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "E-poçtunuzu daxil edin",
"firstrun_form_sub_header": "və Firefox Sync ilə davam edin.",
"firstrun_email_input_placeholder": "E-poçt",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "Davam etməklə {terms} və {privacy} ilə razılaşmış olursuz.",
"firstrun_terms_of_service": "İstifadə Şərtləri",
"firstrun_privacy_notice": "Məxfilik Bildirişi",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="be" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Новая картка</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Увядзіце сваю электронную пошту",
"firstrun_form_sub_header": "каб прадоўжыць з Firefox Sync.",
"firstrun_email_input_placeholder": "Эл.пошта",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "Працягваючы, вы згаджаецеся з {terms} і {privacy}.",
"firstrun_terms_of_service": "умовамі абслугоўвання",
"firstrun_privacy_notice": "паведамленнем аб прыватнасці",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="bg" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Нов раздел</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Въведете своята ел. поща,",
"firstrun_form_sub_header": "за да продължите към Firefox Sync",
"firstrun_email_input_placeholder": "адрес на електронна поща",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "Продължавайки, вие се съгласявате с {terms} и {privacy}.",
"firstrun_terms_of_service": "Условията на услугата",
"firstrun_privacy_notice": "Политиката за лични данни",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="bn-BD" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>নতুন ট্যাব</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "আপনার ই-মেইল লিখুন",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "ইমেইল",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "সেবার শর্ত",
"firstrun_privacy_notice": "গোপনীয়তা নীতি",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="bn-IN" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>নতুন ট্যাব</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "আপনার ই-মেইল লিখুন",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "ইমেইল",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "সেবার শর্ত",
"firstrun_privacy_notice": "গোপনীয়তা নীতি",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="br" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Ivinell nevez</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Enankit ho chomlec'h postel",
"firstrun_form_sub_header": "evit kenderc'hel etrezek Firefox Sync.",
"firstrun_email_input_placeholder": "Postel",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "En ur genderc'hel, e savit a-du gant an {terms} hag ar {privacy}.",
"firstrun_terms_of_service": "divizoù arver",
"firstrun_privacy_notice": "evezhiadennoù a-fet buhez prevez",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="bs" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Novi tab</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

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

@ -96,6 +96,7 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Enter your email",
"firstrun_form_sub_header": "to continue to Firefox Sync",
"firstrun_email_input_placeholder": "Email",
"firstrun_invalid_input": "Valid email required",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",

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

@ -0,0 +1,17 @@
<!doctype html>
<html lang="ca" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
<title>Pestanya nova</title>
<link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
<link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
<link rel="stylesheet" href="resource://activity-stream/css/activity-stream.css" />
</head>
<body class="activity-stream">
<div id="root"></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>
</body>
</html>

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше