Bug 1466971 - Add Blob images, Jexl targets and bug fixes to Activity Stream. r=ursula

MozReview-Commit-ID: NRTSgzuIzW

--HG--
extra : rebase_source : 4103ffba7c6f6b0c2004245855c1fc67a0dd1843
This commit is contained in:
Ed Lee 2018-06-05 14:04:52 -07:00
Родитель 7f90c6a9cc
Коммит 1d122eac32
58 изменённых файлов: 1305 добавлений и 1098 удалений

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

@ -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 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 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 ABOUT_URL = "about:newtab";

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

@ -41,7 +41,6 @@ body {
--newtab-text-conditional-color: #4A4A4F;
--newtab-text-primary-color: #0C0C0D;
--newtab-text-secondary-color: #737373;
--newtab-text-tertiary-color: #737373;
--newtab-textbox-background-color: #FFF;
--newtab-textbox-border: rgba(12, 12, 13, 0.2);
--newtab-textbox-focus-color: #0060DF;
@ -84,7 +83,6 @@ body {
--newtab-text-conditional-color: #F9F9FA;
--newtab-text-primary-color: #F9F9FA;
--newtab-text-secondary-color: rgba(249, 249, 250, 0.8);
--newtab-text-tertiary-color: rgba(249, 249, 250, 0.6);
--newtab-textbox-background-color: #38383D;
--newtab-textbox-border: rgba(249, 249, 250, 0.2);
--newtab-textbox-focus-color: #45A1FF;
@ -1338,14 +1336,14 @@ main {
word-wrap: break-word; }
.card-outer .card-context {
bottom: 0;
color: var(--newtab-text-tertiary-color);
color: var(--newtab-text-secondary-color);
display: flex;
font-size: 11px;
offset-inline-start: 0;
padding: 9px 16px 9px 14px;
position: absolute; }
.card-outer .card-context-icon {
fill: var(--newtab-icon-tertiary-color);
fill: var(--newtab-text-secondary-color);
height: 22px;
margin-inline-end: 6px; }
.card-outer .card-context-label {
@ -1390,9 +1388,9 @@ main {
line-height: 10px; }
.compact-cards .card-outer .card-text .card-title,
.compact-cards .card-outer .card-text:not(.no-description) .card-title {
font-size: 10px;
line-height: 12px;
max-height: 12px;
font-size: 12px;
line-height: 13px;
max-height: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
@ -1401,7 +1399,7 @@ main {
.compact-cards .card-outer .card-context {
background-color: var(--newtab-card-background-color);
border-radius: 16px;
clip-path: inset(0 0 4px);
clip-path: inset(-1px -1px 4px);
height: 32px;
width: 32px;
padding: 8px;
@ -1411,13 +1409,13 @@ main {
.compact-cards .card-outer .card-context::after {
border: 1px solid var(--newtab-card-hairline-color);
border-bottom: 0;
border-radius: 16px 16px 0 0;
border-radius: 17px 17px 0 0;
content: '';
position: absolute;
height: 50%;
width: 100%;
top: 0;
left: 0; }
height: 17px;
width: 34px;
top: -1px;
left: -1px; }
.compact-cards .card-outer .card-context .card-context-icon {
margin-inline-end: 0;
height: 16px;
@ -1635,8 +1633,10 @@ main {
background-color: var(--newtab-button-secondary-color);
font-family: inherit;
padding: 8px 15px;
margin-left: 12px;
margin-inline-start: 12px;
color: inherit; }
.tall .ASRouterButton {
margin-inline-start: 20px; }
.SnippetBaseContainer {
position: fixed;
@ -1757,11 +1757,24 @@ main {
padding: 4px 0 6px 0;
font-size: 15px; }
.SimpleSnippet.tall {
padding: 27px 0; }
.SimpleSnippet .title {
display: inline;
font-size: inherit;
margin: 0; }
.SimpleSnippet .titleIcon {
background-repeat: no-repeat;
background-size: 14px;
height: 16px;
width: 16px;
margin-top: 2px;
margin-inline-end: 2px;
display: inline-block;
vertical-align: top; }
.SimpleSnippet .body {
display: inline;
margin: 0; }
@ -1772,6 +1785,9 @@ main {
margin-inline-end: 12px;
flex-shrink: 0; }
.SimpleSnippet.tall .icon {
margin-inline-end: 20px; }
.SimpleSnippet .ASRouterAnchor {
color: inherit;
text-decoration: underline; }

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

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

@ -44,7 +44,6 @@ body {
--newtab-text-conditional-color: #4A4A4F;
--newtab-text-primary-color: #0C0C0D;
--newtab-text-secondary-color: #737373;
--newtab-text-tertiary-color: #737373;
--newtab-textbox-background-color: #FFF;
--newtab-textbox-border: rgba(12, 12, 13, 0.2);
--newtab-textbox-focus-color: #0060DF;
@ -87,7 +86,6 @@ body {
--newtab-text-conditional-color: #F9F9FA;
--newtab-text-primary-color: #F9F9FA;
--newtab-text-secondary-color: rgba(249, 249, 250, 0.8);
--newtab-text-tertiary-color: rgba(249, 249, 250, 0.6);
--newtab-textbox-background-color: #38383D;
--newtab-textbox-border: rgba(249, 249, 250, 0.2);
--newtab-textbox-focus-color: #45A1FF;
@ -1341,14 +1339,14 @@ main {
word-wrap: break-word; }
.card-outer .card-context {
bottom: 0;
color: var(--newtab-text-tertiary-color);
color: var(--newtab-text-secondary-color);
display: flex;
font-size: 11px;
offset-inline-start: 0;
padding: 9px 16px 9px 14px;
position: absolute; }
.card-outer .card-context-icon {
fill: var(--newtab-icon-tertiary-color);
fill: var(--newtab-text-secondary-color);
height: 22px;
margin-inline-end: 6px; }
.card-outer .card-context-label {
@ -1393,9 +1391,9 @@ main {
line-height: 10px; }
.compact-cards .card-outer .card-text .card-title,
.compact-cards .card-outer .card-text:not(.no-description) .card-title {
font-size: 10px;
line-height: 12px;
max-height: 12px;
font-size: 12px;
line-height: 13px;
max-height: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
@ -1404,7 +1402,7 @@ main {
.compact-cards .card-outer .card-context {
background-color: var(--newtab-card-background-color);
border-radius: 16px;
clip-path: inset(0 0 4px);
clip-path: inset(-1px -1px 4px);
height: 32px;
width: 32px;
padding: 8px;
@ -1414,13 +1412,13 @@ main {
.compact-cards .card-outer .card-context::after {
border: 1px solid var(--newtab-card-hairline-color);
border-bottom: 0;
border-radius: 16px 16px 0 0;
border-radius: 17px 17px 0 0;
content: '';
position: absolute;
height: 50%;
width: 100%;
top: 0;
left: 0; }
height: 17px;
width: 34px;
top: -1px;
left: -1px; }
.compact-cards .card-outer .card-context .card-context-icon {
margin-inline-end: 0;
height: 16px;
@ -1638,8 +1636,10 @@ main {
background-color: var(--newtab-button-secondary-color);
font-family: inherit;
padding: 8px 15px;
margin-left: 12px;
margin-inline-start: 12px;
color: inherit; }
.tall .ASRouterButton {
margin-inline-start: 20px; }
.SnippetBaseContainer {
position: fixed;
@ -1760,11 +1760,24 @@ main {
padding: 4px 0 6px 0;
font-size: 15px; }
.SimpleSnippet.tall {
padding: 27px 0; }
.SimpleSnippet .title {
display: inline;
font-size: inherit;
margin: 0; }
.SimpleSnippet .titleIcon {
background-repeat: no-repeat;
background-size: 14px;
height: 16px;
width: 16px;
margin-top: 2px;
margin-inline-end: 2px;
display: inline-block;
vertical-align: top; }
.SimpleSnippet .body {
display: inline;
margin: 0; }
@ -1775,6 +1788,9 @@ main {
margin-inline-end: 12px;
flex-shrink: 0; }
.SimpleSnippet.tall .icon {
margin-inline-end: 20px; }
.SimpleSnippet .ASRouterAnchor {
color: inherit;
text-decoration: underline; }

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

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

@ -41,7 +41,6 @@ body {
--newtab-text-conditional-color: #4A4A4F;
--newtab-text-primary-color: #0C0C0D;
--newtab-text-secondary-color: #737373;
--newtab-text-tertiary-color: #737373;
--newtab-textbox-background-color: #FFF;
--newtab-textbox-border: rgba(12, 12, 13, 0.2);
--newtab-textbox-focus-color: #0060DF;
@ -84,7 +83,6 @@ body {
--newtab-text-conditional-color: #F9F9FA;
--newtab-text-primary-color: #F9F9FA;
--newtab-text-secondary-color: rgba(249, 249, 250, 0.8);
--newtab-text-tertiary-color: rgba(249, 249, 250, 0.6);
--newtab-textbox-background-color: #38383D;
--newtab-textbox-border: rgba(249, 249, 250, 0.2);
--newtab-textbox-focus-color: #45A1FF;
@ -1338,14 +1336,14 @@ main {
word-wrap: break-word; }
.card-outer .card-context {
bottom: 0;
color: var(--newtab-text-tertiary-color);
color: var(--newtab-text-secondary-color);
display: flex;
font-size: 11px;
offset-inline-start: 0;
padding: 9px 16px 9px 14px;
position: absolute; }
.card-outer .card-context-icon {
fill: var(--newtab-icon-tertiary-color);
fill: var(--newtab-text-secondary-color);
height: 22px;
margin-inline-end: 6px; }
.card-outer .card-context-label {
@ -1390,9 +1388,9 @@ main {
line-height: 10px; }
.compact-cards .card-outer .card-text .card-title,
.compact-cards .card-outer .card-text:not(.no-description) .card-title {
font-size: 10px;
line-height: 12px;
max-height: 12px;
font-size: 12px;
line-height: 13px;
max-height: 13px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap; }
@ -1401,7 +1399,7 @@ main {
.compact-cards .card-outer .card-context {
background-color: var(--newtab-card-background-color);
border-radius: 16px;
clip-path: inset(0 0 4px);
clip-path: inset(-1px -1px 4px);
height: 32px;
width: 32px;
padding: 8px;
@ -1411,13 +1409,13 @@ main {
.compact-cards .card-outer .card-context::after {
border: 1px solid var(--newtab-card-hairline-color);
border-bottom: 0;
border-radius: 16px 16px 0 0;
border-radius: 17px 17px 0 0;
content: '';
position: absolute;
height: 50%;
width: 100%;
top: 0;
left: 0; }
height: 17px;
width: 34px;
top: -1px;
left: -1px; }
.compact-cards .card-outer .card-context .card-context-icon {
margin-inline-end: 0;
height: 16px;
@ -1635,8 +1633,10 @@ main {
background-color: var(--newtab-button-secondary-color);
font-family: inherit;
padding: 8px 15px;
margin-left: 12px;
margin-inline-start: 12px;
color: inherit; }
.tall .ASRouterButton {
margin-inline-start: 20px; }
.SnippetBaseContainer {
position: fixed;
@ -1757,11 +1757,24 @@ main {
padding: 4px 0 6px 0;
font-size: 15px; }
.SimpleSnippet.tall {
padding: 27px 0; }
.SimpleSnippet .title {
display: inline;
font-size: inherit;
margin: 0; }
.SimpleSnippet .titleIcon {
background-repeat: no-repeat;
background-size: 14px;
height: 16px;
width: 16px;
margin-top: 2px;
margin-inline-end: 2px;
display: inline-block;
vertical-align: top; }
.SimpleSnippet .body {
display: inline;
margin: 0; }
@ -1772,6 +1785,9 @@ main {
margin-inline-end: 12px;
flex-shrink: 0; }
.SimpleSnippet.tall .icon {
margin-inline-end: 20px; }
.SimpleSnippet .ASRouterAnchor {
color: inherit;
text-decoration: underline; }

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

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

@ -968,16 +968,15 @@ class ASRouterUISurface extends __WEBPACK_IMPORTED_MODULE_4_react___default.a.Pu
throw new Error(`You must provide a message_id for bundled messages`);
}
const eventType = `${message.provider || bundle.provider}_user_event`;
ASRouterUtils.sendTelemetry(Object.assign({
message_id: message.id || extraProps.message_id,
source: this.props.id,
source: extraProps.id,
action: eventType
}, extraProps));
}
sendImpression() {
this.sendUserActionTelemetry({ event: "IMPRESSION" });
sendImpression(extraProps) {
this.sendUserActionTelemetry(Object.assign({ event: "IMPRESSION" }, extraProps));
}
onBlockById(id) {
@ -1024,6 +1023,7 @@ class ASRouterUISurface extends __WEBPACK_IMPORTED_MODULE_4_react___default.a.Pu
return __WEBPACK_IMPORTED_MODULE_4_react___default.a.createElement(
__WEBPACK_IMPORTED_MODULE_2__components_ImpressionsWrapper_ImpressionsWrapper__["a" /* ImpressionsWrapper */],
{
id: "NEWTAB_FOOTER_BAR",
message: this.state.message,
sendImpression: this.sendImpression,
shouldSendImpressionOnUpdate: shouldSendImpressionOnUpdate
@ -1754,7 +1754,7 @@ class ContextMenuItem extends __WEBPACK_IMPORTED_MODULE_0_react___default.a.Pure
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_content_src_components_ErrorBoundary_ErrorBoundary__ = __webpack_require__(10);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_content_src_components_SectionMenu_SectionMenu__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_content_src_components_SectionMenu_SectionMenu__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_content_src_lib_section_menu_options__ = __webpack_require__(15);
@ -2866,7 +2866,7 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_content_src_lib_snippets__ = __webpack_require__(20);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_content_src_components_Base_Base__ = __webpack_require__(25);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_content_src_lib_detect_user_session_start__ = __webpack_require__(39);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_content_src_lib_detect_user_session_start__ = __webpack_require__(40);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_content_src_lib_init_store__ = __webpack_require__(8);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_react_redux__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_react_redux___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_redux__);
@ -3363,7 +3363,7 @@ class ImpressionsWrapper extends __WEBPACK_IMPORTED_MODULE_0_react___default.a.P
// only send the event if the page becomes visible again.
sendImpressionOrAddListener() {
if (this.props.document.visibilityState === VISIBLE) {
this.props.sendImpression();
this.props.sendImpression({ id: this.props.id });
} else {
// We should only ever send the latest impression stats ping, so remove any
// older listeners.
@ -3374,7 +3374,7 @@ class ImpressionsWrapper extends __WEBPACK_IMPORTED_MODULE_0_react___default.a.P
// When the page becomes visible, send the impression stats ping if the section isn't collapsed.
this._onVisibilityChange = () => {
if (this.props.document.visibilityState === VISIBLE) {
this.props.sendImpression();
this.props.sendImpression({ id: this.props.id });
this.props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
}
};
@ -3484,7 +3484,7 @@ class OnboardingMessage_OnboardingCard extends external__React__default.a.PureCo
onClick() {
const { props } = this;
props.sendUserActionTelemetry({ event: "CLICK_BUTTON", message_id: props.id });
props.sendUserActionTelemetry({ event: "CLICK_BUTTON", message_id: props.id, id: props.UISurface });
props.onAction(props.content);
}
@ -3540,7 +3540,11 @@ class OnboardingMessage_OnboardingMessage extends external__React__default.a.Pur
external__React__default.a.createElement(
"div",
{ className: "onboardingMessageContainer" },
props.bundle.map(message => external__React__default.a.createElement(OnboardingMessage_OnboardingCard, _extends({ key: message.id, sendUserActionTelemetry: props.sendUserActionTelemetry, onAction: props.onAction }, message)))
props.bundle.map(message => external__React__default.a.createElement(OnboardingMessage_OnboardingCard, _extends({ key: message.id,
sendUserActionTelemetry: props.sendUserActionTelemetry,
onAction: props.onAction,
UISurface: props.UISurface
}, message)))
)
);
}
@ -3574,13 +3578,31 @@ function safeURI(url) {
const Button = props => external__React__default.a.createElement(
"a",
{ href: safeURI(props.url),
onClick: props.onClick,
className: props.className || "ASRouterButton" },
props.children
);
const ALLOWED_STYLE_TAGS = ["color", "backgroundColor"];
const Button = props => {
const style = {};
// Add allowed style tags from props, e.g. props.color becomes style={color: props.color}
for (const tag of ALLOWED_STYLE_TAGS) {
if (typeof props[tag] !== "undefined") {
style[tag] = props[tag];
}
}
// remove border if bg is set to something custom
if (style.backgroundColor) {
style.border = "0";
}
return external__React__default.a.createElement(
"a",
{ href: safeURI(props.url),
onClick: props.onClick,
className: props.className || "ASRouterButton",
style: style },
props.children
);
};
// CONCATENATED MODULE: ./system-addon/content-src/asrouter/components/SnippetBase/SnippetBase.jsx
@ -3591,7 +3613,7 @@ class SnippetBase_SnippetBase extends external__React__default.a.PureComponent {
}
onBlockClicked() {
this.props.sendUserActionTelemetry({ event: "BLOCK" });
this.props.sendUserActionTelemetry({ event: "BLOCK", id: this.props.UISurface });
this.props.onBlock();
}
@ -3629,7 +3651,7 @@ class SimpleSnippet_SimpleSnippet extends external__React__default.a.PureCompone
}
onButtonClick() {
this.props.sendUserActionTelemetry({ event: "CLICK_BUTTON" });
this.props.sendUserActionTelemetry({ event: "CLICK_BUTTON", id: this.props.UISurface });
}
renderTitle() {
@ -3641,6 +3663,11 @@ class SimpleSnippet_SimpleSnippet extends external__React__default.a.PureCompone
) : null;
}
renderTitleIcon() {
const titleIcon = safeURI(this.props.content.title_icon);
return titleIcon ? external__React__default.a.createElement("span", { className: "titleIcon", style: { backgroundImage: `url("${titleIcon}")` } }) : null;
}
renderButton(className) {
const { props } = this;
return external__React__default.a.createElement(
@ -3648,7 +3675,9 @@ class SimpleSnippet_SimpleSnippet extends external__React__default.a.PureCompone
{
className: className,
onClick: this.onButtonClick,
url: props.content.button_url },
url: props.content.button_url,
color: props.content.button_color,
backgroundColor: props.content.button_background_color },
props.content.button_label
);
}
@ -3657,13 +3686,16 @@ class SimpleSnippet_SimpleSnippet extends external__React__default.a.PureCompone
const { props } = this;
const hasLink = props.content.button_url && props.content.button_type === "anchor";
const hasButton = props.content.button_url && !props.content.button_type;
const className = `SimpleSnippet${props.content.tall ? " tall" : ""}`;
return external__React__default.a.createElement(
SnippetBase_SnippetBase,
_extends({}, props, { className: "SimpleSnippet" }),
_extends({}, props, { className: className }),
external__React__default.a.createElement("img", { src: safeURI(props.content.icon) || DEFAULT_ICON_PATH, className: "icon" }),
external__React__default.a.createElement(
"div",
null,
this.renderTitleIcon(),
" ",
this.renderTitle(),
" ",
external__React__default.a.createElement(
@ -3704,7 +3736,7 @@ class SimpleSnippet_SimpleSnippet extends external__React__default.a.PureCompone
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9_content_src_components_Search_Search__ = __webpack_require__(30);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10_content_src_components_Sections_Sections__ = __webpack_require__(32);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_content_src_components_StartupOverlay_StartupOverlay__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11_content_src_components_StartupOverlay_StartupOverlay__ = __webpack_require__(39);
@ -4488,8 +4520,8 @@ const Search = Object(__WEBPACK_IMPORTED_MODULE_2_react_redux__["connect"])()(Ob
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_react_redux___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react_redux__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_content_src_components_Topics_Topics__ = __webpack_require__(35);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_content_src_components_TopSites_TopSites__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_content_src_components_Topics_Topics__ = __webpack_require__(36);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_content_src_components_TopSites_TopSites__ = __webpack_require__(37);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
@ -4766,11 +4798,366 @@ const Sections = Object(__WEBPACK_IMPORTED_MODULE_5_react_redux__["connect"])(st
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__ = __webpack_require__(1);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__types__ = __webpack_require__(34);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_redux__ = __webpack_require__(4);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_redux___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react_redux__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react_intl__ = __webpack_require__(2);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react_intl___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_intl__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_content_src_lib_link_menu_options__ = __webpack_require__(11);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_content_src_components_LinkMenu_LinkMenu__ = __webpack_require__(12);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react__);
// EXTERNAL MODULE: ./system-addon/common/Actions.jsm
var Actions = __webpack_require__(1);
// CONCATENATED MODULE: ./system-addon/content-src/components/Card/types.js
// Keep track of pending image loads to only request once
const gImageLoading = new Map();
/**
* Card component.
* Cards are found within a Section component and contain information about a link such
* as preview image, page title, page description, and some context about if the page
* was visited, bookmarked, trending etc...
* Each Section can make an unordered list of Cards which will create one instane of
* this class. Each card will then get a context menu which reflects the actions that
* can be done on this Card.
*/
class _Card extends __WEBPACK_IMPORTED_MODULE_6_react___default.a.PureComponent {
constructor(props) {
super(props);
this.state = {
activeCard: null,
imageLoaded: false,
showContextMenu: false,
cardImage: null
};
this.onMenuButtonClick = this.onMenuButtonClick.bind(this);
this.onMenuUpdate = this.onMenuUpdate.bind(this);
this.onLinkClick = this.onLinkClick.bind(this);
}
/**
* Helper to conditionally load an image and update state when it loads.
*/
async maybeLoadImage() {
// No need to load if it's already loaded or no image
const { cardImage } = this.state;
if (!cardImage) {
return;
}
const imageUrl = cardImage.url;
if (!this.state.imageLoaded) {
// Initialize a promise to share a load across multiple card updates
if (!gImageLoading.has(imageUrl)) {
const loaderPromise = new Promise((resolve, reject) => {
const loader = new Image();
loader.addEventListener("load", resolve);
loader.addEventListener("error", reject);
loader.src = imageUrl;
});
// Save and remove the promise only while it's pending
gImageLoading.set(imageUrl, loaderPromise);
loaderPromise.catch(ex => ex).then(() => gImageLoading.delete(imageUrl)).catch();
}
// Wait for the image whether just started loading or reused promise
await gImageLoading.get(imageUrl);
// Only update state if we're still waiting to load the original image
if (_Card.isImageInState(this.state, this.props.link.image) && !this.state.imageLoaded) {
this.setState({ imageLoaded: true });
}
}
}
/**
* Checks if `.image` property on link object is a local image with blob data.
* This function only works for props since state has `.url` and not `.data`.
*
* @param {obj|string} image
* @returns {bool} true if image is a local image object, otherwise false
* (otherwise, image will be a URL as a string)
*/
static isLocalImageObject(image) {
return image && image.data && image.path;
}
/**
* Helper to obtain the next state based on nextProps and prevState.
*
* NOTE: Rename this method to getDerivedStateFromProps when we update React
* to >= 16.3. We will need to update tests as well. We cannot rename this
* method to getDerivedStateFromProps now because there is a mismatch in
* the React version that we are using for both testing and production.
* (i.e. react-test-render => "16.3.2", react => "16.2.0").
*
* See https://github.com/airbnb/enzyme/blob/master/packages/enzyme-adapter-react-16/package.json#L43.
*/
static getNextStateFromProps(nextProps, prevState) {
const { image } = nextProps.link;
const imageInState = _Card.isImageInState(prevState, image);
let nextState = null;
// Image is updating.
if (!imageInState && nextProps.link) {
nextState = { imageLoaded: false };
}
if (imageInState) {
return nextState;
}
nextState = nextState || {};
// Since image was updated, attempt to revoke old image blob URL, if it exists.
_Card.maybeRevokeImageBlob(prevState);
if (!image) {
nextState.cardImage = null;
} else if (_Card.isLocalImageObject(image)) {
nextState.cardImage = { url: global.URL.createObjectURL(image.data), path: image.path };
} else {
nextState.cardImage = { url: image };
}
return nextState;
}
/**
* Helper to conditionally revoke the previous card image if it is a blob.
*/
static maybeRevokeImageBlob(prevState) {
if (prevState.cardImage && prevState.cardImage.path) {
global.URL.revokeObjectURL(prevState.cardImage.url);
}
}
/**
* Helper to check if an image is already in state.
*/
static isImageInState(state, image) {
const { cardImage } = state;
// Both image and cardImage are present.
if (image && cardImage) {
return _Card.isLocalImageObject(image) ? cardImage.path === image.path : cardImage.url === image;
}
// This will only handle the remaining three possible outcomes.
// (i.e. everything except when both image and cardImage are present)
return !image && !cardImage;
}
onMenuButtonClick(event) {
event.preventDefault();
this.setState({
activeCard: this.props.index,
showContextMenu: true
});
}
/**
* Report to telemetry additional information about the item.
*/
_getTelemetryInfo() {
// Filter out "history" type for being the default
if (this.props.link.type !== "history") {
return { value: { card_type: this.props.link.type } };
}
return null;
}
onLinkClick(event) {
event.preventDefault();
if (this.props.link.type === "download") {
this.props.dispatch(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].OnlyToMain({
type: __WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["c" /* actionTypes */].SHOW_DOWNLOAD_FILE,
data: this.props.link
}));
} else {
const { altKey, button, ctrlKey, metaKey, shiftKey } = event;
this.props.dispatch(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].OnlyToMain({
type: __WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["c" /* actionTypes */].OPEN_LINK,
data: Object.assign(this.props.link, { event: { altKey, button, ctrlKey, metaKey, shiftKey } })
}));
}
if (this.props.isWebExtension) {
this.props.dispatch(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].WebExtEvent(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["c" /* actionTypes */].WEBEXT_CLICK, {
source: this.props.eventSource,
url: this.props.link.url,
action_position: this.props.index
}));
} else {
this.props.dispatch(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].UserEvent(Object.assign({
event: "CLICK",
source: this.props.eventSource,
action_position: this.props.index
}, this._getTelemetryInfo())));
if (this.props.shouldSendImpressionStats) {
this.props.dispatch(__WEBPACK_IMPORTED_MODULE_0_common_Actions_jsm__["b" /* actionCreators */].ImpressionStats({
source: this.props.eventSource,
click: 0,
tiles: [{ id: this.props.link.guid, pos: this.props.index }]
}));
}
}
}
onMenuUpdate(showContextMenu) {
this.setState({ showContextMenu });
}
componentDidMount() {
this.maybeLoadImage();
}
componentDidUpdate() {
this.maybeLoadImage();
}
// NOTE: Remove this function when we update React to >= 16.3 since React will
// call getDerivedStateFromProps automatically. We will also need to
// rename getNextStateFromProps to getDerivedStateFromProps.
componentWillMount() {
const nextState = _Card.getNextStateFromProps(this.props, this.state);
if (nextState) {
this.setState(nextState);
}
}
// NOTE: Remove this function when we update React to >= 16.3 since React will
// call getDerivedStateFromProps automatically. We will also need to
// rename getNextStateFromProps to getDerivedStateFromProps.
componentWillReceiveProps(nextProps) {
const nextState = _Card.getNextStateFromProps(nextProps, this.state);
if (nextState) {
this.setState(nextState);
}
}
componentWillUnmount() {
_Card.maybeRevokeImageBlob(this.state);
}
render() {
const { index, className, link, dispatch, contextMenuOptions, eventSource, shouldSendImpressionStats } = this.props;
const { props } = this;
const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
// Display "now" as "trending" until we have new strings #3402
const { icon, intlID } = __WEBPACK_IMPORTED_MODULE_1__types__["a" /* cardContextTypes */][link.type === "now" ? "trending" : link.type] || {};
const hasImage = this.state.cardImage || link.hasImage;
const imageStyle = { backgroundImage: this.state.cardImage ? `url(${this.state.cardImage.url})` : "none" };
const outerClassName = ["card-outer", className, isContextMenuOpen && "active", props.placeholder && "placeholder"].filter(v => v).join(" ");
return __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"li",
{ className: outerClassName },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"a",
{ href: link.type === "pocket" ? link.open_url : link.url, onClick: !props.placeholder ? this.onLinkClick : undefined },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card" },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-preview-image-outer" },
hasImage && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement("div", { className: `card-preview-image${this.state.imageLoaded ? " loaded" : ""}`, style: imageStyle })
),
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-details" },
link.type === "download" && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-host-name alternate" },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_intl__["FormattedMessage"], { id: Object(__WEBPACK_IMPORTED_MODULE_4_content_src_lib_link_menu_options__["a" /* GetPlatformString */])(this.props.platform) })
),
link.hostname && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-host-name" },
link.hostname.slice(0, 100),
link.type === "download" && ` \u2014 ${link.description}`
),
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: ["card-text", icon ? "" : "no-context", link.description ? "" : "no-description", link.hostname ? "" : "no-host-name"].join(" ") },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"h4",
{ className: "card-title", dir: "auto" },
link.title
),
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"p",
{ className: "card-description", dir: "auto" },
link.description
)
),
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-context" },
icon && !link.context && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement("span", { className: `card-context-icon icon icon-${icon}` }),
link.icon && link.context && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement("span", { className: "card-context-icon icon", style: { backgroundImage: `url('${link.icon}')` } }),
intlID && !link.context && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-context-label" },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_intl__["FormattedMessage"], { id: intlID, defaultMessage: "Visited" })
),
link.context && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"div",
{ className: "card-context-label" },
link.context
)
)
)
)
),
!props.placeholder && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"button",
{ className: "context-menu-button icon",
onClick: this.onMenuButtonClick },
__WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(
"span",
{ className: "sr-only" },
`Open context menu for ${link.title}`
)
),
isContextMenuOpen && __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_5_content_src_components_LinkMenu_LinkMenu__["a" /* LinkMenu */], {
dispatch: dispatch,
index: index,
source: eventSource,
onUpdate: this.onMenuUpdate,
options: link.contextMenuOptions || contextMenuOptions,
site: link,
siteInfo: this._getTelemetryInfo(),
shouldSendImpressionStats: shouldSendImpressionStats })
);
}
}
/* unused harmony export _Card */
_Card.defaultProps = { link: {} };
const Card = Object(__WEBPACK_IMPORTED_MODULE_2_react_redux__["connect"])(state => ({ platform: state.Prefs.values.platform }))(_Card);
/* harmony export (immutable) */ __webpack_exports__["a"] = Card;
const PlaceholderCard = props => __WEBPACK_IMPORTED_MODULE_6_react___default.a.createElement(Card, { placeholder: true, className: props.className });
/* harmony export (immutable) */ __webpack_exports__["b"] = PlaceholderCard;
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(3)))
/***/ }),
/* 34 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
const cardContextTypes = {
history: {
intlID: "type_label_visited",
@ -4797,270 +5184,11 @@ const cardContextTypes = {
icon: "download"
}
};
// EXTERNAL MODULE: external "ReactRedux"
var external__ReactRedux_ = __webpack_require__(4);
var external__ReactRedux__default = /*#__PURE__*/__webpack_require__.n(external__ReactRedux_);
// EXTERNAL MODULE: external "ReactIntl"
var external__ReactIntl_ = __webpack_require__(2);
var external__ReactIntl__default = /*#__PURE__*/__webpack_require__.n(external__ReactIntl_);
// EXTERNAL MODULE: ./system-addon/content-src/lib/link-menu-options.js
var link_menu_options = __webpack_require__(11);
// EXTERNAL MODULE: ./system-addon/content-src/components/LinkMenu/LinkMenu.jsx
var LinkMenu = __webpack_require__(12);
// EXTERNAL MODULE: external "React"
var external__React_ = __webpack_require__(0);
var external__React__default = /*#__PURE__*/__webpack_require__.n(external__React_);
// CONCATENATED MODULE: ./system-addon/content-src/components/Card/Card.jsx
// Keep track of pending image loads to only request once
const gImageLoading = new Map();
/**
* Card component.
* Cards are found within a Section component and contain information about a link such
* as preview image, page title, page description, and some context about if the page
* was visited, bookmarked, trending etc...
* Each Section can make an unordered list of Cards which will create one instane of
* this class. Each card will then get a context menu which reflects the actions that
* can be done on this Card.
*/
class Card__Card extends external__React__default.a.PureComponent {
constructor(props) {
super(props);
this.state = {
activeCard: null,
imageLoaded: false,
showContextMenu: false
};
this.onMenuButtonClick = this.onMenuButtonClick.bind(this);
this.onMenuUpdate = this.onMenuUpdate.bind(this);
this.onLinkClick = this.onLinkClick.bind(this);
}
/**
* Helper to conditionally load an image and update state when it loads.
*/
async maybeLoadImage() {
// No need to load if it's already loaded or no image
const { image } = this.props.link;
if (!this.state.imageLoaded && image) {
// Initialize a promise to share a load across multiple card updates
if (!gImageLoading.has(image)) {
const loaderPromise = new Promise((resolve, reject) => {
const loader = new Image();
loader.addEventListener("load", resolve);
loader.addEventListener("error", reject);
loader.src = image;
});
// Save and remove the promise only while it's pending
gImageLoading.set(image, loaderPromise);
loaderPromise.catch(ex => ex).then(() => gImageLoading.delete(image)).catch();
}
// Wait for the image whether just started loading or reused promise
await gImageLoading.get(image);
// Only update state if we're still waiting to load the original image
if (this.props.link.image === image && !this.state.imageLoaded) {
this.setState({ imageLoaded: true });
}
}
}
onMenuButtonClick(event) {
event.preventDefault();
this.setState({
activeCard: this.props.index,
showContextMenu: true
});
}
/**
* Report to telemetry additional information about the item.
*/
_getTelemetryInfo() {
// Filter out "history" type for being the default
if (this.props.link.type !== "history") {
return { value: { card_type: this.props.link.type } };
}
return null;
}
onLinkClick(event) {
event.preventDefault();
if (this.props.link.type === "download") {
this.props.dispatch(Actions["b" /* actionCreators */].OnlyToMain({
type: Actions["c" /* actionTypes */].SHOW_DOWNLOAD_FILE,
data: this.props.link
}));
} else {
const { altKey, button, ctrlKey, metaKey, shiftKey } = event;
this.props.dispatch(Actions["b" /* actionCreators */].OnlyToMain({
type: Actions["c" /* actionTypes */].OPEN_LINK,
data: Object.assign(this.props.link, { event: { altKey, button, ctrlKey, metaKey, shiftKey } })
}));
}
if (this.props.isWebExtension) {
this.props.dispatch(Actions["b" /* actionCreators */].WebExtEvent(Actions["c" /* actionTypes */].WEBEXT_CLICK, {
source: this.props.eventSource,
url: this.props.link.url,
action_position: this.props.index
}));
} else {
this.props.dispatch(Actions["b" /* actionCreators */].UserEvent(Object.assign({
event: "CLICK",
source: this.props.eventSource,
action_position: this.props.index
}, this._getTelemetryInfo())));
if (this.props.shouldSendImpressionStats) {
this.props.dispatch(Actions["b" /* actionCreators */].ImpressionStats({
source: this.props.eventSource,
click: 0,
tiles: [{ id: this.props.link.guid, pos: this.props.index }]
}));
}
}
}
onMenuUpdate(showContextMenu) {
this.setState({ showContextMenu });
}
componentDidMount() {
this.maybeLoadImage();
}
componentDidUpdate() {
this.maybeLoadImage();
}
componentWillReceiveProps(nextProps) {
// Clear the image state if changing images
if (nextProps.link.image !== this.props.link.image) {
this.setState({ imageLoaded: false });
}
}
render() {
const { index, className, link, dispatch, contextMenuOptions, eventSource, shouldSendImpressionStats } = this.props;
const { props } = this;
const isContextMenuOpen = this.state.showContextMenu && this.state.activeCard === index;
// Display "now" as "trending" until we have new strings #3402
const { icon, intlID } = cardContextTypes[link.type === "now" ? "trending" : link.type] || {};
const hasImage = link.image || link.hasImage;
const imageStyle = { backgroundImage: link.image ? `url(${link.image})` : "none" };
const outerClassName = ["card-outer", className, isContextMenuOpen && "active", props.placeholder && "placeholder"].filter(v => v).join(" ");
return external__React__default.a.createElement(
"li",
{ className: outerClassName },
external__React__default.a.createElement(
"a",
{ href: link.type === "pocket" ? link.open_url : link.url, onClick: !props.placeholder ? this.onLinkClick : undefined },
external__React__default.a.createElement(
"div",
{ className: "card" },
external__React__default.a.createElement(
"div",
{ className: "card-preview-image-outer" },
hasImage && external__React__default.a.createElement("div", { className: `card-preview-image${this.state.imageLoaded ? " loaded" : ""}`, style: imageStyle })
),
external__React__default.a.createElement(
"div",
{ className: "card-details" },
link.type === "download" && external__React__default.a.createElement(
"div",
{ className: "card-host-name alternate" },
external__React__default.a.createElement(external__ReactIntl_["FormattedMessage"], { id: Object(link_menu_options["a" /* GetPlatformString */])(this.props.platform) })
),
link.hostname && external__React__default.a.createElement(
"div",
{ className: "card-host-name" },
link.hostname.slice(0, 100),
link.type === "download" && ` \u2014 ${link.description}`
),
external__React__default.a.createElement(
"div",
{ className: ["card-text", icon ? "" : "no-context", link.description ? "" : "no-description", link.hostname ? "" : "no-host-name"].join(" ") },
external__React__default.a.createElement(
"h4",
{ className: "card-title", dir: "auto" },
link.title
),
external__React__default.a.createElement(
"p",
{ className: "card-description", dir: "auto" },
link.description
)
),
external__React__default.a.createElement(
"div",
{ className: "card-context" },
icon && !link.context && external__React__default.a.createElement("span", { className: `card-context-icon icon icon-${icon}` }),
link.icon && link.context && external__React__default.a.createElement("span", { className: "card-context-icon icon", style: { backgroundImage: `url('${link.icon}')` } }),
intlID && !link.context && external__React__default.a.createElement(
"div",
{ className: "card-context-label" },
external__React__default.a.createElement(external__ReactIntl_["FormattedMessage"], { id: intlID, defaultMessage: "Visited" })
),
link.context && external__React__default.a.createElement(
"div",
{ className: "card-context-label" },
link.context
)
)
)
)
),
!props.placeholder && external__React__default.a.createElement(
"button",
{ className: "context-menu-button icon",
onClick: this.onMenuButtonClick },
external__React__default.a.createElement(
"span",
{ className: "sr-only" },
`Open context menu for ${link.title}`
)
),
isContextMenuOpen && external__React__default.a.createElement(LinkMenu["a" /* LinkMenu */], {
dispatch: dispatch,
index: index,
source: eventSource,
onUpdate: this.onMenuUpdate,
options: link.contextMenuOptions || contextMenuOptions,
site: link,
siteInfo: this._getTelemetryInfo(),
shouldSendImpressionStats: shouldSendImpressionStats })
);
}
}
/* unused harmony export _Card */
Card__Card.defaultProps = { link: {} };
const Card = Object(external__ReactRedux_["connect"])(state => ({ platform: state.Prefs.values.platform }))(Card__Card);
/* harmony export (immutable) */ __webpack_exports__["a"] = Card;
const PlaceholderCard = props => external__React__default.a.createElement(Card, { placeholder: true, className: props.className });
/* harmony export (immutable) */ __webpack_exports__["b"] = PlaceholderCard;
/* harmony export (immutable) */ __webpack_exports__["a"] = cardContextTypes;
/***/ }),
/* 34 */
/* 35 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -5133,7 +5261,7 @@ const SectionMenu = Object(__WEBPACK_IMPORTED_MODULE_2_react_intl__["injectIntl"
/***/ }),
/* 35 */
/* 36 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -5189,7 +5317,7 @@ class Topics extends __WEBPACK_IMPORTED_MODULE_1_react___default.a.PureComponent
/***/ }),
/* 36 */
/* 37 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -5204,7 +5332,7 @@ class Topics extends __WEBPACK_IMPORTED_MODULE_1_react___default.a.PureComponent
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react__ = __webpack_require__(0);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_react__);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_common_Reducers_jsm__ = __webpack_require__(6);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__TopSiteForm__ = __webpack_require__(37);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__TopSiteForm__ = __webpack_require__(38);
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__TopSite__ = __webpack_require__(18);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
@ -5366,7 +5494,7 @@ const TopSites = Object(__WEBPACK_IMPORTED_MODULE_4_react_redux__["connect"])(st
/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(3)))
/***/ }),
/* 37 */
/* 38 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -5736,7 +5864,7 @@ TopSiteForm_TopSiteForm.defaultProps = {
};
/***/ }),
/* 38 */
/* 39 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
@ -5891,7 +6019,7 @@ const StartupOverlay = Object(__WEBPACK_IMPORTED_MODULE_2_react_redux__["connect
/***/ }),
/* 39 */
/* 40 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";

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

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

@ -8,7 +8,7 @@
<em:type>2</em:type>
<em:bootstrap>true</em:bootstrap>
<em:unpack>false</em:unpack>
<em:version>2018.05.30.1059-64e374ac</em:version>
<em:version>2018.06.06.1137-f6f92043</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>

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

@ -8,6 +8,9 @@ Cu.importGlobalProperties(["fetch"]);
const {ASRouterActions: ra} = ChromeUtils.import("resource://activity-stream/common/Actions.jsm", {});
const {OnboardingMessageProvider} = ChromeUtils.import("resource://activity-stream/lib/OnboardingMessageProvider.jsm", {});
ChromeUtils.defineModuleGetter(this, "ASRouterTargeting",
"resource://activity-stream/lib/ASRouterTargeting.jsm");
const INCOMING_MESSAGE_NAME = "ASRouter:child-to-parent";
const OUTGOING_MESSAGE_NAME = "ASRouter:parent-to-child";
const ONE_HOUR_IN_MS = 60 * 60 * 1000;
@ -102,17 +105,6 @@ const MessageLoaderUtils = {
this.MessageLoaderUtils = MessageLoaderUtils;
/**
* getRandomItemFromArray
*
* @param {Array} arr An array of items
* @returns one of the items in the array
*/
function getRandomItemFromArray(arr) {
const index = Math.floor(Math.random() * arr.length);
return arr[index];
}
/**
* @class _ASRouter - Keeps track of all messages, UI surfaces, and
* handles blocking, rotation, etc. Inspecting ASRouter.state will
@ -238,29 +230,40 @@ class _ASRouter {
bundledMessages.push({content: originalMessage.content, id: originalMessage.id});
for (const msg of this.state.messages) {
if (msg.bundled && msg.template === originalMessage.template && msg.id !== originalMessage.id && !this.state.blockList.includes(msg.id)) {
// only copy the content - that's what the UI cares about
// Only copy the content - that's what the UI cares about
bundledMessages.push({content: msg.content, id: msg.id});
}
// Stop once we have enough messages to fill a bundle
if (bundledMessages.length === originalMessage.bundled) {
break;
}
}
// If we did not find enough messages to fill the bundle, do not send the bundle down
if (bundledMessages.length < originalMessage.bundled) {
return null;
}
return {bundle: bundledMessages, provider: originalMessage.provider, template: originalMessage.template};
}
async sendNextMessage(target) {
let message;
let bundledMessages;
_getUnblockedMessages() {
let {state} = this;
return state.messages.filter(item => !state.blockList.includes(item.id));
}
async sendNextMessage(target) {
let bundledMessages;
const msgs = this._getUnblockedMessages();
let message = await ASRouterTargeting.findMatchingMessage(msgs);
await this.setState({lastMessageId: message ? message.id : null});
await this.setState(state => {
message = getRandomItemFromArray(state.messages.filter(item => item.id !== state.lastMessageId && !state.blockList.includes(item.id)));
return {lastMessageId: message ? message.id : null};
});
// 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 = this._getBundledMessages(message);
}
if (message && !bundledMessages) {
if (message && !message.bundled) {
// If we only need to send 1 message, send the message
target.sendAsyncMessage(OUTGOING_MESSAGE_NAME, {type: "SET_MESSAGE", data: message});
} else if (bundledMessages) {

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

@ -0,0 +1,60 @@
ChromeUtils.import("resource://gre/modules/components-utils/FilterExpressions.jsm");
ChromeUtils.import("resource://gre/modules/Services.jsm");
ChromeUtils.defineModuleGetter(this, "ProfileAge",
"resource://gre/modules/ProfileAge.jsm");
ChromeUtils.import("resource://gre/modules/Console.jsm");
const FXA_USERNAME_PREF = "services.sync.username";
/**
* removeRandomItemFromArray - Removes a random item from the array and returns it.
*
* @param {Array} arr An array of items
* @returns one of the items in the array
*/
function removeRandomItemFromArray(arr) {
return arr.splice(Math.floor(Math.random() * arr.length), 1)[0];
}
const TargetingGetters = {
get profileAgeCreated() {
return new ProfileAge(null, null).created;
},
get profileAgeReset() {
return new ProfileAge(null, null).reset;
},
get hasFxAccount() {
return Services.prefs.prefHasUserValue(FXA_USERNAME_PREF);
}
};
this.ASRouterTargeting = {
Environment: TargetingGetters,
isMatch(filterExpression, context = this.Environment) {
return FilterExpressions.eval(filterExpression, context);
},
/**
* findMatchingMessage - Given an array of messages, returns one message
* whos targeting expression evaluates to true
*
* @param {Array} messages An array of AS router messages
* @param {obj|null} context A FilterExpression context. Defaults to TargetingGetters above.
* @returns {obj} an AS router message
*/
async findMatchingMessage(messages, context) {
const arrayOfItems = [...messages];
let match;
let candidate;
while (!match && arrayOfItems.length) {
candidate = removeRandomItemFromArray(arrayOfItems);
if (candidate && (!candidate.targeting || await this.isMatch(candidate.targeting, context))) {
match = candidate;
}
}
return match;
}
};
this.EXPORTED_SYMBOLS = ["ASRouterTargeting", "removeRandomItemFromArray"];

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

@ -30,7 +30,7 @@ const PREFS_BEFORE_SECTIONS = [
descString: "prefs_topsites_description"
},
icon: "topsites",
maxRows: 2,
maxRows: 4,
rowsPref: "topSitesRows"
}
];

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

@ -5,18 +5,14 @@
const EXPORTED_SYMBOLS = ["Screenshots"];
Cu.importGlobalProperties(["fetch"]);
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
ChromeUtils.defineModuleGetter(this, "BackgroundPageThumbs",
"resource://gre/modules/BackgroundPageThumbs.jsm");
ChromeUtils.defineModuleGetter(this, "PageThumbs",
"resource://gre/modules/PageThumbs.jsm");
ChromeUtils.defineModuleGetter(this, "FileUtils",
"resource://gre/modules/FileUtils.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "MIMEService",
"@mozilla.org/mime;1", "nsIMIMEService");
ChromeUtils.defineModuleGetter(this, "OS",
"resource://gre/modules/osfile.jsm");
ChromeUtils.defineModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
ChromeUtils.defineModuleGetter(this, "Services",
@ -25,53 +21,28 @@ ChromeUtils.defineModuleGetter(this, "Services",
const GREY_10 = "#F9F9FA";
this.Screenshots = {
/**
* Convert bytes to a string using extremely fast String.fromCharCode without
* exceeding the max number of arguments that can be provided to a function.
*/
_bytesToString(bytes) {
// NB: This comes from js/src/vm/ArgumentsObject.h ARGS_LENGTH_MAX
const ARGS_LENGTH_MAX = 500 * 1000;
let i = 0;
let str = "";
let {length} = bytes;
while (i < length) {
const start = i;
i += ARGS_LENGTH_MAX;
str += String.fromCharCode.apply(null, bytes.slice(start, i));
}
return str;
},
/**
* Get a screenshot / thumbnail for a url. Either returns the disk cached
* image or initiates a background request for the url.
*
* @param url {string} The url to get a thumbnail
* @return {Promise} Resolves a data uri string or null if failed
* @return {Promise} Resolves a custom object or null if failed
*/
async getScreenshotForURL(url) {
try {
await BackgroundPageThumbs.captureIfMissing(url, {backgroundColor: GREY_10});
const imgPath = PageThumbs.getThumbnailPath(url);
// OS.File object used to easily read off-thread
const file = await OS.File.open(imgPath, {read: true, existing: true});
const filePathResponse = await fetch(`file://${imgPath}`);
const fileContents = await filePathResponse.blob();
// Check if the file is empty, which indicates there isn't actually a
// thumbnail, so callers can show a failure state.
const bytes = await file.read();
if (bytes.length === 0) {
if (fileContents.size === 0) {
return null;
}
// nsIFile object needed for MIMEService
const nsFile = FileUtils.File(imgPath);
const contentType = MIMEService.getTypeFromFile(nsFile);
const encodedData = btoa(this._bytesToString(bytes));
file.close();
return `data:${contentType};base64,${encodedData}`;
return {path: imgPath, data: fileContents};
} catch (err) {
Cu.reportError(`getScreenshot(${url}) failed: ${err}`);
}

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

@ -30,6 +30,7 @@ const MIN_FAVICON_SIZE = 96;
const CACHED_LINK_PROPS_TO_MIGRATE = ["screenshot", "customScreenshot"];
const PINNED_FAVICON_PROPS_TO_MIGRATE = ["favicon", "faviconRef", "faviconSize"];
const SECTION_ID = "topsites";
const ROWS_PREF = "topSitesRows";
this.TopSitesFeed = class TopSitesFeed {
constructor() {
@ -88,8 +89,7 @@ this.TopSitesFeed = class TopSitesFeed {
}
async getLinksWithDefaults() {
// Get at least 2 rows so toggling between 1 and 2 rows has sites
const numItems = Math.max(this.store.getState().Prefs.values.topSitesRows, 2) * TOP_SITES_MAX_SITES_PER_ROW;
const numItems = this.store.getState().Prefs.values[ROWS_PREF] * TOP_SITES_MAX_SITES_PER_ROW;
const frecent = (await this.frecentCache.request({
numItems,
topsiteFrecency: FRECENCY_THRESHOLD
@ -329,7 +329,7 @@ this.TopSitesFeed = class TopSitesFeed {
// Don't insert any pins past the end of the visible top sites. Otherwise,
// we can end up with a bunch of pinned sites that can never be unpinned again
// from the UI.
const topSitesCount = this.store.getState().Prefs.values.topSitesRows * TOP_SITES_MAX_SITES_PER_ROW;
const topSitesCount = this.store.getState().Prefs.values[ROWS_PREF] * TOP_SITES_MAX_SITES_PER_ROW;
if (index >= topSitesCount) {
return;
}
@ -378,7 +378,7 @@ this.TopSitesFeed = class TopSitesFeed {
// pinned in the slot (unless it's the last slot, then it replaces).
this._insertPin(
action.data.site, index,
action.data.draggedFromIndex !== undefined ? action.data.draggedFromIndex : this.store.getState().Prefs.values.topSitesRows * TOP_SITES_MAX_SITES_PER_ROW);
action.data.draggedFromIndex !== undefined ? action.data.draggedFromIndex : this.store.getState().Prefs.values[ROWS_PREF] * TOP_SITES_MAX_SITES_PER_ROW);
await this._clearLinkCustomScreenshot(action.data.site);
this._broadcastPinnedSitesUpdated();
@ -410,6 +410,8 @@ this.TopSitesFeed = class TopSitesFeed {
case at.PREF_CHANGED:
if (action.data.name === DEFAULT_SITES_PREF) {
this.refreshDefaults(action.data.value);
} else if (action.data.name === ROWS_PREF) {
this.refresh({broadcast: true});
}
break;
case at.UPDATE_SECTION_PREFS:

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Bölməni Daralt",
"section_menu_action_expand_section": "Bölməni Genişlət",
"section_menu_action_manage_section": "Bölməni İdarə et",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Uzantını idarə et",
"section_menu_action_add_topsite": "Qabaqcıl Sayt əlavə et",
"section_menu_action_move_up": "Yuxarı daşı",
"section_menu_action_move_down": "Aşağı daşı",
"section_menu_action_privacy_notice": "Məxfilik Bildirişi",
"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": "İlkin seçənəkləri bərpa et",
"settings_pane_header": "Yeni Vərəq Nizamlamaları",
"settings_pane_body2": "Bu səhifədə nə görəcəyinizi seçin.",
"settings_pane_search_header": "Axtar",
"settings_pane_search_body": "Yeni vərəqinizdən Web-də axtarış edin.",
"settings_pane_topsites_body": "Ən çox ziyarət etdiyiniz saytları görün.",
"settings_pane_topsites_options_showmore": "İki sətir göstər",
"settings_pane_highlights_body2": "Son ziyarət etdiyiniz və ya əlfəcinlədiyiniz maraqlı məzmunlara rahat qayıdın.",
"settings_pane_highlights_options_visited": "Baxılmış Saytlar",
"settings_pane_snippets_body": "Mozilladan Firefox, internet mədəniyyəti və digər yeniliklər haqqında qısa bildirişlər oxuyun.",
"settings_pane_done_button": "Oldu",
"settings_pane_topstories_options_sponsored": "Sponsor Hekayələrini Göstər",
"pocket_description": "Mozilla ailəsinin yeni üzvü olan Pocket ilə yüksək keyfiyyətli məzmunları kəşf edin."
"firstrun_title": "Firefox-u özünüzlə gəzdirin",
"firstrun_content": "Əlfəcin, tarixçə, parol və digər tənzimləmələrinizi bütün cihazlarınızda əldə edin.",
"firstrun_learn_more_link": "Firefox Hesabları haqqında ətraflı öyrənin",
"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_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",
"firstrun_continue_to_login": "Davam et",
"firstrun_skip_login": "Bu addımı keç"
};

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

@ -10,7 +10,7 @@ window.gActivityStreamStrings = {
"type_label_bookmarked": "A les adreces d'interès",
"type_label_recommended": "Tendència",
"type_label_pocket": "Desat al Pocket",
"type_label_downloaded": "Downloaded",
"type_label_downloaded": "Baixat",
"menu_action_bookmark": "Afegeix a les adreces d'interès",
"menu_action_remove_bookmark": "Elimina l'adreça d'interès",
"menu_action_open_new_window": "Obre en una finestra nova",
@ -24,14 +24,14 @@ window.gActivityStreamStrings = {
"menu_action_save_to_pocket": "Desa al Pocket",
"menu_action_delete_pocket": "Suprimeix del Pocket",
"menu_action_archive_pocket": "Arxiva en el 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": "Mostra-ho en el Finder",
"menu_action_show_file_windows": "Obre la carpeta on es troba",
"menu_action_show_file_linux": "Obre la carpeta on es troba",
"menu_action_show_file_default": "Mostra el fitxer",
"menu_action_open_file": "Obre el fitxer",
"menu_action_copy_download_link": "Copia l'enllaç de la baixada",
"menu_action_go_to_download_page": "Vés a la pàgina de la baixada",
"menu_action_remove_download": "Suprimeix de l'historial",
"search_button": "Cerca",
"search_header": "Cerca de {search_engine_name}",
"search_web_placeholder": "Cerca al web",
@ -43,13 +43,13 @@ window.gActivityStreamStrings = {
"prefs_section_rows_option": "{num} fila;{num} files",
"prefs_search_header": "Cerca web",
"prefs_topsites_description": "El llocs que visiteu més sovint",
"prefs_topstories_description2": "Great content from around the web, personalized for you",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_description2": "El contingut més interessant de tot el web, personalitzat per a vós",
"prefs_topstories_options_sponsored_label": "Articles patrocinats",
"prefs_topstories_sponsored_learn_more": "Més informació",
"prefs_highlights_description": "Una selecció dels llocs que heu desat o visitat",
"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": "Pàgines visitades",
"prefs_highlights_options_download_label": "Baixada més recent",
"prefs_highlights_options_pocket_label": "Pàgines desades al Pocket",
"prefs_snippets_description": "Actualitzacions de Mozilla i del Firefox",
"settings_pane_button_label": "Personalitzeu la pàgina de pestanya nova",
"settings_pane_topsites_header": "Llocs principals",
@ -85,35 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Redueix la secció",
"section_menu_action_expand_section": "Amplia la secció",
"section_menu_action_manage_section": "Gestiona la secció",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Gestiona l'extensió",
"section_menu_action_add_topsite": "Afegeix com a lloc principal",
"section_menu_action_move_up": "Mou cap amunt",
"section_menu_action_move_down": "Mou cap avall",
"section_menu_action_privacy_notice": "Avís de privadesa",
"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": "Restaura els valors per defecte",
"prefs_topstories_description": "Contingut d'alta qualitat que d'altra manera potser us passaria per alt",
"prefs_topstories_show_sponsored_label": "Articles patrocinats per {provider}",
"settings_pane_header": "Preferències de pestanya nova",
"settings_pane_body2": "Trieu què voleu veure en aquesta pàgina.",
"settings_pane_search_header": "Cerca",
"settings_pane_search_body": "Cerca al web des de la pestanya nova.",
"settings_pane_topsites_body": "Accediu als llocs web que visiteu més sovint.",
"settings_pane_topsites_options_showmore": "Mostra dues files",
"settings_pane_highlights_body2": "Torneu a trobar allò més interessant que recentment heu visitat o heu afegit a les adreces d'interès.",
"settings_pane_highlights_options_visited": "Llocs visitats",
"settings_pane_snippets_body": "Llegiu notícies curtes de Mozilla sobre el Firefox, la cultura d'internet i, de tant en tant, algun mem.",
"settings_pane_done_button": "Fet",
"settings_pane_topstories_options_sponsored": "Mostra articles patrocinats",
"pocket_description": "Gràcies al Pocket, que ara és part de Mozilla, podeu descobrir contingut d'alta qualitat que d'altra manera potser us passaria per alt."
"firstrun_title": "El vostre Firefox, a tot arreu",
"firstrun_content": "Accediu a les vostres adreces d'interès, historial, contrasenyes i preferències en tots els vostres dispositius.",
"firstrun_learn_more_link": "Més informació sobre el Compte del Firefox",
"firstrun_form_header": "Introduïu la vostra adreça electrònica",
"firstrun_form_sub_header": "per continuar al Firefox Sync.",
"firstrun_email_input_placeholder": "Adreça electrònica",
"firstrun_extra_legal_links": "Si continueu, accepteu les {terms} i l'{privacy}.",
"firstrun_terms_of_service": "Condicions del servei",
"firstrun_privacy_notice": "Avís de privadesa",
"firstrun_continue_to_login": "Continua",
"firstrun_skip_login": "Omet aquest pas"
};

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

@ -10,7 +10,7 @@ window.gActivityStreamStrings = {
"type_label_bookmarked": "Yakon retal",
"type_label_recommended": "Rujawaxik",
"type_label_pocket": "Yakon pa Pocket",
"type_label_downloaded": "Downloaded",
"type_label_downloaded": "Xqasäx",
"menu_action_bookmark": "Yaketal",
"menu_action_remove_bookmark": "Tiyuj el ri yaketal",
"menu_action_open_new_window": "Tijaq pa jun K'ak'a' Tzuwäch",
@ -24,14 +24,14 @@ window.gActivityStreamStrings = {
"menu_action_save_to_pocket": "Tiyak pa Pocket",
"menu_action_delete_pocket": "Tiyuj el pa Pocket",
"menu_action_archive_pocket": "Tiyak pa 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": "Tik'ut pan Finder",
"menu_action_show_file_windows": "Tijaq K'wayöl Yakwuj",
"menu_action_show_file_linux": "Tijaq K'wayöl Yakwuj",
"menu_action_show_file_default": "Tik'ut Yakb'äl",
"menu_action_open_file": "Tijaq Yakb'äl",
"menu_action_copy_download_link": "Tiwachib'ëx Ruximonel Qasanïk",
"menu_action_go_to_download_page": "Tib'e pa Ruxaq Qasanïk",
"menu_action_remove_download": "Tiyuj el pa Natab'äl",
"search_button": "Tikanöx",
"search_header": "{search_engine_name} Tikanöx",
"search_web_placeholder": "Tikanöx pa Ajk'amaya'l",
@ -44,12 +44,12 @@ window.gActivityStreamStrings = {
"prefs_search_header": "Ajk'amaya'l Kanoxïk",
"prefs_topsites_description": "Taq ruxaq yalan ye'atz'ët",
"prefs_topstories_description2": "Nïm rupam chijun ri ajk'amaya'l, ichinan awuma rat",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_options_sponsored_label": "To'on taq B'anob'äl",
"prefs_topstories_sponsored_learn_more": "Tetamäx ch'aqa' chik",
"prefs_highlights_description": "Jun rucha'onem ruxaq, ri xayäk o xatz'ët",
"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": "Taq Ruxaq Etz'eton",
"prefs_highlights_options_download_label": "K'a B'a' Keqasäx",
"prefs_highlights_options_pocket_label": "Taq Ruxaq Eyakon pa Pocket",
"prefs_snippets_description": "Kik'exoj Mozilla chuqa' Firefox",
"settings_pane_button_label": "Tawichinaj ri ruxaq richin K'ak'a' Ruwi'",
"settings_pane_topsites_header": "Utziläj taq ruxaq K'amaya'l",
@ -85,34 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Tiwulüx Peraj",
"section_menu_action_expand_section": "Tirik' Peraj",
"section_menu_action_manage_section": "Tinuk'samajïx Peraj",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Tinuk'samajïx K'amal",
"section_menu_action_add_topsite": "Titz'aqatisäx K'ïy Ruwinaq Ruxaq K'amaya'l",
"section_menu_action_move_up": "Tijotob'äx",
"section_menu_action_move_down": "Tiqasäx qa",
"section_menu_action_privacy_notice": "Ichinan na'oj",
"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": "Ketzolïx ri e K'o wi",
"prefs_topstories_show_sponsored_label": "{provider} To'on taq B'anob'äl",
"settings_pane_header": "K'ak'a' Ruwi' Taq Ajowab'äl",
"settings_pane_body2": "Tacha' ri natzu' pa re ruxaq re'.",
"settings_pane_search_header": "Tikanöx",
"settings_pane_search_body": "Tikanoj ri k'ak'a' taq ruwi' pa ri K'amaya'l.",
"settings_pane_topsites_body": "Katok pa ri taq ajk'amaya'l yalan ye'atz'ët.",
"settings_pane_topsites_options_showmore": "Kek'ut pe ka'i' cholaj",
"settings_pane_highlights_body2": "Ke'awila' chik ri jeb'ël taq wachinäq e'atz'eton chuqa' aya'on ketal.",
"settings_pane_highlights_options_visited": "Ruxaq k'amaya'l etz'eton",
"settings_pane_snippets_body": "Ke'asik'ij koköj taq rutzijol Mozilla chi rij Firefox, rub'anob'al k'amaya'l, chuqa' jantäq q'olonel wachib'äl.",
"settings_pane_done_button": "Xk'is",
"settings_pane_topstories_options_sponsored": "Kek'ut pe To'on taq B'anob'äl",
"pocket_description": "Ke'awila' utziläj taq rupam pa Pocket, wakami ruch'akulan ri' rik'in Mozilla, ri rik'in jub'a' xtasäch rutz'etik."
"firstrun_title": "Tak'waj ri Firefox Awik'in",
"firstrun_content": "Ke'ak'waj ri taq yaketal, natab'äl, ewan taq tzij chuqa' ch'aqa' chik taq nuk'ulem pa ronojel taq awokisaxel.",
"firstrun_learn_more_link": "Tawetamaj ch'aqa' chik pa ruwi' ri Firefox Taqoya'l",
"firstrun_form_header": "Tatz'ib'aj ri ataqoya'l",
"firstrun_form_sub_header": "richin yatok pa Firefox Sync.",
"firstrun_email_input_placeholder": "Taqoya'l",
"firstrun_extra_legal_links": "Toq nasamajij qa, nawojqaj ri {terms} chuqa' {privacy}.",
"firstrun_terms_of_service": "Kojqanem Samaj",
"firstrun_privacy_notice": "Ichinan Na'oj",
"firstrun_continue_to_login": "Titikïr chik el",
"firstrun_skip_login": "Tixakalüx re jun ruxak re'"
};

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

@ -99,6 +99,6 @@ window.gActivityStreamStrings = {
"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_continue_to_login": "Συνέχεια",
"firstrun_skip_login": "Skip this step"
};

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

@ -100,18 +100,5 @@ window.gActivityStreamStrings = {
"firstrun_terms_of_service": "Términos del servicio",
"firstrun_privacy_notice": "Anuncio de privacidad",
"firstrun_continue_to_login": "Continuar",
"firstrun_skip_login": "Saltear este paso",
"prefs_restore_defaults_button": "Restaurar valores predeterminados",
"settings_pane_header": "Preferencias de nueva pestaña",
"settings_pane_body2": "Elige lo que ves en esta página.",
"settings_pane_search_header": "Buscar",
"settings_pane_search_body": "Busca en la web de tu nueva pestaña.",
"settings_pane_topsites_body": "Accede a los sitios web que más visitas.",
"settings_pane_topsites_options_showmore": "Mostrar dos filas",
"settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que has visitado o marcado recientemente.",
"settings_pane_highlights_options_visited": "Sitios visitados",
"settings_pane_snippets_body": "Lee actualizaciones breves de Mozilla sobre Firefox, la cultura de internet y de repente un meme de vez en cuando.",
"settings_pane_done_button": "Listo",
"settings_pane_topstories_options_sponsored": "Mostrar historias patrocinadas",
"pocket_description": "Descubre contenido de alta calidad que de otra forma te podrías perder, con la ayuda de Pocket, ahora parte de Mozilla."
"firstrun_skip_login": "Saltear este paso"
};

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

@ -100,18 +100,5 @@ window.gActivityStreamStrings = {
"firstrun_terms_of_service": "Términos del servicio",
"firstrun_privacy_notice": "Política de privacidad",
"firstrun_continue_to_login": "Continuar",
"firstrun_skip_login": "Saltar este paso",
"prefs_restore_defaults_button": "Restaurar valores predeterminados",
"settings_pane_header": "Preferencias de nueva pestaña",
"settings_pane_body2": "Elige lo que ves en esta página.",
"settings_pane_search_header": "Buscar",
"settings_pane_search_body": "Busca en la web de tu nueva pestaña.",
"settings_pane_topsites_body": "Accede a los sitios web que más visitas.",
"settings_pane_topsites_options_showmore": "Mostrar dos filas",
"settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que has visitado o marcado recientemente.",
"settings_pane_highlights_options_visited": "Sitios visitados",
"settings_pane_snippets_body": "Lee actualizaciones breves de Mozilla sobre Firefox, la cultura de internet y de repente un meme de vez en cuando.",
"settings_pane_done_button": "Listo",
"settings_pane_topstories_options_sponsored": "Mostrar historias patrocinadas",
"pocket_description": "Descubre contenido de alta calidad que de otra forma te podrías perder, con la ayuda de Pocket, ahora parte de Mozilla."
"firstrun_skip_login": "Saltar este paso"
};

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

@ -96,22 +96,9 @@ window.gActivityStreamStrings = {
"firstrun_form_header": "Introduzca su correo electrónico",
"firstrun_form_sub_header": "para acceder a Firefox Sync.",
"firstrun_email_input_placeholder": "Correo electrónico",
"firstrun_extra_legal_links": "Al proceder, aceptas los {terms} y la {privacy}.",
"firstrun_extra_legal_links": "Al continuar aceptas los {terms} y el {privacy}.",
"firstrun_terms_of_service": "Términos del servicio",
"firstrun_privacy_notice": "Aviso de privacidad",
"firstrun_continue_to_login": "Continuar",
"firstrun_skip_login": "Saltar este paso",
"prefs_restore_defaults_button": "Restaurar valores predeterminados",
"settings_pane_header": "Preferencias de nueva pestaña",
"settings_pane_body2": "Elige lo que ves en esta página.",
"settings_pane_search_header": "Buscar",
"settings_pane_search_body": "Busca en la web de tu nueva pestaña.",
"settings_pane_topsites_body": "Accede a los sitios web que más visitas.",
"settings_pane_topsites_options_showmore": "Mostrar dos filas",
"settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que has visitado o marcado recientemente.",
"settings_pane_highlights_options_visited": "Sitios visitados",
"settings_pane_snippets_body": "Lee actualizaciones breves de Mozilla sobre Firefox, la cultura de internet y de repente un meme de vez en cuando.",
"settings_pane_done_button": "Listo",
"settings_pane_topstories_options_sponsored": "Mostrar historias patrocinadas",
"pocket_description": "Descubre contenido de alta calidad que de otra forma te podrías perder, con la ayuda de Pocket, ahora parte de Mozilla."
"firstrun_skip_login": "Saltar este paso"
};

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

@ -90,28 +90,15 @@ window.gActivityStreamStrings = {
"section_menu_action_move_up": "Más",
"section_menu_action_move_down": "Bajar",
"section_menu_action_privacy_notice": "Política de privacidad",
"firstrun_title": "Llévese Firefox consigo",
"firstrun_content": "Acceda a sus marcadores, historial, contraseñas y más ajustes en todos sus dispositivos.",
"firstrun_learn_more_link": "Descubra más sobre las Cuentas de Firefox",
"firstrun_form_header": "Introduzca su correo electrónico",
"firstrun_title": "Lleva a Firefox contigo",
"firstrun_content": "Accede a tus marcadores, historial, contraseñas y más ajustes en todos tus dispositivos.",
"firstrun_learn_more_link": "Conoce más acerca de Firefox Accounts",
"firstrun_form_header": "Ingresa tu correo electrónico",
"firstrun_form_sub_header": "para acceder a Firefox Sync.",
"firstrun_email_input_placeholder": "Correo electrónico",
"firstrun_extra_legal_links": "Al proceder, aceptas los {terms} y la {privacy}.",
"firstrun_terms_of_service": "Términos del servicio",
"firstrun_privacy_notice": "Aviso de privacidad",
"firstrun_privacy_notice": "Política de privacidad",
"firstrun_continue_to_login": "Continuar",
"firstrun_skip_login": "Saltar este paso",
"prefs_restore_defaults_button": "Restaurar valores predeterminados",
"settings_pane_header": "Preferencias de nueva pestaña",
"settings_pane_body2": "Elige lo que ves en esta página.",
"settings_pane_search_header": "Buscar",
"settings_pane_search_body": "Busca en la web de tu nueva pestaña.",
"settings_pane_topsites_body": "Accede a los sitios web que más visitas.",
"settings_pane_topsites_options_showmore": "Mostrar dos filas",
"settings_pane_highlights_body2": "Encuentra tu camino de regreso a las cosas interesantes que has visitado o marcado recientemente.",
"settings_pane_highlights_options_visited": "Sitios visitados",
"settings_pane_snippets_body": "Lee actualizaciones breves de Mozilla sobre Firefox, la cultura de internet y de repente un meme de vez en cuando.",
"settings_pane_done_button": "Listo",
"settings_pane_topstories_options_sponsored": "Mostrar historias patrocinadas",
"pocket_description": "Descubre contenido de alta calidad que de otra forma te podrías perder, con la ayuda de Pocket, ahora parte de Mozilla."
"firstrun_skip_login": "Saltar este paso"
};

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

@ -87,8 +87,8 @@ window.gActivityStreamStrings = {
"section_menu_action_manage_section": "Manage Section",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_add_topsite": "Add Top Site",
"section_menu_action_move_up": "Move Up",
"section_menu_action_move_down": "Move Down",
"section_menu_action_move_up": "جابه‌جایی به بالا",
"section_menu_action_move_down": "جابه‌جایی به پایین",
"section_menu_action_privacy_notice": "Privacy Notice",
"firstrun_title": "Take Firefox with You",
"firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
@ -100,55 +100,5 @@ window.gActivityStreamStrings = {
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",
"firstrun_continue_to_login": "Continue",
"firstrun_skip_login": "Skip this step",
"default_label_loading": "در حال بارگیری…",
"header_stories": "برترین داستان‌ها",
"header_visit_again": "مشاهده دوباره",
"header_bookmarks": "نشانک‌های اخیر",
"header_bookmarks_placeholder": "هنوز هیچ نشانکی ندارید.",
"header_stories_from": "از",
"type_label_synced": "هم‌گام شده از دستگاهی دیگر",
"type_label_open": "باز کردن",
"type_label_topic": "موضوع",
"type_label_now": "هم‌اکنون",
"menu_action_copy_address": "رونوشت از آدرس",
"menu_action_email_link": "ارسال پیوند…",
"search_for_something_with": "جست‌وجو برای {search_term} با:",
"search_settings": "تغییر تنظیمات جست‌وجو",
"section_info_option": "اطلاعات",
"section_info_send_feedback": "ارسال بازخورد",
"section_info_privacy_notice": "نکات حفظ حریم خصوصی",
"welcome_title": "به زبانه جدید خوش‌آمدید",
"welcome_body": "فایرفاکس از این فضا برای نمایش نشانک‌ها، مقالات، ویدئوها و صفحات مرتبطی که به‌تازگی مشاهده کرده‌اید استفاده می‌کند، تا شما به راحتی دوباره به آنها دسترسی داشته باشید.",
"welcome_label": "شناسایی گزینه‌های برجسته شما",
"time_label_less_than_minute": "> ۱ دقیقه",
"time_label_minute": "{number} د",
"time_label_hour": "{number} س",
"time_label_day": "{number} ر",
"settings_pane_header": "تنظیمات زبانه جدید",
"settings_pane_body2": "انتخاب کنید چیزی را که مایل هستید در این صفحه مشاهده کنید.",
"settings_pane_search_header": "جست‌وجو",
"settings_pane_search_body": "وب را از زبانه جدید خود جست‌وجو کنید.",
"settings_pane_topsites_body": "به وب‌سایت‌هایی که بیشترین بازدید از آنها را داشتید دسترسی داشته باشید.",
"settings_pane_topsites_options_showmore": "نمایش دو ردیفی",
"settings_pane_bookmarks_header": "نشانک‌های اخیر",
"settings_pane_bookmarks_body": "به‌تازگی شما نشانک‌هایی را در یک محل مناسب ساخته‌اید.",
"settings_pane_visit_again_header": "مشاهده دوباره",
"settings_pane_visit_again_body": "فایرفاکس بخش‌هایی از تاریخ‌چه مرورتان را که ممکن است بخواهید به یاد داشته باشید یا به آن‌ها بازگردید به شما نشان خواهد داد.",
"settings_pane_highlights_body2": "راه خود را در میان چیزهایی که دوست دارید پیدا کنید.چیزهایی که اخیرا مشاهده کرده اید یا نشانک ها.",
"settings_pane_highlights_options_visited": "سایت‌های بازدید شده",
"settings_pane_snippets_body": "بروزرسانی های شیرین و کوتاه موزیلا در مورد فایرفاکس،‌ فرهنگ اینترنت، و تصاویر تصادفی مناسبتی مطالعه کنید.",
"settings_pane_done_button": "انجام شد",
"settings_pane_topstories_options_sponsored": "نمایش داستان‌های حمایت شده",
"edit_topsites_button_label": "قسمت سایت‌های برتر را سفارشی کنید",
"edit_topsites_showmore_button": "نمایش بیشتر",
"edit_topsites_showless_button": "نمایش کمتر",
"edit_topsites_done_button": "انجام شد",
"edit_topsites_pin_button": "چسباندن این سایت",
"edit_topsites_unpin_button": "لغو سنجاق کردن این پایگاه اینترنتی",
"edit_topsites_dismiss_button": "نادیده گرفتن این سایت",
"edit_topsites_add_button": "افزودن",
"edit_topsites_add_button_tooltip": "اضافه کردن به سایت های برتر",
"pocket_feedback_header": "بهترین‌های وب، گزینش شده توسط بیش از ۲۵ میلیون نفر.",
"pocket_description": "محتواهای با کیفیتی را پیدا کنید که ممکن است از دست داده باشید، به کمک Pocket که اکنون بخشی از موزیلا است."
"firstrun_skip_login": "Skip this step"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Pienennä osio",
"section_menu_action_expand_section": "Laajenna osio",
"section_menu_action_manage_section": "Muokkaa osiota",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Hallitse laajennusta",
"section_menu_action_add_topsite": "Lisää ykkössivusto",
"section_menu_action_move_up": "Siirrä ylös",
"section_menu_action_move_down": "Siirrä alas",
"section_menu_action_privacy_notice": "Tietosuojakäytäntö",
"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": "Palauta oletukset",
"settings_pane_header": "Uuden välilehden asetukset",
"settings_pane_body2": "Valitse, mitä haluat nähdä tällä sivulla.",
"settings_pane_search_header": "Haku",
"settings_pane_search_body": "Tee verkkohakuja uudesta välilehdestä.",
"settings_pane_topsites_body": "Näe eniten vierailemasi sivustot.",
"settings_pane_topsites_options_showmore": "Näytä kaksi riviä",
"settings_pane_highlights_body2": "Löydä tiesi takaisin kiinnostaviin juttuihin, joissa olet käynyt tai jotka olet lisännyt kirjanmerkkeihin viime aikoina.",
"settings_pane_highlights_options_visited": "Vieraillut sivustot",
"settings_pane_snippets_body": "Lue Mozillan lyhyitä päivityksiä liittyen Firefoxiin, internetkulttuuriin ja satunnaisiin meemeihin.",
"settings_pane_done_button": "Valmis",
"settings_pane_topstories_options_sponsored": "Näytä sponsoroidut jutut",
"pocket_description": "Löydä laadukasta sisältöä, josta olisit muutoin ehkä jäänyt paitsi. Pocketilta, joka on nyt osa Mozillaa."
"firstrun_title": "Ota Firefox matkalle mukaan",
"firstrun_content": "Käytä kirjanmerkkejä, historiaa, salasanoja ja muita asetuksia kaikilla laitteillasi.",
"firstrun_learn_more_link": "Lue lisää Firefox-tilistä",
"firstrun_form_header": "Kirjoita sähköpostisi",
"firstrun_form_sub_header": "jatkaaksesi Firefox Sync -palveluun.",
"firstrun_email_input_placeholder": "Sähköposti",
"firstrun_extra_legal_links": "Jatkamalla hyväksyt {terms} ja {privacy}.",
"firstrun_terms_of_service": "käyttöehdot",
"firstrun_privacy_notice": "tietosuojakäytännön",
"firstrun_continue_to_login": "Jatka",
"firstrun_skip_login": "Ohita tämä vaihe"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Co-theannaich an earrann",
"section_menu_action_expand_section": "Leudaich an earrann",
"section_menu_action_manage_section": "Stiùirich an earrann",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Stiùirich an leudachan",
"section_menu_action_add_topsite": "Cuir ris brod làraich",
"section_menu_action_move_up": "Gluais suas",
"section_menu_action_move_down": "Gluais sìos",
"section_menu_action_privacy_notice": "Sanas prìobhaideachd",
"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": "Aisig na bun-roghainnean",
"settings_pane_header": "Roghainnean nan tabaichean ùra",
"settings_pane_body2": "Tagh na chì thu air an duilleag seo.",
"settings_pane_search_header": "Lorg",
"settings_pane_search_body": "Lorg air an lìon on taba ùr agad.",
"settings_pane_topsites_body": "Faigh cothrom air na làraichean air an tadhail thu gu tric.",
"settings_pane_topsites_options_showmore": "Seall dà ràgh",
"settings_pane_highlights_body2": "Faigh greim gu furasta air rudan inntinneach air an do thadhail thu roimhe no a rinn thu comharran-lìn dhiubh.",
"settings_pane_highlights_options_visited": "Làraichean a thadhladh orra",
"settings_pane_snippets_body": "Leugh naidheachdan goirid tlachdmhor o Mozilla mu Firefox, cultar an lìn s mìm no dhà.",
"settings_pane_done_button": "Deiseil",
"settings_pane_topstories_options_sponsored": "Seall sgeulachdan sponsairichte",
"pocket_description": "Fiosraich sàr-shusbaint nach lorgadh tu s dòcha le taic o Pocket a tha na phàirt dhe Mozilla a-nis."
"firstrun_title": "Thoir Firefox leat",
"firstrun_content": "Faigh na comharran-lìn, an eachdraidh, na faclan-faire s roghainnean eile air na h-uidheaman air fad agad.",
"firstrun_learn_more_link": "Barrachd fiosrachaidh air cunntasan Firefox",
"firstrun_form_header": "Cuir a-steach am post-d agad",
"firstrun_form_sub_header": "a leantainn air adhart gu sioncronachadh Firefox.",
"firstrun_email_input_placeholder": "Post-d",
"firstrun_extra_legal_links": "Ma leanas tu air adhart, bidh tu ag aontachadh ri {terms} agus {privacy}.",
"firstrun_terms_of_service": "teirmichean na seirbheise",
"firstrun_privacy_notice": "aithris na prìobhaideachd",
"firstrun_continue_to_login": "Lean air adhart",
"firstrun_skip_login": "Leum seachad air seo"
};

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

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

@ -3,7 +3,7 @@ window.gActivityStreamStrings = {
"newtab_page_title": "નવી ટૅબ",
"header_top_sites": "ટોચની સાઇટ્સ",
"header_highlights": "હાઇલાઇટ્સ",
"header_recommended_by": "Recommended by {provider}",
"header_recommended_by": "{provider} દ્વારા ભલામણ",
"context_menu_button_sr": "{title} માટે સંદર્ભ મેનૂ ખોલો",
"section_context_menu_button_sr": "વિભાગ સંદર્ભ મેનૂ ખોલો",
"type_label_visited": "જોવામા આવેલ:",
@ -85,20 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "વિભાગ સંકુચિત કરો",
"section_menu_action_expand_section": "વિભાગ વિસ્તૃત કરો",
"section_menu_action_manage_section": "વિભાગ સંચાલિત કરો",
"section_menu_action_manage_webext": "Manage Extension",
"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": "ખાનગી સૂચના",
"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"
"firstrun_title": "તમારી સાથે Firefox લો",
"firstrun_content": "તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સ મેળવો.",
"firstrun_learn_more_link": "Fireofox ખાતા વિશે વધુ જાણો",
"firstrun_form_header": "તમારા ઇમેઇલ દાખલ કરો",
"firstrun_form_sub_header": "Firefox સમન્વયન ચાલુ રાખવા માટે.",
"firstrun_email_input_placeholder": "ઇમેઇલ",
"firstrun_extra_legal_links": "આગળ વધીને, તમે {terms} અને {privacy} સાથે સંમત થાઓ છો.",
"firstrun_terms_of_service": "સેવાની શરતો",
"firstrun_privacy_notice": "ખાનગી સૂચના",
"firstrun_continue_to_login": "ચાલુ રાખો",
"firstrun_skip_login": "આ પગલું છોડી દો"
};

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

@ -10,7 +10,7 @@ window.gActivityStreamStrings = {
"type_label_bookmarked": "पुस्तचिह्न लगाया हुआ",
"type_label_recommended": "लोकप्रिय",
"type_label_pocket": "Pocket में सहेजा",
"type_label_downloaded": "Downloaded",
"type_label_downloaded": "डाउनलोड की गई",
"menu_action_bookmark": "पुस्तचिह्न",
"menu_action_remove_bookmark": "पुस्तचिह्न हटाएँ",
"menu_action_open_new_window": "एक नई विंडो में खोलें",
@ -91,14 +91,14 @@ window.gActivityStreamStrings = {
"section_menu_action_move_down": "नीचे जाएँ",
"section_menu_action_privacy_notice": "गोपनीयता नीति",
"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"
"firstrun_content": "अपने सभी उपकरणों पर अपना पुस्तचिह्न, इतिहास, कूटशब्द और अन्य सेटिंग प्राप्त करें.",
"firstrun_learn_more_link": "Firefox खातों के बारे में अधिक जानें",
"firstrun_form_header": "अपना ईमेल प्रविष्ट करें",
"firstrun_form_sub_header": "Firefox सिंक के लिए जारी रखें.",
"firstrun_email_input_placeholder": "ईमेल",
"firstrun_extra_legal_links": "आगे बढ़ने से, आप {terms} और {privacy} से सहमत हैं|",
"firstrun_terms_of_service": "सेवा की शर्तें",
"firstrun_privacy_notice": "गोपनीयता नीति",
"firstrun_continue_to_login": "जारी रखें",
"firstrun_skip_login": "इस चरण को छोड़ दें"
};

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

@ -9,7 +9,7 @@
<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>Cari di Web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Cari di Web" title="Cari di Web"/><button id="searchSubmit" class="search-button" title="Cari"><span class="sr-only"><span>Cari</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>Situs Teratas</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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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>Disarankan oleh 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>Topik Populer:</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>Sorotan</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="Ubahsuai laman Tab Baru Anda"></button></div></div></main></div></div></div>
<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>Cari di Web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Cari di Web" title="Cari di Web"/><button id="searchSubmit" class="search-button" title="Cari"><span class="sr-only"><span>Cari</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>Situs Teratas</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Buka bagian menu konteks</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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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="Sunting situs ini"></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>Disarankan oleh Pocket</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Buka bagian menu konteks</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="topic"><span><span>Topik Populer:</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>Sorotan</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Buka bagian menu konteks</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="Ubahsuai laman Tab Baru Anda"></button></div></div></main></div></div></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>

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

@ -4,13 +4,13 @@ window.gActivityStreamStrings = {
"header_top_sites": "Situs Teratas",
"header_highlights": "Sorotan",
"header_recommended_by": "Disarankan oleh {provider}",
"context_menu_button_sr": "Open context menu for {title}",
"section_context_menu_button_sr": "Open the section context menu",
"context_menu_button_sr": "Buka menu konteks untuk {title}",
"section_context_menu_button_sr": "Buka bagian menu konteks",
"type_label_visited": "Dikunjungi",
"type_label_bookmarked": "Dimarkahi",
"type_label_recommended": "Trending",
"type_label_pocket": "Disimpan di Pocket",
"type_label_downloaded": "Downloaded",
"type_label_downloaded": "Terunduh",
"menu_action_bookmark": "Markah",
"menu_action_remove_bookmark": "Hapus Markah",
"menu_action_open_new_window": "Buka di Jendela Baru",
@ -23,34 +23,34 @@ window.gActivityStreamStrings = {
"confirm_history_delete_notice_p2": "Tindakan ini tidak bisa diurungkan.",
"menu_action_save_to_pocket": "Simpan ke Pocket",
"menu_action_delete_pocket": "Hapus dari Pocket",
"menu_action_archive_pocket": "Archive in 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_archive_pocket": "Arsip di Pocket",
"menu_action_show_file_mac_os": "Tampilkan di Finder",
"menu_action_show_file_windows": "Buka Foldernya",
"menu_action_show_file_linux": "Buka Foldernya",
"menu_action_show_file_default": "Tampilkan Berkas",
"menu_action_open_file": "Buka Berkas",
"menu_action_copy_download_link": "Salin Tautan Unduhan",
"menu_action_go_to_download_page": "Buka Laman Unduhan",
"menu_action_remove_download": "Hapus dari Riwayat",
"search_button": "Cari",
"search_header": "Pencarian {search_engine_name}",
"search_web_placeholder": "Cari di Web",
"section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.",
"section_disclaimer_topstories_linktext": "Learn how it works.",
"section_disclaimer_topstories_buttontext": "Okay, got it",
"prefs_home_header": "Firefox Home Content",
"prefs_home_description": "Choose what content you want on your Firefox Home screen.",
"section_disclaimer_topstories": "Cerita paling menarik di web, dipilih berdasarkan apa yang Anda baca. Dari Pocket, yang kini merupakan bagian dari Mozilla.",
"section_disclaimer_topstories_linktext": "Pelajari cara kerjanya.",
"section_disclaimer_topstories_buttontext": "Oke, paham",
"prefs_home_header": "Konten Beranda Firefox",
"prefs_home_description": "Pilih konten yang anda ingin untuk ditampilkan dalam Beranda Firefox.",
"prefs_section_rows_option": "{num} baris;{num} baris",
"prefs_search_header": "Web Search",
"prefs_topsites_description": "The sites you visit most",
"prefs_topstories_description2": "Great content from around the web, personalized for you",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_sponsored_learn_more": "Learn more",
"prefs_highlights_description": "A selection of sites that youve saved or visited",
"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_snippets_description": "Updates from Mozilla and Firefox",
"prefs_search_header": "Pencarian Web",
"prefs_topsites_description": "Situs yang sering Anda kunjungi",
"prefs_topstories_description2": "Konten bermutu dari seluruh web, khusus untuk Anda",
"prefs_topstories_options_sponsored_label": "Konten Sponsor",
"prefs_topstories_sponsored_learn_more": "Pelajari lebih lanjut",
"prefs_highlights_description": "Sejumlah situs yang Anda simpan atau kunjungi",
"prefs_highlights_options_visited_label": "Laman yang Dikunjungi",
"prefs_highlights_options_download_label": "Unduhan Terbaru",
"prefs_highlights_options_pocket_label": "Laman Disimpan di Pocket",
"prefs_snippets_description": "Pembaruan dari Mozilla dan Firefox",
"settings_pane_button_label": "Ubahsuai laman Tab Baru Anda",
"settings_pane_topsites_header": "Situs Teratas",
"settings_pane_highlights_header": "Sorotan",
@ -60,18 +60,18 @@ window.gActivityStreamStrings = {
"edit_topsites_edit_button": "Sunting situs ini",
"topsites_form_add_header": "Situs Pilihan Baru",
"topsites_form_edit_header": "Ubah Situs Pilihan",
"topsites_form_title_label": "Title",
"topsites_form_title_label": "Judul",
"topsites_form_title_placeholder": "Masukkan judul",
"topsites_form_url_label": "URL",
"topsites_form_image_url_label": "Custom Image URL",
"topsites_form_image_url_label": "URL Gambar Khusus",
"topsites_form_url_placeholder": "Ketik atau tempel URL",
"topsites_form_use_image_link": "Use a custom image…",
"topsites_form_use_image_link": "Gunakan gambar khusus…",
"topsites_form_preview_button": "Pratinjau",
"topsites_form_add_button": "Tambah",
"topsites_form_save_button": "Simpan",
"topsites_form_cancel_button": "Batalkan",
"topsites_form_url_validation": "URL valid diperlukan",
"topsites_form_image_validation": "Image failed to load. Try a different URL.",
"topsites_form_image_validation": "Gambar gagal dimuat. Cobalah URL lain.",
"pocket_read_more": "Topik Populer:",
"pocket_read_even_more": "Lihat Cerita Lainnya",
"highlights_empty_state": "Mulai menjelajah, dan kami akan menampilkan beberapa artikel bagus, video, dan halaman lain yang baru saja Anda kunjungi atau termarkah di sini.",
@ -79,37 +79,26 @@ window.gActivityStreamStrings = {
"manual_migration_explanation2": "Coba Firefox dengan markah, riwayat, dan sandi dari peramban lain.",
"manual_migration_cancel_button": "Tidak, Terima kasih",
"manual_migration_import_button": "Impor Sekarang",
"error_fallback_default_info": "Oops, something went wrong loading this content.",
"error_fallback_default_refresh_suggestion": "Refresh page to try again.",
"section_menu_action_remove_section": "Remove Section",
"section_menu_action_collapse_section": "Collapse Section",
"section_menu_action_expand_section": "Expand Section",
"section_menu_action_manage_section": "Manage Section",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_add_topsite": "Add Top Site",
"section_menu_action_move_up": "Move Up",
"section_menu_action_move_down": "Move Down",
"section_menu_action_privacy_notice": "Privacy Notice",
"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",
"settings_pane_header": "Preferensi Tab Baru",
"settings_pane_body2": "Pilih apa yang Anda lihat di halaman ini.",
"settings_pane_search_header": "Pencarian",
"settings_pane_search_body": "Cari Web dari tab baru Anda.",
"settings_pane_topsites_body": "Mengakses situs web yang paling sering Anda kunjungi.",
"settings_pane_topsites_options_showmore": "Tampilkan dua baris",
"settings_pane_highlights_body2": "Temukan jalan kembali ke hal menarik yang baru saja Anda kunjungi atau dimarkah.",
"settings_pane_highlights_options_visited": "Situs Terkunjungi",
"settings_pane_snippets_body": "Baca info pendek terbaru dari Mozilla tentang Firefox, budaya internet dan beberapa meme acak.",
"settings_pane_done_button": "Selesai",
"pocket_description": "Temukan konten berkualitas tinggi yang mungkin Anda lewatkan dengan bantuan Pocket, yang sekarang menjadi bagian dari Mozilla."
"error_fallback_default_info": "Ups, ada masalah saat memuat konten ini.",
"error_fallback_default_refresh_suggestion": "Segarkan laman untuk mencoba lagi.",
"section_menu_action_remove_section": "Hapus Bagian",
"section_menu_action_collapse_section": "Ciutkan Bagian",
"section_menu_action_expand_section": "Bentangkan Bagian",
"section_menu_action_manage_section": "Kelola Bagian",
"section_menu_action_manage_webext": "Kelola Ekstensi",
"section_menu_action_add_topsite": "Tambah Situs Pilihan",
"section_menu_action_move_up": "Naikkan",
"section_menu_action_move_down": "Turunkan",
"section_menu_action_privacy_notice": "Kebijakan Privasi",
"firstrun_title": "Bawa Firefox bersama Anda",
"firstrun_content": "Dapatkan markah, riwayat, sandi, dan setelan lainnya di semua peranti Anda.",
"firstrun_learn_more_link": "Pelajari selengkapnya tentang Firefox Accounts",
"firstrun_form_header": "Masukkan surel Anda",
"firstrun_form_sub_header": "Lanjutkan ke Firefox Sync.",
"firstrun_email_input_placeholder": "Surel",
"firstrun_extra_legal_links": "Dengan melanjutkan, Anda menyetujui {terms} dan {privacy}.",
"firstrun_terms_of_service": "Ketentuan Layanan",
"firstrun_privacy_notice": "Pernyataan Privasi",
"firstrun_continue_to_login": "Lanjutkan",
"firstrun_skip_login": "Lewati langkah ini"
};

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

@ -85,20 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Fneẓ tigezmi",
"section_menu_action_expand_section": "Snefli tigezmi",
"section_menu_action_manage_section": "Sefrek tigezmi",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Sefrek asiɣzef",
"section_menu_action_add_topsite": "Rnu asmel ifazen",
"section_menu_action_move_up": "Ali",
"section_menu_action_move_down": "Ader",
"section_menu_action_privacy_notice": "Tasertit n tbaḍnit",
"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_title": "Awi Firefox yid-k",
"firstrun_content": "Awi ticraḍ-ik n yisebtar, amazray-ik, awalen-ik uffiren d yiɣewwaṛen-nniḍen ɣef ibenkan-ik meṛṛa.",
"firstrun_learn_more_link": "Issin ugar ɣef Firefox Accounts",
"firstrun_form_header": "Sekcem imayl inek",
"firstrun_form_sub_header": "akken ad tkemleḍ akked Firefox Sync",
"firstrun_email_input_placeholder": "Imayl",
"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"
"firstrun_terms_of_service": "Tiwtilin n useqdec",
"firstrun_privacy_notice": "Tasertit n tbaḍnit",
"firstrun_continue_to_login": "Kemmel",
"firstrun_skip_login": "Zgel amecwaṛ-agi"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "섹션 닫기",
"section_menu_action_expand_section": "섹션 열기",
"section_menu_action_manage_section": "섹션 관리",
"section_menu_action_manage_webext": "Manage Extension",
"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": "개인 정보 보호 정책",
"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": "기본값으로 복원",
"settings_pane_header": "새 탭 설정",
"settings_pane_body2": "이 페이지에서 볼 것을 선택하세요.",
"settings_pane_search_header": "검색",
"settings_pane_search_body": "새 탭에서 웹을 검색하세요.",
"settings_pane_topsites_body": "가장 많이 방문한 웹 사이트에 접근하세요.",
"settings_pane_topsites_options_showmore": "두 줄로 보기",
"settings_pane_highlights_body2": "최근에 방문했거나 북마크한 흥미로운 것들로 돌아갈 수 있는 방법입니다.",
"settings_pane_highlights_options_visited": "방문한 사이트",
"settings_pane_snippets_body": "Mozilla, Firefox, 인터넷 문화나 가끔 무작위 밈에 대해서 읽어보세요.",
"settings_pane_done_button": "완료",
"settings_pane_topstories_options_sponsored": "후원된 스토리",
"pocket_description": "Mozilla와 하나가 된 Pocket의 도움으로 놓칠지도 모르는 고품질의 컨텐츠를 접해보세요."
"firstrun_title": "Firefox와 함께 하세요",
"firstrun_content": "즐겨찾기와 방문기록, 비밀번호, 다른 설정을 모든 기기에서 사용해 보세요.",
"firstrun_learn_more_link": "Firefox 계정 자세히 알아보기",
"firstrun_form_header": "이메일을 입력",
"firstrun_form_sub_header": "해서 Firefox Sync 사용",
"firstrun_email_input_placeholder": "이메일",
"firstrun_extra_legal_links": "진행하면 {terms}과 {privacy}에 동의하게 됩니다.",
"firstrun_terms_of_service": "이용 약관",
"firstrun_privacy_notice": "개인 정보 보호 정책",
"firstrun_continue_to_login": "계속",
"firstrun_skip_login": "단계 건너뛰기"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Conprimmi seçion",
"section_menu_action_expand_section": "Espandi seçion",
"section_menu_action_manage_section": "Gestisci seçion",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Gestisci estenscioin",
"section_menu_action_add_topsite": "Azonzi scito prinçipâ",
"section_menu_action_move_up": "Mescia in sciù",
"section_menu_action_move_down": "Mescia in zu",
"section_menu_action_privacy_notice": "Informativa in sciâ privacy",
"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_title": "Pòrta Firefox con ti",
"firstrun_content": "Repiggia i teu segnalibbri, stöia, poule segrete e atre inpostaçioin in sce tutti i teu dispoxitivi.",
"firstrun_learn_more_link": "Saccine de ciù in sce l'account Firefox",
"firstrun_form_header": "Scrivi a teu email",
"firstrun_form_sub_header": "pe continoâ con 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": "Repiggia predefinii",
"settings_pane_header": "Preferense neuvo feuggio",
"settings_pane_body2": "Çerni cöse ti veu vedde in sta pagina.",
"settings_pane_search_header": "Çerca",
"settings_pane_search_body": "Çerca inta Ræ da-o teu neuvo feuggio.",
"settings_pane_topsites_body": "Acedi a-i sciti che ti vixiti ciù de spesso.",
"settings_pane_topsites_options_showmore": "Fanni vedde doe righe",
"settings_pane_highlights_body2": "Treuva torna e pagine interesanti che t'aivi vixitou ò azonto a-i segnalibbri.",
"settings_pane_highlights_options_visited": "Sciti vixitæ",
"settings_pane_snippets_body": "Notiçie brevi da Mozille in sciô Firefox, Internet, sensa ascordâ di meme quache vòtta.",
"settings_pane_done_button": "Fæto",
"settings_pane_topstories_options_sponsored": "Fanni vedde articoli sponsorizæ",
"pocket_description": "Graçie a Pocket, un conponente da famiggia Mozilla, descòvri contegnui de erta qualitæ che atrimenti te porieivan scapâ."
"firstrun_extra_legal_links": "Se ti væ avanti t'ê d'acòrdio co-i {terms} e l'{privacy}.",
"firstrun_terms_of_service": "Termini do serviçio",
"firstrun_privacy_notice": "Informativa in sciâ privacy",
"firstrun_continue_to_login": "Continoa",
"firstrun_skip_login": "Sata sto passo"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Suskleisti skiltį",
"section_menu_action_expand_section": "Išplėsti skiltį",
"section_menu_action_manage_section": "Tvarkyti skiltį",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Tvarkyti priedą",
"section_menu_action_add_topsite": "Pridėti lankomą svetainę",
"section_menu_action_move_up": "Pakelti",
"section_menu_action_move_down": "Nuleisti",
"section_menu_action_privacy_notice": "Privatumo nuostatai",
"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": "Grąžinti numatytąsias nuostatas",
"settings_pane_header": "Naujos kortelės nuostatos",
"settings_pane_body2": "Pasirinkite, ką matysite šiame tinklalapyje.",
"settings_pane_search_header": "Paieška",
"settings_pane_search_body": "Ieškokite saityne tiesiai iš naujos kortelės.",
"settings_pane_topsites_body": "Pasiekite jūsų dažniausiai lankomas svetaines.",
"settings_pane_topsites_options_showmore": "Rodyti dvi eilutes",
"settings_pane_highlights_body2": "Sugrįžkite prie įdomių dalykų, kuriuose neseniai lankėtės ar įtraukėte į adresyną.",
"settings_pane_highlights_options_visited": "Aplankytos svetainės",
"settings_pane_snippets_body": "Skaitykite trumpas ir mielas naujienas iš „Mozillos“ apie „Firefox“, interneto kultūrą bei atsitiktinį memą.",
"settings_pane_done_button": "Atlikta",
"settings_pane_topstories_options_sponsored": "Rodyti rėmėjų straipsnius",
"pocket_description": "Atraskite kokybišką turinį, kurio kitaip galbūt nerastumėte, su „Pocket“, kuri yra tapusi „Mozillos“ dalimi, pagalba."
"firstrun_title": "Pasiimkite „Firefox“ su savimi",
"firstrun_content": "Turėkite savo adresyną, žurnalą, slaptažodžius ir kitas nuostatas visuose savo įrenginiuose.",
"firstrun_learn_more_link": "Sužinokite daugiau apie „Firefox“ paskyras",
"firstrun_form_header": "Įveskite savo el. paštą",
"firstrun_form_sub_header": "norėdami tęsti su „Firefox Sync“.",
"firstrun_email_input_placeholder": "El. paštas",
"firstrun_extra_legal_links": "Tęsdami sutinkate su {terms} ir {privacy}.",
"firstrun_terms_of_service": "paslaugos teikimo nuostatais",
"firstrun_privacy_notice": "privatumo nuostatais",
"firstrun_continue_to_login": "Tęsti",
"firstrun_skip_login": "Praleisti šį žingsnį"
};

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

@ -8,9 +8,9 @@ window.gActivityStreamStrings = {
"section_context_menu_button_sr": "Buka bahagian menu konteks",
"type_label_visited": "Dilawati",
"type_label_bookmarked": "Ditandabuku",
"type_label_recommended": "Trending",
"type_label_recommended": "Sohor kini",
"type_label_pocket": "Disimpan ke Pocket",
"type_label_downloaded": "Dimuat turun",
"type_label_downloaded": "Telah dimuat turun",
"menu_action_bookmark": "Tandabuku",
"menu_action_remove_bookmark": "Buang Tandabuku",
"menu_action_open_new_window": "Buka dalam Tetingkap Baru",

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

@ -91,7 +91,7 @@ window.gActivityStreamStrings = {
"section_menu_action_move_down": "Flytt ned",
"section_menu_action_privacy_notice": "Personvernmerknad",
"firstrun_title": "Ta med deg Firefox",
"firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
"firstrun_content": "Få bokmerke, historikk, passord, og andre innstillingar på alle einingane dine.",
"firstrun_learn_more_link": "Les meir om Firefox-kontoen",
"firstrun_form_header": "Skriv inn e-postadressa di",
"firstrun_form_sub_header": "for å fortsetje til Firefox Sync.",

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

@ -0,0 +1,39 @@
<!doctype html>
<html lang="oc" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
<title>Onglet novèl</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>Recèrca sul web</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Recèrca sul web" title="Recèrca sul web"/><button id="searchSubmit" class="search-button" title="Recercar"><span class="sr-only"><span>Recercar</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>Sites favorits</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="Edit this site"></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="Edit this site"></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="Edit this site"></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="Edit this site"></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="Edit this site"></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="Edit this site"></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="Edit this site"></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="Edit this site"></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>Recommended by 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>Popular Topics:</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>Highlights</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="Customize your New Tab page"></button></div></div></main></div></div></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 [
"resource://activity-stream/prerendered/static/activity-stream-initial-state.js",
"chrome://browser/content/contentSearchUI.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/oc/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// 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>
</body>
</html>

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

@ -0,0 +1,104 @@
// Note - this is a generated oc file.
window.gActivityStreamStrings = {
"newtab_page_title": "Onglet novèl",
"header_top_sites": "Sites favorits",
"header_highlights": "Highlights",
"header_recommended_by": "Recommended by {provider}",
"context_menu_button_sr": "Open context menu for {title}",
"section_context_menu_button_sr": "Open the section context menu",
"type_label_visited": "Visitat",
"type_label_bookmarked": "Apondut als marcapaginas",
"type_label_recommended": "Tendéncia",
"type_label_pocket": "Pagina enregistrada dins Pocket",
"type_label_downloaded": "Telecargat",
"menu_action_bookmark": "Marcar aquesta pagina",
"menu_action_remove_bookmark": "Suprimir lo marcapagina",
"menu_action_open_new_window": "Dobrir lo ligam dins una fenèstra novèla",
"menu_action_open_private_window": "Dobrir lo ligam dins una fenèstra de navegacion privada",
"menu_action_dismiss": "Dismiss",
"menu_action_delete": "Delete from History",
"menu_action_pin": "Pin",
"menu_action_unpin": "Unpin",
"confirm_history_delete_p1": "Are you sure you want to delete every instance of this page from your history?",
"confirm_history_delete_notice_p2": "This action cannot be undone.",
"menu_action_save_to_pocket": "Save to Pocket",
"menu_action_delete_pocket": "Delete from Pocket",
"menu_action_archive_pocket": "Archive in 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": "Mostrar lo fichièr",
"menu_action_open_file": "Dobrir lo fichièr",
"menu_action_copy_download_link": "Copy Download Link",
"menu_action_go_to_download_page": "Go to Download Page",
"menu_action_remove_download": "Tirar de listoric",
"search_button": "Recercar",
"search_header": "{search_engine_name} Search",
"search_web_placeholder": "Recèrca sul web",
"section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.",
"section_disclaimer_topstories_linktext": "Vejatz cossí fonciona.",
"section_disclaimer_topstories_buttontext": "Comprés",
"prefs_home_header": "Firefox Home Content",
"prefs_home_description": "Choose what content you want on your Firefox Home screen.",
"prefs_section_rows_option": "{num} row;{num} rows",
"prefs_search_header": "Web Search",
"prefs_topsites_description": "The sites you visit most",
"prefs_topstories_description2": "Great content from around the web, personalized for you",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_sponsored_learn_more": "Learn more",
"prefs_highlights_description": "A selection of sites that youve saved or visited",
"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_snippets_description": "Updates from Mozilla and Firefox",
"settings_pane_button_label": "Customize your New Tab page",
"settings_pane_topsites_header": "Top Sites",
"settings_pane_highlights_header": "Highlights",
"settings_pane_highlights_options_bookmarks": "Bookmarks",
"settings_pane_snippets_header": "Snippets",
"edit_topsites_button_text": "Edit",
"edit_topsites_edit_button": "Edit this site",
"topsites_form_add_header": "New Top Site",
"topsites_form_edit_header": "Edit Top Site",
"topsites_form_title_label": "Title",
"topsites_form_title_placeholder": "Enter a title",
"topsites_form_url_label": "URL",
"topsites_form_image_url_label": "Custom Image URL",
"topsites_form_url_placeholder": "Type or paste a URL",
"topsites_form_use_image_link": "Use a custom image…",
"topsites_form_preview_button": "Preview",
"topsites_form_add_button": "Add",
"topsites_form_save_button": "Save",
"topsites_form_cancel_button": "Cancel",
"topsites_form_url_validation": "Valid URL required",
"topsites_form_image_validation": "Image failed to load. Try a different URL.",
"pocket_read_more": "Popular Topics:",
"pocket_read_even_more": "View More Stories",
"highlights_empty_state": "Start browsing, and well show some of the great articles, videos, and other pages youve recently visited or bookmarked here.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.",
"manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.",
"manual_migration_cancel_button": "No Thanks",
"manual_migration_import_button": "Import Now",
"error_fallback_default_info": "Oops, something went wrong loading this content.",
"error_fallback_default_refresh_suggestion": "Refresh page to try again.",
"section_menu_action_remove_section": "Remove Section",
"section_menu_action_collapse_section": "Collapse Section",
"section_menu_action_expand_section": "Expand Section",
"section_menu_action_manage_section": "Manage Section",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_add_topsite": "Add Top Site",
"section_menu_action_move_up": "Move Up",
"section_menu_action_move_down": "Move Down",
"section_menu_action_privacy_notice": "Privacy Notice",
"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"
};

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

@ -0,0 +1,38 @@
<!doctype html>
<html lang="oc" dir="ltr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Security-Policy-Report-Only" content="script-src 'unsafe-inline'; img-src http: https: data: blob:; style-src 'unsafe-inline'; child-src 'none'; object-src 'none'; report-uri https://tiles.services.mozilla.com/v4/links/activity-stream/csp">
<title>Onglet novèl</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>
<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 [
"chrome://browser/content/contentSearchUI.js",
"resource://activity-stream/vendor/react.js",
"resource://activity-stream/vendor/react-dom.js",
"resource://activity-stream/vendor/prop-types.js",
"resource://activity-stream/vendor/react-intl.js",
"resource://activity-stream/vendor/redux.js",
"resource://activity-stream/vendor/react-redux.js",
"resource://activity-stream/prerendered/oc/activity-stream-strings.js",
"resource://activity-stream/data/content/activity-stream.bundle.js"
]) {
// 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>
</body>
</html>

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

@ -9,7 +9,7 @@
<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>Szukaj</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Szukaj" title="Szukaj"/><button id="searchSubmit" class="search-button" title="Szukaj"><span class="sr-only"><span>Szukaj</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>Popularne</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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>Poleca: Pocket</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="topic"><span><span>Popularne tematy:</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>Wyróżnione</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</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="Dostosuj stronę nowej karty"></button></div></div></main></div></div></div>
<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>Szukaj w Internecie</span></span></label><input type="search" id="newtab-search-text" maxLength="256" placeholder="Szukaj w Internecie" title="Szukaj w Internecie"/><button id="searchSubmit" class="search-button" title="Szukaj"><span class="sr-only"><span>Szukaj</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>Popularne</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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="Edytuj stronę"></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>Polecane przez Pocket</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</span></span></button></div></div><div class="section-body"><ul class="section-list" style="padding:0"></ul><div class="topic"><span><span>Popularne treści:</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>Wyróżnione</span></span></h3><div><button class="context-menu-button icon"><span class="sr-only"><span>Otwórz menu kontekstowe sekcji</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="Dostosuj stronę nowej karty"></button></div></div></main></div></div></div>
<div id="snippets-container">
<div id="snippets"></div>
</div>

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

@ -3,115 +3,115 @@ window.gActivityStreamStrings = {
"newtab_page_title": "Nowa karta",
"header_top_sites": "Popularne",
"header_highlights": "Wyróżnione",
"header_recommended_by": "Poleca: {provider}",
"context_menu_button_sr": "Otwórz menu kontekstowe dla „{title}”",
"header_recommended_by": "Polecane przez {provider}",
"context_menu_button_sr": "Otwórz menu kontekstowe „{title}”",
"section_context_menu_button_sr": "Otwórz menu kontekstowe sekcji",
"type_label_visited": "Odwiedzone",
"type_label_bookmarked": "Zakładka",
"type_label_visited": "Z odwiedzonych",
"type_label_bookmarked": "Z zakładek",
"type_label_recommended": "Na czasie",
"type_label_pocket": "Zachowane w Pocket",
"type_label_downloaded": "Pobrane",
"type_label_pocket": "Z Pocket",
"type_label_downloaded": "Z pobranych",
"menu_action_bookmark": "Dodaj zakładkę",
"menu_action_remove_bookmark": "Usuń zakładkę",
"menu_action_open_new_window": "Otwórz w nowym oknie",
"menu_action_open_private_window": "Otwórz w nowym oknie prywatnym",
"menu_action_dismiss": "Odrzuć",
"menu_action_dismiss": "Usuń z tej sekcji",
"menu_action_delete": "Usuń z historii",
"menu_action_pin": "Przypnij",
"menu_action_unpin": "Odepnij",
"confirm_history_delete_p1": "Czy na pewno usunąć każde wystąpienie tej strony z historii?",
"confirm_history_delete_notice_p2": "Nie można tego cofnąć.",
"confirm_history_delete_p1": "Czy na pewno usunąć wszystkie wizyty na tej stronie z historii?",
"confirm_history_delete_notice_p2": "Tej czynności nie można cofnąć.",
"menu_action_save_to_pocket": "Zachowaj w Pocket",
"menu_action_delete_pocket": "Usuń z Pocket",
"menu_action_archive_pocket": "Archiwizuj w Pocket",
"menu_action_show_file_mac_os": "Wyświetl w Finderze",
"menu_action_show_file_mac_os": "Pokaż w Finderze",
"menu_action_show_file_windows": "Otwórz folder nadrzędny",
"menu_action_show_file_linux": "Otwórz folder nadrzędny",
"menu_action_show_file_default": "Wyświetl plik",
"menu_action_open_file": "Otwórz plik",
"menu_action_copy_download_link": "Kopiuj adres pobierania",
"menu_action_copy_download_link": "Kopiuj adres, z którego pobrano plik",
"menu_action_go_to_download_page": "Przejdź do strony pobierania",
"menu_action_remove_download": "Usuń z historii",
"search_button": "Szukaj",
"search_header": "Wyszukiwanie w {search_engine_name}",
"search_web_placeholder": "Szukaj",
"section_disclaimer_topstories": "Najciekawsze artykuły w Internecie, wybierane na podstawie już przeczytanych. Od serwisu Pocket, będącego teraz częścią Mozilli.",
"section_disclaimer_topstories_linktext": "Zobacz, jak to działa.",
"section_disclaimer_topstories_buttontext": "OK!",
"prefs_home_header": "Strona startowa Firefoksa",
"prefs_home_description": "Wybierz, co wyświetlać na stronie startowej Firefoksa.",
"prefs_section_rows_option": "{num} rząd;{num} rzędy;{num} rzędów",
"prefs_search_header": "Wyszukiwanie",
"prefs_topsites_description": "Najczęściej odwiedzane strony",
"prefs_topstories_description2": "Świetne rzeczy z całego Internetu, wybrane specjalnie dla Ciebie",
"prefs_topstories_options_sponsored_label": "Sponsorowane artykuły",
"search_header": "Wyszukiwanie z „{search_engine_name}”",
"search_web_placeholder": "Szukaj w Internecie",
"section_disclaimer_topstories": "Najciekawsze artykuły w Internecie, wybierane na podstawie tego co czytasz. Od serwisu Pocket, będącego teraz częścią Mozilli.",
"section_disclaimer_topstories_linktext": "Zobacz, jak to działa",
"section_disclaimer_topstories_buttontext": "OK",
"prefs_home_header": "Strona startowa",
"prefs_home_description": "Wybierz, jakie treści mają być wyświetlane na stronie startowej.",
"prefs_section_rows_option": "{num} wiersz;{num} wiersze;{num} wierszy",
"prefs_search_header": "Pasek wyszukiwania",
"prefs_topsites_description": "Popularne odwiedzane strony",
"prefs_topstories_description2": "Świetne rzeczy z całego Internetu, personalizowane specjalnie dla Ciebie",
"prefs_topstories_options_sponsored_label": "Sponsorowane treści",
"prefs_topstories_sponsored_learn_more": "Więcej informacji",
"prefs_highlights_description": "Wybór zachowanych i odwiedzonych stron",
"prefs_highlights_options_visited_label": "Odwiedzone strony",
"prefs_highlights_options_download_label": "Ostatnio pobrane",
"prefs_highlights_options_pocket_label": "Strony zachowane w Pocket",
"prefs_snippets_description": "Informacje od Mozilli i Firefoksa",
"prefs_highlights_description": "Wybierane z zachowanych i odwiedzonych stron.",
"prefs_highlights_options_visited_label": "Historia",
"prefs_highlights_options_download_label": "Ostatnio pobrane pliki",
"prefs_highlights_options_pocket_label": "Zachowane w Pocket",
"prefs_snippets_description": "Informacje od Mozilli i Firefoksa.",
"settings_pane_button_label": "Dostosuj stronę nowej karty",
"settings_pane_topsites_header": "Popularne",
"settings_pane_highlights_header": "Wyróżnione",
"settings_pane_highlights_header": "Wyróżniane",
"settings_pane_highlights_options_bookmarks": "Zakładki",
"settings_pane_snippets_header": "Notki",
"settings_pane_snippets_header": "Od Mozilli",
"edit_topsites_button_text": "Edytuj",
"edit_topsites_edit_button": "Edytuj stronę",
"topsites_form_add_header": "Nowa popularna strona",
"topsites_form_edit_header": "Edytuj popularną stronę",
"edit_topsites_edit_button": "Edytuj stronę",
"topsites_form_add_header": "Dodawanie strony do sekcji Popularne",
"topsites_form_edit_header": "Edycja strony z sekcji Popularne",
"topsites_form_title_label": "Tytuł",
"topsites_form_title_placeholder": "Wpisz tytuł",
"topsites_form_url_label": "Adres",
"topsites_form_image_url_label": "Adres niestandardowego obrazu",
"topsites_form_url_placeholder": "Wpisz lub wklej adres",
"topsites_form_use_image_link": "Użyj niestandardowego obrazu…",
"topsites_form_title_placeholder": "Tytuł strony",
"topsites_form_url_label": "Adres URL",
"topsites_form_image_url_label": "Własny obraz",
"topsites_form_url_placeholder": "Adres strony",
"topsites_form_use_image_link": "Użyj własnego obrazu…",
"topsites_form_preview_button": "Podgląd",
"topsites_form_add_button": "Dodaj",
"topsites_form_save_button": "Zapisz",
"topsites_form_save_button": "Zachowaj",
"topsites_form_cancel_button": "Anuluj",
"topsites_form_url_validation": "Wymagany jest prawidłowy adres",
"topsites_form_image_validation": "Wczytanie obrazu się nie powiodło. Spróbuj innego adresu.",
"pocket_read_more": "Popularne tematy:",
"pocket_read_even_more": "Więcej artykułów",
"highlights_empty_state": "Zacznij przeglądać Internet, a pojawią się tutaj niedawno dodane zakładki i odwiedzone artykuły, filmy i inne strony.",
"topstories_empty_state": "To na razie wszystko. {provider} później będzie mieć więcej popularnych artykułów. Nie możesz się doczekać? Wybierz popularny temat, aby znaleźć więcej artykułów z całego Internetu.",
"manual_migration_explanation2": "Używaj Firefoksa z zakładkami, historią i hasłami z innej przeglądarki.",
"manual_migration_cancel_button": "Nie, dziękuję",
"manual_migration_import_button": "Importuj teraz",
"error_fallback_default_info": "Coś się nie powiodło podczas wczytywania tej treści.",
"error_fallback_default_refresh_suggestion": "Odśwież stronę, aby spróbować ponownie.",
"topsites_form_url_validation": "Wymagany jest prawidłowy adres URL",
"topsites_form_image_validation": "Wczytanie obrazu nie powiodło się. Spróbuj innego adresu.",
"pocket_read_more": "Popularne treści:",
"pocket_read_even_more": "Pokaż więcej artykułów",
"highlights_empty_state": "Zacznij przeglądać Internet, a pojawią się tutaj świetne artykuły, filmy oraz inne ostatnio odwiedzane strony i dodane zakładki.",
"topstories_empty_state": "To na razie wszystko. {provider} później będzie mieć więcej popularnych artykułów. Nie możesz się doczekać? Wybierz popularny temat, aby znaleźć więcej treści z całego Internetu.",
"manual_migration_explanation2": "Wypróbuj program Firefox z zakładkami, historią i hasłami z innej przeglądarki.",
"manual_migration_cancel_button": "Anuluj",
"manual_migration_import_button": "Importuj",
"error_fallback_default_info": "Coś się nie powiodło podczas wczytywania tej treści",
"error_fallback_default_refresh_suggestion": "Odśwież stronę, by spróbować ponownie",
"section_menu_action_remove_section": "Usuń sekcję",
"section_menu_action_collapse_section": "Zwiń sekcję",
"section_menu_action_expand_section": "Rozwiń sekcję",
"section_menu_action_manage_section": "Zarządzaj sekcją",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_add_topsite": "Dodaj popularną stronę",
"section_menu_action_move_up": "Przenieś w górę",
"section_menu_action_move_down": "Przenieś w dół",
"section_menu_action_privacy_notice": "Prywatność",
"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",
"section_menu_action_manage_webext": "Zarządzaj rozszerzeniem",
"section_menu_action_add_topsite": "Dodaj stronę do popularnych",
"section_menu_action_move_up": "Przesuń w górę",
"section_menu_action_move_down": "Przesuń w dół",
"section_menu_action_privacy_notice": "Uwagi dotyczące prywatności",
"firstrun_title": "Zabierz swoje dane ze sobą",
"firstrun_content": "Zakładki, historia, hasła i inne ustawienia mogą być dostępne i synchronizowane na wszystkich urządzeniach.",
"firstrun_learn_more_link": "Więcej informacji",
"firstrun_form_header": "Wprowadź adres e-mail",
"firstrun_form_sub_header": ", aby skorzystać z Firefox Sync.",
"firstrun_email_input_placeholder": "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",
"firstrun_continue_to_login": "Kontynuuj",
"firstrun_skip_login": "Pomiń",
"prefs_restore_defaults_button": "Przywróć domyślne",
"settings_pane_header": "Preferencje nowej karty",
"settings_pane_body2": "Wybierz, co wyświetlać na tej stronie.",
"settings_pane_search_header": "Wyszukiwanie",
"settings_pane_search_body": "Szukaj w Internecie na nowej karcie.",
"settings_pane_topsites_body": "Otwieraj najczęściej odwiedzane strony.",
"settings_pane_topsites_options_showmore": "Dwa rzędy",
"settings_pane_highlights_body2": "Szybko wracaj do niedawno odwiedzonych stron i dodanych zakładek.",
"settings_pane_highlights_options_visited": "Odwiedzone",
"settings_pane_snippets_body": "Krótkie informacje od Mozilli o Firefoksie i kulturze internetowej, a od czasu do czasu także jakiś żart.",
"settings_pane_header": "Ustawienia nowej karty",
"settings_pane_body2": "Wybierz, co wyświetlać na tej stronie",
"settings_pane_search_header": "Wyszukiwanie w Internecie",
"settings_pane_search_body": "Pasek wyszukiwania na stronie nowej karty.",
"settings_pane_topsites_body": "Dostęp do najczęściej odwiedzanych stron.",
"settings_pane_topsites_options_showmore": "Dwa wiersze",
"settings_pane_highlights_body2": "Szybki dostęp do niedawno odwiedzonych stron i dodanych zakładek.",
"settings_pane_highlights_options_visited": "Odwiedzone strony",
"settings_pane_snippets_body": "Krótkie i słodkie informacje od Mozilli o Firefoksie i kulturze internetowej, a od czasu do czasu także jakiś żart.",
"settings_pane_done_button": "Gotowe",
"settings_pane_topstories_options_sponsored": "Sponsorowane artykuły",
"pocket_description": "Odkrywaj wysokiej jakości treści dzięki serwisowi Pocket, będącego teraz częścią Mozilli."
"settings_pane_topstories_options_sponsored": "Sponsorowane treści",
"pocket_description": "Odkrywaj wysokiej jakości treści dzięki serwisowi Pocket, który jest teraz częścią Mozilli."
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Свернуть раздел",
"section_menu_action_expand_section": "Развернуть раздел",
"section_menu_action_manage_section": "Управление разделом",
"section_menu_action_manage_webext": "Manage Extension",
"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": "Уведомление о приватности",
"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": "Восстановить по умолчанию",
"settings_pane_header": "Настройки новой вкладки",
"settings_pane_body2": "Выберите, что вы увидите на этой странице.",
"settings_pane_search_header": "Поиск",
"settings_pane_search_body": "Поиск в Интернете с вашей новой вкладки.",
"settings_pane_topsites_body": "Получите доступ к сайтам, которые вы посещаете чаще всего.",
"settings_pane_topsites_options_showmore": "Показать в два ряда",
"settings_pane_highlights_body2": "Найдите способ вернуться к интересным страницам, которые вы недавно посетили или добавили в закладки.",
"settings_pane_highlights_options_visited": "Посещённые сайты",
"settings_pane_snippets_body": "Читайте короткие и радостные новости от Mozilla о Firefox, интернет-культуру и случайные мемы.",
"settings_pane_done_button": "Готово",
"settings_pane_topstories_options_sponsored": "Показывать статьи спонсоров",
"pocket_description": "Откройте для себя высококачественный контент, который вы могли бы пропустить, с помощью Pocket, теперь ставшего частью Mozilla."
"firstrun_title": "Возьмите Firefox с собой",
"firstrun_content": "Получите доступ к вашим закладкам, истории, паролям и другим параметрам на всех ваших устройствах.",
"firstrun_learn_more_link": "Узнайте больше об Аккаунтах Firefox",
"firstrun_form_header": "Введите ваш адрес электронной почты",
"firstrun_form_sub_header": "чтобы продолжить использовать синхронизацию Firefox.",
"firstrun_email_input_placeholder": "Эл. почта",
"firstrun_extra_legal_links": "Продолжая, вы соглашаетесь с {terms} и {privacy}.",
"firstrun_terms_of_service": "условиями службы",
"firstrun_privacy_notice": "политикой приватности",
"firstrun_continue_to_login": "Продолжить",
"firstrun_skip_login": "Пропустить этот шаг"
};

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Zbaliť sekciu",
"section_menu_action_expand_section": "Rozbaliť sekciu",
"section_menu_action_manage_section": "Spravovať sekciu",
"section_menu_action_manage_webext": "Manage Extension",
"section_menu_action_manage_webext": "Správa rozšírenia",
"section_menu_action_add_topsite": "Pridať top stránku",
"section_menu_action_move_up": "Posunúť vyššie",
"section_menu_action_move_down": "Posunúť nižšie",
"section_menu_action_privacy_notice": "Zásady ochrany súkromia",
"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": "Obnoviť predvolené",
"settings_pane_header": "Nastavenia Novej karty",
"settings_pane_body2": "Vyberte si, čo chcete na tejto stránke vidieť.",
"settings_pane_search_header": "Vyhľadávanie",
"settings_pane_search_body": "Vyhľadávanie zo stránky novej karty.",
"settings_pane_topsites_body": "Prístup k webovým stránkam, ktoré navštevujete najčastejšie.",
"settings_pane_topsites_options_showmore": "Zobraziť dva riadky",
"settings_pane_highlights_body2": "Pozrite sa na zaujímavé stránky, ktoré ste nedávno navštívili alebo pridali do záložiek.",
"settings_pane_highlights_options_visited": "Navštívené stránky",
"settings_pane_snippets_body": "Prečítajte si krátke správy od Mozilly o Firefoxe či internetovej kultúre. Občas uvidíte aj náhodné meme.",
"settings_pane_done_button": "Hotovo",
"settings_pane_topstories_options_sponsored": "Zobraziť sponzorované stránky",
"pocket_description": "Objavte vysokokvalitný obsah, ktorý by ste inak prepásli. Pomôže vám s tým Pocket, súčasť Mozilly."
"firstrun_title": "Vezmite si Firefox so sebou",
"firstrun_content": "Majte svoje záložky, históriu, heslá a ostatné nastavenia na všetkých vašich zariadeniach.",
"firstrun_learn_more_link": "Ďalšie informácie o účtoch Firefox",
"firstrun_form_header": "Zadajte e-mailovú adresu",
"firstrun_form_sub_header": "a používajte službu Firefox Sync.",
"firstrun_email_input_placeholder": "E-mail",
"firstrun_extra_legal_links": "Pokračovaním súhlasíte s {terms} a {privacy}.",
"firstrun_terms_of_service": "podmienkami používania služby",
"firstrun_privacy_notice": "zásadami ochrany súkromia",
"firstrun_continue_to_login": "Pokračovať",
"firstrun_skip_login": "Preskočiť tento krok"
};

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

@ -90,13 +90,13 @@ window.gActivityStreamStrings = {
"section_menu_action_move_up": "Flytta upp",
"section_menu_action_move_down": "Flytta ner",
"section_menu_action_privacy_notice": "Sekretesspolicy",
"firstrun_title": "Take Firefox with You",
"firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
"firstrun_title": "Ta med dig Firefox",
"firstrun_content": "Få dina bokmärken, historik, lösenord och andra inställningar på alla dina enheter.",
"firstrun_learn_more_link": "Lär dig mer om Firefox-konton",
"firstrun_form_header": "Ange din e-postadress",
"firstrun_form_sub_header": "to continue to Firefox Sync.",
"firstrun_form_sub_header": "för att fortsätta till Firefox Sync.",
"firstrun_email_input_placeholder": "E-post",
"firstrun_extra_legal_links": "By proceeding, you agree to the {terms} and {privacy}.",
"firstrun_extra_legal_links": "Genom att fortsätta godkänner du {terms} och {privacy}.",
"firstrun_terms_of_service": "Användarvillkor",
"firstrun_privacy_notice": "Sekretesspolicy",
"firstrun_continue_to_login": "Fortsätt",

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

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

@ -4,13 +4,13 @@ window.gActivityStreamStrings = {
"header_top_sites": "சிறந்த தளங்கள்",
"header_highlights": "மிளிர்ப்புகள்",
"header_recommended_by": "{provider} என்பவரால் பரிந்துரைக்கப்பட்டது",
"context_menu_button_sr": "Open context menu for {title}",
"section_context_menu_button_sr": "Open the section context menu",
"context_menu_button_sr": "{title} என்பதற்கான உள்ளடக்க பட்டியலைத் திற",
"section_context_menu_button_sr": "பிரிவு உள்ளடக்க பட்டியலைத் திற",
"type_label_visited": "பார்த்தவை",
"type_label_bookmarked": "புத்தகக்குறியிடப்பட்டது",
"type_label_recommended": "பிரபலமான",
"type_label_pocket": "Saved to Pocket",
"type_label_downloaded": "Downloaded",
"type_label_pocket": "பாக்கெட்டில் சேமிக்கப்பட்டது",
"type_label_downloaded": "பதிவிறக்கப்பட்டது",
"menu_action_bookmark": "புத்தகக்குறி",
"menu_action_remove_bookmark": "புத்தகக்குறியை நீக்கு",
"menu_action_open_new_window": "ஒரு புதிய சாளரத்தில் திற",
@ -35,15 +35,15 @@ window.gActivityStreamStrings = {
"search_button": "தேடு",
"search_header": "{search_engine_name} தேடுபொறியில் தேடு",
"search_web_placeholder": "இணையத்தில் தேடு",
"section_disclaimer_topstories": "The most interesting stories on the web, selected based on what you read. From Pocket, now part of Mozilla.",
"section_disclaimer_topstories": "இணையத்தின் சுவாரசியமான கதைகள், நீங்கள் படிப்பவற்றின் அடிப்படையில் தேர்ந்தெடுக்கப்பட்டுள்ளன. பாக்கெட், இப்போது மொசில்லாவின் ஒரு பகுதியாகும்.",
"section_disclaimer_topstories_linktext": "இது எப்படி வேலை செய்கிறது என்று தெரிந்துகொள்ளவும்.",
"section_disclaimer_topstories_buttontext": "சரி, புரிந்தது",
"prefs_home_header": "Firefox முகப்பு உள்ளடக்கம்",
"prefs_home_description": "Choose what content you want on your Firefox Home screen.",
"prefs_section_rows_option": "{num} row;{num} rows",
"prefs_home_description": "உங்கள் பயர்பாக்ஸ் முகப்புத் திரையில் என்ன உள்ளடக்கம் வேண்டுமென்று தேர்ந்தெடு.",
"prefs_section_rows_option": "{num} வரிசை;{num} வரிசைகள்",
"prefs_search_header": "வலைதள தேடல்",
"prefs_topsites_description": "நீங்கள் மிகவும் பார்வையிடும் தளங்கள்",
"prefs_topstories_description2": "Great content from around the web, personalized for you",
"prefs_topstories_description2": "இணையத்திலிருந்து சிறந்த உள்ளடக்கங்கள், உங்களுக்காக தனிப்பயனாக்கப்பட்டவை",
"prefs_topstories_options_sponsored_label": "Sponsored Stories",
"prefs_topstories_sponsored_learn_more": "மேலும் அறிய",
"prefs_highlights_description": "நீங்கள் சேமித்த அல்லது பார்வையிட்ட தளங்களின் தேர்வு",
@ -63,7 +63,7 @@ window.gActivityStreamStrings = {
"topsites_form_title_label": "தலைப்பு",
"topsites_form_title_placeholder": "தலைப்பை இடு",
"topsites_form_url_label": "URL",
"topsites_form_image_url_label": "Custom Image URL",
"topsites_form_image_url_label": "தனிப்பயன் பட URL",
"topsites_form_url_placeholder": "உள்ளிடு (அ) ஒரு URL ஒட்டு",
"topsites_form_use_image_link": "தனிப்பயன் படத்தை பயன்படுத்தவும்…",
"topsites_form_preview_button": "முன்தோற்றம்",
@ -75,8 +75,8 @@ window.gActivityStreamStrings = {
"pocket_read_more": "பிரபலமான தலைப்புகள்:",
"pocket_read_even_more": "இன்னும் கதைகளைப் பார்க்கவும்",
"highlights_empty_state": "உலாவலைத் தொடங்கவும், மேலும் நாங்கள் சில சிறந்த கட்டுரைகள், காணொளிகள், மற்றும் நீங்கள் சமீபத்தில் பார்த்த பிற பக்கங்கள் அல்லது இங்கே புத்தகக்குறியிட்டவற்றைக் காட்டுவோம்.",
"topstories_empty_state": "Youve caught up. Check back later for more top stories from {provider}. Cant wait? Select a popular topic to find more great stories from around the web.",
"manual_migration_explanation2": "Try Firefox with the bookmarks, history and passwords from another browser.",
"topstories_empty_state": "நீங்கள் முடித்துவிட்டீர்கள். {provider} இலிருந்து கூடுதல் கதைகளுக்கு பின்னர் பாருங்கள். காத்திருக்க முடியவில்லையா? இணையத்திலிருந்து கூடுதலான கதைகளைக் கண்டுபிடிக்க பிரபலமான தலைப்பைத் தேர்ந்தெடுங்கள்.",
"manual_migration_explanation2": "மற்றொரு உலாவியின் புத்தகக்குறிகள், வரலாறு மற்றும் கடவுச்சொற்களுடன் பயர்பாக்சை முயற்சித்துப் பாருங்கள்.",
"manual_migration_cancel_button": "பரவாயில்லை",
"manual_migration_import_button": "இப்போது இறக்கு",
"error_fallback_default_info": "அச்சச்சோ, இந்த உள்ளடக்கத்தை ஏற்றுவதில் ஏதோ தவறு ஏற்பட்டது.",
@ -100,17 +100,5 @@ window.gActivityStreamStrings = {
"firstrun_terms_of_service": "Terms of Service",
"firstrun_privacy_notice": "Privacy Notice",
"firstrun_continue_to_login": "Continue",
"firstrun_skip_login": "Skip this step",
"prefs_topstories_show_sponsored_label": "{provider} விளம்பரதாரர் செய்திகள்",
"settings_pane_header": "புதிய கீற்றின் முன்னுரிமைகள்",
"settings_pane_body2": "இந்த பக்கத்தில் நீங்கள் பார்ப்பதை தேர்வு செய்யவும்.",
"settings_pane_search_header": "தேடல்",
"settings_pane_search_body": "புதிய கீற்றிலீருந்து இணையத்தை தேடு.",
"settings_pane_topsites_body": "நீங்கள் அடிக்கடி பார்க்கும் தளங்களை அணுகவும்.",
"settings_pane_topsites_options_showmore": "இரு வரிசைகளைக் காண்பி",
"settings_pane_highlights_body2": "நீங்கள் சமீபத்தில் பார்வையிட்ட புத்தகக்குறியிட்ட சுவாரசியமான விடயங்களை மீண்டும் காணுங்கள்.",
"settings_pane_highlights_options_visited": "பார்வையிடப்பட்ட தளம்",
"settings_pane_snippets_body": "பயர்பாக்ஸ், இணைய கலாச்சாரம், அவ்வப்போது மீம்கள் போன்ற சுருக்கமான இனிய புதுப்பிப்புகளை மொசில்லாவிடமிருந்து படியுங்கள்.",
"settings_pane_done_button": "முடிந்தது",
"settings_pane_topstories_options_sponsored": "விளம்பரங்களைக் காட்டு"
"firstrun_skip_login": "Skip this step"
};

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

@ -91,7 +91,7 @@ window.gActivityStreamStrings = {
"section_menu_action_move_down": "ย้ายลง",
"section_menu_action_privacy_notice": "ประกาศความเป็นส่วนตัว",
"firstrun_title": "นำ Firefox ไปกับคุณ",
"firstrun_content": "Get your bookmarks, history, passwords and other settings on all your devices.",
"firstrun_content": "รับที่คั่นหน้า, ประวัติ, รหัสผ่าน และการตั้งค่าอื่น ๆ ของคุณในอุปกรณ์ทั้งหมดของคุณ",
"firstrun_learn_more_link": "เรียนรู้เพิ่มเติมเกี่ยวกับบัญชี Firefox",
"firstrun_form_header": "ป้อนอีเมลของคุณ",
"firstrun_form_sub_header": "เพื่อดำเนินการต่อไปยัง Firefox Sync",

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

@ -85,33 +85,20 @@ window.gActivityStreamStrings = {
"section_menu_action_collapse_section": "Згорнути розділ",
"section_menu_action_expand_section": "Розгорнути розділ",
"section_menu_action_manage_section": "Керувати розділом",
"section_menu_action_manage_webext": "Manage Extension",
"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": "Повідомлення про приватність",
"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": "Відновити типові",
"settings_pane_header": "Налаштування нової вкладки",
"settings_pane_body2": "Оберіть, що ви побачите на цій сторінці.",
"settings_pane_search_header": "Пошук",
"settings_pane_search_body": "Пошук в Інтернеті з нової вкладки.",
"settings_pane_topsites_body": "Доступ до найчастіше відвідуваних веб-сайтів.",
"settings_pane_topsites_options_showmore": "Показувати два рядки",
"settings_pane_highlights_body2": "Визначте свій спосіб, як повернутися до цікавих матеріалів, які ви нещодавно переглядали чи зберігали.",
"settings_pane_highlights_options_visited": "Відвідані сайти",
"settings_pane_snippets_body": "Читайте короткі й цікаві новини від Mozilla про Firefox, культуру інтернету, а також випадкові меми.",
"settings_pane_done_button": "Готово",
"settings_pane_topstories_options_sponsored": "Показувати матеріали від спонсорів",
"pocket_description": "Відкривайте високоякісні матеріали, які ви могли не побачити, завдяки Pocket, що тепер входить до складу Mozilla."
"firstrun_title": "Візьміть Firefox з собою",
"firstrun_content": "Ваші закладки, історія, паролі та інші налаштування на всіх ваших пристроях.",
"firstrun_learn_more_link": "Дізнайтеся більше про обліковий запис Firefox",
"firstrun_form_header": "Введіть свою адресу е-пошти",
"firstrun_form_sub_header": "для продовження в Синхронізації Firefox.",
"firstrun_email_input_placeholder": "Е-пошта",
"firstrun_extra_legal_links": "Продовжуючи, ви приймаєте {terms} і {privacy}.",
"firstrun_terms_of_service": "Умови надання послуги",
"firstrun_privacy_notice": "Повідомлення про приватність",
"firstrun_continue_to_login": "Продовжити",
"firstrun_skip_login": "Пропустити цей крок"
};

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

@ -5,6 +5,7 @@ support-files =
[browser_as_load_location.js]
[browser_as_render.js]
[browser_asrouter_targeting.js]
[browser_getScreenshots.js]
[browser_highlights_section.js]
[browser_topsites_contextMenu_options.js]

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

@ -0,0 +1,68 @@
ChromeUtils.defineModuleGetter(this, "ASRouterTargeting",
"resource://activity-stream/lib/ASRouterTargeting.jsm");
ChromeUtils.defineModuleGetter(this, "ProfileAge",
"resource://gre/modules/ProfileAge.jsm");
// ASRouterTargeting.isMatch
add_task(async function should_do_correct_targeting() {
is(await ASRouterTargeting.isMatch("FOO", {FOO: true}), true, "should return true for a matching value");
is(await ASRouterTargeting.isMatch("!FOO", {FOO: true}), false, "should return false for a non-matching value");
});
add_task(async function should_handle_async_getters() {
const context = {get FOO() { return Promise.resolve(true); }};
is(await ASRouterTargeting.isMatch("FOO", context), true, "should return true for a matching async value");
});
// ASRouterTargeting.findMatchingMessage
add_task(async function find_matching_message() {
const messages = [
{id: "foo", targeting: "FOO"},
{id: "bar", targeting: "!FOO"}
];
const context = {FOO: true};
const match = await ASRouterTargeting.findMatchingMessage(messages, context);
is(match, messages[0], "should match and return the correct message");
});
add_task(async function return_nothing_for_no_matching_message() {
const messages = [{id: "bar", targeting: "!FOO"}];
const context = {FOO: true};
const match = await ASRouterTargeting.findMatchingMessage(messages, context);
is(match, undefined, "should return nothing since no matching message exists");
});
// ASRouterTargeting.Environment
add_task(async function checkProfileAgeCreated() {
let profileAccessor = new ProfileAge();
is(await ASRouterTargeting.Environment.profileAgeCreated, await profileAccessor.created,
"should return correct profile age creation date");
const message = {id: "foo", targeting: `profileAgeCreated > ${await profileAccessor.created - 100}`};
is(await ASRouterTargeting.findMatchingMessage([message]), message,
"should select correct item by profile age created");
});
add_task(async function checkProfileAgeReset() {
let profileAccessor = new ProfileAge();
is(await ASRouterTargeting.Environment.profileAgeReset, await profileAccessor.reset,
"should return correct profile age reset");
const message = {id: "foo", targeting: `profileAgeReset == ${await profileAccessor.reset}`};
is(await ASRouterTargeting.findMatchingMessage([message]), message,
"should select correct item by profile age reset");
});
add_task(async function checkhasFxAccount() {
await pushPrefs(["services.sync.username", "someone@foo.com"]);
is(await ASRouterTargeting.Environment.hasFxAccount, true,
"should return true if a fx account is set");
const message = {id: "foo", targeting: "hasFxAccount"};
is(await ASRouterTargeting.findMatchingMessage([message]), message,
"should select correct item by hasFxAccount");
});

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

@ -11,11 +11,12 @@ const XHTMLNS = "http://www.w3.org/1999/xhtml";
ChromeUtils.defineModuleGetter(this, "Screenshots", "resource://activity-stream/lib/Screenshots.jsm");
function get_pixels_for_data_uri(dataURI, width, height) {
function get_pixels_for_blob(blob, width, height) {
return new Promise(resolve => {
// get the pixels out of the screenshot that we just took
let img = document.createElementNS(XHTMLNS, "img");
img.setAttribute("src", dataURI);
let imgPath = URL.createObjectURL(blob);
img.setAttribute("src", imgPath);
img.addEventListener("load", () => {
let canvas = document.createElementNS(XHTMLNS, "canvas");
canvas.setAttribute("width", width);
@ -23,6 +24,7 @@ function get_pixels_for_data_uri(dataURI, width, height) {
let ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
const result = ctx.getImageData(0, 0, width, height).data;
URL.revokeObjectURL(imgPath);
resolve(result);
}, {once: true});
});
@ -31,9 +33,9 @@ function get_pixels_for_data_uri(dataURI, width, height) {
add_task(async function test_screenshot() {
await SpecialPowers.pushPrefEnv({set: [["browser.pagethumbnails.capturing_disabled", false]]});
// take a screenshot of a blue page and save it as a data URI
const screenshotAsDataURI = await Screenshots.getScreenshotForURL(TEST_URL);
let pixels = await get_pixels_for_data_uri(screenshotAsDataURI, 10, 10);
// take a screenshot of a blue page and save it as a blob
const screenshotAsObject = await Screenshots.getScreenshotForURL(TEST_URL);
let pixels = await get_pixels_for_blob(screenshotAsObject.data, 10, 10);
let rgbaCount = {r: 0, g: 0, b: 0, a: 0};
while (pixels.length) {
// break the pixels into arrays of 4 components [red, green, blue, alpha]

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

@ -7,7 +7,7 @@ export const baseKeys = {
addon_version: Joi.string().required(),
locale: Joi.string().required(),
session_id: Joi.string(),
page: Joi.valid(["about:home", "about:newtab", "unknown"]),
page: Joi.valid(["about:home", "about:newtab", "about:welcome", "unknown"]),
user_prefs: Joi.number().integer().required()
};

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

@ -188,7 +188,7 @@ describe("ASRouter", () => {
});
it("should send a message back to the to the target if there is a bundle, too", async () => {
// force the only message to be a bundled message so getRandomItemFromArray picks it
await Router.setState({messages: [{id: "foo1", template: "simple_template", bundled: 2, content: {title: "Foo1", body: "Foo123-1"}}]});
await Router.setState({messages: [{id: "foo1", template: "simple_template", bundled: 1, content: {title: "Foo1", body: "Foo123-1"}}]});
const msg = fakeAsyncMessage({type: "CONNECT_UI_REQUEST"});
await Router.onMessage(msg);
const [currentMessage] = Router.state.messages.filter(message => message.id === Router.state.lastMessageId);
@ -196,6 +196,19 @@ describe("ASRouter", () => {
assert.equal(msg.target.sendAsyncMessage.firstCall.args[1].type, "SET_BUNDLED_MESSAGES");
assert.equal(msg.target.sendAsyncMessage.firstCall.args[1].data.bundle[0].content, currentMessage.content);
});
it("should return a null bundle if we do not have enough messages to fill the bundle", async () => {
// force the only message to be a bundled message that needs 2 messages in the bundle
await Router.setState({messages: [{id: "foo1", template: "simple_template", bundled: 2, content: {title: "Foo1", body: "Foo123-1"}}]});
const bundle = Router._getBundledMessages(Router.state.messages[0]);
assert.equal(bundle, null);
});
it("should send a CLEAR_ALL message if no bundle available", async () => {
// force the only message to be a bundled message that needs 2 messages in the bundle
await Router.setState({messages: [{id: "foo1", template: "simple_template", bundled: 2, content: {title: "Foo1", body: "Foo123-1"}}]});
const msg = fakeAsyncMessage({type: "CONNECT_UI_REQUEST"});
await Router.onMessage(msg);
assert.calledWith(msg.target.sendAsyncMessage, PARENT_TO_CHILD_MESSAGE_NAME, {type: "CLEAR_ALL"});
});
it("should send a CLEAR_ALL message if no messages are available", async () => {
await Router.setState({messages: []});
const msg = fakeAsyncMessage({type: "CONNECT_UI_REQUEST"});

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

@ -89,6 +89,25 @@ describe("ASRouterUISurface", () => {
assert.isTrue(wrapper.exists());
});
describe("snippets", () => {
it("should send correct event and source when snippet link is clicked", () => {
const content = {button_url: "https://foo.com", button_type: "anchor", button_label: "foo", ...FAKE_MESSAGE.content};
const message = Object.assign({}, FAKE_MESSAGE, {content});
wrapper.setState({message});
wrapper.find("a.ASRouterAnchor").simulate("click");
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "event", "CLICK_BUTTON");
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "source", "NEWTAB_FOOTER_BAR");
});
it("should send correct event and source when snippet is blocked", () => {
wrapper.setState({message: FAKE_MESSAGE});
wrapper.find(".blockButton").simulate("click");
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "event", "BLOCK");
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "source", "NEWTAB_FOOTER_BAR");
});
});
describe("impressions", () => {
function simulateVisibilityChange(value) {
fakeDocument.visibilityState = value;
@ -115,12 +134,13 @@ describe("ASRouterUISurface", () => {
assert.calledOnce(ASRouterUtils.sendTelemetry);
});
it("should the right data in the ", () => {
it("should send the correct impression source", () => {
wrapper.setState({message: FAKE_MESSAGE});
assert.notCalled(ASRouterUtils.sendTelemetry);
simulateVisibilityChange("visible");
assert.calledOnce(ASRouterUtils.sendTelemetry);
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "event", "IMPRESSION");
assert.propertyVal(ASRouterUtils.sendTelemetry.firstCall.args[0], "source", "NEWTAB_FOOTER_BAR");
});
it("should send an impression ping when the page is visible and a message gets loaded", () => {
@ -169,6 +189,7 @@ describe("ASRouterUISurface", () => {
assert.propertyVal(payload, "message_id", FAKE_MESSAGE.id);
assert.propertyVal(payload, "event", "IMPRESSION");
assert.propertyVal(payload, "action", `${FAKE_MESSAGE.provider}_user_event`);
assert.propertyVal(payload, "source", "NEWTAB_FOOTER_BAR");
});
});
});

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

@ -27,14 +27,12 @@ describe("Screenshots", () => {
globals.set("BackgroundPageThumbs", {captureIfMissing: sandbox.spy(() => Promise.resolve())});
globals.set("PageThumbs", {
_store: sandbox.stub(),
getThumbnailPath: sandbox.spy(() => Promise.resolve(FAKE_THUMBNAIL_PATH))
getThumbnailPath: sandbox.spy(() => FAKE_THUMBNAIL_PATH)
});
globals.set("PrivateBrowsingUtils", {isWindowPrivate: sandbox.spy(() => false)});
testFile = [0];
globals.set("OS", {File: {open: sandbox.spy(() => Promise.resolve({read: () => testFile, close: () => {}}))}});
globals.set("FileUtils", {File: sandbox.spy(() => {})});
globals.set("MIMEService", {getTypeFromFile: sandbox.spy(() => {})});
testFile = {size: 1};
globals.set("Services", fakeServices);
globals.set("fetch", sandbox.spy(() => Promise.resolve({blob: () => Promise.resolve(testFile)})));
});
afterEach(() => {
globals.restore();
@ -49,20 +47,18 @@ describe("Screenshots", () => {
await Screenshots.getScreenshotForURL(URL);
assert.calledWith(global.PageThumbs.getThumbnailPath, URL);
});
it("should call OS.File.open with the correct params", async () => {
it("should call fetch", async () => {
await Screenshots.getScreenshotForURL(URL);
assert.calledOnce(global.OS.File.open);
assert.calledOnce(global.fetch);
});
it("should call FileUtils.File", async () => {
await Screenshots.getScreenshotForURL(URL);
assert.calledOnce(global.FileUtils.File);
});
it("should call MIMEService.getTypeFromFile", async () => {
await Screenshots.getScreenshotForURL(URL);
assert.calledOnce(global.MIMEService.getTypeFromFile);
it("should have the necessary keys in the response object", async () => {
const screenshot = await Screenshots.getScreenshotForURL(URL);
assert.notEqual(screenshot.path, undefined);
assert.notEqual(screenshot.data, undefined);
});
it("should get null if something goes wrong", async () => {
globals.set("BackgroundPageThumbs", {captureIfMissing: () => new Error("Cannot capture tumbnail")});
globals.set("BackgroundPageThumbs", {captureIfMissing: () => Promise.reject(new Error("Cannot capture thumbnail"))});
const screenshot = await Screenshots.getScreenshotForURL(URL);
@ -70,7 +66,7 @@ describe("Screenshots", () => {
assert.equal(screenshot, null);
});
it("should get null without storing if existing thumbnail is empty", async () => {
testFile.length = 0;
testFile.size = 0;
const screenshot = await Screenshots.getScreenshotForURL(URL);
@ -125,29 +121,6 @@ describe("Screenshots", () => {
});
});
describe("#_bytesToString", () => {
it("should convert no bytes to empty string", () => {
assert.equal(Screenshots._bytesToString([]), "");
});
it("should convert bytes to a string", () => {
const str = Screenshots._bytesToString([104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]);
assert.equal(str, "hello world");
});
it("should convert very many bytes to a long string", () => {
const bytes = [];
for (let i = 0; i < 1000 * 1000; i++) {
bytes.push(9);
}
const str = Screenshots._bytesToString(bytes);
assert.propertyVal(str, 0, "\t");
assert.propertyVal(str, "length", 1000000);
assert.propertyVal(str, 999999, "\u0009");
});
});
describe("#_shouldGetScreenshots", () => {
beforeEach(() => {
let more = 2;

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

@ -118,11 +118,17 @@ describe("Top Sites Feed", () => {
assert.isAbove(DEFAULT_TOP_SITES.length, 0);
});
it("should add defaults on PREF_CHANGED", () => {
it("should add defaults on default.sites PREF_CHANGED", () => {
feed.onAction({type: at.PREF_CHANGED, data: {name: "default.sites", value: "https://foo.com"}});
assert.isAbove(DEFAULT_TOP_SITES.length, 0);
});
it("should refresh on topSiteRows PREF_CHANGED", () => {
feed.refresh = sinon.spy();
feed.onAction({type: at.PREF_CHANGED, data: {name: "topSitesRows"}});
assert.calledOnce(feed.refresh);
});
it("should have default sites with .isDefault = true", () => {
feed.refreshDefaults("https://foo.com");

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

@ -176,7 +176,8 @@ const TEST_GLOBAL = {
generateQI() { return {}; }
},
EventEmitter,
ShellService: {isDefaultBrowser: () => true}
ShellService: {isDefaultBrowser: () => true},
FilterExpressions: {eval() { return Promise.resolve(true); }}
};
overrider.set(TEST_GLOBAL);