зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to mozilla-inbound. a=merge on a CLOSED TREE
This commit is contained in:
Коммит
1bf7ac45bb
2
Pipfile
2
Pipfile
|
@ -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"
|
||||
|
|
|
@ -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 browser’s 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 browser’s 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 browser’s 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 browser’s profile into Firefox.
|
||||
# LOCALIZATION NOTE (manual_migration_import_button): This message is shown on a button that starts the process
|
||||
# of importing another browser’s 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>
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче