Merge branch 'master' into update-dashboard-and-preferences

This commit is contained in:
Lesley Norton 2019-06-06 10:22:03 -05:00 коммит произвёл GitHub
Родитель 9f8989201b c051cdf67a
Коммит 8a7fe89ea6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
94 изменённых файлов: 1915 добавлений и 745 удалений

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

@ -27,7 +27,7 @@ function getEmailMockUps(req, res) {
emailSubject = req.fluentFormat("user-verify-email-report-subject");
if(emailType === "breachAlert") {
breachAlert = unsafeBreachesForEmail[0];
emailSubject = req.fluentFormat("hibp-notify-email-subject");
emailSubject = req.fluentFormat("breach-alert-subject");
}
} else if (emailType === "multipleBreaches") {
const breachArray = ["Experian", "Dropbox", "Apollo"];

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

@ -90,13 +90,14 @@ async function notify (req, res) {
{defaultLocale: "en"}
);
const subject = LocaleUtils.fluentFormat(supportedLocales, "hibp-notify-email-subject");
const subject = LocaleUtils.fluentFormat(supportedLocales, "breach-alert-subject");
const template = "default_email";
if (!notifiedRecipients.includes(breachedEmail)) {
await EmailUtils.sendEmail(
recipientEmail, subject, template,
{
breachedEmail,
recipientEmail,
supportedLocales,
breachAlert,
SERVER_URL: req.app.locals.SERVER_URL,

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

@ -80,7 +80,7 @@ async function confirmed(req, res, next, client = FxAOAuthClient) {
// req.session.newUser determines whether or not we show "fxa_new_user_bar" in template
req.session.newUser = true;
const signupLanguage = req.headers["accept-language"];
const verifiedSubscriber = await DB.addSubscriber(email, signupLanguage, fxaUser.refreshToken, data.body);
const verifiedSubscriber = await DB.addSubscriber(email, signupLanguage, fxaUser.accessToken, fxaUser.refreshToken, data.body);
// duping some of user/verify for now
let unsafeBreachesForEmail = [];
@ -101,6 +101,7 @@ async function confirmed(req, res, next, client = FxAOAuthClient) {
{
supportedLocales: req.supportedLocales,
breachedEmail: email,
recipientEmail: email,
date: req.fluentFormat(new Date()),
unsafeBreachesForEmail: unsafeBreachesForEmail,
scanAnotherEmailHref: EmailUtils.getScanAnotherEmailUrl(utmID),
@ -110,7 +111,10 @@ async function confirmed(req, res, next, client = FxAOAuthClient) {
}
);
req.session.user = verifiedSubscriber;
return res.redirect("/user/dashboard");
}
// Update existing user's FxA data
await DB._updateFxAData(existingUser, fxaUser.accessToken, fxaUser.refreshToken, data.body);
res.redirect("/user/dashboard");
}

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

@ -91,7 +91,7 @@ async function handleComplaintMessage(message) {
async function removeSubscribersFromDB(recipients) {
for (const recipient of recipients) {
await DB.removeSubscriberByEmail(recipient.emailAddress);
await DB.removeEmail(recipient.emailAddress);
}
}

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

@ -11,17 +11,19 @@ const HIBP = require("../hibp");
const sha1 = require("../sha1-utils");
function _requireSessionUser(req,res) {
async function _requireSessionUser(req,res) {
if (!req.session || !req.session.user) {
// TODO: can we do a nice redirect to sign in instead of an error?
throw new FluentError("must-be-signed-in");
throw new FluentError("error-must-be-signed-in");
}
return req.session.user;
// make sure the user object has all subscribers and email_addresses properties
const sessionUser = await DB.getSubscriberById(req.session.user.id);
return sessionUser;
}
async function removeEmail(req, res) {
const emailId = req.body.emailId;
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
const existingEmail = await DB.getEmailById(emailId);
if (existingEmail.subscriber_id !== sessionUser.id) {
throw new FluentError("error-not-subscribed");
@ -33,7 +35,7 @@ async function removeEmail(req, res) {
async function resendEmail(req, res) {
const emailId = req.body.emailId;
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
const existingEmail = await DB.getEmailById(emailId);
if (!existingEmail || !existingEmail.subscriber_id) {
@ -52,7 +54,7 @@ async function resendEmail(req, res) {
email,
req.fluentFormat("user-add-email-verify-subject"),
"default_email",
{ email,
{ recipientEmail: email,
supportedLocales: req.supportedLocales,
verificationHref: EmailUtils.getVerificationUrl(unverifiedEmailAddressRecord),
unsubscribeUrl: EmailUtils.getUnsubscribeUrl(unverifiedEmailAddressRecord, "account-verification-email"),
@ -65,7 +67,7 @@ async function resendEmail(req, res) {
}
async function updateCommunicationOptions(req, res) {
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
// 0 = Send breach alerts to the email address found in brew breach.
// 1 = Send all breach alerts to user's primary email address.
const allEmailsToPrimary = (Number(req.body.communicationOption) === 1) ? true : false;
@ -89,9 +91,8 @@ function _checkForDuplicateEmail(sessionUser, email) {
async function add(req, res) {
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
const email = req.body.email;
if (!email || !isemail.validate(email)) {
throw new FluentError("user-add-invalid-email");
}
@ -108,6 +109,7 @@ async function add(req, res) {
req.fluentFormat("user-add-email-verify-subject"),
"default_email",
{ breachedEmail: email,
recipientEmail: email,
supportedLocales: req.supportedLocales,
verificationHref: EmailUtils.getVerificationUrl(unverifiedSubscriber),
unsubscribeUrl: EmailUtils.getUnsubscribeUrl(unverifiedSubscriber, "account-verification-email"),
@ -171,7 +173,7 @@ function getNewBreachesForEmailEntriesSinceDate(emailEntries, date) {
async function getDashboard(req, res) {
const user = _requireSessionUser(req, res);
const user = await _requireSessionUser(req);
const allBreaches = req.app.locals.breaches;
const { verifiedEmails, unverifiedEmails } = await getAllEmailsAndBreaches(user, allBreaches);
let lastAddedEmail = null;
@ -210,6 +212,7 @@ async function _verify(req) {
"default_email",
{
breachedEmail: verifiedEmailHash.email,
recipientEmail: verifiedEmailHash.email,
supportedLocales: req.supportedLocales,
unsafeBreachesForEmail: unsafeBreachesForEmail,
scanAnotherEmailHref: EmailUtils.getScanAnotherEmailUrl(utmID),
@ -221,7 +224,7 @@ async function _verify(req) {
async function verify(req, res) {
const sessionUser = _requireSessionUser(req, res);
const sessionUser = await _requireSessionUser(req);
if (!req.query.token) {
throw new FluentError("user-verify-token-error");
}
@ -276,7 +279,7 @@ async function getUnsubscribe(req, res) {
async function getRemoveFxm(req, res) {
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
res.render("subpage", {
title: req.fluentFormat("remove-fxm"),
@ -288,9 +291,9 @@ async function getRemoveFxm(req, res) {
async function postRemoveFxm(req, res) {
const sessionUser = _requireSessionUser(req);
const sessionUser = await _requireSessionUser(req);
await DB.removeSubscriber(sessionUser);
await FXA.revokeOAuthToken(sessionUser.fxa_refresh_token);
await FXA.revokeOAuthTokens(sessionUser);
req.session.reset();
res.redirect("/");
@ -314,14 +317,14 @@ async function postUnsubscribe(req, res) {
await DB.removeOneSecondaryEmail(emailAddress.id);
return res.redirect("/user/preferences");
}
await FXA.revokeOAuthToken(unsubscribedUser.fxa_refresh_token);
await FXA.revokeOAuthTokens(unsubscribedUser);
req.session.reset();
res.redirect("/");
}
async function getPreferences(req, res) {
const user = _requireSessionUser(req);
const user = await _requireSessionUser(req);
const allBreaches = req.app.locals.breaches;
const { verifiedEmails, unverifiedEmails } = await getAllEmailsAndBreaches(user, allBreaches);

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

@ -50,6 +50,18 @@ const DB = {
return res;
},
async getSubscriberById(id) {
const [subscriber] = await knex("subscribers").where({
"id": id,
});
if (subscriber) {
subscriber.email_addresses = await knex("email_addresses").where({
"subscriber_id": subscriber.id,
});
}
return subscriber;
},
async getSubscriberByEmail(email) {
const [subscriber] = await knex("subscribers").where({
"primary_email": email,
@ -63,6 +75,21 @@ const DB = {
return subscriber;
},
async getEmailAddressRecordByEmail(email) {
const emailAddresses = await knex("email_addresses").where({
"email": email, verified: true,
});
if (!emailAddresses) {
return null;
}
if (emailAddresses.length > 1) {
// TODO: handle multiple emails in separate(?) subscriber accounts?
log.warn("getEmailAddressRecordByEmail", {msg: "found the same email multiple times"});
}
return emailAddresses[0];
},
async addSubscriberUnverifiedEmailHash(user, email) {
const res = await knex("email_addresses").insert({
subscriber_id: user.id,
@ -148,16 +175,18 @@ const DB = {
* 3. For FxA subscriber, add refresh token and profile data
*
* @param {string} email to add
* @param {string} signupLanguage from Accept-Language
* @param {string} fxaAccessToken from Firefox Account Oauth
* @param {string} fxaRefreshToken from Firefox Account Oauth
* @param {string} fxaProfileData from Firefox Account
* @returns {object} subscriber knex object added to DB
*/
async addSubscriber(email, signupLanguage, fxaRefreshToken=null, fxaProfileData=null) {
async addSubscriber(email, signupLanguage, fxaAccessToken=null, fxaRefreshToken=null, fxaProfileData=null) {
const emailHash = await this._addEmailHash(getSha1(email), email, signupLanguage, true);
const verified = await this._verifySubscriber(emailHash);
const verifiedSubscriber = Array.isArray(verified) ? verified[0] : null;
if (fxaRefreshToken || fxaProfileData) {
return this._updateFxAData(verifiedSubscriber, fxaRefreshToken, fxaProfileData);
return this._updateFxAData(verifiedSubscriber, fxaAccessToken, fxaRefreshToken, fxaProfileData);
}
return verifiedSubscriber;
},
@ -218,16 +247,18 @@ const DB = {
* Update fxa_refresh_token and fxa_profile_json for subscriber
*
* @param {object} subscriber knex object in DB
* @param {string} fxaAccessToken from Firefox Account Oauth
* @param {string} fxaRefreshToken from Firefox Account Oauth
* @param {string} fxaProfileData from Firefox Account
* @returns {object} updated subscriber knex object in DB
*/
async _updateFxAData(subscriber, fxaRefreshToken, fxaProfileData) {
async _updateFxAData(subscriber, fxaAccessToken, fxaRefreshToken, fxaProfileData) {
const fxaUID = JSON.parse(fxaProfileData).uid;
const updated = await knex("subscribers")
.where("id", "=", subscriber.id)
.update({
fxa_uid: fxaUID,
fxa_access_token: fxaAccessToken,
fxa_refresh_token: fxaRefreshToken,
fxa_profile_json: fxaProfileData,
})
@ -264,18 +295,35 @@ const DB = {
await knex("subscribers").where({"id": subscriber.id}).del();
},
async removeSubscriberByEmail(email) {
const sha1 = getSha1(email);
return await this._getSha1EntryAndDo(sha1, async aEntry => {
await knex("subscribers")
.where("id", "=", aEntry.id)
// This is used by SES callbacks to remove email addresses when recipients
// perma-bounce or mark our emails as spam
// Removes from either subscribers or email_addresses as necessary
async removeEmail(email) {
const subscriber = await this.getSubscriberByEmail(email);
if (!subscriber) {
const emailAddress = await this.getEmailAddressRecordByEmail(email);
if (!emailAddress) {
log.warn("removed-subscriber-not-found");
return;
}
await knex("email_addresses")
.where({
"email": email,
"verified": true,
})
.del();
log.info("removed-subscriber", { id: aEntry.id });
return aEntry;
}, async () => {
log.warn("removed-subscriber-not-found");
return;
});
}
// This can fail if a subscriber has more email_addresses and marks
// a primary email as spam, but we should let it fail so we can see it
// in the logs
await knex("subscribers")
.where({
"primary_verification_token": subscriber.primary_verification_token,
"primary_sha1": subscriber.primary_sha1,
})
.del();
return;
},
async removeSubscriberByToken(token, emailSha1) {

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

@ -0,0 +1,13 @@
"use strict";
exports.up = function(knex, Promise) {
return knex.schema.table("subscribers", table => {
table.string("fxa_access_token");
});
};
exports.down = function(knex, Promise) {
return knex.schema.table("subscribers", table => {
table.dropColumn("fxa_access_token");
});
};

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

@ -10,6 +10,7 @@ exports.TEST_SUBSCRIBERS = {
primary_email: "firefoxaccount@test.com",
primary_verification_token: "0e2cb147-2041-4e5b-8ca9-494e773b2cf1",
primary_verified: true,
fxa_access_token: "4a4792b89434153f1a6262fbd6a4510c00834ff842585fc4f4d972da158f0fc0",
fxa_refresh_token: "4a4792b89434153f1a6262fbd6a4510c00834ff842585fc4f4d972da158f0fc1",
fxa_uid: 12345,
fxa_profile_json: {},
@ -42,6 +43,7 @@ exports.TEST_SUBSCRIBERS = {
exports.TEST_EMAIL_ADDRESSES = {
firefox_account: {
id: 11111,
subscriber_id: 12345,
sha1: getSha1("firefoxaccount-secondary@test.com"),
email: "firefoxaccount-secondary@test.com",

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

@ -11,10 +11,10 @@ const log = mozlog("fxa");
const FXA = {
async revokeOAuthToken(fxaRefreshToken) {
async destroyOAuthToken(token) {
const fxaTokenOrigin = new URL(AppConstants.OAUTH_TOKEN_URI).origin;
const tokenDestroyUrl = `${fxaTokenOrigin}/v1/destroy`;
const tokenDestroyParams = { refresh_token: fxaRefreshToken };
const tokenDestroyParams = token;
const tokenDestroyOptions = {
method: "POST",
headers: {"Authorization": `Bearer ${AppConstants.OAUTH_CLIENT_SECRET}`},
@ -25,10 +25,15 @@ const FXA = {
try {
return await got(tokenDestroyUrl, tokenDestroyOptions);
} catch (e) {
log.error("revokeOAuthToken", {stack: e.stack});
log.error("destroyOAuthToken", {stack: e.stack});
}
},
async revokeOAuthTokens(subscriber) {
await this.destroyOAuthToken({ token: subscriber.fxa_access_token });
await this.destroyOAuthToken({ refresh_token: subscriber.fxa_refresh_token });
},
};

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

@ -634,3 +634,7 @@ filter-by = Tichayüx achi'el Ruwäch:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = K'utsamaj
to-affected-email = Ketaq taq kitzijol tz'ilanem pa ri taqoya'l xtz'iläx
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = K'o jun rub'anikil richin nachajij awichinanem. Tatunu' awi' { -brand-name }.
# Link title
learn-more-link = Tetamäx ch'aqa' chik.

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

@ -98,6 +98,7 @@ error-not-subscribed = Tato e-mailová adresa není přihlášena k odběru zpr
error-hibp-throttled = Příliš mnoho spojení ke službě { -brand-HIBP }.
error-hibp-connect = Chyba při připojování k { -brand-HIBP }.
error-hibp-load-breaches = Nepodařilo se načíst informace o únicích.
error-must-be-signed-in = Musíte být přihlášeni do svého { -brand-fxa(case: "gen") }.
hibp-notify-email-subject = { -product-name } - upozornění, váš účet byl součástí úniku dat.
home-title = { -product-name }
home-not-found = Stránka nenalezena.
@ -138,7 +139,7 @@ pwt-summary-3 =
pwt-headline-4 = Získejte pomoc s pamatováním si svých hesel.
pwt-summary-4 =
Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vygenerovat silná a unikátní hesla.
Navíc umí hesla bezpečně uložit a automaticky je za vás na webových stránkách vyplnit.
Navíc si umí hesla bezpečně uložit a automaticky je za vás na webových stránkách vyplnit.
pwt-headline-5 = Využívejte přidaného zabezpečení pomocí dvoufázového ověřování
pwt-summary-5 =
Dvoufázové ověřování vyžaduje pro úspěšné přihlášení zadat nějakou dodatečnou informaci (většinou jednorázový kód poslaný přes SMS).
@ -208,12 +209,12 @@ scan-results =
*[other] Účty s vaší e-mailovou adresou byly nalezeny v { $breachCount } dalších únicích.
}
show-more-breaches = Zobrazit více
what-to-do-headline = Co udělat když jsou vaše data součástí nějakého úniku
what-to-do-subhead-1 = Změňte svá hesla i pro staré účty
what-to-do-headline = Co dělat když jsou vaše údaje součástí nějakého úniku.
what-to-do-subhead-1 = Změňte svá hesla i u starých účtů
what-to-do-blurb-1 =
Pokud se nemůžete přihlásit, kontaktujte správce webové stránky a zeptejte se, jak můžete obnovit přístup ke svému účtu, nebo účet zcela zrušit.
Vidíte účet, o kterém vůbec nevíte? Stránka mohla změnit svůj název nebo účet někdo vytvořil za vás.
what-to-do-subhead-2 = Pokud používáte stejné heslo, jako o uniklého účtu, změňte ho
Pokud se nemůžete přihlásit, kontaktujte správce webu a zeptejte se, jak můžete obnovit přístup do svého účtu, případně jak účet zcela zrušit.
Vidíte účet, který vám nic neříká? Web mohl změnit svůj název nebo někdo účet vytvořil za vás.
what-to-do-subhead-2 = Pokud vyzrazené heslo používáte i u jiného účtu, změňte ho tam.
what-to-do-blurb-2 =
Hackeři mohou použít získaná hesla a dostat se s nimi do dalších vašich účtů.
Používejte pro každou webovou stránku jiné heslo, hlavně pokud jde o internetové
@ -223,7 +224,7 @@ what-to-do-blurb-3 =
Většina úniků obsahuje vaši e-mailovou adresu a hesla, ale mohou v nich být také citlivé finanční informace.
Pokud bylo součástí úniku číslo vašeho účtu nebo karty, informujte svou banku a sledujte, jestli nedochází k nečekaným změnám stavu na vašem účtu.
what-to-do-subhead-4 = Nechte si pomoci s vytvářením dobrých hesel a jejich bezpečným uložením.
what-to-do-blurb-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vygenerovat silná hesla, bezpečně je uložit a automaticky je pro vás na webových stránkách vyplnit.
what-to-do-blurb-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vygenerovat silná hesla, bezpečně si je uložit a automaticky je za vás na webových stránkách vyplnit.
# breach-date = the calendar date a particular data theft occurred.
breach-date = Datum úniku:
# compromised accounts = the total number of user accounts exposed in data breach
@ -376,21 +377,21 @@ signup-banner-sensitive-blurb =
Odhalte, co už o vás hackeři vědí, a zůstaňte o krok před nimi.
Nechte si posílat upozornění, pokud se váš účet objeví v novém úniku.
fxa-pwt-section-blurb =
Hesla chrání všechny vaše osobní údaje a online účty. Hackeři spoléhají
Hesla chrání všechny vaše osobní údaje a internetové účty. Hackeři spoléhají
na špatné zvyky jako je používání stejného hesla na více místech, nebo
příliš běžného a lehce uhodnutého hesla (h3sl0). Takže pokud se jim podaří
prolomit jeden váš účet, dostanou se velmi rychle dostat i k ostatním.
prolomit jeden váš účet, mohou se velmi rychle dostat i k ostatním.
fxa-pwt-summary-2 =
Krátké jednoslovné heslo je velmi snadné uhodnout. Používejte alespoň
dvouslovná hesla s kombinací malých a velkých písmen, čísel a speciálních znaků.
fxa-pwt-summary-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vaše hesla bezpečně uložit a automaticky je pro vás na webových stránkách vyplnit. Pomohou vám i s vytvořením silného hesla.
fxa-pwt-summary-6 = Počet úniků dat z webových stránek stoupá. Kdykoliv je nový únik přidán do databáze, { -product-name } vám pošle upozornění, abyste mohli co nejrychleji zareagovat a ochránit svůj účet.
fxa-what-to-do-blurb-1 = Pokud se nemůžete přihlásit, kontaktujte správce webové stránky a zeptejte se, jak můžete své heslo změnit. Vidíte účet, o kterém vůbec nevíte? Stránka mohla změnit svůj název nebo jste na nepoužívaný účet už zapomněli.
fxa-what-to-do-subhead-2 = Přestaňte používat uniklé heslo a změňte ho všude, kde jste ho použili.
fxa-wtd-blurb-2 = Hackeři mohou použít stejné heslo a e-mail a dostat se i do dalších účtů. Pro každý účet používejte jiné heslo, zejména pro internetové bankovnictví a další stránky, které mají vaše citlivé osobní údaje.
fxa-what-to-do-blurb-3 = Většina úniků obsahuje jen e-mailové adresy a hesla. V některých ale mohou být citlivé bankovní údaje. Pokud bylo v úniku číslo vašeho účtu nebo platební karty, informujte neprodleně svou banku o možném zneužití. Sledujte také stav svého účtu, jestli se nečekaně nezměnil.
fxa-what-to-do-subhead-4 = Nemusíte si sami pamatovat všechna svá hesla.
fxa-what-to-do-blurb-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vaše hesla bezpečně uložit a automaticky je pro vás na webových stránkách vyplnit. Používejte správce hesel na mobilu i počítači a už si svá hesla nebudete muset pamatovat.
fxa-pwt-summary-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden si umí vaše hesla bezpečně uložit a automaticky je za vás na webových stránkách vyplnit. Pomohou vám i s vytvořením silného hesla.
fxa-pwt-summary-6 = Počet úniků dat z webových stránek stoupá. Když se vaše osobní údaje objeví v novém úniku dat, { -product-name } vám pošle upozornění, abyste mohli co nejrychleji zareagovat a ochránit svůj účet.
fxa-what-to-do-blurb-1 = Pokud se nemůžete přihlásit, kontaktujte správce webu a zeptejte se, jak můžete své heslo změnit. Vidíte účet, který vám nic neříká? Web mohl změnit svůj název nebo jste na nepoužívaný účet už zapomněli.
fxa-what-to-do-subhead-2 = Přestaňte uniklé heslo používat a změňte ho všude, kde jste ho použili.
fxa-wtd-blurb-2 = Hackeři se mohou pokusit použít toto heslo a vaši e-mailovou adresu k získání přístupu i do dalších vašich účtů. U každého účtu používejte jiné heslo, zejména u internetového bankovnictví a dalších účtů, které obsahují vaše citlivé osobní údaje.
fxa-what-to-do-blurb-3 = Většina úniků vyzrazuje jen e-mailové adresy a hesla, ovšem některé obsahují i citlivé finanční údaje. Pokud bylo vyzrazeno číslo vašeho bankovního účtu nebo platební karty, informujte neprodleně svou banku o možném zneužití. Pravidelně také kontrolujte stav svého účtu kvůli podezřelé aktivitě.
fxa-what-to-do-subhead-4 = Získejte pomoc s pamatováním si svých hesel a jejich uchováváním v bezpečí.
fxa-what-to-do-blurb-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden si umí vaše hesla bezpečně uložit a automaticky je za vás na webových stránkách vyplnit. Používejte správce hesel na mobilu i počítači a už si svá hesla nebudete muset pamatovat.
fb-landing-headline = Byly vaše údaje součástí úniku dat - { $breachName }?
copyright = Části tohoto obsahu jsou © 1999-{ $year } jednotlivými přispěvateli mozilla.org.
content-available = Obsah je dostupný pod licencí Creative Commons.

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

@ -40,80 +40,82 @@ education-levels = Úrovně vzdělání
email-addresses = E-mailové adresy
email-messages = E-mailové zprávy
employers = Zaměstnavatelé
ethnicities = Informace o etnicitě
employment-statuses = Zaměstnanecké statusy
ethnicities = Etnické příslušnosti
family-members-names = Jména rodinných příslušníků
family-plans = Rodinné plány
family-structure = Struktury rodin
family-structure = Rodinné uspořádání
financial-investments = Finanční investice
financial-transactions = Finanční transakce
fitness-levels = Informace o zdraví
fitness-levels = Úrovně tělesné zdatnosti
genders = Pohlaví
geographic-locations = Geografické polohy
government-issued-ids = Státem spravované identifikátory
geographic-locations = Zeměpisné polohy
government-issued-ids = Státem vydané průkazy totožnosti
health-insurance-information = Informace o zdravotním pojištění
historical-passwords = Stará hesla
home-loan-information = Informace o úvěrech na bydlení
home-ownership-statuses = Informace o vlastnictví nemovitostí
homepage-urls = URL adresy domovských stránek
home-ownership-statuses = Stavy vlastnického bydlení
homepage-urls = URL domovských stránek
imei-numbers = Čísla IMEI
imsi-numbers = Čísla IMSI
income-levels = Úrovně příjmů
instant-messenger-identities = Identity z chatovacích služeb
instant-messenger-identities = Identity z instant messengerů
ip-addresses = IP adresy
job-titles = Názvy pracovních pozic
mac-addresses = MAC adresy
marital-statuses = Informace o rodinném stavu
marital-statuses = Rodinné stavy
names = Jména
nationalities = Národnosti
net-worths = Čisté příjmy
net-worths = Čisté jmění
nicknames = Přezdívky
occupations = Zaměstnání
occupations = Povolání
parenting-plans = Plány rodičovství
partial-credit-card-data = Částečné údaje o platebních kartách
passport-numbers = Čísla cestovních pasů
password-hints = Nápovědy k heslům
passwords = Hesla
payment-histories = Historie plateb
payment-methods = Platební metody
payment-histories = Platební historie
payment-methods = Způsoby platby
personal-descriptions = Osobní popisy
personal-health-data = Osobní zdravotní údaje
personal-interests = Osobní zájmy
phone-numbers = Telefonní čísla
photos = Fotografie
physical-addresses = Poštovní dresy
physical-attributes = Fyzické vlastnosti
pins = Čísla PIN
political-donations = Politické dary
physical-addresses = Fyzické adresy
physical-attributes = Fyziologické rysy
pins = PIN kódy
political-donations = Dary politickým stranám
political-views = Politické názory
private-messages = Soukromé zprávy
professional-skills = Profesní zkušenosti
profile-photos = Profilové fotografie
purchases = Nákupy
purchasing-habits = Nákupní návyky
races = Informace o rasové příslušnosti
races = Rasové příslušnosti
recovery-email-addresses = Sekundární e-mailové adresy
relationship-statuses = Stavy vztahů
religions = Informace o náboženství
reward-program-balances = Stavy odměn
relationship-statuses = Příbuzenské stavy
religions = Náboženská vyznání
reward-program-balances = Zůstatky ve věrnostních programech
salutations = Pozdravy
school-grades-class-levels = Stupně školního vzdělání
security-questions-and-answers = Bezpečnostní otázky a odpovědi
sexual-fetishes = Informace o sexuálních úchylkách
sexual-orientations = Informace o sexuální orientaci
smoking-habits = Informace o návyku kouření
sexual-fetishes = Sexuální fetiše
sexual-orientations = Sexuální orientace
smoking-habits = Míra kouření cigaret
sms-messages = SMS zprávy
social-connections = Sociální spojení
social-connections = Společenské vztahy
social-media-profiles = Profily ze sociálních sítí
spoken-languages = Mluvené jazyky
support-tickets = Tickety ze stránky podpory
social-security-numbers = Čísla sociálního zabezpečení (USA)
spoken-languages = Znalosti cizích jazyků
support-tickets = Tickety technické podpory
survey-results = Výsledky průzkumů
time-zones = Časová pásma
travel-habits = Cestovní návyky
user-statuses = Stavy uživatelů
user-website-urls = URL adresy webových stránek uživatelů
user-website-urls = URL webových stránek uživatelů
usernames = Uživatelská jména
utility-bills = Účty
vehicle-details = Informace o vozidlech
utility-bills = Inkasa (poplatky k nájmu)
vehicle-details = Údaje o vozidlech
website-activity = Záznamy aktivit na webových stránkách
work-habits = Pracovní návyky
years-of-birth = Roky narození

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

@ -3,62 +3,62 @@
# Firefox is a brand name and should not be translated.
-brand-name = Firefox
click-to-verify =
Potvrďte své přihlášení k Firefox Monitoru do 24 hodin od odeslání tohoto e-mailu.
Hlášení o vašich účtech vám pak pošleme co nejdříve.
Potvrďte své přihlášení k zasílání upozornění od Firefox Monitoru klepnutím na tlačítko níže do 24 hodin od odeslání tohoto e-mailu.
Vaše hlášení vám pak pošleme co nejdříve.
verify-my-email = Ověřit e-mailovou adresu
report-scan-another-email = Vyhledat další e-mailovou adresu ve { -product-name(case: "loc") }
automated-message = Toto je automaticky zaslaný e-mail - pokud jste si ho nevyžádali, můžete ho ignorovat.
automated-message = Toto je automaticky zaslaný e-mail pokud jste si ho nevyžádali, můžete ho ignorovat.
# Without HTML markup reads: We sent this message to [users email address] because the email address opted into alerts from Firefox Monitor.
we-sent-this-alert = Tuto zprávu jsme poslali na adresu { $userEmail }, protože jste ji vy nebo někdo jiný přihlásil k zasílání upozornění z { -product-name(case: "gen") }.
unsubscribe-email-link = Pokud už nechcete upozornění z { -product-name(case: "gen") } dostávat, odhlaste se.
we-sent-this-alert = Tuto zprávu jsme poslali na adresu { $userEmail }, protože byla přihlášena k dostávání upozornění od { -product-name(case: "gen") }.
unsubscribe-email-link = Pokud již nechcete upozornění od { -product-name(case: "gen") } dostávat, odhlaste se.
# A Firefox Monitor Report is an emailed statement from Firefox Monitor containing a list of known data breaches where the users email address was found amongst the stolen data.
firefox-monitor-report = Hlášení { -product-name(case: "gen") }
report-date = Datum nahlášení:
report-date = Datum:
email-address = E-mailová adresa:
# "full report" should be understood to mean the "complete report" or, the complete list of known data breaches that included the users information.
your-full-report = Toto je kompletní hlášení z { -product-name(case: "gen") }, které obsahuje všechny známé úniky dat s touto e-mailovou adresou.
your-full-report = Toto je kompletní hlášení z { -product-name(case: "gen") }, které obsahuje všechny známé úniky dat, v nichž se vyskytuje tato e-mailová adresa.
report-no-breaches =
Vaše e-mailová adresa není v naší databázi známých úniků dat.
K dalšímu úniku dat ale může dojít kdykoliv. Zabezpečte svá osobní data na internetu.
Vaše e-mailová adresa se nevyskytuje v naší databázi známých úniků dat.
K dalšímu úniku ale může dojít kdykoliv. Podnikněte tyto kroky, které vám pomohou ochránit své osobní údaje na internetu.
# A list of next steps someone should take if their information has been involved in a data breach.
what-to-do-next = Co dál
what-to-do-next = Co teď dělat?
report-headline =
{ $breachCount ->
[0] Zatím jde všechno dobře.
[one] Váš účet byl nalezen v jednom úniku dat.
[few] Váš účet byl nalezen ve { $breachCount } únicích dat.
*[other] Váš účet byl nalezen v { $breachCount } únicích dat.
[one] Váš účet se objevil v jednom úniku dat.
[few] Váš účet se objevil ve { $breachCount } únicích dat.
*[other] Váš účet se objevil v { $breachCount } únicích dat.
}
report-subhead-no-breaches =
Váš účet nebyl součástí naší databáze úniků dat.
Váš účet se nevyskytuje v našem kompletním hlášení o únicích dat.
To je dobrá zpráva, ale pořád ještě můžete něco zlepšovat.
K dalšímu úniku dat může dojít kdykoliv. Přečtěte si, jak můžete ochránit svá hesla.
report-subhead-found-breaches = Toto je vaše kompletní hlášení z Firefox Monitoru, které obsahuje všechny známé úniky dat s touto e-mailovou adresou.
report-subhead-found-breaches = Toto je vaše kompletní hlášení z Firefox Monitoru, které obsahuje všechny známé úniky dat, v nichž se vyskytuje tato e-mailová adresa.
breach-alert-headline = Váš účet byl součástí úniku dat.
breach-alert-subhead = Nedávno nahlášený únik dat obsahuje vaši e-mailovou adresu a následující data
report-pwt-blurb =
Hesla jsou velmi cenná a proto jich jsou denně ukradeny tisíce a tisíce a směňovány nebo prodávány na černém trhu.
Hesla jsou velmi cenná a proto jich jsou denně ukradeny tisíce, načež jsou pak směňovány nebo prodávány na černém trhu.
Silnější hesla lépe chrání vaše účty a všechna osobní data, která v nich máte uložena.
report-pwt-headline-1 = Používejte rozdílná hesla pro každý účet
report-pwt-headline-1 = Používejte u každého účtu jiné heslo
report-pwt-summary-1 =
Používáním stejného hesla necháváte hackerům otevřené dveře.
I oni mohou použít stejné heslo pro přihlášení ke všem vašim účtům.
Opakovaným používáním jednoho hesla necháváte hackerům otevřené dveře.
Mohou ho totiž použít k přihlášení se i do jiných vašich účtů.
report-pwt-headline-2 = Vytvářejte silná a unikátní hesla
report-pwt-summary-2 = Hackeři používají seznam běžně používaných hesel, aby se pokusili uhodnout to vaše. Čím delší a náhodnější je vaše heslo, tím těžší ho bude uhádnout.
report-pwt-headline-3 = Považujte bezpečnostní otázky jako hesla
report-pwt-summary-2 = Hackeři při pokusu o uhodnutí vašeho hesla užívají seznam běžně používaných hesel. Čím delší a náhodnější je vaše heslo, tím těžší ho bude uhádnout.
report-pwt-headline-3 = Bezpečnostní otázky berte jako přídavná hesla
report-pwt-summary-3 =
Webové stránky nekontrolují, jestli jsou vaše odpovědi správně, jenom jestli jsou pokaždé stejné.
Webové stránky nekontrolují, jestli jsou vaše odpovědi správně, nýbrž jenom jestli jsou pokaždé stejné.
Připravte si dlouhé a náhodné odpovědi a někam si je bezpečně uložte.
report-pwt-headline-4 = Používejte správce hesel
report-pwt-summary-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vygenerovat silná, bezpečně je uložit a automaticky je pro vás na webových stránkách vyplnit, takže si nemusíte každé pamatovat.
report-pwt-summary-4 = Správci hesel jako 1Password, LastPass, Dashlane a Bitwarden umí vygenerovat silná hesla, bezpečně si je uložit a automaticky je za vás na webových stránkách vyplnit, takže už si ani nemusíte každé pamatovat.
# A link to legal information about mozilla products.
legal = Právní informace
# Share Firefox Monitor by email subject line
share-by-email-subject = Zjistěte, jestli vaše data byla součástí nějakého úniku.
share-by-email-subject = Zjistěte, zda jste nebyli součástí nějakého úniku dat.
# Share Firefox Monitor by email message. {"https://monitor.firefox.com"} should not be translated or modified.
share-by-email-message =
Zdravím,
{ -brand-name } je služba, která je zdarma a kde můžete zkontrolovat, jestli byla některá vaše osobní data na internetu součástí úniku. Jak to funguje:
1. Otevřete { "https://monitor.firefox.com" } a zadejte do vyhledávacího pole svou e-mailovou adresu.
2. Uvidíte, jestli byl váš účet součástí nějakého úniku dat.
{ -brand-name } má bezplatnou službu, u níž si můžete zkontrolovat, jestli jste nebyli součástí nějakého úniku dat. Jak to funguje:
1. Přejděte na adresu { "https://monitor.firefox.com" } a vyhledejte svou e-mailovou adresu.
2. Uvidíte, jestli byly vaše internetové účty součástí úniku dat.
3. { -product-name } vám nabídne pár tipů, co dál a jak zůstat v bezpečí.

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

@ -26,6 +26,7 @@ error-not-subscribed = Nid yw'r cyfeiriad e-bost hwn wedi'i danysgrifio i { -pro
error-hibp-throttled = Gormod o gysylltiadau i { -brand-HIBP }.
error-hibp-connect = Gwall wrth gysylltu i { -brand-HIBP }.
error-hibp-load-breaches = Methu llwytho'r tor-data.
error-must-be-signed-in = Rhaid eich bod wedi eich mewngofnodi i'ch { -brand-fxa }.
hibp-notify-email-subject = Rhybudd { -product-name }: Mae eich cyfrif wedi ei gynnwys mewn tor-data.
home-title = { -product-name }
home-not-found = Heb ganfod tudalen.

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

@ -642,3 +642,7 @@ filter-by = Filtrer efter kategori:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menu
to-affected-email = Send alle advarsler om datalæk til den berørte mailadresse
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Beskyt dit privatliv på nettet. Slut dig til { -brand-name }.
# Link title
learn-more-link = Læs mere.

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

@ -26,6 +26,7 @@ error-not-subscribed = Diese E-Mail-Adresse hat { -product-name } nicht abonnier
error-hibp-throttled = Zu viele Verbindungen mit { -brand-HIBP }.
error-hibp-connect = Fehler beim Verbinden mit { -brand-HIBP }.
error-hibp-load-breaches = Sicherheitslecks konnten nicht geladen werden.
error-must-be-signed-in = Sie müssen bei Ihrem { -brand-fxa } angemeldet sein.
hibp-notify-email-subject = { -product-name }: Warnung: Dein Konto war von einem Datenleck betroffen.
home-title = { -product-name }
home-not-found = Seite nicht gefunden.
@ -189,7 +190,7 @@ share-other = Andere
share-twitter = Die meisten Menschen haben circa 100 Online-Konten. Wurde eines deiner Konten bei einem Datenleck geknackt? Finde es heraus.
share-facebook-headline = Überprüfe, ob du von einem Datenleck betroffen bist.
share-facebook-blurb = Wurden deine Online-Konten bei einem Datenleck geknackt?
og-site-description = Überprüfe mit { -product-name }, ob du von einem Datenleck betroffen bist. Melde dich für Warnungen zu zukünftigen Datenleaks an und erhalte Tipps zum Schutz deiner Online-Konten.
og-site-description = Überprüfe mit { -product-name }, ob du von einem Datenleck betroffen bist. Melde dich für Warnungen zu zukünftigen Datenlecks an und erhalte Tipps zum Schutz deiner Online-Konten.
mozilla-security-blog = { -brand-Mozilla } Sicherheitsblog
# A header for a list of links to share Firefox Monitor on various social media platforms.
layout-social = Soziale Medien
@ -277,7 +278,7 @@ guest-fb-not-compromised-blurb-v2 =
user-found-breaches-blurb =
{ $breachCount ->
[one] Dieses Datenleck enthielt die folgenden persönlichen Daten. Ändere dein Passwort, falls du es noch nicht getan hast.
*[other] Dieses Datenleck enthielt die folgenden persönlichen Daten. Ändere dein Passwort, falls du es noch nicht getan hast.
*[other] Diese Datenlecks enthielten die folgenden persönlichen Daten. Ändere deine Passwörter, falls du es noch nicht getan hast.
}
# While English doesnt use the actual number of breaches in this sentence,
# you can use {$breachCount} to display the number of breaches in your localization.
@ -391,7 +392,7 @@ even-for-old = Auch für ältere Accounts sollten Passwörter erneuert werden.
make-new-pw-unique = Das neue Passwort sollte anders und einzigartig sein.
strength-of-your-pw = Die Stärke deines Passworts hat direkte Auswirkungen auf deine Online-Sicherheit.
create-strong-passwords = So erstellst du starke Passwörter
stop-reusing-pw = Benutze nie dieselben Passwörter für unterschiedlich Accounts
stop-reusing-pw = Benutze nie dieselben Passwörter für unterschiedliche Accounts
create-unique-pw = Erstelle einzigartige Passwörter und speichere sie an einem sicheren Ort. Zum Beispiel in einem Passwort-Manager.
five-myths = 5 Mythen über Passwort-Manager
create-a-fxa = Erstelle ein { -brand-fxa }, um deinen kompletten Bericht zu Datenlecks und zukünftige Warnmeldungen zu erhalten.

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

@ -370,9 +370,27 @@ breaches = Παραβιάσεις
# Link title
security-tips = Συμβουλές ασφαλείας
fxa-account = { -brand-fxa }
# Aria button message to open menu. "Open Firefox Account Navigation"
open-fxa-menu = Άνοιγμα πλοήγησης { -brand-fxa }
## What to do after data breach tips
faq1 = Δεν αναγνωρίζω αυτή την εταιρεία ή ιστοσελίδα. Γιατί είμαι σε αυτή την παραβίαση;
faq2 = Γιατί πέρασε τόσος καιρός μέχρι να ενημερωθώ για αυτή την παραβίαση;
faq3 = Πώς ξέρω αν αυτό είναι ένα γνήσιο email από το { -product-name };
new-breaches-found =
{ $breachCount ->
[one] ΒΡΕΘΗΚΕ { $breachCount } ΝΕΑ ΠΑΡΑΒΙΑΣΗ
*[other] ΒΡΕΘΗΚΑΝ { $breachCount } ΝΕΕΣ ΠΑΡΑΒΙΑΣΕΙΣ
}
fb-not-comp = Αυτό το email δεν εμφανίστηκε στην παραβίαση { $breachName }.
fb-comp-only = Αυτό το email εμφανίστηκε στην παραβίαση { $breachName }.
no-results-blurb = Λυπούμαστε, αυτή η παραβίαση δεν είναι στη βάση δεδομένων μας.
all-breaches-headline = Όλες οι παραβιάσεις στο { -product-name }
search-breaches = Αναζήτηση παραβιάσεων
# "Appears in-page as: Showing: All Breaches"
currently-showing = Εμφάνιση:
all-breaches = Όλες οι παραβιάσεις
## Updated error messages

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

@ -26,6 +26,7 @@ error-not-subscribed = This email address is not subscribed to { -product-name }
error-hibp-throttled = Too many connections to { -brand-HIBP }.
error-hibp-connect = Error connecting to { -brand-HIBP }.
error-hibp-load-breaches = Could not load breaches.
error-must-be-signed-in = You must be signed in to your { -brand-fxa }.
hibp-notify-email-subject = { -product-name } Alert: Your account was involved in a breach.
home-title = { -product-name }
home-not-found = Page not found.

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

@ -29,8 +29,7 @@ error-not-subscribed = This email address is not subscribed to {-product-name}.
error-hibp-throttled = Too many connections to {-brand-HIBP}.
error-hibp-connect = Error connecting to {-brand-HIBP}.
error-hibp-load-breaches = Could not load breaches.
hibp-notify-email-subject = {-product-name} Alert: Your account was involved in a breach.
error-must-be-signed-in = You must be signed in to your {-brand-fxa}.
home-title = {-product-name}
home-not-found = Page not found.
@ -487,9 +486,6 @@ open-fxa-menu = Open {-brand-fxa} navigation
# Appears above a snippet about the breach most recently reported to Firefox Monitor.
latest-breach = LATEST BREACH ADDED
breach-added = Breach reported:
breach-discovered = Breach discovered:
# Link title
more-about-this-breach = More about this breach
@ -863,7 +859,6 @@ join-firefox = There is a way to protect your privacy. Join {-brand-name}.
# Link title
learn-more-link = Learn more.
email-sent = Email Sent!
# Form title
@ -885,3 +880,7 @@ manage-all-emails = Manage all email addresses in { $preferencesLink }.
# alerts for all of their monitored email addresses to a single
# email address.
breach-alert-notifications = Breach Alert Notifications
# This string is a label for the calendar date a breach is added to the database
# and is followed by that date.
breach-added-label = Breach added:

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

@ -26,6 +26,7 @@ error-not-subscribed = Esta dirección de correo electrónico no está suscrita
error-hibp-throttled = Demasiadas conexiones a { -brand-HIBP }.
error-hibp-connect = Error al conectar con { -brand-HIBP }.
error-hibp-load-breaches = No se pudieron cargar las violaciones de seguridad.
error-must-be-signed-in = Tenés que iniciar la sesión en tu { -brand-fxa }.
hibp-notify-email-subject = Alerta de { -product-name }: Tu cuenta estuvo involucrada en una violación de seguridad.
home-title = { -product-name }
home-not-found = Página no encontrada.
@ -61,12 +62,12 @@ pwt-summary-4 = Los administradores de contraseñas como 1Password, LastPass, Da
pwt-headline-5 = Agregá seguridad adicional con la autenticación de dos factores
pwt-summary-5 = 2FA requiere información adicional (como un código de una sola vez enviado por mensaje de texto) para iniciar sesión en tu cuenta. Incluso si alguien tiene tu contraseña no puede entrar.
pwt-headline-6 = Registrate para recibir las alertas de { -product-name-nowrap }
pwt-summary-6 = Las violaciones de datos de sitios web están en aumento. Tan pronto como se agrega una nueva violación a nuestra base de datos, { -product-name-nowrap } te envía una alerta para que puedas tomar medidas y proteger tu cuenta.
pwt-summary-6 = Las violaciones de datos de sitios web están en aumento. Así como se agrega una nueva violación a nuestra base de datos, { -product-name-nowrap } te envía una alerta para que puedas tomar medidas y proteger tu cuenta.
landing-headline = Tu derecho a estar a salvo de los piratas comienza aquí.
landing-blurb = { -product-name-nowrap } te brinda herramientas para mantener segura tu información personal. Descubrí lo que los piratas ya saben de vos y aprendé cómo mantenerte un paso adelante de ellos.
scan-label = Mirá si te involucraste en una violación de datos.
scan-label = Fijate si estás involucrado en alguna violación de datos.
scan-placeholder = Ingresá la dirección de correo electrónico
scan-privacy = Tu dirección de correo electrónico no será almacenado.
scan-privacy = Tu dirección de correo electrónico no será almacenada.
scan-submit = Buscá tu dirección de correo electrónico
scan-another-email = Escanear otra dirección de correo electrónico
scan-featuredbreach-label = Averigüá si tu cuenta <span class="bold"> { $featuredBreach } </span> fue comprometida.
@ -78,20 +79,20 @@ download-firefox-bar-blurb = { -product-name-nowrap } es presentado por el <span
download-firefox-bar-link = Descargar { -brand-name } ahora
download-firefox-banner-blurb = Tomá el control de tu navegador
download-firefox-banner-button = Descargar { -brand-name }
signup-modal-headline = Registrarse para { -product-name-nowrap }
signup-modal-blurb = Registrarse para obtener tu informe completo, alertas cuando ocurran nuevas violaciones y consejos de seguridad de { -product-name-nowrap }.
signup-modal-headline = Registrate para obtener { -product-name-nowrap }
signup-modal-blurb = Registrate para obtener un informe completo, alertas cuando ocurran nuevas violaciones y consejos de seguridad de { -product-name-nowrap }.
signup-modal-close = Cerrar
get-your-report = Conseguí tu informe
signup-modal-verify-headline = Verificá tu suscripción
signup-modal-verify-blurb = Enviamos un enlace de verificación a <span id="submitted-email" class="medium"></span>.
signup-modal-verify-expiration = Este enlace caduca en 24 horas.
signup-modal-verify-resend = ¿No está en la bandeja de entrada o en el correo basura? Reenviar
signup-modal-verify-resend = ¿No está en la bandeja de entrada o en el correo basura? Reenviar el mensaje.
# Appears after Firefox Monitor has sent a verification email to a new user.
signup-modal-sent = ¡Enviado!
signup-with-fxa = Registrarse con la cuenta { -brand-name }
signup-with-fxa = Registrate con la cuenta { -brand-name }
form-signup-placeholder = Ingresar dirección de correo electrónico
form-signup-checkbox = Obtené lo último de { -brand-Mozilla } y { -brand-name }.
sign-up = Registrarse
sign-up = Registrate
form-signup-error = Debe ser una dirección de correo electrónico válida
no-breaches-headline = Por ahora va todo bien.
found-breaches-headline = Tu información fue parte de una violación de datos.
@ -318,7 +319,7 @@ breach-discovered = Violación descubierta:
more-about-this-breach = Más acerca de esta violación
take-control = Recuperá el control de tu información personal.
cant-stop-hackers = No podés evitar que te pirateen los piratas, pero sí podés evitar la malas prácticas que les facilitan el trabajo.
read-more-tips = Leer consejos de seguridad
read-more-tips = Ver más consejos de seguridad
how-hackers-work = Entender cómo trabajan los piratas
monitor-your-online-accounts = Registrate para el control de violaciones con { -brand-fxa }.
stay-alert = Mantenete alerta a las nuevas violaciones
@ -534,8 +535,8 @@ security-tips-headline = Consejos de seguridad para protegerte de los hackers.
steps-to-protect = Pasos a seguir para proteger tu identidad en línea
take-further-steps = Tomá medidas adicionales para proteger tu identidad
alert-about-new-breaches = Alertarme sobre nuevas filtraciones.
see-if-youve-been-part = Vea si has sido parte de una filtración de datos en línea.
get-ongoing-breach-monitoring = Obtener monitoreo contínuo de filtraciones para múltiples direcciones de correo electrónico.
see-if-youve-been-part = Fijate si fuiste parte de una violación de datos en línea.
get-ongoing-breach-monitoring = Obtené el monitoreo contínuo de las violaciones de datos para múltiples direcciones de correo electrónico.
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Averiguar
new-unsub-error = Necesitás darte de baja de uno de los correos electrónicos enviados por { -product-name }.
@ -564,3 +565,7 @@ filter-by = Filtrar por categoría:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menú
to-affected-email = Enviar alertas de filtración a la dirección de correo electrónico afectada
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Hay una manera de proteger tu privacidad. Unite a { -brand-name }.
# Link title
learn-more-link = Conocer más.

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

@ -2,7 +2,7 @@
account-balances = Saldos de cuentas
address-book-contacts = Contactos de la Libreta de direcciones
age-groups = Grupos de edad
age-groups = Grupos etarios
ages = Edades
apps-installed-on-devices = Aplicaciones instaladas en dispositivos
astrological-signs = Signos astrológicos
@ -18,7 +18,7 @@ bios = Biografías
browser-user-agent-details = Detalles del agente de usuario del navegador
browsing-histories = Historiales de navegación
buying-preferences = Preferencias de compra
car-ownership-statuses = Estados de propiedad del coche
car-ownership-statuses = Estados de propiedad del automotor
career-levels = Niveles de carrera
cellular-network-names = Nombres de redes celulares
charitable-donations = Donaciones de caridad
@ -28,13 +28,13 @@ credit-cards = Tarjetas de crédito
credit-status-information = Información del estado del crédito
customer-feedback = Opiniones de los clientes
customer-interactions = Interacciones con el cliente
dates-of-birth = Años de nacimiento
dates-of-birth = Fechas de nacimiento
deceased-date = Fecha de fallecimiento
deceased-statuses = Estados de los fallecidos
device-information = Información del dispositivo
device-usage-tracking-data = Datos de rastreo del uso del dispositivo
drinking-habits = Hábitos de bebida
drug-habits = Hábitos de drogas
drinking-habits = Hábitos de consumo de bebidas
drug-habits = Hábitos de consumo de drogas
eating-habits = Hábitos alimenticios
education-levels = Niveles de educación
email-addresses = Direcciones de correo electrónico
@ -50,7 +50,7 @@ financial-transactions = Transacciones financieras
fitness-levels = Niveles de condición física
genders = Géneros
geographic-locations = Ubicaciones geográficas
government-issued-ids = Documentos de identidad emitidos por el Gobierno
government-issued-ids = IDs emitidos por el Gobierno
health-insurance-information = Información del seguro de salud
historical-passwords = Contraseñas históricas
home-loan-information = Información del préstamo hipotecario
@ -63,16 +63,16 @@ instant-messenger-identities = Identidades de mensajería instantánea
ip-addresses = Direcciones IP
job-titles = Cargos laborales
mac-addresses = Direcciones MAC
marital-statuses = Estados maritales
marital-statuses = Estados civiles
names = Nombres
nationalities = Nacionalidades
net-worths = Valores netos
net-worths = Nivel de ingresos
nicknames = Apodos
occupations = Ocupaciones
parenting-plans = Planes de crianza
partial-credit-card-data = Datos parciales de la tarjeta de crédito
passport-numbers = Números del pasaporte
password-hints = Sugerencias de la contraseña
password-hints = Sugerencias para la contraseña
passwords = Contraseñas
payment-histories = Historiales de pago
payment-methods = Métodos de pago

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

@ -32,8 +32,8 @@ report-pwt-blurb = Las contraseñas son tan valiosas que miles de ellas son roba
report-pwt-headline-1 = Usá una contraseña diferente para cada cuenta
report-pwt-summary-1 = Reutilizar la misma contraseña en todas partes abre la puerta a los piratas. Pueden usar esa contraseña para iniciar sesión en tus otras cuentas.
report-pwt-headline-2 = Creá contraseñas seguras y únicas.
report-pwt-summary-2 = Los piratas usan miles de contraseñas comunes para tratar de adivinar la tuya. Cuanto más larga y aleatoria sea tu contraseña, más difícil será de adivinar.
report-pwt-headline-3 = Tratá las preguntas de seguridad como contraseñas adicionales
report-pwt-summary-2 = Los piratas usan miles de contraseñas comunes para tratar de adivinar la tuya. Cuanto más larga y aleatoria sea tu contraseña, será más difícil de adivinar.
report-pwt-headline-3 = Tratá las preguntas de seguridad como contraseñas adicionales
report-pwt-summary-3 = Los sitios web no verifican que tus respuestas sean precisas, solo que coincidan cada vez. Creá respuestas largas y aleatorias y guardalas en un lugar seguro.
report-pwt-headline-4 = Usá un administrador de contraseñas
report-pwt-summary-4 = Los servicios como 1Password, LastPass, Dashlane y Bitwarden generan contraseñas seguras, las almacenan de forma segura y las rellenan en sitios web para que no tengas que recordar cada una de ellas.
@ -44,7 +44,7 @@ share-by-email-subject = Fijate si fuiste parte de una violación de datos.
# Share Firefox Monitor by email message. {"https://monitor.firefox.com"} should not be translated or modified.
share-by-email-message =
Hola,
{ -brand-name } tiene un servicio gratuito donde podés verificar si fuiste parte de una violación de datos. Así es como funciona:
{ -brand-name } tiene un servicio gratuito donde podés verificar si fuiste parte de una violación de datos. Funciona así:
1. Andá a { "https://monitor.firefox.com" } y buscá tu correo electrónico.
2. Fijate si tus cuentas en línea se expusieron a una violación de datos.
2. Fijate si tus cuentas en línea se expusieron en una violación de datos.
3. Obtené consejos de { -product-name } sobre lo que hacer a continuación.

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

@ -350,9 +350,87 @@ monitor-several-emails = Monitorea varios corres electrónicos
take-action = Actúa para proteger tus cuentas
keep-your-data-safe = Descubre lo que necesitas hacer para mantener tu información segura de los criminales cibrenéticos.
website-breach = Violación del sitio web
sensitive-breach = Filtración de datos sensible del sitio web
data-aggregator-breach = Filtración de recopilador de datos
unverified-breach = Filtración no verificada
spam-list-breach = Lista de filtración no deseada
website-breach-plural = Filtraciones de sitios web
sensitive-breach-plural = Filtraciones sensibles
data-aggregator-breach-plural = Filtraciones de recopiladores de datos
unverified-breach-plural = Filtraciones sin verificar
spam-list-breach-plural = Listas de filtraciones no deseadas
what-data = Qué datos fueron comprometidos:
sensitive-sites = ¿Cómo trata { -product-name } los sitios sensibles?
sensitive-sites-copy =
{ -product-name } solo revela las cuentas asociadas con estos
tipos de filtraciones una vez que se ha verificado la dirección de correo electrónico. Esto significa que eres la
única persona que puede ver si tu información estaba expuesta (a menos que alguien
más también tenga acceso a tu cuenta de correo electrónico).
delayed-reporting-headline = ¿Por qué se tardó tanto en informar de esta filtración?
delayed-reporting-copy =
A veces pueden pasar meses o años antes de que las credenciales que se expusieron
en una filtración de datos aparezcan en la web oscura. Las filtraciones se añaden a nuestra base de datos en cuanto se descubren y verifican.
about-fxm-headline = Acerca de { -product-name }
about-fxm-blurb = { -product-name } te advierte si tus cuentas en línea estuvieron involucradas en un filtración de datos. Averigua si se han expuesto tus datos, recibe alertas sobre nuevas filtraciones y toma medidas para proteger tus cuentas en línea. { -brand-Mozilla } patrocina { -product-name }.
fxm-warns-you = { -product-name } te advierte si tus cuentas en línea estuvieron involucradas en un filtración de datos. Verifica si tu información ha sido expuesta, aprende cómo proteger mejor tus cuentas en línea y recibe alertas si tu dirección de correo se encuentra nuevamente en riesgo.
# How Firefox Monitor works
how-fxm-works = Cómo funciona { -product-name }
how-fxm-1-headline = Hacer una búsqueda básica
how-fxm-1-blurb =
Busca tu dirección de correo electrónico en las filtraciones de datos públicos yendo hacia atrás
a 2007. Esta búsqueda básica mostrará la mayoría de las filtraciones de datos, pero no
las que contienen información personal privada.
how-fxm-2-headline = Regístrate para monitorear las filtraciones
how-fxm-2-blurb =
Crea una { -brand-fxa } para controlar tu correo electrónico en busca de filtraciones continuas.
Una vez que hayas verificado tu correo electrónico, también recibirás un informe completo de las infracciones anteriores, incluyendo las filtraciones de la privacidad.
how-fxm-3-headline = Recibir notificaciones en el navegador
how-fxm-3-blurb = Si usas { -brand-name }, recibirás una notificación si visitas un sitio que ha sido vulnerado. Averigua si formaste parte de esta vulnerabilidad y qué puedes hacer al respecto.
wtd-after-website = Qué hacer tras una filtración de una página web
wtd-after-data-agg = Qué hacer después de una violación de un agregador de datos
what-is-data-agg = ¿Qué es un agregador de datos?
what-is-data-agg-blurb = Los agregadores de datos, o los intermediarios de datos, recopilan información de registros públicos y los compran de otras empresas. Compilan estos datos para venderlos a las empresas con fines de comercialización. Las víctimas de estas violaciones tienen menos probabilidades de experimentar fraudes financieros, pero los piratas informáticos podrían usar estos datos para hacerse pasar por ellos o perfilarlos.
protect-your-privacy = Proteger tu privacidad en línea
no-pw-to-change = A diferencia de una filtración de un sitio web, no hay contraseña que cambiar.
avoid-personal-info = Evita usar información personal en contraseñas
avoid-personal-info-blurb = Es fácil encontrar cumpleaños, direcciones y nombres de los miembros de tu familia en línea. Mantén estas palabras fuera de tus contraseñas.
## What to do after data breach tips
change-pw = Cambiar tu contraseña
even-for-old = Incluso para cuentas antiguas, es importante actualizar tu contraseña.
make-new-pw-unique = Haz que la nueva contraseña sea diferente y única
strength-of-your-pw = La fuerza de tus contraseñas impactan directamente a tu seguridad en línea.
create-strong-passwords = Cómo crear contraseñas seguras
stop-reusing-pw = Dejar de usar las mismas contraseñas
create-unique-pw = Crea contraseñas únicas y guárdalas en algún lugar seguro, como un administrador de contraseñas.
five-myths = 5 mitos sobre los administradores de contraseñas
create-a-fxa = Crea una { -brand-fxa } para tener un informe completo de las filtraciones y para recibir alertas.
feat-security-tips = Consejos de seguridad para proteger tus cuentas
feat-sensitive = Búsqueda avanzada en filtraciones sensibles
back-to-top = Volver al inicio
resend-verification = Reenviar correo electrónico de verificación
add-new-email = Agregar una nueva dirección de correo electrónico
send-verification = Enviar enlace de verificación
# This string is a header on the user preferences page and
# appears above a check-box list of user options which allow
# the user to choose whether or not they want to receive breach
# alerts for all of their monitored email addresses to a single
# email address.
global-communication = Comunicación global
link-change-primary = Cambiar dirección de correo principal
manage-email-addresses = Administrar direcciones de correo electrónico
welcome-back = ¡Bienvenido de nuevo, { $userName }!
welcome-user = ¡Bienvenido, { $userName }!
what-to-do-after-breach = Qué hacer después de una filtración de datos:
ba-next-step-1 = Cambiar tu contraseña por otra segura y única.
ba-next-step-2 = Dejar de usar la contraseña expuesta por completo.
## Updated error messages
login-link-pre = ¿Tienes una cuenta?
login-link = Iniciar sesión
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Descubrir
# Title
email-addresses-title = Direcciones de correo electrónico

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

@ -413,7 +413,7 @@ welcome-back = Heureux de vous revoir, { $userName } !
welcome-user = Bienvenue, { $userName } !
breach-alert-subject = { -product-name } a détecté votre adresse électronique dans une nouvelle fuite de données.
your-info-was-discovered-headline = Vos données ont été découvertes dans une nouvelle fuite.
your-info-was-discovered-blurb = Vous êtes abonné·e aux alertes { -product-name } et en recevez lorsque votre adresse électronique apparaît dans des fuites de données. Voici ce que nous savons de cette fuite.
your-info-was-discovered-blurb = Vous êtes abonné(e) aux alertes { -product-name } et en recevez lorsque votre adresse électronique apparaît dans des fuites de données. Voici ce que nous savons de cette fuite.
what-to-do-after-breach = Que faire après une fuite de données ?
ba-next-step-1 = Remplacez votre mot de passe par un mot de passe unique et robuste.
ba-next-step-blurb-1 =
@ -540,7 +540,7 @@ breach-overview = Le { $breachDate }, { $breachTitle } a été victime dune f
monitor-preferences = Préférences de { -product-short-name }
# When a user is signed in, this appears in the drop down menu
# and is followed by the user's primary Firefox Account email.
signed-in-as = Connecté·e en tant que : { $userEmail }
signed-in-as = Connecté(e) en tant que : { $userEmail }
# Appears on the All Breaches page and is followed by a list of filter options
# that a user can filter the visible breaches by.
filter-by = Filtrer par catégorie :

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

@ -26,6 +26,7 @@ error-not-subscribed = Dit e-mailadres is net abonnearre op { -product-name }.
error-hibp-throttled = Te folle ferbiningen mei { -brand-HIBP }.
error-hibp-connect = Flater by ferbinen mei { -brand-HIBP }.
error-hibp-load-breaches = Koe datalekken net lade.
error-must-be-signed-in = Jo moatte by jo { -brand-fxa } oanmeld wêze.
hibp-notify-email-subject = { -product-name } Warskôging: jo account is belutsen by in datalek.
home-title = { -product-name }
home-not-found = Side net fûn.

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

@ -26,6 +26,7 @@ error-not-subscribed = Ez az e-mail cím nincs feliratkozva a { -product-name }r
error-hibp-throttled = Túl sok kapcsolat a { -brand-HIBP } felé.
error-hibp-connect = Hiba a { -brand-HIBP }hoz kapcsolódáskor.
error-hibp-load-breaches = A adatsértések nem tölthetőek be.
error-must-be-signed-in = Be kell jelentkeznie a { -brand-fxa }jába.
hibp-notify-email-subject = { -product-name } figyelmeztetés: A fiókját érintette egy adatsértés.
home-title = { -product-name }
home-not-found = Az oldal nem található.

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

@ -567,3 +567,8 @@ signed-in-as = Authenticate como: { $userEmail }
filter-by = Filtrar per categoria:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menu
to-affected-email = Invia avisos de violation al adresse email afficite
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Il ha un maniera de proteger tu confidentialitate. Junge te a { -brand-name }.
# Link title
learn-more-link = Saper plus.

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

@ -25,8 +25,8 @@ error-could-not-add-email = Tidak dapat menambahkan alamat surel ke basis data.
error-not-subscribed = Alamat surel ini tidak berlangganan { -product-name }.
error-hibp-throttled = Terlalu banyak koneksi ke { -brand-HIBP }.
error-hibp-connect = Gagal tersambung dengan { -brand-HIBP }.
error-hibp-load-breaches = Tidak dapat memuat data penerobosan.
hibp-notify-email-subject = Peringatan { -product-name }: Akun Anda telah terlibat dalam sebuah penerobosan.
error-hibp-load-breaches = Tidak dapat memuat data pembobolan.
hibp-notify-email-subject = Peringatan { -product-name }: Akun Anda telah terlibat dalam sebuah pembobolan.
home-title = { -product-name }
home-not-found = Laman tidak ditemukan.
oauth-invalid-session = Sesi tidak valid
@ -83,7 +83,7 @@ scan-privacy = Surel Anda tidak akan disimpan.
scan-submit = Cari Surel Anda
scan-another-email = Pindai Alamat Surel Lainnya
scan-featuredbreach-label = Cari tahu apakah akun <span class="bold">{ $featuredBreach }</span> Anda telah diketahui orang lain.
sensitive-breach-email-required = Penerobosan mengandung informasi yang sensitif. Verifikasi surel dibutuhkan.
sensitive-breach-email-required = Pembobolan mengandung informasi yang sensitif. Verifikasi surel dibutuhkan.
scan-error = Harus surel yang valid.
signup-banner-headline = { -product-name-nowrap } mendeteksi ancaman terhadap akun daring Anda.
signup-banner-blurb =
@ -343,8 +343,8 @@ fxa-account = { -brand-fxa }
# Aria button message to open menu. "Open Firefox Account Navigation"
open-fxa-menu = Buka navigasi { -brand-fxa }
# Appears above a snippet about the breach most recently reported to Firefox Monitor.
latest-breach = PEMBOBOLAN TERBARU TELAH DITAMBAHKAN
breach-added = Pembobolan yang dilaporkan:
latest-breach = KEBOCORAN TERBARU TELAH DITAMBAHKAN
breach-added = Pelaporan kebocoran:
breach-discovered = Pembobolan yang ditemukan:
# Link title
more-about-this-breach = Lebih lanjut tentang pembobolan ini
@ -352,7 +352,7 @@ take-control = Ambil alih kendali data pribadi Anda.
cant-stop-hackers = Anda tidak dapat menghentikan peretas dari peretasan. Tetapi Anda dapat menghindari kebiasaan buruk yang membuat pekerjaan mereka menjadi mudah.
read-more-tips = Baca Lebih Lanjut Tips Keamanan
how-hackers-work = Memahami bagaimana para peretas bekerja
monitor-your-online-accounts = Mendaftar untuk pemantauan pembobolan dengan { -brand-fxa }.
monitor-your-online-accounts = Daftar untuk memantau pelanggaran data dengan { -brand-fxa }.
stay-alert = Tetap waspada terhadap pembobolan baru
if-your-info = Jika informasi Anda muncul dalam pembobolan data baru, kami akan mengirimkan peringatan kepada Anda.
search-all-emails = Cari semua alamat surel Anda untuk pembobolan dan dapatkan peringatan tentang ancaman terbaru.
@ -371,16 +371,52 @@ unverified-breach-plural = Pembobolan Belum Terverifikasi
spam-list-breach-plural = Pembobolan Data Spam
what-data = Data apa saja yang terkompromi:
sensitive-sites = Bagaimana { -product-name } memperlakukan situs sensitif?
sensitive-sites-copy =
{ -product-name } hanya memunculkan akun yang diasosiasikan dengan
macam-macam kebocoran setelah sebuah alamat surel diverifikasi. Ini berarti Anda adalah
satu-satu orang yang dapat melihat jika informasi Anda termasuk di dalam kebocoran ini
(kecuali seseorang telah mengakses ke akun surel Anda).
delayed-reporting-headline = Mengapa butuh waktu lama untuk melaporkan pembobolan ini?
delayed-reporting-copy =
Terkadang butuh waktu berbulan-bulan atau bertahun-tahun untuk identitas terungkap
dalam kebocoran data untuk muncul di web gelap. Pembobolan ditambahkan ke basis data kami
segera setelah ditemukan dan diverifikasi.
about-fxm-headline = Tentang { -product-name }
about-fxm-blurb =
{ -product-name } memperingatkan jika akun daring Anda tersangkut dalam
kebocoran data. Cari tahu apakah Anda pernah tersangkut dalam kebocoran data, dapatkan peringatan tentang pembobolan terkini,
dan mengambil langkah-langkah untuk melindungi akun online Anda. { -product-name } disediakan
oleh { -brand-Mozilla }.
fxm-warns-you =
{ -product-name } memperingatkan Anda jika alamat surel Anda telah terungkap
dalam kebocoran data daring. Lihat apakah informasi Anda telah terungkap, pelajari cara
untuk melindungi akun daring Anda lebih baik, dan dapatkan pemberitahuan jika alamat surel Anda
muncul dalam pembobolan baru.
# How Firefox Monitor works
how-fxm-works = Bagaimana { -product-name } bekerja
how-fxm-1-headline = Lakukan pencarian dasar
how-fxm-1-blurb =
Cari alamat email Anda saat terjadi kebocoran data publik terjadi
sejak 2007. Pencarian dasar ini akan memunculkan sebagian besar kebocoran data, tetapi tidak
termasuk kebocoran yang berisi informasi pribadi yang sensitif.
how-fxm-2-headline = Mendaftar untuk pemantauan pembobolan
how-fxm-2-blurb =
Buat { -brand-fxa } untuk memantau surel Anda jika ada pembobolan.
Setelah memverifikasi email Anda, Anda juga akan menerima laporan lengkap tentang pembobolan di masa lalu,
termasuk kebocoran sensitif.
how-fxm-3-headline = Dapatkan notifikasi di peramban Anda
how-fxm-3-blurb =
Jika Anda menggunakan { -brand-name }, Anda akan menerima pemberitahuan jika Anda mengunjungi
situs yang telah dibobol. Cari tahu segera apakah Anda tersangkut dalam pembobolan tersebut
dan apa yang dapat Anda lakukan.
wtd-after-website = Apa yang harus dilakukan setelah pembobolan situs web
wtd-after-data-agg = Apa yang harus dilakukan setelah pembobolan agregator data
what-is-data-agg = Apa itu agregator data?
what-is-data-agg-blurb =
Pengumpul data, atau pialang data, mengumpulkan informasi dari rekaman
publik dan membelinya dari perusahaan lain. Mereka mengkompilasi data ini untuk menjualnya kepada perusahaan
untuk tujuan pemasaran. Korban pembobolan ini kecil kemungkinannya mengalami penipuan
finansial, tetapi peretas dapat menggunakan data ini untuk menyamar atau membuat profil mereka.
protect-your-privacy = Lindungi privasi daring Anda
no-pw-to-change = Tidak seperti pembobolan situs web, tidak ada kata sandi untuk diubah.
avoid-personal-info = Hindari penggunaan informasi pribadi dalam kata sandi
@ -391,13 +427,30 @@ avoid-personal-info-blurb = Sangat mudah untuk menemukan tanggal lahir, alamat,
change-pw = Ubah kata sandi Anda
even-for-old = Bahkan untuk akun lama, adalah penting untuk memperbarui kata sandi Anda.
make-new-pw-unique = Buat kata sandi baru yang berbeda dan unik
strength-of-your-pw = Kekuatan kombinasi kata sandi Anda secara langsung berdampak pada keamanan daring Anda.
create-strong-passwords = Cara membuat kata sandi yang kuat
stop-reusing-pw = Berhenti menggunakan kembali kata sandi yang sama
create-unique-pw = Buat kata sandi unik dan simpan di tempat yang aman, seperti pengelola kata sandi.
five-myths = 5 mitos tentang pengelola kata sandi
create-a-fxa = Buat { -brand-fxa } untuk laporan lengkap pembobolan dan sekaligus mendapatkan peringatan.
feat-security-tips = Tips keamanan untuk melindungi akun Anda
feat-sensitive = Pencarian lanjutan dalam pembobolan sensitif
feat-enroll-multiple = Daftarkan beberapa surel dalam pemantauan kebocoran
sign-up-for-fxa = Daftar { -brand-fxa }
# This string is shown beneath each of the users email addresses to indicate
# how many known breaches that email address was found in.
appears-in-x-breaches =
{ $breachCount ->
*[other] Muncul dalam { $breachCount } pembobolan yang diketahui.
}
see-if-breached = Lihat apakah Anda pernah tersangkut kebocoran data daring.
check-for-breaches = Periksa Pelanggaran Data
find-out-what-hackers-know = Cari tahu apa yang sudah diketahui peretas tentang Anda. Pelajari cara agar selalu selangkah lebih depan dari mereka.
search-for-your-email = Cari alamat surel Anda yang tersangkut kebocoran data publik sejak 2007.
back-to-top = Kembali ke Atas
comm-opt-1 = Kirim semua peringatan pembobolan ke { $primaryEmail }.
comm-opt-0 = Kirim saya surel jika salah satu alamat surel saya di bawah ini tersangkut dalam kebocoran data.
comm-opt-1 = Kirim semua peringatan kebocoran ke { $primaryEmail }.
stop-monitoring-this = Hentikan pemantauan surel ini.
resend-verification = Kirim ulang verifikasi surel
add-new-email = Tambah alamat surel baru
send-verification = Kirim Tautan Verifikasi
@ -407,16 +460,155 @@ send-verification = Kirim Tautan Verifikasi
# alerts for all of their monitored email addresses to a single
# email address.
global-communication = Komunikasi Global
breach-summary = Ringkasan Pembobolan
show-breaches-for-this-email = Tampilkan semua pembobolan untuk surel ini.
link-change-primary = Ubah Alamat Surel Utama
remove-fxm = Hapus { -product-name }
remove-fxm-blurb =
Matikan peringatan { -product-name }. { -brand-fxa } Anda akan tetap aktif, dan Anda mungkin menerima
komunikasi terkait akun lainnya.
manage-email-addresses = Kelola Alamat Surel
latest-breach-link = Lihat apakah Anda tersangkut dalam pembobolan ini.
welcome-back = Selamat datang kembali, { $userName }!
welcome-user = Selamat datang, { $userName }!
breach-alert-subject = { -product-name } menemukan surel Anda dalam kebocoran data terkini.
your-info-was-discovered-headline = Informasi Anda ditemukan dalam kebocoran data terkini.
your-info-was-discovered-blurb =
Anda mendaftarkan diri untuk menerima peringatan { -product-name }
ketika surel Anda muncul dalam kebocoran data. Inilah yang kami ketahui tentang pembobolan ini.
what-to-do-after-breach = Apa yang harus dilakukan setelah tersangkut kebocoran data:
ba-next-step-1 = Ubah kata sandi Anda menjadi kata sandi yang kuat dan unik.
ba-next-step-blurb-1 =
Kata sandi yang kuat menggunakan kombinasi huruf besar dan kecil,
karakter khusus, dan angka. Kata sandi pun tidak mengandung info pribadi seperti
alamat, tanggal lahir, atau nama keluarga Anda.
ba-next-step-2 = Hentikan penggunaan kata sandi yang terungkap sepenuhnya.
ba-next-step-blurb-2 =
Penjahat siber dapat menemukan kata sandi Anda di web gelap dan menggunakannya
masuk ke akun Anda yang lain. Cara terbaik untuk melindungi akun Anda
adalah dengan menggunakan kata sandi unik untuk masing-masing akun.
ba-next-step-3 = Dapatkan bantuan untuk membuat kata sandi yang lebih baik dan menjaganya tetap aman.
ba-next-step-blurb-3 =
Gunakan pengelola kata sandi untuk membuat kata sandi yang kuat dan unik. Pengelola kata sandi menyimpan semua log masuk Anda dengan aman
sehingga Anda dapat mengaksesnya di semua perangkat Anda.
faq1 = Saya tidak mengenali perusahaan atau situs web ini. Mengapa saya tersangkut pembobolan ini?
faq2 = Mengapa butuh waktu lama untuk memberi tahu saya tentang pembobolan ini?
faq3 = Bagaimana saya tahu ini adalah surel yang sah dari { -product-name }?
new-breaches-found =
{ $breachCount ->
*[other] { $breachCount } PEMBOBOLAN BARU DITEMUKAN
}
sign-up-headline-1 = Dapatkan peringatan berkelanjutan dengan { -brand-fxa }.
account-not-required = Peramban { -brand-name } tidak dibutuhkan untuk sebuah { -brand-fxa }. Anda dapat menerima info tentang layanan { -brand-Mozilla }.
get-alerted = Dapatkan pemberitahuan tentang pembobolan baru.
was-your-info-exposed = Apakah informasi Anda terungkap dalam kebocoran data { $breachName }?
find-out-if = Cari tahu apakah data Anda terungkap dalam pembobolan ini.
fb-not-comp = Surel ini tidak muncul dalam pembobolan { $breachName }.
other-breaches-found =
{ $breachCount ->
*[other] Namun, itu muncul dalam { $breachCount } pembobolan lainnya yang diketahui.
}
fb-comp-only = Surel ini muncul di pembobolan { $breachName }.
fb-comp-and-others =
{ $breachCount ->
*[other] Surel ini muncul di { $breachCount } kebocoran data yang diketahui, termasuk { $breachName }.
}
no-other-breaches-found = Tidak ada pembobolan lain yang ditemukan dari pencarian dasar.
no-results-blurb = Maaf, kebocoran tersebut tidak ada dalam basis data kami.
all-breaches-headline = Semua pembobolan di { -product-name }
search-breaches = Cari Pembobolan
# "Appears in-page as: Showing: All Breaches"
currently-showing = Menampilkan:
all-breaches = Semua Pembobolan
## Updated error messages
error-bot-headline = Pencarian sementara ditangguhkan
error-bot-blurb =
Kami khawatir Anda mungkin menjadi bot karena Anda mencari
beberapa alamat surel dalam waktu singkat. Untuk saat ini, Anda diblokir
dari pencarian baru. Anda bisa mencobanya lagi nanti.
error-csrf-headline = Sesi habis
error-csrf-blurb = Pilih tombol kembali pada peramban Anda, muat ulang laman, dan coba lagi.
error-invalid-unsub = Cara berhenti berlangganan dari peringatan { -product-name }
error-invalid-unsub-blurb =
Anda harus berhenti berlangganan dari salah satu dari
surel { -product-name } yang mengirimi Anda. Periksa kotak masuk Anda untuk pesan dari
{ -brand-team-email }. Pilih tautan berhenti berlangganan di bagian bawah surel.
login-link-pre = Punya akun?
login-link = Masuk
# This string is displayed under a large numeral that indicates the total number
# of email address a user has signed up for monitoring. Dont add $emails to
# your localization, because it would result in the number showing twice.
email-addresses-being-monitored =
{ $emails ->
*[other] Alamat surel sedang dipantau
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that have exposed the users information. Dont add $breaches to
# your localization, because it would result in the number showing twice.
data-breaches-exposed =
{ $breaches ->
*[other] Kebocoran data telah mengungkap informasi Anda
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that exposed a users password. Dont add $passwords to
# your localization, because it would result in the number showing twice.
passwords-exposed =
{ $passwords ->
*[other] Kata sandi terungkap di semua pembobolan
}
# Button
see-additional-breaches = Lihat Pembobolan Tambahan
# A button on the All Breaches page that restores all of the breaches
# back to the page if the user has filtered some of them out.
see-all-breaches = Lihat Semua Pembobolan
scan-results-known-breaches =
{ $breachCount ->
*[other] Surel ini muncul di { $breachCount } kebocoran data yang diketahui.
}
# This string is shown at the top of the scan results page and is followed
# by the email address that the user searched.
# In page, it reads "Results for: searchedEmail@monitor.com"
results-for = Hasil untuk: { $userEmail }
other-monitored-emails = Surel Terpantau Lainnya
email-verification-required = Verifikasi Surel Diperlukan
fxa-primary-email = Surel Utama { -brand-fxa }
what-is-a-website-breach = Apa itu pembobolan situs web?
website-breach-blurb = Kebocoran data situs web terjadi ketika penjahat siber mencuri, menyalin, atau mengungkap informasi pribadi dari akun daring. Biasanya ini merupakan hasil peretas yang menemukan titik lemah dalam keamanan situs web. Pembobolan juga dapat terjadi ketika informasi akun bocor secara tidak sengaja.
security-tips-headline = Kiat keamanan untuk melindungi diri Anda dari peretas
steps-to-protect = Langkah-langkah yang harus diambil untuk melindungi identitas daring Anda
take-further-steps = Ambil langkah lebih lanjut untuk melindungi identitas Anda
alert-about-new-breaches = Beritahu saya tentang pembobolan baru
see-if-youve-been-part = Lihat apakah Anda telah tersangkut kebocoran data online.
get-ongoing-breach-monitoring = Dapatkan pemantauan yang sedang berlangsung atas kebocoran untuk beberapa alamat surel.
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Temukan
new-unsub-error = Anda harus berhenti berlangganan dari salah satu surel { -product-name } yang dikirim.
other-known-breaches-found =
{ $breachCount ->
*[other] Namun, itu muncul dalam { $breachCount } pembobolan lainnya yang diketahui.
}
# This string appears on breach detail pages and is followed by a list
# of data classes that the breach exposed.
additional-information-including = Informasi tambahan, termasuk:
# Title
email-addresses-title = Alamat Surel
# This is a standardized breach overview blurb that appears on all breach detail pages.
# $breachTitle is the name of the breached company or website.
# $breachDate and $addedDate are calendar dates.
breach-overview = Pada { $breachDate }, { $breachTitle } mengalami pembobolan. Setelah pembobolan ditemukan dan diverifikasi, maka informasi ini ditambahkan ke basis data kami pada { $addedDate }.
# Title appearing on the Preferences dashboard.
monitor-preferences = Pengaturan { -product-short-name }
# When a user is signed in, this appears in the drop down menu
# and is followed by the user's primary Firefox Account email.
signed-in-as = Masuk sebagai: { $userEmail }
# Appears on the All Breaches page and is followed by a list of filter options
# that a user can filter the visible breaches by.
filter-by = Saring berdasarkan Kategori:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menu
to-affected-email = Kirim peringatan kebocoran ke alamat surel terkait
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan { -brand-name }.
# Link title

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

@ -30,6 +30,7 @@ error-not-subscribed = Questo indirizzo email non è iscritto a { -product-name
error-hibp-throttled = Troppe connessioni a { -brand-HIBP }.
error-hibp-connect = Errore di connessione a { -brand-HIBP }.
error-hibp-load-breaches = Non è possibile caricare informazioni relative alle violazioni di dati.
error-must-be-signed-in = Devi effettuare laccesso al tuo { -brand-fxa }.
hibp-notify-email-subject = Avviso di { -product-name }: Il tuo account è stato coinvolto in una violazione di dati.
home-title = { -product-name }
home-not-found = Pagina non trovata.

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

@ -181,6 +181,7 @@ confirmation-blurb = データ侵害は他の人にも影響を及ぼす可能
share-email = メールアドレス
# Appears at the end of a list of email-clients and refers to any other unlisted email-client.
share-other = その他
share-twitter = 多くの人が約 100 個のオンラインアカウントを持っています。あなたのアカウントはデータ侵害にさらされていませんか?確認しましょう。
mozilla-security-blog = { -brand-Mozilla } セキュリティブログ
# A header for a list of links to share Firefox Monitor on various social media platforms.
layout-social = ソーシャル
@ -211,12 +212,14 @@ guest-scan-results-headline =
}
user-no-breaches-blurb = このメールアドレスが新たな侵害に含まれた場合、通知します。
have-an-account = 既にアカウントをお持ちですか?
fb-landing-headline = { $breachName } のデータ侵害にさらされていますか?
# Alerts is a noun
sign-up-for-alerts = 登録して通知を受け取る
sign-up-for-fxa-alerts = 登録して { -product-name } の通知を受け取る。
# Link title
frequently-asked-questions = よくある質問
about-firefox-monitor = { -product-name } について
preferences = 設定
# Link title.
home = ホーム
# Link title
@ -229,14 +232,86 @@ latest-breach = 最近追加されたデータ侵害
breach-added = 侵害の報告日:
# Link title
more-about-this-breach = この侵害について詳しく見る
take-control = 個人情報の制御を取り戻してください。
cant-stop-hackers = ハッカーのハッキングは止められません。しかし、ハッキングを容易にさせる悪習慣は避けられます。
read-more-tips = セキュリティの秘訣をもっと読む
how-hackers-work = ハッカーの手段を理解する
monitor-your-online-accounts = { -brand-fxa }でデータ侵害の監視に登録しましょう。
stay-alert = 新しいデータ侵害の警告を受け取る
if-your-info = あなたの情報が新しいデータ侵害にさらされた場合、警告を送信します。
monitor-several-emails = 複数のメールアドレスを監視する
keep-your-data-safe = サイバー犯罪からデータを安全に保つために必要なことを見つけましょう。
what-data = 漏洩したデータ:
delayed-reporting-headline = なぜ、この侵害の報告に時間がかかったのですか?
about-fxm-headline = { -product-name } について
protect-your-privacy = オンラインプライバシーを保護する
## What to do after data breach tips
change-pw = パスワードを変更する
make-new-pw-unique = 新しいパスワードを他とは異なり一意にする
create-strong-passwords = 強力なパスワードの作り方
stop-reusing-pw = 同じパスワードの追加い回しをやめる
five-myths = パスワードマネージャーに関する 5 つの話題
see-if-breached = オンラインのデータ侵害がないか確認しましょう。
check-for-breaches = データ侵害を確認する
find-out-what-hackers-know = ハッカーが既にあなたについて知っていることを調査しましょう。一歩先に行く方法を学んでください。
search-for-your-email = 2007 年までさかのぼって、メールアドレスがデータ侵害を受けているか検索します。
back-to-top = トップに戻る
resend-verification = 認証メールを再送する
send-verification = 認証リンクを送信する
breach-summary = データ侵害概要
manage-email-addresses = メールアドレスの管理
latest-breach-link = この侵害を受けているか確認する
welcome-back = おかえりなさい、{ $userName } さん!
welcome-user = ようこそ、{ $userName } さん!
what-to-do-after-breach = データ侵害があった後にするべきこと:
account-not-required = { -brand-name } ブラウザーは { -brand-fxa }には必要ありません。{ -brand-Mozilla } サービスについての情報を受け取るでしょう。
was-your-info-exposed = { $breachName } のデータ侵害にさらされていますか?
no-results-blurb = データベース内に侵害は見つかりませんでした。
all-breaches-headline = { -product-name } 内のすべてのデータ侵害
search-breaches = データ侵害を検索
## Updated error messages
error-csrf-headline = セッションがタイムアウトしました
login-link-pre = アカウントをお持ちですか?
login-link = ログイン
# A button on the All Breaches page that restores all of the breaches
# back to the page if the user has filtered some of them out.
see-all-breaches = すべてのデータ侵害を見る
scan-results-known-breaches =
{ $breachCount ->
*[other] このメールアドレスは { $breachCount } 個の既知のデータ侵害があります。
}
# This string is shown at the top of the scan results page and is followed
# by the email address that the user searched.
# In page, it reads "Results for: searchedEmail@monitor.com"
results-for = { $userEmail } についての結果
email-verification-required = メールアドレスの認証が必要です
fxa-primary-email = { -brand-fxa } メールアドレス - 主要
security-tips-headline = ハッカーからあなたを守るセキュリティの秘訣
steps-to-protect = オンラインであなたを保護する手順
take-further-steps = あなたを守るさらなる手順
see-if-youve-been-part = オンラインのデータ侵害に含まれていないか確認しましょう。
get-ongoing-breach-monitoring = 複数のメールアドレスに対してデータ侵害の監視をしましょう。
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = 調査する
# This string appears on breach detail pages and is followed by a list
# of data classes that the breach exposed.
additional-information-including = 侵害を受けたその他の情報:
# This is a standardized breach overview blurb that appears on all breach detail pages.
# $breachTitle is the name of the breached company or website.
# $breachDate and $addedDate are calendar dates.
breach-overview = { $breachDate }に、{ $breachTitle } は、データ侵害にさらされました。この侵害が発見され、確認されたため、{ $addedDate }にデータベースに追加されました。
# Title appearing on the Preferences dashboard.
monitor-preferences = { -product-short-name } の設定
# When a user is signed in, this appears in the drop down menu
# and is followed by the user's primary Firefox Account email.
signed-in-as = ログイン中: { $userEmail }
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = メニュー
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = あなたのプライバシーを守る方法があります。{ -brand-name } を使用しましょう。
# Link title
learn-more-link = 詳しくはこちら。

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

@ -5,6 +5,7 @@
# - Translated.
-product-name = ഫയർഫോക്സ് മോണിറ്റർ
-product-name-nowrap = <span class="nowrap">{ -product-name }</span>
-product-short-name = മോണിറ്റർ
-brand-name = ഫയർഫോക്സ്
-brand-Quantum = ഫയർഫോക്സ് ക്വാണ്ടം
-brand-Mozilla = മോസില്ല
@ -79,6 +80,7 @@ signup-modal-verify-resend = ഇൻബോക്സിലോ സ്പാം ഫ
signup-modal-sent = അയച്ചു!
signup-with-fxa = { -brand-name } അക്കൗണ്ട് ഉപയോഗിച്ച് പ്രവേശിക്കുക
form-signup-placeholder = ഇമെയിൽ നൽകുക
form-signup-checkbox = { -brand-Mozilla }, { -brand-name } എന്നിവയിൽ നിന്നുള്ള ഏറ്റവും പുതിയത് നേടുക.
sign-up = പ്രവേശിക്കു
form-signup-error = സാധുവായ ഇമെയിൽ ആയിരിക്കണം
no-breaches-headline = ഇതുവരെ കൊള്ളാം.
@ -150,6 +152,10 @@ sign-up-for-fxa-alerts = { -product-name } അറിയിപ്പുകൾക
get-your-report-and-sign-up = റിപ്പോർട് എടുക്കുകയും അറിയിപ്പുകൾക്കായി സൈൻ അപ് ചെയ്യുകയും ചെയ്യുക.
# Link title
frequently-asked-questions = പതിവു ചോദ്യങ്ങള്‍
mozilla-dot-org = Mozilla.org
preferences = മുൻഗണനകൾ
# Link title
security-tips = സുരക്ഷാ നുറുങ്ങുകൾ
## What to do after data breach tips

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

@ -26,6 +26,7 @@ error-not-subscribed = Dit e-mailadres is niet geabonneerd op { -product-name }.
error-hibp-throttled = Te veel verbindingen met { -brand-HIBP }.
error-hibp-connect = Fout bij verbinden met { -brand-HIBP }.
error-hibp-load-breaches = Kon datalekken niet laden.
error-must-be-signed-in = U moet bij uw { -brand-fxa } zijn aangemeld.
hibp-notify-email-subject = { -product-name } Waarschuwing: uw account is betrokken bij een datalek.
home-title = { -product-name }
home-not-found = Pagina niet gevonden.

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

@ -69,6 +69,9 @@ pwt-summary-5 = To faktor-godkjenning krev tilleggsinformasjon (t.d. ein eingang
pwt-headline-6 = Registrer deg for { -product-name-nowrap }-åtvaringar
pwt-summary-6 = Nettstadlekkasjar aukar. Så snart ein ny lekkasje vert lagt til i databasen i vår, sender { -product-name-nowrap } deg ei åtvaring — slik at du kan ta affære og beskytte kontoen din.
landing-headline = Ditt vern mot hackarar startar her.
landing-blurb =
Med { -product-name-nowrap } får du ei rekkje verktøy, slik at du kan beskytte dei personlege opplysningane dine.
Finn ut kor mykje hackerane allereie veit om deg, og korleis du kan vere eitt steg framom dei.
scan-label = Sjå om du har vore innblanda i ein datalekkasje.
scan-placeholder = Skriv inn e-postadresse
scan-privacy = E-postadressa di vert ikkje lagra.
@ -167,7 +170,7 @@ fxa-scan-another-email = Vil du kontrollere ei anna e-postadresse?
# Search Firefox Monitor
fxa-scan-submit = Sök { -product-name }
sign-up-to-check = Registrer deg for å kontrollere
sign-in = Logg in
sign-in = Logg inn
sign-out = Logg ut
full-report-headline = Din { -product-name }-rapport
see-full-report = Vis fullstendig rapport
@ -220,6 +223,7 @@ fxa-pwt-summary-4 =
fxa-pwt-summary-6 =
Datalekkasjar aukar. Om din personlege informasjon vert avslørt i ein datalekkasje,
vil { -product-name } sende deg ei åtvaring - slik at du kan ta forholdsreglar og verne kontoane dine.
fb-landing-headline = Er opplysningane dine kompromitterte i datalekkasjen { $breachName }?
copyright = Delar av dette innhaldet er © 1999-{ $year } av einskilde mozilla.org-bidragsytarar.
content-available = Innhaldet er tilgjengeleg under ein Creative Commons-lisens.
# Alerts is a noun
@ -250,10 +254,12 @@ breach-discovered = Oppdaga datalekkasjar:
# Link title
more-about-this-breach = Meir om denne datalekkasjen
take-control = Ta tilbake kontrollen over personopplysningane dine.
read-more-tips = Les fleire sikkerheitstips
cant-stop-hackers = Du kan ikkje hindre hackarar i å hacke. Men du kan unngå dårlega vanar som gjer det lett for dei.
read-more-tips = Her er fleire tryggingstips
how-hackers-work = Forstå korleis hackarar jobbar
monitor-your-online-accounts = Registrer deg for overvaking av datalekkasjar med { -brand-fxa }.
monitor-your-online-accounts = Registrer deg for overvaking av datalekkasjar med ein { -brand-fxa }.
stay-alert = Ver på vakt for nye datalekkasjar
if-your-info = Om din informasjon dukkar opp i ein ny datalekkasje, sender vi deg ei åtvaring.
monitor-several-emails = Overvak fleire e-postadresser
take-action = Beskytt kontoane dine aktivt
keep-your-data-safe = Finn ut kva du må gjere for å beskytte dataa dine frå cyberkriminelle.
@ -301,8 +307,14 @@ appears-in-x-breaches =
[one] Er involvert i { $breachCount } kjend datalekkasje.
*[other] Er involvert i { $breachCount } kjende datalekkasjar.
}
see-if-breached = Sjå om du har vore involvert i ein datalekkasje.
check-for-breaches = Sjå etter datalekkasjar
find-out-what-hackers-know = Finnut kva hackarar allereie veit om deg. Lær deg korleis du kan vere eitt steg framom dei.
search-for-your-email = Søk etter e-postadressa di i offentlege datalekkasjar som går tilbake til 2007.
back-to-top = Tilbake til toppen
comm-opt-1 = Send åtvaringar om datalekkasjar til { $primaryEmail }.
stop-monitoring-this = Slutt å overvake denne e-postadressa.
resend-verification = Send stadfestings e-posten på nytt
add-new-email = Legg til ei ny e-postadresse
send-verification = Send stadfestingslenke
# This string is a header on the user preferences page and
@ -320,13 +332,16 @@ latest-breach-link = Sjå om du har vore involvert i ein datalekkasje
welcome-back = Velkomen tilbake, { $userName }!
welcome-user = Velkomen, { $userName }!
breach-alert-subject = { -product-name } fann e-postadressa di i ein ny datalekkasje.
what-to-do-after-breach = Kva skal du gjere etter ein datalekkasje:
ba-next-step-2 = Slutt heilt med å bruke det eksponerte passordet.
new-breaches-found =
{ $breachCount ->
[one] FANN { $breachCount } NY DATALEKKASJE
*[other] FANN { $breachCount } NYE DATALEKKASJAR
}
account-not-required = Du treng ikkje å ha ein { -brand-name }-nettlesar for å bruke ein { -brand-fxa }. Ved å melde deg på kan du få informasjon om tenester frå { -brand-Mozilla }.
get-alerted = Få melding om nye datalekkasjar.
was-your-info-exposed = Er opplysningane dine kompromitterte i datalekkasjen { $breachName }?
find-out-if = Finn ut om dine opplysningar vart eksponerte i denne datalekkasjen.
no-other-breaches-found = Ingen andre datalekkasjar vart funne i dette grunnleggjande søket.
all-breaches-headline = Alle datalekkasjar i { -product-name }
@ -337,9 +352,26 @@ all-breaches = Alle datalekkasjar
## Updated error messages
error-csrf-headline = Tidsavbrot i økta
login-link-pre = Har du ein konto?
login-link = Logg inn
# This string is displayed under a large numeral that indicates the total number
# of email address a user has signed up for monitoring. Dont add $emails to
# your localization, because it would result in the number showing twice.
email-addresses-being-monitored =
{ $emails ->
[one] E-postadresser som er overvaka
*[other] E-postadresser som er overvaka
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that have exposed the users information. Dont add $breaches to
# your localization, because it would result in the number showing twice.
data-breaches-exposed =
{ $breaches ->
[one] Dattalekkasje som har komprommitert opplysningane dine
*[other] Dattalekkasjar som har komprommitert opplysningane dine
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that exposed a users password. Dont add $passwords to
# your localization, because it would result in the number showing twice.
passwords-exposed =
@ -363,7 +395,11 @@ other-monitored-emails = Andre overvaka e-postadresser
email-verification-required = E-poststadfesting påkravd
fxa-primary-email = { -brand-fxa } E-post - Primær
what-is-a-website-breach = Kva er ein nettstadlekkasje?
security-tips-headline = Tryggingstips for å verne deg mot hackarar
steps-to-protect = Kva du kan gjere for å beskytte identiteten din på nettet
alert-about-new-breaches = Varsle meg om nye datalekkasjar
see-if-youve-been-part = Sjå om du har vore omfatta av ein datalekkasje på nettet.
get-ongoing-breach-monitoring = Få løpande datalekkasjeovervaking av fleire e-postadresser.
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Sjekk no
# This string appears on breach detail pages and is followed by a list
@ -381,3 +417,7 @@ signed-in-as = Innlogga som: { $userEmail }
filter-by = Filtrer etter kategori:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Meny
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Det finst ein måte å ta vare på personvernet ditt. Ver med { -brand-name } på ferda.
# Link title
learn-more-link = Les meir.

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

@ -23,7 +23,7 @@ breach-alert-subhead = Ein nyleg rapportert datalekkasje inneheld di e-postadres
report-pwt-headline-1 = Bruk ulike passord for kvar konto
report-pwt-headline-2 = Lag sterke, unike passord
report-pwt-summary-2 =
Hackerar brukar lister med vanlege passord for å prøve å gjette ditt.
Hackarar brukar lister med vanlege passord for å prøve å gjette ditt.
Dess lenger og meir tilfeldig passordet ditt er, dess vanskelegare er det å stele det.
report-pwt-headline-3 = Behandle tryggingsspørsmål som ekstra passord
report-pwt-headline-4 = Bruk ein passordhandterar

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

@ -26,6 +26,7 @@ error-not-subscribed = Este endereço de e-mail não está cadastrado no { -prod
error-hibp-throttled = Conexões em excesso para o { -brand-HIBP }
error-hibp-connect = Falha ao conectar com o { -brand-HIBP }.
error-hibp-load-breaches = Não foi possível carregar os vazamentos.
error-must-be-signed-in = Você precisa entrar na sua { -brand-fxa }.
hibp-notify-email-subject = Alerta do { -product-name }: Sua conta foi envolvida em um vazamento.
home-title = { -product-name }
home-not-found = Página não encontrada.
@ -630,6 +631,6 @@ filter-by = Filtrar por categoria:
menu = Menu
to-affected-email = Enviar alertas de vazamento para os endereços de e-mail afetados
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Existe um meio de proteger sua privacidade. Inscreva-se no { -brand-name }.
join-firefox = Existe um meio de proteger sua privacidade. Cadastre-se no { -brand-name }.
# Link title
learn-more-link = Saiba mais.

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

@ -26,6 +26,7 @@ error-not-subscribed = Este endereço de email não está subscrito no { -produc
error-hibp-throttled = Demasiadas ligações para { -brand-HIBP }.
error-hibp-connect = Erro ao ligar a { -brand-HIBP }.
error-hibp-load-breaches = Não foi possível carregar as brechas.
error-must-be-signed-in = Deve estar autenticado na sua { -brand-fxa }.
hibp-notify-email-subject = { -product-name } Alerta: A sua conta foi envolvida numa brecha.
home-title = { -product-name }
home-not-found = Página não encontrada.
@ -82,10 +83,10 @@ landing-blurb =
O { -product-name-nowrap } oferece-lhe ferramentas para manter a sua informação pessoal segura.
Descubra o que os hackers já sabem acerca de si, e saiba como ficar um passo à frente dos mesmos.
scan-label = Veja se foi envolvido(a) numa brecha de dados.
scan-placeholder = Introduzir endereço de email
scan-privacy = O seu email não será armazenado.
scan-submit = Pesquisar o seu email
scan-another-email = Verificar outro endereço de email
scan-placeholder = Inserir endereço de e-mail
scan-privacy = O seu e-mail não será guardado.
scan-submit = Pesquisar pelo seu e-mail
scan-another-email = Pesquisar outro endereço de e-mail
scan-featuredbreach-label = Descubra se a sua conta <span class="bold"> { $featuredBreach } </span> foi comprometida.
sensitive-breach-email-required = A brecha contém informação sensível. Verificação por email requerida.
scan-error = Tem de ser um email válido.
@ -108,7 +109,7 @@ signup-modal-verify-resend = Não está na caixa de entrada ou pasta de lixo? Re
# Appears after Firefox Monitor has sent a verification email to a new user.
signup-modal-sent = Enviado!
signup-with-fxa = Registe-se com uma Conta { -brand-name }
form-signup-placeholder = Introduzir email
form-signup-placeholder = Inserir e-mail
form-signup-checkbox = Obter as últimas da { -brand-Mozilla } e do { -brand-name }.
sign-up = Registar
form-signup-error = Tem de ser um email válido
@ -387,8 +388,13 @@ take-control = Retome o controlo dos seus dados pessoais.
cant-stop-hackers = Não pode impedir que os hackers invadam. Mas pode evitar maus hábitos que lhes facilitam o trabalho.
read-more-tips = Ler mais dicas de segurança
how-hackers-work = Compreender como é que os hackers funcionam
stay-alert = Mantenha-se atento(a) a novas brechas
monitor-your-online-accounts = Inscreva-se para uma monitorização de violações com { -brand-fxa }.
stay-alert = Mantenha-se atento às novas violações
if-your-info = Se a sua informação apareceu numa nova violação de dados, nós iremos enviar-lhe um alerta.
search-all-emails = Procure por violações em todos os seus endereços de e-mail e receba alertas sobre novas ameaças.
monitor-several-emails = Monitorize vários emails
take-action = Tome medidas para proteger as suas contas
keep-your-data-safe = Descubra o que precisa de fazer para manter os seus dados seguros de cibercriminosos.
website-breach = Brecha de website
sensitive-breach = Brechas de websites sensíveis
data-aggregator-breach = Brecha agregadora de dados
@ -401,21 +407,170 @@ unverified-breach-plural = Brechas não verificadas
spam-list-breach-plural = Brechas de listas de spam
what-data = Que dados foram comprometidos:
sensitive-sites = Como é que o { -product-name } trata sites sensíveis?
sensitive-sites-copy =
{ -product-name } só revela as contas associadas com estes
tipos de violações depois de um endereço de e-mail ter sido verificado. Isto significa que
é a única pessoa que pode ver se a sua informação estava numa violação (a menos que
alguém tenha acesso à sua conta de e-mail).
delayed-reporting-headline = Porque demorou tanto tempo até esta violação ser reportada?
delayed-reporting-copy =
Pode demorar meses ou até mesmo anos para as credenciais expostas
numa violação de dados aparecerem na dark web. As violações são adicionadas à nossa base de dados
assim que são descobertas e validadas.
about-fxm-headline = Acerca do { -product-name }
about-fxm-blurb = { -product-name } indica que as suas contas online estiveram envolvidas numa fuga de dados. Descubra se esteve numa fuga de dados, obtenha alertas sobre novas fugas e execute os procedimentos para proteger as suas contas onlines. { -product-name } é fornecido por { -brand-Mozilla }.
fxm-warns-you =
{ -product-name } indica se o seu endereço de e-mail foi exposto
numa violação de dados online. Confirme se a sua informação foi exposta, aprenda a
proteger melhor as suas contas online e receba alertas caso o seu endereço de e-mail
apareça numa nova violação.
# How Firefox Monitor works
how-fxm-works = Como é que o { -product-name } funciona
how-fxm-1-headline = Realizar uma pesquisa básica
how-fxm-1-blurb =
Procure pelo seu endereço de e-mail em violações de dados públicas desde
2007. Esta pesquisa básica vai apresentar a maior parte das violações de dados, mas não
as que contenham dados pessoais sensíveis.
how-fxm-2-headline = Registe-se para monitorizar violações
how-fxm-2-blurb =
Crie uma { -brand-fxa } para monitorizar o seu e-mail sobre violações atuais.
Assim que confirmar o seu e-mail, irá também receber um relatório completo sobre violações anteriores,
incluindo violações sensíveis.
how-fxm-3-headline = Receba notificações no seu navegador
how-fxm-3-blurb =
Se utilizar { -brand-name }, irá receber uma notificação se visitar um
site cujos dados tenham sido violados. Saiba imediatamente se faz parte dessa violação
e o que pode fazer quanto a isso.
wtd-after-website = O que fazer depois de uma brecha de website
wtd-after-data-agg = O que fazer depois de uma brecha de agregador de dados
what-is-data-agg = O que é um agregador de dados?
what-is-data-agg-blurb =
Um agregador ou agente de dados, recolhe informações de registos
públicos e adquire dados de outras empresas. Trabalham estes dados para os venderem a outras empresas
para fins de marketing. As vítimas destas violações são uma probabilidade mais baixa de fraude financeira
mas os piratas informáticos podem utilizar estes dados para se fazerem passar por essas pessoas ou as perfilar.
protect-your-privacy = Proteja a sua privacidade online
no-pw-to-change = Ao contrário de uma violação de website, não há uma palavra-passe para alterar.
avoid-personal-info = Evite utilizar informação pessoal nas palavras-passe
avoid-personal-info-blurb = É fácil encontrar aniversários, moradas e nomes de membros de família online. Mantenha estas palavras fora das suas palavras-passe.
## What to do after data breach tips
change-pw = Altere a sua palavra-passe
even-for-old = Mesmo para as contas antigas, é importante atualizar a sua palavra-passe.
make-new-pw-unique = Torne a nova palavra-passe diferente e única
strength-of-your-pw = A força das suas palavras-passe tem um impacto direto na sua segurança online.
create-strong-passwords = Como criar palavras-passe fortes
stop-reusing-pw = Pare de reutilizar as mesmas palavras-passe
create-unique-pw = Crie palavras-passe únicas e guarde-as num lugar seguro, tal como um gestor de palavras-passe.
five-myths = 5 mitos sobre os gestores de palavras-passe
create-a-fxa = Crie uma { -brand-fxa } para o seu relatório completo das violações e para receber alertas.
feat-security-tips = Dicas de segurança para proteger as suas contas
feat-sensitive = Pesquisa avançada em violações sensíveis
feat-enroll-multiple = Registar vários e-mails na monitorização de violações
sign-up-for-fxa = Registe-se para uma { -brand-fxa }
# This string is shown beneath each of the users email addresses to indicate
# how many known breaches that email address was found in.
appears-in-x-breaches =
{ $breachCount ->
[one] Aparece em { $breachCount } violação conhecida.
*[other] Aparece em { $breachCount } violações conhecidas.
}
see-if-breached = Consulte se esteve numa violação de dados online.
check-for-breaches = Consultar violações
find-out-what-hackers-know = Descubra o que os piratas informáticos já sabem sobre si. Saiba como ficar um passo à frente deles.
search-for-your-email = Pesquise pelo seu endereço de e-mail em violações públicas de dados até 2007.
back-to-top = Voltar ao topo
comm-opt-0 = Enviar um e-mail para mim caso um dos meus endereços de e-mail abaixo aparecer numa violação de dados.
comm-opt-1 = Enviar todos alertas de violações para { $primaryEmail }.
stop-monitoring-this = Pare de monitorizar este e-mail.
resend-verification = Reenviar e-mail de verificação
add-new-email = Adicionar um novo endereço de e-mail
send-verification = Enviar ligação de verificação
# This string is a header on the user preferences page and
# appears above a check-box list of user options which allow
# the user to choose whether or not they want to receive breach
# alerts for all of their monitored email addresses to a single
# email address.
global-communication = Comunicação global
breach-summary = Resumo da violação
show-breaches-for-this-email = Mostrar todas as violações para este e-mail.
link-change-primary = Alterar endereço de e-mail primário
remove-fxm = Remover { -product-name }
remove-fxm-blurb =
Desativar os alertas de { -product-name }. A sua { -brand-fxa } continuará ativa e poderá receber
outras comunicações relacionadas com a conta.
manage-email-addresses = Gerir endereços de e-mail
latest-breach-link = Veja se esteve nesta violação
welcome-back = Bem-vindo(a) de volta, { $userName }!
welcome-user = Bem-vindo(a), { $userName }!
breach-alert-subject = { -product-name } encontrou o seu e-mail numa nova violação de dados.
your-info-was-discovered-headline = Os seus dados foram descobertos numa nova violação de dados.
your-info-was-discovered-blurb =
Registou-se para receber alertas do { -product-name }
quando o seu e-mail aparecer numa violação de dados. Veja o que nós sabemos sobre esta violação.
what-to-do-after-breach = O que fazer depois de uma violação de dados:
ba-next-step-1 = Altere a sua palavra-passe para uma palavra-passe forte e única.
ba-next-step-blurb-1 =
Uma palavra-passe forte utiliza uma combinação de letras maiúsculas e minúsculas,
carateres especiais e números. Não contem informações pessoais tais como
a sua morada, data de nascimento ou apelidos.
ba-next-step-2 = Nunca mais volte a utilizar a palavra-se exposta.
ba-next-step-blurb-2 =
Os cibercriminosos poderão encontrar a sua palavra-passe na "dark web" e utilizá-la
para iniciar a sessão nas suas outras contas. O melhor modo para proteger as suas
contas é utilizar palavras-passe únicas para cada uma.
ba-next-step-3 = Obtenha ajuda para criar melhores palavras-passe e as manter seguras.
ba-next-step-blurb-3 =
Utilize um gestor de palavras-passe para criar palavras-passe fortes e únicas. Os gestores de palavras-passe guardam
com segurança todas as suas credenciais para que possa aceder às mesmas em todos os seus dispositivos.
faq1 = Eu não reconheço esta empresa ou website. Por que é que eu estou nesta violação?
faq2 = Porque é que demorou tanto para me notificarem desta violação?
faq3 = Como é que eu sei que é um e-mail legitimo do { -product-name }?
new-breaches-found =
{ $breachCount ->
[one] ENCONTRADA { $breachCount } NOVA VIOLAÇÃO
*[other] ENCONTRADAS { $breachCount } NOVAS VIOLAÇÕES
}
sign-up-headline-1 = Receba alertas atuais com uma { -brand-fxa }.
account-not-required = O navegador { -brand-name } não é obrigatório para uma { -brand-fxa }. Poderá receber informações sobre os serviços da { -brand-Mozilla }.
get-alerted = Receba alertas sobre novas violações.
was-your-info-exposed = A sua informação foi exposta na violação de dados de { $breachName }?
find-out-if = Saiba se os seus dados foram expostos nesta violação.
fb-not-comp = Este e-mail não apareceu na violação { $breachName }.
other-breaches-found =
{ $breachCount ->
[one] Contudo, este apareceu em { $breachCount } outra violação.
*[other] Contudo, este apareceu em { $breachCount } outras violações
}
fb-comp-only = Este e-mail apareceu na violação { $breachName }.
fb-comp-and-others =
{ $breachCount ->
[one] Este e-mail apareceu em { $breachCount } violação de dados conhecida, incluindo { $breachName }.
*[other] Este e-mail apareceu em { $breachCount } violações de dados conhecidas, incluindo { $breachName }.
}
no-other-breaches-found = Nenhuma outra violação encontrada a partir de uma pesquisa básica.
no-results-blurb = Desculpe, esta violação não está na nossa base de dados.
all-breaches-headline = Todas as violações no { -product-name }
search-breaches = Procurar por violações
# "Appears in-page as: Showing: All Breaches"
currently-showing = A mostrar:
all-breaches = Todas as violações
## Updated error messages
error-bot-headline = Pesquisas temporariamente suspensas
error-bot-blurb =
Nós estamos preocupados que seja um "bot" porque pesquisou
vários endereços de e-mail num curto espaço de tempo. Por agora, as novas
pesquisas estão bloqueadas. Pode tentar novamente mais tarde.
error-csrf-headline = A sessão expirou
error-csrf-blurb = Selecione o seu botão de retroceder do seu navegador, recarregue a página e tente novamente.
error-invalid-unsub = Como cancelar a subscrição dos alertas do { -product-name }
error-invalid-unsub-blurb =
Terá de cancelar a subscrição a partir de um dos
e-mails que o { -product-name } lhe enviou. Procure na sua caixa de correio por mensagens
de { -brand-team-email }. Selecione a ligação de cancelamento da subscrição no final da mensagem.
login-link-pre = Tem uma conta?
login-link = Iniciar sessão
# This string is displayed under a large numeral that indicates the total number
@ -459,5 +614,43 @@ results-for = Resultados para: { $userEmail }
other-monitored-emails = Outros emails monitorizados
email-verification-required = Verificação de email requerida
fxa-primary-email = Email do { -brand-fxa } - Primário
what-is-a-website-breach = O que é uma violação do website?
website-breach-blurb = Uma violação de dados do website ocorre quando os cibercriminosos roubam, copiam ou expõem a informação pessoal das contas online. Geralmente, é a consequência dos piratas informáticos encontrarem um ponto fraco na segurança do website. As violações também podem acontecer quando a informação de contas é divulgada acidentalmente.
security-tips-headline = Dicas de segurança para se proteger contra hackers
steps-to-protect = Passos a tomar para proteger a sua identidade online
take-further-steps = Mais passos para proteger a sua identidade
alert-about-new-breaches = Alertar-me acerca de novas brechas
see-if-youve-been-part = Veja se fez parte de uma violação de dados online.
get-ongoing-breach-monitoring = Obtenha a monitorização de violações atuais para múltiplos endereços de e-mail.
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Descobrir
new-unsub-error = Terá de cancelar a subscrição de um dos e-mails que o { -product-name } lhe enviou.
other-known-breaches-found =
{ $breachCount ->
[one] Contudo, este apareceu em { $breachCount } outra violação conhecida.
*[other] Contudo, este apareceu em { $breachCount } outras violações conhecidas.
}
# This string appears on breach detail pages and is followed by a list
# of data classes that the breach exposed.
additional-information-including = Informação adicional, incluindo:
# Title
email-addresses-title = Endereços de e-mail
# This is a standardized breach overview blurb that appears on all breach detail pages.
# $breachTitle is the name of the breached company or website.
# $breachDate and $addedDate are calendar dates.
breach-overview = Em { $breachDate }, { $breachTitle } sofreu uma violação. Assim que a violação foi descoberta e confirmada, esta foi adicionada à nossa base de dados em { $addedDate }.
# Title appearing on the Preferences dashboard.
monitor-preferences = { -product-short-name } - Preferências
# When a user is signed in, this appears in the drop down menu
# and is followed by the user's primary Firefox Account email.
signed-in-as = Sessão iniciada como: { $userEmail }
# Appears on the All Breaches page and is followed by a list of filter options
# that a user can filter the visible breaches by.
filter-by = Filtrar por categoria:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menu
to-affected-email = Enviar alertas de violação para o endereço de e-mail afetado
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Existe um modo para proteger a sua privacidade. Registe-se em { -brand-name }.
# Link title
learn-more-link = Saber mais.

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

@ -12,6 +12,9 @@ avatars = Avatares
bank-account-numbers = Números da conta bancária
beauty-ratings = Avaliações de beleza
biometric-data = Dados biométricos
# This string is the shortened version of "Biographies", and
# refers to biographical data about a user.
bios = Biografias
browser-user-agent-details = Detalhes do user agent
browsing-histories = Históricos de navegação
buying-preferences = Preferências de compras
@ -37,6 +40,7 @@ education-levels = Níveis de educação
email-addresses = Endereços de email
email-messages = Mensagens de email
employers = Empregadores
employment-statuses = Situação laboral
ethnicities = Etnicidades
family-members-names = Nomes dos membros da família
family-plans = Planos familiares
@ -101,6 +105,7 @@ smoking-habits = Hábitos de fumar
sms-messages = Mensagens SMS
social-connections = Ligações sociais
social-media-profiles = Perfis de redes sociais
social-security-numbers = Números da segurança social
spoken-languages = Idiomas falados
support-tickets = Bilhetes de apoio
survey-results = Resultados de pesquisas

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

@ -26,6 +26,7 @@ error-not-subscribed = Această adresă de e-mail nu este abonată la { -product
error-hibp-throttled = Prea multe conexiuni la { -brand-HIBP }.
error-hibp-connect = Eroare de conectare la { -brand-HIBP }.
error-hibp-load-breaches = Nu s-au putut încărca breșele.
error-must-be-signed-in = Trebuie să fii autentificat(ă) la { -brand-fxa }.
hibp-notify-email-subject = Alertă { -product-name }: Contul tău a fost implicat într-o breșă.
home-title = { -product-name }
home-not-found = Pagină negăsită.

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

@ -621,3 +621,7 @@ filter-by = Фильтр по категориям:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Меню
to-affected-email = Отправлять оповещения об утечках на затронутые ими адреса электронной почты
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Есть способ защитить вашу приватность. Присоединяйтесь к { -brand-name }.
# Link title
learn-more-link = Подробнее.

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

@ -5,6 +5,7 @@
# - Translated.
-product-name = Firefox Monitor
-product-name-nowrap = <span class="nowrap">{ -product-name }</span>
-product-short-name = Monitor
-brand-name = Firefox
-brand-Quantum = Firefox Quantum
-brand-Mozilla = Mozilla
@ -25,6 +26,7 @@ error-not-subscribed = Táto e-mailová adresa nie je prihlásená na odber zo s
error-hibp-throttled = Príliš mnoho spojení k službe { -brand-HIBP }.
error-hibp-connect = Chyba pri pripájaní k { -brand-HIBP }.
error-hibp-load-breaches = Nepodarilo sa načítať údaje o únikoch.
error-must-be-signed-in = Musíte byť prihlásení do svojho { -brand-fxa(case: "gen") }.
hibp-notify-email-subject = { -product-name } - upozornenie, váš účet bol súčasťou úniku dát.
home-title = { -product-name }
home-not-found = Stránka nebola nájdená.
@ -360,3 +362,38 @@ create-free-account =
get-your-report-and-sign-up = Získajte správu a prihláste sa na odber upozornení.
# Link title
frequently-asked-questions = Často kladené otázky
about-firefox-monitor = O { -product-name(case: "gen") }
mozilla-dot-org = Mozilla.org
preferences = Možnosti
# Link title.
home = Domov
# Link title
breaches = Úniky
# Link title
security-tips = Bezpečnostné tipy
fxa-account = { -brand-fxa }
# Aria button message to open menu. "Open Firefox Account Navigation"
open-fxa-menu = Otvoriť ponuku { -brand-fxa(case: "gen") }
# Appears above a snippet about the breach most recently reported to Firefox Monitor.
latest-breach = NAPOSLEDY PRIDANÝ ÚNIK
breach-added = Dátum nahlásenia:
breach-discovered = Dátum odhalenia:
# Link title
more-about-this-breach = Ďalšie informácie o tomto úniku
take-control = Získajte opäť kontrolu nad svojimi osobnými údajmi.
cant-stop-hackers = Nemôžete zabrániť hackerom v hackovaní. No môžete sa vyvarovať zlých zvykov a sťažiť im prácu.
read-more-tips = Ďalšie bezpečnostné tipy
how-hackers-work = Porozumejte tomu, ako hackeri pracujú
stay-alert = Buďte informovaní o nových únikoch
monitor-several-emails = Monitorujte niekoľko e-mailových adries
take-action = Podniknite kroky na ochranu svojich účtov
## What to do after data breach tips
## Updated error messages
login-link-pre = Už ho máte?
login-link = Prihláste sa
# Link title
learn-more-link = Ďalšie informácie

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

@ -26,6 +26,7 @@ error-not-subscribed = Den här e-postadressen prenumererar inte på { -product-
error-hibp-throttled = För många anslutningar till { -brand-HIBP }.
error-hibp-connect = Det gick inte att ansluta till { -brand-HIBP }.
error-hibp-load-breaches = Kunde inte ladda intrång.
error-must-be-signed-in = Du måste vara inloggad på ditt { -brand-fxa }.
hibp-notify-email-subject = { -product-name } varning: Ditt konto var inblandat i ett intrång.
home-title = { -product-name }
home-not-found = Sidan hittades inte.
@ -632,3 +633,7 @@ filter-by = Filtrera efter kategori:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Meny
to-affected-email = Skicka intrångsvarningar till den drabbade e-postadressen
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Det finns ett sätt att skydda din integritet. Gå med i { -brand-name }.
# Link title
learn-more-link = Läs mer.

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

@ -356,7 +356,11 @@ read-more-tips = Daha dazla güvenlik ipucu
how-hackers-work = Hackerların nasıl çalıştığını anlayın
monitor-your-online-accounts = { -brand-fxa } ile ihlal uyarılarına kaydolun.
stay-alert = Yeni ihlallere karşı tetikte kalın
if-your-info = Bilgileriniz yeni bir veri ihlalinde karşımıza çıkarsa size bir uyarı göndereceğiz.
search-all-emails = İhallere dahil olabilecek tüm e-posta adreslerinizi arayın ve yeni tehditler hakkında uyarı alın.
monitor-several-emails = Birden fazla e-postayı izleyin
take-action = Hesaplarınızı korumak için harekete geçin
keep-your-data-safe = Verilerinizi siber suçlulardan korumak için neler yapmanız gerektiğini öğrenin.
website-breach = Web sitesi ihlali
sensitive-breach = Hassas web sitesi ihlali
data-aggregator-breach = Veri toplayıcı ihlali
@ -367,6 +371,9 @@ sensitive-breach-plural = Hassas ihlaller
data-aggregator-breach-plural = Veri toplayıcı ihlalleri
unverified-breach-plural = Doğrulanmamış ihlaller
spam-list-breach-plural = Spam listesi ihlalleri
what-data = Ele geçirilen veriler:
sensitive-sites = { -product-name } hassas siteleri nasıl ele alıyor?
delayed-reporting-headline = Bu ihlalin bildirilmesi neden bu kadar uzun sürdü?
about-fxm-headline = { -product-name } hakkında
# How Firefox Monitor works
how-fxm-works = { -product-name } nasıl çalışır?
@ -383,24 +390,53 @@ make-new-pw-unique = Yeni parolanız eskisinden ve tüm parolalarınızdan farkl
strength-of-your-pw = Parolalarınızın kalitesi, internetteki güvenliğinizi doğrudan etkiler.
create-strong-passwords = Güçlü parolalar nasıl oluşturulur?
stop-reusing-pw = Aynı parolaları kullanmayın
create-unique-pw = Benzersiz parolalar oluşturun ve bunları parola yöneticisi gibi güvenli bir yerde saklayın.
five-myths = Parola yöneticileri hakkında 5 şehir efsanesi
create-a-fxa = Tam ihlal raporunuzu görmek ve ihlal uyarıları almak için { -brand-fxa } açın.
feat-security-tips = Hesaplarınızı korumanız için güvenlik ipuçları
sign-up-for-fxa = { -brand-fxa } açın
# This string is shown beneath each of the users email addresses to indicate
# how many known breaches that email address was found in.
appears-in-x-breaches =
{ $breachCount ->
[one] Bilinen { $breachCount } ihlalde yer alıyor.
*[other] Bilinen { $breachCount } ihlalde yer alıyor.
}
see-if-breached = Çevrimiçi veri ihlallerinde verilerinizin çalınmış olabilir mi? Hemen öğrenin.
check-for-breaches = İhlalleri kontrol et
find-out-what-hackers-know = Hackerların sizin hakkınızda neler bildiklerini öğrenin, onların bir adım önüne geçin.
search-for-your-email = 2007ye uzanan bilindik veri ihlallerinde e-posta adresinizi arayın.
back-to-top = Başa dön
comm-opt-1 = Tüm ihlal uyarılarını { $primaryEmail } adresine gönder.
stop-monitoring-this = Bu e-postayı izlemeyi durdur.
resend-verification = Doğrulama e-postasını yeniden gönder
add-new-email = Yeni e-posta adresi ekle
send-verification = Doğrulama bağlantısını gönder
# This string is a header on the user preferences page and
# appears above a check-box list of user options which allow
# the user to choose whether or not they want to receive breach
# alerts for all of their monitored email addresses to a single
# email address.
global-communication = İletişim
breach-summary = İhlal özeti
show-breaches-for-this-email = Bu e-postayı içeren tüm ihlalleri göster.
link-change-primary = Ana e-posta adresini değiştir
link-change-primary = Birincil e-posta adresini değiştir
remove-fxm = { -product-name }’ü kaldır
manage-email-addresses = E-posta adreslerini yönet
latest-breach-link = Bu ihlale dahil olup olmadığınızı öğrenin
welcome-back = Yeniden hoş geldin { $userName }!
welcome-user = Hoş geldin { $userName }!
breach-alert-subject = { -product-name } yeni bir veri ihlalinde e-posta adresinizi tespit etti.
your-info-was-discovered-headline = Bilgileriniz yeni bir veri ihlalinde tespit edildi.
what-to-do-after-breach = Veri ihlalinden sonra ne yapılmalı?
ba-next-step-1 = Parolanızı güçlü ve benzersiz bir parolayla değiştirin.
faq2 = Bu ihlali bana bildirmeniz neden bu kadar uzun sürdü?
new-breaches-found =
{ $breachCount ->
[one] { $breachCount } YENİ İHLAL BULUNDU
*[other] { $breachCount } YENİ İHLAL BULUNDU
}
account-not-required = { -brand-fxa } için { -brand-name } tarayıcısı gerekmez. Size { -brand-Mozilla } hizmetleri hakkında bilgi gönderebiliriz.
get-alerted = Yeni ihlallerden haberdar olun.
no-other-breaches-found = Temel aramada başka bir ihlal bulunamadı.
no-results-blurb = Üzgünüz, bu ihlal veritabanımızda yok.
@ -414,15 +450,67 @@ all-breaches = Tüm ihlaller
error-bot-headline = Arama geçici olarak kullanılamıyor
error-csrf-headline = Oturum zaman aşımına uğradı
error-csrf-blurb = Tarayıcınızın geri düğmesine tıklayın, sayfayı tazeleyin ve tekrar deneyin.
login-link-pre = Hesabınız var var?
login-link = Giriş yap
# This string is displayed under a large numeral that indicates the total number
# of email address a user has signed up for monitoring. Dont add $emails to
# your localization, because it would result in the number showing twice.
email-addresses-being-monitored =
{ $emails ->
[one] e-posta adresi izleniyor
*[other] e-posta adresi izleniyor
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that have exposed the users information. Dont add $breaches to
# your localization, because it would result in the number showing twice.
data-breaches-exposed =
{ $breaches ->
[one] veri ihlalinde bilgileriniz ele geçirilmiş
*[other] veri ihlalinde bilgileriniz ele geçirilmiş
}
# This string is displayed under a large numeral that indicates the total number
# of data breaches that exposed a users password. Dont add $passwords to
# your localization, because it would result in the number showing twice.
passwords-exposed =
{ $passwords ->
[one] parolanız ihlallerde ele geçirilmiş
*[other] parolanız ihlallerde ele geçirilmiş
}
# Button
see-additional-breaches = Diğer ihlallere bakın
# This string is shown at the top of the scan results page and is followed
# by the email address that the user searched.
# In page, it reads "Results for: searchedEmail@monitor.com"
results-for = { $userEmail } sonuçları
other-monitored-emails = İzlenen diğer e-postalar
email-verification-required = E-posta doğrulaması gerekiyor
fxa-primary-email = { -brand-fxa } e-postası - birincil
see-if-youve-been-part = Çevrimiçi veri ihlallerinde verilerinizin çalınmış olabilir mi? Hemen öğrenin.
get-ongoing-breach-monitoring = İstediğiniz sayıda e-posta adresinin ihlallerini sürekli olarak takip edin.
# This is a button and follows a headline reading "Was your info exposed in the ___ breach?"
find-out = Öğrenin
# This string appears on breach detail pages and is followed by a list
# of data classes that the breach exposed.
additional-information-including = Ek bilgiler:
# Title
email-addresses-title = E-posta adresi
# This is a standardized breach overview blurb that appears on all breach detail pages.
# $breachTitle is the name of the breached company or website.
# $breachDate and $addedDate are calendar dates.
breach-overview = { $breachDate } tarihinde { $breachTitle } bir veri ihlaline uğradı. İhlal keşfedildikten ve doğrulandıktan sonra { $addedDate } tarihinde veritabanımıza eklendi.
# Title appearing on the Preferences dashboard.
monitor-preferences = { -product-short-name } tercihleri
# When a user is signed in, this appears in the drop down menu
# and is followed by the user's primary Firefox Account email.
signed-in-as = { $userEmail } olarak giriş yapıldı
# Appears on the All Breaches page and is followed by a list of filter options
# that a user can filter the visible breaches by.
filter-by = Kategoriye göre filtrele:
# Title that appears in the mobile menu bar and opens the mobile menu when clicked.
menu = Menü
to-affected-email = İhlal uyarılarını etkilenen e-posta adresine gönder
# This string appears in a banner at the top of each page and is followed by a "Learn More" link.
join-firefox = Gizliliğinizi korumanın bir yolu var. { -brand-name }a katılın.
# Link title
learn-more-link = Daha fazla bilgi alın.

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

@ -5,6 +5,7 @@
# - Translated.
-product-name = Firefox Monitor
-product-name-nowrap = <span class="nowrap">{ -product-name }</span>
-product-short-name = Monitor
-brand-name = Firefox
-brand-Quantum = Firefox Quantum
-brand-Mozilla = Mozilla
@ -356,3 +357,48 @@ create-free-account =
get-your-report-and-sign-up = Отримайте свій звіт і підпишіться на отримання попереджень.
# Link title
frequently-asked-questions = Часті питання
about-firefox-monitor = Про { -product-name }
mozilla-dot-org = Mozilla.org
preferences = Налаштування
# Link title.
home = Домівка
# Link title
breaches = Витік даних
# Link title
security-tips = Поради щодо безпеки
fxa-account = { -brand-fxa }
# Aria button message to open menu. "Open Firefox Account Navigation"
open-fxa-menu = Відкрийте { -brand-fxa }
breach-added = Повідомлення про витік даних:
breach-discovered = Виявлено витік даних:
# Link title
more-about-this-breach = Докладніше про цей витік даних
take-control = Відновіть контроль над особистими даними.
cant-stop-hackers = Ви не можете зупинити хакерів. Але ви можете позбутися шкідливих звичок, які полегшують їхню роботу.
read-more-tips = Прочитайте більше порад щодо безпеки
how-hackers-work = Зрозумійте, як працюють хакери
monitor-your-online-accounts = Підпишіться на повідомлення про витік даних за допомогою { -brand-fxa }.
stay-alert = Дізнавайтеся про нові витоки даних
if-your-info = Якщо ваша інформація опиниться в новому витоку даних, ми надішлемо вам повідомлення.
search-all-emails = Перевірте всі ваші адреси електронної пошти та отримуйте повідомлення про нові загрози.
monitor-several-emails = Відслідковуйте декілька адрес електронної пошти
take-action = Вживайте заходів для захисту своїх облікових записів
keep-your-data-safe = Дізнайтеся, що потрібно зробити для збереження ваших даних від кіберзлочинців.
website-breach = Витік даних із сайту
sensitive-breach = Витік конфіденційної інформації з сайту
data-aggregator-breach = Витік даних з агрегатора
unverified-breach = Непідтверджений витік даних
spam-list-breach = Витік списку надсилання спаму
website-breach-plural = Витоки даних із сайту
sensitive-breach-plural = Витоки конфіденційної інформації
data-aggregator-breach-plural = Витоки даних з агрегатора
unverified-breach-plural = Непідтверджені витоки даних
spam-list-breach-plural = Витоки списку надсилання спаму
what-data = Які дані скомпрометовані:
sensitive-sites = Як { -product-name } ставиться до сайтів з конфіденційною інформацією?
## What to do after data breach tips
## Updated error messages

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

@ -12,6 +12,9 @@ avatars = Аватари
bank-account-numbers = Номери банківських рахунків
beauty-ratings = Оцінки краси
biometric-data = Біометричні дані
# This string is the shortened version of "Biographies", and
# refers to biographical data about a user.
bios = Біографії
browser-user-agent-details = Подробиці про user agent браузера
browsing-histories = Історія перегляду
buying-preferences = Вподобання покупок
@ -37,6 +40,7 @@ education-levels = Рівні освіти
email-addresses = Адреси електронної пошти
email-messages = Повідомлення електронної пошти
employers = Роботодавці
employment-statuses = Статуси зайнятості
ethnicities = Етнічні приналежності
family-members-names = Імена родичів
family-plans = Сімейні плани
@ -101,6 +105,7 @@ smoking-habits = Куріння
sms-messages = SMS-повідомлення
social-connections = Соціальні зв'язки
social-media-profiles = Профілі соціальних мереж
social-security-numbers = Номери соціального страхування
spoken-languages = Знання мов
support-tickets = Запити в службу підтримки
survey-results = Результати опитування

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

@ -26,6 +26,7 @@ error-not-subscribed = 此电子邮件地址未订阅 { -product-name }。
error-hibp-throttled = 与 { -brand-HIBP } 的连接过多。
error-hibp-connect = 连接 { -brand-HIBP } 时出错。
error-hibp-load-breaches = 未能加载泄露信息。
error-must-be-signed-in = 您必须先登录 { -brand-fxa }。
hibp-notify-email-subject = { -product-name } 警报:您的账号信息已遭泄露。
home-title = { -product-name }
home-not-found = 找不到网页。

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

@ -26,6 +26,7 @@ error-not-subscribed = 此電子郵件地址未訂閱 { -product-name }。
error-hibp-throttled = 與 { -brand-HIBP } 的連線太多。
error-hibp-connect = 連線到 { -brand-HIBP } 時發生錯誤。
error-hibp-load-breaches = 無法載入資料外洩資訊。
error-must-be-signed-in = 您必須先登入 { -brand-fxa }。
hibp-notify-email-subject = { -product-name } 警告: 您的帳號資料已遭外洩。
home-title = { -product-name }
home-not-found = 找不到頁面。

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

@ -91,10 +91,11 @@
"scripts": {
"js:minify": "minify public/dist/app.min.js -o public/dist/app.min.js",
"js:concat": "concat -o public/dist/app.min.js public/js/*.js",
"js:allBreaches": "minify public/js/all-breaches/all-breaches.js -o public/dist/all-breaches.min.js",
"css:minify": "cleancss -o public/dist/app.min.css public/dist/app.min.css",
"css:concat": "concat -o public/dist/app.min.css public/css/*.css",
"build:css": "run-s css:concat css:minify",
"build:js": "run-s js:concat js:minify",
"build:js": "run-s js:concat js:allBreaches js:minify",
"build:polyfills": "minify public/js/polyfills/edge.js -o public/dist/edge.min.js",
"watch:js": "onchange 'public/js/monitor.js' -- npm run build:js",
"watch:css": "onchange 'public/css/*.css' -- npm run build:css",

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

@ -1,8 +1,13 @@
main.all-breaches-main {
.all-breaches-main {
min-height: auto;
color: var(--grey1);
}
span.x-close-bg,
svg.x-close {
pointer-events: none;
}
.hide-breaches,
.lazy-img {
opacity: 0;
@ -28,7 +33,7 @@ main.all-breaches-main {
flex-direction: column;
}
button#show-all-breaches {
button.fuzzy-find-show-breaches {
position: absolute;
right: 1rem;
bottom: 0;
@ -45,6 +50,12 @@ button#show-all-breaches {
transition: opacity 0.15s ease-in-out;
}
.show-all-breaches.violet-btn {
align-items: center;
max-width: 260px;
margin: var(--padding) auto calc(var(--padding) * 3) auto;
}
#no-results-blurb {
pointer-events: none;
opacity: 0;
@ -85,7 +96,7 @@ button#show-all-breaches {
transition: all 0.15s ease-in-out;
}
button#show-all-breaches.show {
button.fuzzy-find-show-breaches.show {
opacity: 1;
transition: opacity 0.15s ease-in-out;
}
@ -199,60 +210,6 @@ input#fuzzy-find-input {
margin: 1rem;
}
/* back-to-top-bar */
.back-to-top-bar {
display: flex;
position: fixed;
top: 0;
left: 0;
right: 0;
justify-content: center;
background-color: var(--color);
box-shadow: 2px 2px 10px rgba(247, 247, 247, 0);
z-index: 100;
padding: var(--padding);
transform: translateY(-100%);
transition: transform 0.3s ease;
}
button.back-to-top {
border: none;
padding: 0;
position: absolute;
right: calc(var(--padding) * 2);
top: 0;
bottom: 0;
display: flex;
justify-content: center;
align-content: center;
flex-direction: column;
color: rgba(255, 255, 255, 1);
}
button.back-to-top svg {
display: block;
transform: rotate(270deg);
border: 2px solid var(--grey2);
height: 30px;
width: 30px;
padding: 6px;
border-radius: 4rem;
margin: 0 auto 0.5rem auto;
}
button.back-to-top:focus,
button.back-to-top:hover {
box-shadow: none !important;
border: none !important;
}
.back-to-top-bar.show-bar {
box-shadow: 2px 2px 10px rgb(24, 24, 24);
transform: translateY(0);
padding: 4rem;
transition: transform 0.3s ease, box-shadow 0.15s ease;
}
.plus-sign-wrap {
display: flex;
background-color: rgba(0, 0, 0, 0.07);
@ -275,7 +232,7 @@ button.back-to-top:hover {
@media screen and (max-width: 1000px) {
.ab.breach-card.three-up {
flex: 1 1 45%;
max-width: 460px;
max-width: 45%;
}
}
@ -284,31 +241,9 @@ button.back-to-top:hover {
padding: var(--padding);
}
.back-to-top-bar {
flex-direction: column;
}
.ab.breach-card.three-up {
max-width: 100%;
margin: 0.5rem auto;
flex: 1 1 100%;
}
button.back-to-top {
flex-direction: row;
justify-content: flex-start;
align-items: center;
position: relative;
right: auto;
margin-top: var(--margin);
}
button.back-to-top svg {
margin: 0;
display: inline-block;
height: 20px;
width: 20px;
padding: 3px;
margin-right: var(--margin);
}
}

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

@ -70,6 +70,8 @@ body {
min-height: 100vh;
width: 100vw;
-webkit-overflow-scrolling: touch;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.cool-gradient {
@ -556,7 +558,7 @@ div.sprite {
}
.clear-header {
padding-top: 14rem;
padding-top: 16rem;
}
.hide-mobile {

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

@ -134,10 +134,6 @@ main.breach-detail {
}
@media screen and (max-width: 600px) {
.col-8.breach-details {
margin-top: 2rem !important;
}
.what-to-do-tips h2.section-headline-light {
text-align: center;
margin-left: auto;

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

@ -176,10 +176,6 @@ p.confirm-submit {
margin-bottom: 0;
}
.dashboard.clear-header {
padding-top: 12rem;
}
.welcome-back,
.section-headline.dash {
font-size: 1.1rem;

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

@ -6,12 +6,34 @@ header {
background-color: var(--color);
z-index: 2;
box-shadow: 0 0 5px 0 #20123a1c;
transition: box-shadow 0.2s ease;
transition: all 0.2s ease;
}
header.show-shadow {
box-shadow: 2px 2px 10px rgba(24, 24, 24, 0.75);
transition: box-shadow 0.2s ease;
transition: all 0.2s ease;
}
.show-nav-bars {
transform: translateY(0);
-webkit-transform: translateY(0);
transform-origin: top;
opacity: 1;
max-height: 200px;
transition: all 0.3s ease;
}
.hide-nav-bars {
transform: translateY(-60px);
-webkit-transform: translateY(-60px);
transform-origin: top;
opacity: 0;
max-height: 0;
transition: all 0.3s ease;
}
.fxm-branding {
position: relative;
}
.fx-monitor {
@ -48,29 +70,30 @@ nav {
background-color: rgba(255, 255, 255, 0);
padding-right: calc(1rem + 1vw);
padding-left: calc(1rem + 1vw);
text-align: center;
justify-content: center;
font-size: 1rem;
color: rgba(255, 255, 255, 0.9);
}
.nav-link.active-link {
.active-link {
font-weight: 700;
position: relative;
}
.nav-link.active-link::after {
width: 50%;
.active-link-underline::after {
height: 0.15rem;
background-image: var(--monitorGradient);
max-width: 6rem;
background: var(--monitorGradient);
opacity: 0;
display: block;
content: "";
position: absolute;
bottom: -10px;
left: 0;
right: 0;
margin: auto;
}
.active-link-underline.active-link::after {
opacity: 1;
transition: opacity 0.15s ease-in-out;
}
.drop-down-menu {
@ -130,22 +153,6 @@ nav {
font-size: 1.1rem;
}
/* mobile-menu */
.mobile-menu {
padding: 0 1rem;
}
.mobile-menu .nav-link {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
flex: 1 1 auto;
}
.mobile-menu .nav-link:hover {
background-color: var(--color);
transition: background-color 0.15s ease-in-out;
}
/* signed-in user avatar */
.avatar-wrapper {
border-radius: 50%;
@ -251,32 +258,149 @@ nav {
}
.fxa-menu-link:hover {
background-color: rgba(155, 155, 165, 0.06);
background-color: rgba(155, 155, 165, 0.15);
transition: all 0.15s ease;
}
.top-bar {
z-index: 1;
position: relative;
background-color: #1d1133;
padding: 1rem 1.75rem;
border-bottom: 1px solid #2b2156;
color: rgba(255, 255, 255, 1);
font-size: 16px;
}
.learn-more {
margin-left: 0.5rem;
color: rgba(255, 255, 255, 1);
text-decoration: underline;
white-space: nowrap;
}
.join-fx-wrap {
align-items: center;
}
.join-fx-img {
content: "";
background-image: url("/img/firefox-master-logo.png");
background-repeat: no-repeat;
background-position: center center;
background-size: contain;
min-width: 24px;
height: 24px;
margin: auto 16px auto auto;
}
@media screen and (max-width: 800px) {
.fx-monitor {
font-size: 1.4rem;
.top-bar {
font-size: 14px;
}
.desktop-menu .nav-link {
display: none;
}
.nav-link.active-link::after {
.active-link::after {
display: none;
}
.mobile-nav {
visibility: visible;
background-color: #1c1033;
box-shadow: 0 2px 2px -1px #0202024d;
transition: all 0.2s ease;
padding: 0;
flex-wrap: wrap;
flex-direction: column;
position: relative;
cursor: pointer;
}
.mobile-menu a {
.mobile-menu a.nav-link {
color: rgba(255, 255, 255, 0.9);
padding-left: 0;
padding-right: 0;
padding: 0.75rem 1rem;
border-radius: 4px;
transition: all 0.15s ease-in-out;
}
.mobile-menu .nav-link:hover {
background-color: var(--color);
opacity: 1;
transition: all 0.15s ease-in-out;
}
.mobile-menu {
margin: auto;
border-radius: 0;
flex-direction: column;
flex-wrap: wrap;
visibility: hidden;
padding: 0 1.75rem;
max-height: 0;
position: absolute;
top: 0;
left: 0;
right: 0;
background-color: var(--inkLight);
z-index: 0;
color: rgba(255, 255, 255, 0);
-webkit-user-select: none;
transition: all 0.25s ease;
}
.mobile-menu-open .mobile-menu {
top: 3rem;
max-height: 1000px;
visibility: visible;
color: rgba(255, 255, 255, 1);
padding-top: 1rem;
padding-bottom: 1rem;
transition: all 0.15s ease;
}
.nav-link.drop-down-menu,
.mobile-menu-open .nav-link {
display: block;
}
.nav-link.drop-down-menu {
-webkit-user-select: none;
pointer-events: none;
padding: 1rem 2.75rem;
background-color: var(--inkLight);
width: 100%;
z-index: 1;
border-bottom: 1px solid var(--inkLight);
transition: border-bottom 0.15s ease;
}
.mobile-menu-open .drop-down-menu {
border-bottom: 1px solid var(--color);
transition: border-bottom 0.15s ease;
}
.mobile-menu-open svg.toggle-down {
transform: rotate(180deg);
transition: transform 0.15s ease;
}
.drop-down-menu svg.toggle-down {
opacity: 0.7;
right: 2.75rem;
}
.drop-down-menu .toggle-down path {
fill: rgba(255, 255, 255, 1);
}
.nav-link {
padding-left: 2.75rem;
padding-right: 2.75rem;
text-align: left;
width: 100%;
}
}
@ -285,6 +409,15 @@ nav {
font-size: 1.25rem;
}
.drop-down-menu svg.toggle-down {
right: 2rem;
}
.top-bar {
text-align: left;
font-size: 12px;
}
.nav-user-email {
font-size: 1rem;
}
@ -301,39 +434,8 @@ nav {
padding: 0.75rem 1.35rem;
}
.mobile-nav {
padding: 0;
flex-wrap: wrap;
flex-direction: column;
position: relative;
cursor: pointer;
}
.mobile-menu {
margin: auto;
border-radius: 0;
flex-direction: column;
flex-wrap: wrap;
visibility: hidden;
padding: 0 1.5rem;
max-height: 0;
position: absolute;
top: 0;
left: 0;
right: 0;
background-color: var(--inkLight);
z-index: 0;
color: rgba(255, 255, 255, 0);
-webkit-user-select: none;
transition: all 0.25s ease;
}
.mobile-menu-open .mobile-menu {
top: 3rem;
max-height: 1000px;
visibility: visible;
color: rgba(255, 255, 255, 1);
transition: all 0.15s ease;
padding: 1rem 0.75rem;
}
.nav-link.drop-down-menu,
@ -341,44 +443,7 @@ nav {
display: block;
}
.nav-link.drop-down-menu,
.mobile-menu-open .mobile-menu {
.nav-link.drop-down-menu {
padding: 1rem 1.75rem;
}
.nav-link.drop-down-menu {
-webkit-user-select: none;
pointer-events: none;
background-color: var(--inkLight);
width: 100%;
z-index: 1;
border-bottom: 1px solid var(--inkLight);
transition: border-bottom 0.15s ease;
}
.drop-down-menu svg.toggle-down {
opacity: 0.7;
right: 2.35rem;
}
.mobile-menu-open .drop-down-menu {
border-bottom: 1px solid var(--color);
transition: border-bottom 0.15s ease;
}
.mobile-menu-open svg.toggle-down {
transform: rotate(180deg);
transition: transform 0.15s ease;
}
.drop-down-menu .toggle-down path {
fill: rgba(255, 255, 255, 1);
}
.nav-link {
padding-left: 1.75rem;
padding-right: 1.75rem;
text-align: left;
width: 100%;
}
}

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

@ -1,6 +1,5 @@
.monitor-homepage {
min-height: 92vh;
padding-top: 9rem;
background-color: var(--color);
background-image: url(/img/landing/background-noodle-top2.svg);
background-repeat: no-repeat;

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

@ -2,6 +2,12 @@
min-height: auto;
}
.articles .col-9 {
width: 100%;
max-width: 100%;
justify-content: center;
}
.security-tip-list-item {
align-items: flex-start;
margin-bottom: 1.75rem;
@ -150,10 +156,16 @@ body {
}
.article-wrapper {
padding-top: 10rem;
padding-top: 12rem;
padding-bottom: 0;
}
.article-wrapper,
.st-intro-wrap {
width: 75%;
margin: auto;
}
.article-headline {
color: var(--color);
font-size: 3rem;
@ -168,7 +180,7 @@ body {
opacity: 0.9;
}
.article-paragraph a {
a.st-copy-link {
color: var(--blue3);
}
@ -176,7 +188,7 @@ body {
color: var(--color);
}
.article-paragraph a:hover,
a.st-copy-link:hover,
a.st-link:hover {
text-decoration: underline;
}
@ -270,29 +282,116 @@ a.st-link {
.st-headline .bold {
display: block;
text-transform: uppercase;
font-size: 1.3rem;
}
.st-call-out {
margin: calc(var(--padding) * 2) auto;
border-radius: var(--radius);
border: 1px solid var(--grey3);
padding: var(--padding);
border-radius: 0.7rem;
background: var(--monitorGradient);
padding: 2px;
box-shadow: 0 0 10px 1px rgba(205, 205, 212, 0.78);
}
.inset {
background-color: var(--bgLight);
border-radius: 0.575rem;
padding: calc(var(--padding) * 2);
}
/* password dos and don't list */
.password-tip-list-wrapper {
display: none; /* figure out how to make this work this week */
border-radius: var(--radius);
border: 1px solid var(--borderColor);
.pw-tip-item {
width: 100%;
}
.pw-tip-item.flx:nth-child(odd) {
background-color: rgba(32, 18, 58, 0.031);
}
.pw-do-hl,
.pw-do {
border-right: 1px solid var(--grey2);
}
.pw-tip-headlines {
position: relative;
}
.pw-tip-headlines::after {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 3px;
display: block;
content: "";
background: var(--monitorGradient);
}
.pw-tip-headlines,
.do-dont-hl {
width: 100%;
}
.do-dont-hl {
padding: 2rem 1rem;
flex: 1 1 50%;
}
.do-dont-hl h4 {
align-items: center;
font-size: 1.5rem;
position: relative;
color: var(--blue5);
}
.icon-dont::before {
background-image: url("/img/svg/x-close-red.svg");
}
.icon-do::before {
background-image: url("/img/svg/green-check.svg");
}
.icon-do::before,
.icon-dont::before {
left: -2.5rem;
content: "";
width: 2rem;
height: 2rem;
background-size: contain;
background-position: center center;
display: inline-block;
position: absolute;
}
.do-dont-wrap {
padding: var(--padding);
flex: 1 1 50%;
}
.do-dont {
width: 80%;
line-height: 150%;
font-size: 1.1rem;
font-weight: 500;
color: var(--color);
}
.password-tip-list {
flex-wrap: wrap;
}
.pw-tip-table {
border-radius: 0.7rem;
box-shadow: 0 0 10px 1px rgba(205, 205, 212, 0.78);
}
.password-tip-list-headline {
text-align: center;
padding: var(--padding) var(--padding) 0 var(--padding);
font-weight: 800;
color: var(--color);
letter-spacing: 1px;
padding: calc(var(--padding) * 2) var(--padding);
margin-bottom: 0;
font-size: 2.25rem;
}
.do-list-item,
@ -317,32 +416,6 @@ a.st-link {
transition: background-color 0.15s ease-in-out;
}
li.do-list-item:first-of-type,
li.dont-list-item:first-of-type {
text-align: center;
justify-content: center;
border-top: 1px solid var(--borderColor);
font-family: "FirefoxSharpSans", 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
font-weight: 700;
letter-spacing: 1px;
}
li.dont-list-item,
li.do-list-item {
border-bottom: 1px solid #eee;
}
li.do-list-item:first-of-type {
border-bottom: 3px solid green;
border-right: 1px solid var(--borderColor);
}
li.dont-list-item:first-of-type {
border-bottom: 3px solid var(--alertRed);
background-color: var(--color);
color: white;
}
.article-toggle svg.toggle-down {
display: none;
}
@ -372,6 +445,28 @@ li.dont-list-item:first-of-type {
}
@media screen and (max-width: 800px) {
.pw-tip-headlines::after {
display: none;
}
.do-dont-wrap {
flex: 1 1 100% !important;
border: none;
}
.pw-tip-table {
background-color: rgba(0, 0, 0, 0);
box-shadow: none;
}
.pw-tip-item {
flex-direction: column;
margin-bottom: 3rem;
border-radius: 0.7rem;
overflow: hidden;
border: none !important;
}
.security-tips-headline {
font-size: var(--headline);
}
@ -379,10 +474,62 @@ li.dont-list-item:first-of-type {
.security-tip-link {
font-size: 1rem;
}
.article-wrapper,
.st-intro-wrap {
width: 100%;
max-width: 100%;
}
.do-dont-hl-mobile {
position: relative;
font-weight: bold;
font-size: 1.25rem;
margin-bottom: 0.25rem;
color: var(--blue5);
}
.do-dont-hl-mobile::before {
width: 1.5rem;
height: 1.5rem;
left: -2.15rem;
}
.do-dont-hl {
display: none;
}
.do-dont {
text-align: left;
display: flex;
flex-direction: column;
}
.pw-do {
background-color: rgba(255, 255, 255, 1);
}
.pw-dont {
position: relative;
background-color: rgba(32, 18, 58, 0.05);
}
.pw-dont::before {
width: 1.25rem;
height: 1.25rem;
background-color: white;
display: block;
content: "";
position: absolute;
top: -0.75rem;
transform: rotate(45deg);
}
}
@media screen and (max-width: 600px) { /* some articles become toggled closed */
.st-intro {
.st-intro,
.article-list-item,
.article-paragraph {
font-size: 1rem;
}
@ -395,11 +542,6 @@ li.dont-list-item:first-of-type {
font-size: var(--headline);
}
.article-list-item,
.article-paragraph {
font-size: 1rem;
}
.drop-cap {
font-size: 28px;
padding-right: 1px;
@ -430,6 +572,10 @@ li.dont-list-item:first-of-type {
margin: 1rem 0;
}
.st-icon {
display: none;
}
.st-next-steps .st-toggle-wrapper {
border: 1px solid var(--grey8);
border-radius: 0.25rem;
@ -473,4 +619,16 @@ li.dont-list-item:first-of-type {
.logo-title-wrapper .arrow-head-right {
margin-left: 0;
}
.do-dont-wrap {
padding: calc(var(--padding) * 2) var(--margin);
}
.st-subhead {
padding: 1rem 0;
}
.st-call-out {
margin: calc(var(--padding) * 3) auto;
}
}

Двоичные данные
public/img/firefox-master-logo.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.7 KiB

Двоичные данные
public/img/firefox-monitor.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 36 KiB

После

Ширина:  |  Высота:  |  Размер: 23 KiB

Двоичные данные
public/img/logos/Elance.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

После

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Двоичные данные
public/img/logos/List.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.8 KiB

После

Ширина:  |  Высота:  |  Размер: 2.1 KiB

Двоичные данные
public/img/logos/PaddyPower.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.1 KiB

После

Ширина:  |  Высота:  |  Размер: 3.3 KiB

Двоичные данные
public/img/logos/Staminus.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 2.1 KiB

После

Ширина:  |  Высота:  |  Размер: 2.7 KiB

Двоичные данные
public/img/logos/WPSandbox.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.3 KiB

После

Ширина:  |  Высота:  |  Размер: 2.1 KiB

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

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><path fill="#54ffbd" d="M6 14a1 1 0 0 1-.707-.293l-3-3a1 1 0 0 1 1.414-1.414l2.157 2.157 6.316-9.023a1 1 0 0 1 1.639 1.146l-7 10a1 1 0 0 1-.732.427A.863.863 0 0 1 6 14z"></path></svg>

После

Ширина:  |  Высота:  |  Размер: 267 B

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

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" class="x-close" width="16" height="16" viewBox="0 0 16 16"><path fill="#ff4f5e" d="M9.061 8l3.47-3.47a.75.75 0 0 0-1.061-1.06L8 6.939 4.53 3.47a.75.75 0 1 0-1.06 1.06L6.939 8 3.47 11.47a.75.75 0 1 0 1.06 1.06L8 9.061l3.47 3.47a.75.75 0 0 0 1.06-1.061z"></path></svg>

После

Ширина:  |  Высота:  |  Размер: 307 B

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

@ -1,11 +1,16 @@
"use strict";
function replaceLogo(e) {
e.target.src = "/img/logos/missing-logo-icon.png";
e.target.removeEventListener("error", replaceLogo);
return true;
}
function breachImages() {
this.active = false;
this.lazyLoad = () => {
let lazyImages = [].slice.call(document.querySelectorAll(".lazy-img"));
if (this.active === false) {
const lazyImages = [].slice.call(document.querySelectorAll(".lazy-img"));
if (!this.active) {
this.active = true;
const winHeight = window.innerHeight;
lazyImages.forEach(lazyImage => {
@ -13,11 +18,8 @@ function breachImages() {
lazyImage.classList.add("lazy-loaded");
lazyImage.classList.remove("lazy-img");
lazyImage.src = lazyImage.dataset.src;
lazyImage.srcset = lazyImage.dataset.srcset;
lazyImage.addEventListener("error", replaceLogo);
lazyImages = lazyImages.filter(image => {
return image !== lazyImage;
});
if (lazyImages.length === 0) {
document.removeEventListener("scroll", this.lazyLoad);
window.removeEventListener("resize", this.lazyLoad);
@ -51,28 +53,27 @@ function clearBreaches(wrapper) {
}
}
function makeBreaches(breachArray, breachCardWrapper) {
function makeBreaches(breaches, LocalizedBreachCardStrings, breachCardWrapper, breachLogos) {
breachCardWrapper.classList.toggle("hide-breaches");
clearBreaches(breachCardWrapper);
const fragment = document.createDocumentFragment();
fragment["id"] = "all-breaches";
for (const breach of breachArray) {
for (const breach of breaches) {
const card = document.createElement("a");
card["classList"] = `breach-card ${breach.Category} three-up ab drop-shadow`;
card["classList"] = "breach-card three-up ab drop-shadow";
card["href"] = `/breach-details/${breach.Name}`;
card["data-breach-title"] = breach.Title;
fragment.appendChild(card);
const logoWrapper = makeDiv("breach-logo-wrapper", card);
const breachLogo = document.createElement("img");
breachLogo["alt"] = "";
breachLogo["classList"] = "breach-logo lazy-img";
breachLogo.dataset.srcset = `/img/logos/${breach.LogoPath}`;
breachLogo.dataset.src = `/img/logos/${breach.LogoPath}`;
breachLogo.src = "/img/logos/lazyPlaceHolder.png";
logoWrapper.appendChild(breachLogo);
@ -84,134 +85,113 @@ function makeBreaches(breachArray, breachCardWrapper) {
makeBreachInfoSpans("breach-title", breach.Title, wrapper);
// added date
makeBreachInfoSpans("breach-key", breach.String.AddedDate, wrapper);
makeBreachInfoSpans("breach-key", LocalizedBreachCardStrings.BreachAdded, wrapper);
makeBreachInfoSpans("breach-value", breach.AddedDate, wrapper);
// compromised accounts
makeBreachInfoSpans("breach-key", breach.String.CompromisedAccounts, wrapper);
makeBreachInfoSpans("breach-key", LocalizedBreachCardStrings.CompromisedAccounts, wrapper);
makeBreachInfoSpans("breach-value", breach.PwnCount, wrapper);
// compromised data
makeBreachInfoSpans("breach-key", breach.String.CompromisedData, wrapper);
makeBreachInfoSpans("breach-key", LocalizedBreachCardStrings.CompromisedData, wrapper);
makeBreachInfoSpans("breach-value", breach.DataClasses, wrapper);
// add link at bottom of card
wrapper = makeDiv("breach-card-link-wrap", breachInfoWrapper);
makeBreachInfoSpans("more-about-this-breach", breach.String.MoreInfoLink, wrapper);
makeBreachInfoSpans("more-about-this-breach", LocalizedBreachCardStrings.MoreInfoLink, wrapper);
}
breachCardWrapper.appendChild(fragment);
breachCardWrapper.classList.toggle("hide-breaches");
const breachLogos = new breachImages();
breachLogos.lazyLoad();
document.addEventListener("scroll", breachLogos.lazyLoad);
window.addEventListener("resize", breachLogos.lazyLoad);
window.addEventListener("orientationchange", breachLogos.lazyLoad);
return breachArray;
const loader = document.getElementById("breaches-loader");
loader.classList = ["hide"];
return breaches;
}
(async() => {
if (document.getElementById("all-breaches")) {
const breachCardWrapper = document.getElementById("all-breaches");
function initBreaches() {
const breachCardWrapper = document.querySelector("#all-breaches");
if (breachCardWrapper) {
const breachWrapper = document.getElementById("breach-array-json");
const {LocalizedBreachCardStrings, breaches} = JSON.parse(breachWrapper.dataset.breachArray);
const breachArray = JSON.parse(breachWrapper.dataset.breachArray);
const breachLogos = new breachImages();
document.addEventListener("scroll", breachLogos.lazyLoad);
window.addEventListener("resize", breachLogos.lazyLoad);
window.addEventListener("orientationchange", breachLogos.lazyLoad);
makeBreaches(breachArray, breachCardWrapper);
document.onreadystatechange = () => {
if (document.readyState === "complete") {
const loader = document.getElementById("breaches-loader");
loader.classList.add("hide");
}
const doBreaches = (arr) => {
makeBreaches(arr, LocalizedBreachCardStrings, breachCardWrapper, breachLogos);
};
const showAllBreaches = document.getElementById("show-all-breaches");
const firstFifteen = breaches.slice(0,15);
doBreaches(firstFifteen);
const noResultsBlurb = document.getElementById("no-results-blurb");
const fuzzyFindInput = document.getElementById("fuzzy-find-input");
const fuzzyFinder = document.getElementById("fuzzy-form");
showAllBreaches.addEventListener("click", (e) => {
e.preventDefault();
fuzzyFindInput.value = "";
makeBreaches(breachArray, breachCardWrapper);
showAllBreaches.classList = ["show-all-breaches"];
noResultsBlurb.classList = "";
return false;
const [fuzzyShowAll, showHiddenBreaches] = document.querySelectorAll(".show-all-breaches");
showHiddenBreaches.addEventListener("click", (e) => {
doBreaches(breaches);
showHiddenBreaches.classList.add("hide");
});
const win = window;
const backToTopBar = document.getElementById("back-to-top-bar");
win.onscroll = function(e) {
if (win.pageYOffset < 400) {
if (backToTopBar.classList.contains("show-bar")) {
backToTopBar.classList.remove("show-bar");
}
return;
}
if ((this.oldScroll > this.scrollY + 50) && win.pageYOffset > 1000) {
if (!backToTopBar.classList.contains("show-bar") && !backToTopBar.classList.contains("to-top")) {
backToTopBar.classList.add("show-bar");
}
}
if (this.oldScroll < this.scrollY && backToTopBar.classList.contains("show-bar")) {
backToTopBar.classList.remove("show-bar");
}
this.oldScroll = this.scrollY;
};
const backToTopButton = document.getElementById("back-to-top");
backToTopButton.addEventListener("click", () => {
window.scrollTo(0, 0);
fuzzyShowAll.addEventListener("click", (e) => {
e.preventDefault();
fuzzyFindInput.value = "";
doBreaches(breaches);
noResultsBlurb.classList = [""];
fuzzyShowAll.classList = ["fuzzy-find-show-breaches"];
});
const searchBreaches = (e) => {
e.preventDefault();
e.stopImmediatePropagation();
// hide purple "Show All" button
// show button to clear fuzzy input
showHiddenBreaches.classList = ["hide"];
fuzzyShowAll.classList = ["fuzzy-find-show-breaches show"];
const breachSearchTerm = fuzzyFindInput.value.toLowerCase();
// filter breach array by search term
const filteredBreachArray = breachArray.filter(breach => {
const filteredBreachArray = breaches.filter(breach => {
return breach.Title.toLowerCase().startsWith(breachSearchTerm);
});
// if hitting enter off a zero results search, restore breaches
// and clear out input
if (e.keyCode === 13) {
if (noResultsBlurb.classList.contains("show")) {
makeBreaches(breachArray, breachCardWrapper);
noResultsBlurb.classList = "";
showAllBreaches.classList = ["show-all-breaches"];
fuzzyFindInput.value = "";
return false;
}
makeBreaches(filteredBreachArray, breachCardWrapper);
if (e.keyCode === 13 && noResultsBlurb.classList.contains("show")) {
doBreaches(breaches);
noResultsBlurb.classList.remove("show");
fuzzyShowAll.classList.remove("show");
fuzzyFindInput.value = "";
return false;
}
// if no results, show "no results message"
// otherwise make sure it isn't showing
if (filteredBreachArray.length === 0) {
noResultsBlurb.classList.add("show");
} else {
noResultsBlurb.classList = "";
noResultsBlurb.classList = [""];
}
makeBreaches(filteredBreachArray, breachCardWrapper);
doBreaches(filteredBreachArray);
return false;
};
fuzzyFinder.addEventListener("keydown", (e) => {
if (fuzzyFindInput.value.length !== 0 ) {
showAllBreaches.classList.add("show");
}
if (e.keyCode === 13) {
showAllBreaches.classList = ["show-all-breaches"];
}
});
fuzzyFinder.addEventListener("keyup", searchBreaches);
fuzzyFinder.addEventListener("submit", searchBreaches);
}
})();
}
document.onreadystatechange = () => {
if (document.readyState === "interactive") {
initBreaches();
}
};

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

@ -136,8 +136,38 @@ function toggleArticles() {
});
}
function toggleMobileFeatures() {
const windowWidth = window.innerWidth;
function hideShowNavBars(win, navBar) {
win.onscroll = function(e) {
// catch a window that has resized from less than 600px
// to greater than 600px and unhide navigation.
if (win.innerWidth > 600) {
navBar.classList = ["show-nav-bars"];
return;
}
if (win.pageYOffset < 100) {
navBar.classList = ["show-nav-bars"];
return;
}
if (this.oldScroll < this.scrollY) {
navBar.classList = ["hide-nav-bars"];
this.oldScroll = this.scrollY;
return;
}
if (this.oldScroll > this.scrollY + 50) {
navBar.classList = ["show-nav-bars"];
this.oldScroll = this.scrollY;
return;
}
this.oldScroll = this.scrollY;
};
}
function toggleMobileFeatures(topNavBar) {
const win = window;
const windowWidth = win.innerWidth;
if (windowWidth > 800) {
const emailCards = document.querySelectorAll(".col-9.email-card:not(.zero-breaches)");
emailCards.forEach(card => {
@ -150,6 +180,10 @@ function toggleMobileFeatures() {
closeActiveEmailCards.forEach(card => {
card.classList.remove("active");
});
if (windowWidth < 600) {
hideShowNavBars(win, topNavBar);
}
}
function toggleHeaderStates(header, win) {
@ -160,41 +194,50 @@ function toggleHeaderStates(header, win) {
}
}
function styleActiveLink(locationHref) {
let queryString = `.nav-link[href='${locationHref}']`;
const activeLink = document.querySelector(queryString);
if (activeLink) {
return activeLink.firstChild.classList.add("active-link");
}
if (locationHref.indexOf("/dashboard") !== -1) {
queryString = queryString.replace("user/dashboard", "");
return document.querySelector(queryString).firstChild.classList.add("active-link");
}
if (locationHref.indexOf("/security-tips") !== -1) {
return document.querySelector(".nav-link[href*='/security-tips']").firstChild.classList.add("active-link");
}
}
( async() => {
document.addEventListener("touchstart", function(){}, true);
const win = window;
const header = document.getElementById("header");
const topNavigation = document.querySelector("#navigation-wrapper");
win.addEventListener("pageshow", function() {
const previousActiveLink = document.querySelector(".active-link");
if (previousActiveLink) {
previousActiveLink.classList.remove("active-link");
}
const navLinks = document.querySelectorAll(".nav-link");
navLinks.forEach(link => {
if (link.href === win.location.href) {
link.classList.add("active-link");
}
});
styleActiveLink(win.location.href);
if (win.location.search.includes("utm_") && win.history.replaceState) {
win.history.replaceState({}, "", win.location.toString().replace(/[?&]utm_.*/g, ""));
}
toggleMobileFeatures();
toggleMobileFeatures(topNavigation);
toggleArticles();
toggleHeaderStates(header, win);
document.forms ? (restoreInputs(), addFormListeners()) : null;
});
// toggleMobileFeatures();
win.addEventListener("resize", () => {
toggleMobileFeatures();
toggleMobileFeatures(topNavigation);
toggleArticles();
});
document.addEventListener("scroll", () => toggleHeaderStates(header, win));
document.querySelectorAll(".breach-img").forEach(logo => {
document.querySelectorAll(".breach-logo:not(.lazy-img)").forEach(logo => {
logo.addEventListener("error", (missingLogo) => {
missingLogo.target.src = "/img/logos/missing-logo-icon.png";
});

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

@ -33,7 +33,7 @@ const articleCopy = {
{
subhead: "What makes a password easy to guess.",
paragraphs: [
"If hackers can get a list of email addresses from a data breach, they already have a good start. All they have to do is pick their website of choice and try these emails with the most popular passwords. Chances are, theyll be able to get into quite a few accounts. So dont use any of these <a href='https://www.teamsid.com/splashdatas-top-100-worst-passwords-of-2018/' class='worst-passwords' rel='noopener noreferrer'>100 Worst Passwords of 2018.</a>",
"If hackers can get a list of email addresses from a data breach, they already have a good start. All they have to do is pick their website of choice and try these emails with the most popular passwords. Chances are, theyll be able to get into quite a few accounts. So dont use any of these <a class='st-copy-link' href='https://www.teamsid.com/splashdatas-top-100-worst-passwords-of-2018/' class='worst-passwords' rel='noopener noreferrer'>100 Worst Passwords of 2018.</a>",
],
list: [
"123456 and password are the most commonly used passwords. Dont use them.",
@ -121,6 +121,29 @@ const articleCopy = {
"A single word with one letter changed to an @ or ! (such as p@ssword!) doesnt make for a strong password. Password cracking programs contain every type of these combinations, in every single language.",
],
},
{
subhead: "Certain words should be avoided in all passwords.",
paragraphs: [
"Many people use familiar people, places, or things in passwords because it makes their passwords easy to remember. This also makes your passwords easy for hackers to guess.",
"According to a study conducted by Google, <span class='demi'>passwords that contain the following information are considered insecure because theyre easy to figure out.</span> You can find much of this info after reviewing someones social media profiles.",
],
list: [
"Pet names",
"A notable date, such as a wedding anniversary",
"A family members birthday",
"Your childs name",
"Another family members name",
"Your birthplace",
"A favorite holiday",
"Something related to your favorite sports team",
"The name of a significant other",
"The word “Password”",
],
securityTip: {
tipHeadline: "<span class='bold'>Security tip:</span> Steer clear of the 100 most-used passwords.",
tipSubhead: "Every year, SplashData evaluates millions of leaked passwords and compiles the <a class='st-copy-link' target='_blank' rel='noopener noreferer' href='https://www.teamsid.com/splashdatas-top-100-worst-passwords-of-2018/'>100 most common ones.</a> The most recent list includes password, 123456, and other passwords you shouldnt use. ",
},
},
{
subhead: "Use different passwords for every account.",
paragraphs: [
@ -141,7 +164,7 @@ const articleCopy = {
paragraphs: [
"Many websites offer two-factor authentication, also known as 2FA or multi-factor authentication. On top of your username and password, 2FA requires another piece of information to verify yourself. So, even if someone has your password, they cant get in.",
"Withdrawing money from an ATM is an example of 2FA. It requires your PIN code and your bank card. You need these two pieces to complete the transaction.",
"Many websites support 2FA, including Google and Amazon. The site will text you a code to your phone to enter after your password. YubiKeys are USB ports that verify your accounts. Security apps like DUO allow you to verify your accounts through your phone.",
"<a class='st-copy-link' target='_blank' rel='noopener noreferer' href='https://twofactorauth.org/'>Websites that support 2FA</a> include Google and Amazon. When you have 2FA enabled, the site will text you a code to enter after your password. Other forms of 2FA include YubiKeys USB ports and security apps like DUO. ",
"When you set up 2FA, many sites will give you a list of backup codes to verify your account. A password manager is a great place to store these codes.",
],
},
@ -150,27 +173,39 @@ const articleCopy = {
{
passwordDosAndDonts: {
listHeadline: "Password dos and donts",
doList: [
"Do's",
"Do combine two or more unrelated words. Change letters to numbers or special characters.",
"Do make your passwords at least 8 characters long. Aim for 12-15 characters.",
"Do use a combination of upper- and lower-case letters, numbers, and symbols.",
"Do include unusual words only you would know. It should seem nonsensical to other people.",
"Do keep your passwords protected and safe, like encrypted in a password manager.",
"Do spread various numbers and characters throughout your password.",
"Do create unique and complex passwords for every site.",
"Do use an extra layer of security with two-factor authentication (2FA).",
],
dontList: [
"Dont's",
"Dont use the word “password,” or any combination of it. “P@ssword!” is just as easy for hackers to guess.",
"Use short, one-word passwords, like sunshine, monkey, or football.",
"Dont place special characters (@, !, 0, etc.) only at the beginning or the end.",
"Dont include personal information like your birthdate, address, or family members names.",
"Dont share your passwords. Dont put them on a piece of paper stuck to your computer.",
"Dont use common patterns like 111111, abc123, or 654321.",
"Dont use the same password everywhere.",
"Dont think a weaker password is safer because you have 2FA.",
doDontList : [
{
do: "Do combine two or more unrelated words. Change letters to numbers or special characters.",
dont: "Dont use the word “password,” or any combination of it. “P@ssword!” is just as easy for hackers to guess.",
},
{
do: "Do make your passwords at least 8 characters long. Aim for 12-15 characters.",
dont: "Use short, one-word passwords, like sunshine, monkey, or football.",
},
{
do: "Do use a combination of upper- and lower-case letters, numbers, and symbols.",
dont: "Dont place special characters (@, !, 0, etc.) only at the beginning or the end.",
},
{
do: "Do include unusual words only you would know. It should seem nonsensical to other people.",
dont: "Dont include personal information like your birthdate, address, or family members names.",
},
{
do: "Do keep your passwords protected and safe, like encrypted in a password manager.",
dont: "Dont share your passwords. Dont put them on a piece of paper stuck to your computer.",
},
{
do: "Do spread various numbers and characters throughout your password.",
dont: "Dont use common patterns like 111111, abc123, or 654321.",
},
{
do: "Do create unique and complex passwords for every site.",
dont: "Dont use the same password everywhere.",
},
{
do: "Do use an extra layer of security with two-factor authentication (2FA).",
dont: "Dont think a weaker password is safer because you have 2FA.",
},
],
},
},
@ -186,7 +221,7 @@ const articleCopy = {
{
toggles: [
{
subhead: "Be wary of public wifi networks. ",
subhead: "Be wary of public Wi-Fi networks.",
paragraphs: [
"You can get Wi-Fi almost anywhere. But these open networks are the most vulnerable and tend to be the least secure. This includes the free Wi-Fi at restaurants, libraries, airports, and other public spaces. If you can avoid it, dont use public Wi-Fi. Most importantly, dont use these networks to log in to financial sites or shop online. Its easy for anyone to see what youre doing.",
"Instead, we recommend using a Virtual Private Network (VPN), which lets you use public Wi-Fi more securely and keeps your online behavior private. A VPN routes your connection through a secure server that encrypts your data before you land on a web page. ",
@ -197,15 +232,19 @@ const articleCopy = {
paragraphs: [
"Updating software on your computer or phone can seem like a pain, but its a crucial step to keeping devices safe. These updates fix bugs, software vulnerabilities, and security problems. Regularly updating your smartphone apps and operating systems makes your devices more secure.",
],
securityTip: {
tipHeadline: "Tips for keeping all your online accounts secure:",
tipList : [
listHeadline: "Tips for keeping all your online accounts secure:",
list: [
"Use unique, strong passwords for every account",
"Use a password manager to remember all your passwords for you",
"Turn on two-factor authentication for an extra layer of security",
"Use a VPN (Virtual Private Network) when using public Wi-Fi",
"Update to the latest version of all software and apps",
],
],
},
{
securityTip: {
tipHeadline: "<span class='bold'>Security tip:</span> Turn on automatic updates.",
tipSubhead: "You can set your computer, browser, apps, and phone to update automatically as soon as new updates become available. Set it and forget it!",
},
},
{
@ -228,7 +267,7 @@ const articleCopy = {
{
subhead: "Be selective about who you give your email address to.",
paragraphs: [
"The more online accounts you create, the greater the risk is that youll be involved in a data breach. Many companies, services, apps, and websites ask for your email. But its not always required. Here are some ways to avoid giving out your email address:",
"The more online accounts you create, the greater the risk that youll be involved in a data breach. Many companies, services, apps, and websites ask for your email. But its not always required. Here are some ways to avoid giving out your email address:",
],
list: [
"Dont create an account if its not required. For example, many online shopping portals allow you to check out as a guest.",
@ -239,8 +278,8 @@ const articleCopy = {
{
subhead: "Use unique, strong passwords for every single account.",
paragraphs: [
"One of the best ways to protect yourself online is to use different passwords across all your online accounts. This way hackers wont have the keys to your entire digital life if they get their hands on that one password you use everywhere.",
"Your passwords also need to be strong. Single words (like sunshine, monkey, or football) make for weak passwords. So do these 100 most-commonly used passwords, which include password and 123456. Avoid pop-culture references, sports teams, and personal info... Do not use your address, birthday, names of family members, or pets names. The longer and more unique your passwords are, the harder they will be for hackers to guess.",
"One of the best ways to protect yourself online is to use different passwords across all your online accounts. This way, hackers wont have the keys to your entire digital life if they get their hands on that one password you use everywhere.",
"Your passwords also need to be strong. Single words (like sunshine, monkey, or football) make for weak passwords. So do these 100 most-commonly used passwords, which include password and 123456. Avoid pop-culture references, sports teams, and personal info. Do not use your address, birthday, names of family members, or pets names. The longer and more unique your passwords are, the harder they will be for hackers to crack.",
],
securityTip: {
tipHeadline: "<span class='bold'>Security tip:</span> How to create strong passwords.",
@ -251,11 +290,11 @@ const articleCopy = {
subhead: "Remember all your passwords with a password manager.",
paragraphs: [
"Ever forgotten your password? It happens all the time. The average person has 90 online accounts. And were being asked to create new ones all the time.",
"The good news is you dont have to recall all your passwords from memory. Password managers are secure, easy-to-use applications that do the remembering for you. They even fill your passwords into websites and apps when you need to log in. All you need to remember is a single password — the one you use to unlock your password manager. They can even generate hard-to-guess passwords to help make your accounts more secure. All your data is encrypted, making password managers pretty secure - even if they get hacked.",
"The good news is you dont have to recall all your passwords from memory. Password managers are secure, easy-to-use applications that do the remembering for you. They even fill your passwords into websites and apps when you need to log in. All you need to remember is a single password — the one you use to unlock your password manager. They can even generate hard-to-guess passwords to help make your accounts more secure. All your data is encrypted, making password managers pretty secure even if they get hacked.",
],
securityTip: {
tipHeadline: "<span class='bold'>Security tip:</span> These are the best password managers. ",
tipSubhead: "Firefox Monitor recommends 1Password, LastPass, Dashlane, and Bitwarden for security and ease of use.",
tipHeadline: "<span class='bold'>Security tip:</span>",
tipSubhead: "Firefox recommends 1Password, LastPass, Dashlane, and Bitwarden for security and ease of use.",
},
},
],
@ -301,14 +340,14 @@ const articleCopy = {
paragraphs: [
"No privacy tool can completely guarantee your online safety. Even the most elaborate lock can be broken into. Yet we still lock our doors to our houses and cars. ",
"The alternative to using a password manager is to rely on your own memory to remember all your credentials. This inevitably leads to recycling passwords or using variations — a bad habit that hackers love.",
"A password managers can be such an effective security tool because it helps us improve bad habits. With a password manager installed on your computer and phone, its a lot easier to take your logins everywhere so you can use unique, strong passwords on every account.",
"Password managers can be such an effective security tool because they help us improve bad habits. With a password manager installed on your computer and phone, its a lot easier to take your logins everywhere so you can use unique, strong passwords on every account.",
],
},
{
subhead: "<span class='myth'>Myth 3:</span> Storing all my passwords in one place makes them vulnerable to hackers.",
paragraphs: [
"Password managers dont store all your credentials together in one place. Any data you store in a password manager — passwords, logins, security questions, and other sensitive info — is securely encrypted. Even if the password manager gets hacked, cyber criminals would not be able to see your logins.",
"The only way to access your data is with a single master password that only you know. You use this password to unlock the manager on your computer, phone, or other devices. Once its unlocked, a password manager can fill in your logins to websites and apps for you.",
"The only way to access your data is with a single master password that only you know. You use this password to unlock the manager on your computer, phone, or other devices. Once its unlocked, a password manager can fill in your logins to websites and apps.",
],
},
{
@ -452,7 +491,7 @@ function articleLinks(args) {
stringId: "take-further-steps",
class: "next-steps",
pathToPartial: "svg/icon-trackers",
subhead: "If financial data is exposed in a breach, identity theft is a potential risk.",
subhead: "Find out how to mitigate the risks of identity theft to prevent financial loss.",
},
];

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

@ -14,7 +14,7 @@ function getVars(args) {
// How to dynamically detect Data Aggregator breaches?
function getBreachCategory(breach) {
if (["Exactis"].includes(breach.Name)) {
if (["Exactis", "Apollo", "YouveBeenScraped", "ElasticsearchSalesLeads", "Estonia", "MasterDeeds"].includes(breach.Name)) {
return "data-aggregator-breach";
}
if (!breach.IsVerified) {

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

@ -1,18 +1,16 @@
"use strict";
const { getBreachCategory, localizeAndPrioritizeDataClasses } = require("./breach-detail");
const { localizeAndPrioritizeDataClasses } = require("./breach-detail");
const { prettyDate, localeString, localizedBreachDataClasses } = require("./hbs-helpers");
const { LocaleUtils } = require("./../locale-utils");
const { filterBreaches } = require("./../hibp");
function getLocalizedBreachCardStrings(locales) {
// casing to reflect HIBP
return {
"AddedDate": LocaleUtils.fluentFormat(locales, "breach-added"),
"BreachDate": LocaleUtils.fluentFormat(locales, "breach-discovered"),
"CompromisedAccounts": LocaleUtils.fluentFormat(locales, "compromised-accounts"),
"CompromisedData": LocaleUtils.fluentFormat(locales, "compromised-data"),
"MoreInfoLink": LocaleUtils.fluentFormat(locales, "more-about-this-breach"),
BreachAdded : LocaleUtils.fluentFormat(locales, "breach-added-label"),
CompromisedAccounts: LocaleUtils.fluentFormat(locales, "compromised-accounts"),
CompromisedData: LocaleUtils.fluentFormat(locales, "compromised-data"),
MoreInfoLink: LocaleUtils.fluentFormat(locales, "more-about-this-breach"),
};
}
@ -32,70 +30,28 @@ function dataClassesforCards(breach, locales) {
return localizedBreachDataClasses(topTwoClasses.slice(0, 2), locales);
}
function makeBreachCards(breaches, locales, filter=true) {
const breachCardStrings = getLocalizedBreachCardStrings(locales);
function sortBreaches(breaches) {
breaches = breaches.sort((a,b) => {
const oldestBreach = new Date(a.BreachDate);
const newestBreach = new Date(b.BreachDate);
return newestBreach-oldestBreach;
});
return breaches;
}
function makeBreachCards(breaches, locales) {
const formattedBreaches = [];
const breachCardStrings = getLocalizedBreachCardStrings(locales);
breaches = JSON.parse(JSON.stringify(breaches));
if (filter && breaches.length > 1) {
breaches.sort((a,b) => {
const oldestBreach = new Date(a.BreachDate);
const newestBreach = new Date(b.BreachDate);
return newestBreach-oldestBreach;
});
}
for (const breach of breaches) {
const breachCard = JSON.parse(JSON.stringify(breach));
const breachCategory = getBreachCategory(breach);
breachCard.AddedDate = prettyDate(breach.AddedDate, locales);
breachCard.PwnCount = localeString(breach.PwnCount,locales);
breachCard.DataClasses = dataClassesforCards(breach, locales);
breachCard.Category = breachCategory; // "unverified-breach", etc. for styling cards
breachCard.String = breachCardStrings; // "Compromised Data: , Compromised Accounts: ..."
for (const breachCard of breaches) {
getLocalizedBreachValues(locales, breachCard);
breachCard.LocalizedBreachCardStrings = breachCardStrings; // "Compromised Data: , Compromised Accounts: ..."
formattedBreaches.push(breachCard);
}
return formattedBreaches;
}
function getBreachCategories(locales, categories = null) {
if (!categories) {
categories = [
"website-breach",
"sensitive-breach",
"spam-list-breach",
"unverified-breach",
"data-aggregator-breach",
];
}
const breachCategories = {} ;
categories.forEach(category => {
breachCategories[category] = {
"category": category,
"string": LocaleUtils.fluentFormat(locales, category),
"categoryPlural": LocaleUtils.fluentFormat(locales, `${category}-plural`),
};
});
return breachCategories;
}
function allBreaches(allBreaches, options) {
const locales = options.data.root.req.supportedLocales;
allBreaches = filterBreaches(allBreaches);
const breachCategories = ["website-breach", "sensitive-breach", "data-aggregator-breach"];
const allBreachesModule = {
"breachCategories" : getBreachCategories(locales, breachCategories),
};
return options.fn(allBreachesModule);
}
function lastAddedBreach(options) {
const locales = options.data.root.req.supportedLocales;
let latestBreach = [options.data.root.latestBreach];
@ -106,21 +62,28 @@ function lastAddedBreach(options) {
function getFoundBreaches(args) {
const locales = args.data.root.req.supportedLocales;
let userBreaches = args.data.root.foundBreaches;
userBreaches = makeBreachCards(userBreaches, locales, false);
userBreaches = makeBreachCards(userBreaches, locales);
userBreaches.cardType = "two-up drop-shadow";
return userBreaches;
}
function getBreachArray(args) {
const locales = args.data.root.req.supportedLocales;
let allBreaches = args.data.root.breaches;
function getLocalizedBreachValues(locales, breach) {
breach.AddedDate = prettyDate(breach.AddedDate, locales);
breach.PwnCount = localeString(breach.PwnCount,locales);
breach.DataClasses = dataClassesforCards(breach, locales);
return breach;
}
function getBreachArray(breaches, args) {
const locales = args.data.root.req.supportedLocales;
breaches = JSON.parse(JSON.stringify(breaches));
// should we consider filtering the breaches when the app loads
// since we aren't ever showing them now anyway?
breaches = filterBreaches(breaches);
breaches = sortBreaches(breaches);
allBreaches = filterBreaches(allBreaches);
const breaches = makeBreachCards(allBreaches, locales);
breaches.forEach(breach => {
// remove unused properties
getLocalizedBreachValues(locales, breach);
delete(breach.Description);
delete(breach.IsVerified);
delete(breach.ModifiedDate);
@ -129,13 +92,18 @@ function getBreachArray(args) {
delete(breach.IsRetired);
delete(breach.IsSensitive);
delete(breach.IsSpamList);
delete(breach.BreachDate);
});
return JSON.stringify(breaches);
const allBreaches = {
LocalizedBreachCardStrings: getLocalizedBreachCardStrings(locales),
breaches: breaches,
};
return JSON.stringify(allBreaches);
}
module.exports = {
allBreaches,
lastAddedBreach,
getFoundBreaches,
makeBreachCards,

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

@ -12,22 +12,23 @@ function getSignedInAs(args) {
}
function navLinks(args) {
const serverUrl = args.data.root.constants.SERVER_URL;
const locales = args.data.root.req.supportedLocales;
const links = [
{
title: "Home",
stringId: "home",
href: "/",
href: `${serverUrl}/`,
},
{
title: "Breaches",
stringId: "breaches",
href: "/breaches",
href: `${serverUrl}/breaches`,
},
{
title: "Security Tips",
stringId: "security-tips",
href: "/security-tips",
href: `${serverUrl}/security-tips`,
},
];

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

@ -17,7 +17,7 @@ function makeLanding(args) {
},
];
} else {
landingCopy.headline = LocaleUtils.fluentFormat(locales, "see-if-breached");
landingCopy.headline = LocaleUtils.fluentFormat(locales, "see-if-youve-been-part");
landingCopy.subhead = LocaleUtils.fluentFormat(locales, "find-out-what-hackers-know");
}
if (featuredBreach && featuredBreach.IsSensitive) {

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

@ -37,7 +37,7 @@ function getScanResultsHeadline(args) {
headlineStrings.headline = fluentNestedBold("fb-not-comp", args);
headlineStrings.subhead = fluentNestedBold("other-breaches-found", args);
headlineStrings.subhead = fluentNestedBold("other-known-breaches-found", args);
return args.fn(headlineStrings);
}

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

@ -38,8 +38,8 @@ function monitorFeaturesList(args) {
{
title: "Monitor several emails",
titleStringId: "monitor-several-emails",
subtitle: "Search all your email addresses for breaches and get alerts about new threats.",
subtitleStringId: "search-all-emails",
subtitle: "Get ongoing breach monitoring for multiple email addresses.",
subtitleStringId: "get-ongoing-breach-monitoring",
pictogramPath: "email",
},
{

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

@ -59,7 +59,7 @@ async function checkNotifyCallsEverythingItShould(breachedEmail, recipientEmail)
expect (mockFluentFormatCalls.length).toBe(1);
const mockFluentFormatCallArgs = mockFluentFormatCalls[0];
expect (mockFluentFormatCallArgs[0]).toEqual(["en"]);
expect (mockFluentFormatCallArgs[1]).toBe("hibp-notify-email-subject");
expect (mockFluentFormatCallArgs[1]).toBe("breach-alert-subject");
const mockSendEmailCalls = EmailUtils.sendEmail.mock.calls;
expect (mockSendEmailCalls.length).toBe(1);

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

@ -23,7 +23,7 @@ const createRequestBody = function(notificationType) {
};
test("ses notification with Permanent bounce unsubscribes recipient", async () => {
test("ses notification with Permanent bounce unsubscribes recipient subscriber", async () => {
// TODO: restore tests for ["General", "NoEmail", "Suppressed"] sub types
const testEmail = "bounce@simulator.amazonses.com";
const testHashes = [getSha1(testEmail)];
@ -47,7 +47,7 @@ test("ses notification with Permanent bounce unsubscribes recipient", async () =
});
test("ses notification with Complaint unsubscribes recipient", async () => {
test("ses notification with Complaint unsubscribes recipient subscriber", async () => {
const testEmail = "complaint@simulator.amazonses.com";
await DB.addSubscriber(testEmail);
@ -69,6 +69,28 @@ test("ses notification with Complaint unsubscribes recipient", async () => {
});
test("ses notification with Complaint unsubscribes recipient from email_addresses", async () => {
const testPrimaryEmail = "secondary-email-complainer@mailinator.com";
const testSignupLanguage = "en";
const testUser = await DB.addSubscriber(testPrimaryEmail, testSignupLanguage);
const testEmail = "complaint@simulator.amazonses.com";
await DB.addSubscriberUnverifiedEmailHash(testUser, testEmail);
const req = httpMocks.createRequest({
method: "POST",
url: "/ses/notification",
body: createRequestBody("complaint"),
});
const resp = httpMocks.createResponse();
await ses.notification(req, resp);
expect(resp.statusCode).toEqual(200);
const noMoreEmailAddressRecord = await DB.getEmailAddressRecordByEmail(testEmail);
expect(noMoreEmailAddressRecord).toBeUndefined();
});
test("ses notification with invalid signature responds with error and doesn't change subscribers", async () => {
const testEmail = "complaint@simulator.amazonses.com";
@ -91,13 +113,14 @@ test("ses notification with invalid signature responds with error and doesn't ch
});
test("sns notification for FxA account delete deletes monitor subscriber record", async () => {
test("sns notification for FxA account deletes monitor subscriber record", async () => {
const testEmail = "fxa-deleter@mailinator.com";
const testSignupLanguage = "en";
const testFxaAccessToken = "abcdef123456789";
const testFxaRefreshToken = "abcdef123456789";
const testFxaUID = "3b1a9d27f85b4a4c977f3a84838f9116";
const testFxaProfileData = JSON.stringify({uid: testFxaUID});
await DB.addSubscriber(testEmail, testSignupLanguage, testFxaRefreshToken, testFxaProfileData);
await DB.addSubscriber(testEmail, testSignupLanguage, testFxaAccessToken, testFxaRefreshToken, testFxaProfileData);
let subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);

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

@ -165,7 +165,7 @@ test("user verify request with valid token but no session throws error", async (
const resp = httpMocks.createResponse();
// Call code-under-test
await expect(user.verify(req, resp)).rejects.toThrow("must-be-signed-in");
await expect(user.verify(req, resp)).rejects.toThrow("error-must-be-signed-in");
const emailAddress = await DB.getEmailByToken(validToken);
expect(emailAddress.verified).toBeFalsy();
@ -348,7 +348,7 @@ test("user/remove-fxm GET request with invalid session returns error", async ()
});
const resp = httpMocks.createResponse();
await expect(user.getRemoveFxm(req, resp)).rejects.toThrow("must-be-signed-in");
await expect(user.getRemoveFxm(req, resp)).rejects.toThrow("error-must-be-signed-in");
});
@ -371,14 +371,14 @@ test("user/remove-fxm POST request with invalid session returns error", async ()
const resp = httpMocks.createResponse();
// Call code-under-test
await expect(user.postRemoveFxm(req, resp)).rejects.toThrow("must-be-signed-in");
await expect(user.postRemoveFxm(req, resp)).rejects.toThrow("error-must-be-signed-in");
});
test("user remove-fxm POST request with valid session removes from DB and revokes FXA OAuth token", async () => {
const req = { fluentFormat: jest.fn(), session: { user: TEST_SUBSCRIBERS.firefox_account, reset: jest.fn() }};
const resp = httpMocks.createResponse();
FXA.revokeOAuthToken = jest.fn();
FXA.revokeOAuthTokens = jest.fn();
await user.postRemoveFxm(req, resp);
@ -386,7 +386,7 @@ test("user remove-fxm POST request with valid session removes from DB and revoke
expect(resp._getRedirectUrl()).toEqual("/");
const subscriber = await DB.getEmailByToken(TEST_SUBSCRIBERS.firefox_account.primary_verification_token);
expect(subscriber).toBeUndefined();
expect(FXA.revokeOAuthToken).toHaveBeenCalledTimes(1);
expect(FXA.revokeOAuthTokens).toHaveBeenCalledTimes(1);
expect(req.session.reset).toHaveBeenCalledTimes(1);
});

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

@ -2,7 +2,7 @@
const HIBP = require("../hibp");
const DB = require("../db/DB");
const { TEST_EMAIL_ADDRESSES } = require("../db/seeds/test_subscribers");
const { TEST_SUBSCRIBERS, TEST_EMAIL_ADDRESSES } = require("../db/seeds/test_subscribers");
const getSha1 = require("../sha1-utils");
require("./resetDB");
@ -152,14 +152,40 @@ test("setAllEmailsToPrimary updates column and returns subscriber", async() => {
});
test("removeSubscriber accepts email and removes the email address", async () => {
test("removeSubscriber accepts subscriber and removes everything from subscribers and email_addresses tables", async () => {
const startingSubscriber = await DB.getSubscriberByEmail(TEST_SUBSCRIBERS.firefox_account.primary_email);
expect(startingSubscriber.id).toEqual(TEST_SUBSCRIBERS.firefox_account.id);
const startingEmailAddressRecord = await DB.getEmailById(TEST_EMAIL_ADDRESSES.firefox_account.id);
expect(startingEmailAddressRecord.id).toEqual(TEST_EMAIL_ADDRESSES.firefox_account.id);
await DB.removeSubscriber(startingSubscriber);
const noMoreSubscribers = await DB.getSubscriberByEmail(startingSubscriber.primary_email);
expect(noMoreSubscribers).toBeUndefined();
const noMoreEmailAddress = await DB.getEmailById(startingEmailAddressRecord.id);
expect(noMoreEmailAddress).toBeUndefined();
});
test("removeEmail accepts email and removes from subscribers table", async () => {
const testEmail = "removingFirefoxAccount@test.com";
const verifiedSubscriber = await DB.addSubscriber(testEmail);
let subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
const subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(1);
await DB.removeSubscriberByEmail(verifiedSubscriber.primary_email);
subscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(subscribers.length).toEqual(0);
await DB.removeEmail(verifiedSubscriber.primary_email);
const noMoreSubscribers = await DB.getSubscribersByHashes([getSha1(testEmail)]);
expect(noMoreSubscribers.length).toEqual(0);
});
test("removeEmail accepts email and removes from email_addresses table", async () => {
const testEmailAddress = TEST_EMAIL_ADDRESSES.all_emails_to_primary;
const emailAddress = await DB.getEmailById(testEmailAddress.id);
expect(emailAddress.email).toEqual(testEmailAddress.email);
await DB.removeEmail(emailAddress.email);
const noMoreEmailAddress = await DB.getEmailById(testEmailAddress.id);
expect(noMoreEmailAddress).toBeUndefined();
});

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

@ -10,14 +10,20 @@ jest.mock("got");
test("revokeOAuthToken calls oauth destroy with fxa_refresh_token", async () => {
const token = TEST_SUBSCRIBERS.firefox_account.fxa_refresh_token;
const subscriber = TEST_SUBSCRIBERS.firefox_account;
await FXA.revokeOAuthToken(token);
await FXA.revokeOAuthTokens(subscriber);
const gotCalls = got.mock.calls;
expect(gotCalls.length).toEqual(1);
const gotCallArgs = gotCalls[0];
expect(gotCallArgs[0]).toContain("/v1/destroy");
const gotCallOptions = gotCallArgs[1];
expect(gotCallOptions.body.refresh_token).toEqual(token);
expect(gotCalls.length).toEqual(2);
const accessGotCallArgs = gotCalls[0];
expect(accessGotCallArgs[0]).toContain("/v1/destroy");
const accessGotCallOptions = accessGotCallArgs[1];
expect(accessGotCallOptions.body.token).toEqual(subscriber.fxa_access_token);
const refreshGotCallArgs = gotCalls[1];
expect(refreshGotCallArgs[0]).toContain("/v1/destroy");
const refreshGotCallOptions = refreshGotCallArgs[1];
expect(refreshGotCallOptions.body.refresh_token).toEqual(subscriber.fxa_refresh_token);
});

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

@ -43,7 +43,9 @@
</section>
<section class="detail-section bg-white">
<div class="row jst-cntr flx-col">
{{> sign-up-banners/scan-results-sign-up }}
{{#unless ./../req.session.user}}
{{> sign-up-banners/scan-results-sign-up }}
{{/unless}}
<div id="what-is-this-breach" class="col-8 breach-details">
{{> breach-detail-content-group whatIsThisBreach}}
</div>

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

@ -1,6 +0,0 @@
<div id="back-to-top-bar" class="back-to-top-bar">
<button id="back-to-top" class="back-to-top" aria-label="{{ getString "back-to-top" }}">
{{> svg/arrow-right }}
{{ getString "back-to-top" }}
</button>
</div>

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

@ -0,0 +1,8 @@
<div class="top-bar flx jst-cntr row-full-width">
<div class="join-fx-wrap flx">
<span class="join-fx-img"></span>
<div class="join-fx-copy-wrap">
<span class="join-fx-copy">{{ getString "join-firefox" }}<a class="learn-more" target="_blank" rel="noopener" href="https://www.mozilla.org/firefox/accounts/?utm_source=monitor.firefox.com&utm_medium=banner&utm_campaign=trailhead&utm_content=protect-your-privacy">{{ getString "learn-more-link" }}</a></span>
</div>
</div>
</div>

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

@ -1,4 +1,4 @@
<a class="breach-card {{ Category }} {{ cardType }} {{#if NewBreach}} new-breach {{/if}}" {{#if latestBreach }} href="/?breach={{ Name }}" {{ else }} href="/breach-details/{{ Name }}" {{/if}}>
<a class="breach-card {{ cardType }} {{#if NewBreach}} new-breach {{/if}}" {{#if latestBreach }} href="/?breach={{ Name }}" {{ else }} href="/breach-details/{{ Name }}" {{/if}}>
<div class="breach-logo-wrapper flx">
<img alt="" class="breach-logo breach-img" src="/img/logos/{{ LogoPath }}" />
</div>
@ -16,7 +16,7 @@
{{else}}
{{> breach-cards/added-date }}
{{#if showPwnCount }}
<span class="breach-key">{{ String.CompromisedAccounts }}</span>{{ PwnCount }}</span>
<span class="breach-key">{{ LocalizedBreachCardStrings.CompromisedAccounts }}</span>{{ PwnCount }}</span>
{{/if}}
{{> breach-cards/data-classes }}
{{/if}}
@ -25,7 +25,7 @@
{{#if latestBreach}}
<span class="latest-breach-link">{{ getString "latest-breach-link" }}</span>
{{else}}
<span class="more-about-this-breach">{{ String.MoreInfoLink }}</span>
<span class="more-about-this-breach">{{ LocalizedBreachCardStrings.MoreInfoLink }}</span>
{{/if}}
</div>
</div>

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

@ -1,2 +1,2 @@
<span class="breach-key">{{ String.AddedDate }}</span>
<span class="breach-key">{{ LocalizedBreachCardStrings.BreachAdded }}</span>
<span class="breach-value">{{ AddedDate }}</span>

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

@ -1,4 +1,4 @@
{{#if DataClasses }}
<span class="breach-key">{{ String.CompromisedData }}</span>
<span class="breach-key">{{ LocalizedBreachCardStrings.CompromisedData }}</span>
<span class="breach-value">{{ DataClasses }}</span>
{{/if}}

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

@ -5,7 +5,7 @@
{{ getString "automated-message" }}
</p>
<p class="footer-copy" style="margin-top: 0px; font-weight: 300; color: #738597;">
{{{ getString "we-sent-this-alert" userEmail=email }}}
{{{ getString "we-sent-this-alert" userEmail=recipientEmail }}}
</p>
<p class="footer-copy" style="padding: 0px 0px 3px 0px; margin: 0px; font-weight: 300; color: #738597 ;">
<a class="footer-link" style="color: #0060df;" href="{{ unsubscribeUrl }}" rel="noreferrer noopener">

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

@ -4,10 +4,10 @@
</td>
<td valign="top" style="vertical-align: top; padding-top: 7px; padding-right: 20px; padding-bottom: 10px; font-family: sans-serif;">
<p class="body-copy medium" style="padding: 0px; margin: 0px; color: #333333; margin: 0px; font-weight: 500; font-size: 16px;">{{ Title }}</p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.AddedDate }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ AddedDate }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.CompromisedAccounts }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ PwnCount }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ LocalizedBreachCardStrings.BreachAdded }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ AddedDate }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ LocalizedBreachCardStrings.CompromisedAccounts }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ PwnCount }}</span></p>
{{#if DataClasses }}
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ String.CompromisedData }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ DataClasses }}</span></p>
<p class="body-copy medium" style="padding: 2px 0px 2px 0px; margin: 0px; color: #333333; font-weight: 400; font-size: 14px;">{{ LocalizedBreachCardStrings.CompromisedData }}<span class="body-copy" style="font-weight:300; padding-left: 6px; color: #333333">{{ DataClasses }}</span></p>
{{/if}}
</td>
</tr>

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

@ -3,6 +3,6 @@
<form id="fuzzy-form" class="fuzzy-form">
<input tabindex="1" type="text" id="fuzzy-find-input" class="fuzzy-find-input" placeholder="{{ getString "search-breaches" }}" autocomplete="off" /> <button tabindex="3" id="fuzzy-find-submit" class="fuzzy-find-submit" aria-label="{{ getString "search-breaches" }}">{{> svg/search-icon }}</button>
</form>
<button tabindex="2" id="show-all-breaches" class="show-all-breaches"><span class="x-close-bg">{{> svg/x-close }}</span></button>
<button tabindex="2" id="fuzzy-show-all" class="fuzzy-find-show-breaches show-all-breaches"><span class="x-close-bg">{{> svg/x-close }}</span></button>
<span id="no-results-blurb" class="no-results-blurb">{{ getString "no-results-blurb" }}</span>
</div>

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

@ -1,23 +1,26 @@
<header id="header">
<section class="row-full-width">
<a class="flx-cntr fx-monitor-logo-wrapper" href="/" {{> analytics/internal-link eventLabel="Fx-Monitor-Logo" }}>
<div class="sprite fx-monitor-logo"><!--Firefox Monitor logo--></div>
<h1 class="fx-monitor"><span>Firefox</span> Monitor</h1>
</a>
<nav class="desktop-menu flx-cntr">
{{> header/nav-links }}
{{#if req.session.user}}
{{> header/fxa-menu }}
{{else}}
<button id="sign-in-btn" class="open-oauth sign-in btn-light" {{> analytics/fxa id="fx-monitor-sign-in-button" }} data-event-category="Sign In Button">{{ getString "sign-in" }}</button>
{{/if}}
</nav>
</section>
<!--mobile navigation-->
<section class="mobile-nav show-mobile">
<span class="nav-link drop-down-menu">{{ getString "menu" }} {{> svg/toggle-down }}</span>
<nav class="mobile-menu flx-cntr row-full-width">
{{> header/nav-links }}
</nav>
</section>
{{> branding-strip }}
<div id="navigation-wrapper">
<section class="row-full-width fxm-branding">
<a class="flx-cntr fx-monitor-logo-wrapper" href="/" {{> analytics/internal-link eventLabel="Fx-Monitor-Logo" }}>
<div class="sprite fx-monitor-logo"><!--Firefox Monitor logo--></div>
<h1 class="fx-monitor"><span>Firefox</span> Monitor</h1>
</a>
<nav class="desktop-menu flx-cntr">
{{> header/nav-links }}
{{#if req.session.user}}
{{> header/fxa-menu }}
{{else}}
<button id="sign-in-btn" class="open-oauth sign-in btn-light" {{> analytics/fxa id="fx-monitor-sign-in-button" }} data-event-category="Sign In Button">{{ getString "sign-in" }}</button>
{{/if}}
</nav>
</section>
<!--mobile navigation-->
<section class="mobile-nav show-mobile">
<span class="nav-link drop-down-menu">{{ getString "menu" }} {{> svg/toggle-down }}</span>
<nav class="mobile-menu flx-cntr row-full-width">
{{> header/nav-links }}
</nav>
</section>
</div>
</header>

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

@ -1,3 +1,3 @@
{{#each (navLinks)}}
<a class="nav-link" {{> analytics/internal-link eventLabel=this.title }} href="{{ this.href }}">{{ this.stringId }}</a>
<a class="nav-link" {{> analytics/internal-link eventLabel=this.title }} href="{{ this.href }}"><span class="active-link-underline">{{ this.stringId }}</span></a>
{{/each}}

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

@ -1,5 +1,4 @@
{{#ifCompare UTM_SOURCE "===" "localhost"}}
<link rel="stylesheet" href="/css/all-breaches.css">
<link rel="stylesheet" href="/css/app.css">
<link rel="stylesheet" href="/css/articles.css">
@ -22,7 +21,7 @@
<link rel="stylesheet" href="/css/subpage.css">
<script type="text/javascript" src="/js/all-breaches.js" defer></script>
<script type="text/javascript" src="/js/all-breaches/all-breaches.js"></script>
<script type="text/javascript" src="/js/analytics_dnt-helper.js" defer></script>
<script type="text/javascript" src="/js/analytics_tracking_protection.js" defer></script>
<script type="text/javascript" src="/js/fxa-analytics.js" defer></script>
@ -34,5 +33,10 @@
{{else}}
<link rel="stylesheet" href="/dist/app.min.css">
{{#ifCompare whichPartial "===" "top-level/all-breaches"}}
<script type="text/javascript" src="/dist/all-breaches.min.js"></script>
{{/ifCompare}}
<script type="text/javascript" src="/dist/app.min.js" defer></script>
{{/ifCompare}}

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

@ -1,14 +1,14 @@
<div class="col-9 sign-up-wrapper">
<div class="scan-res sign-up-banner drop-shadow">
<div class="sign-up-headline-list-wrapper flx flx-col">
<h2 class="sign-up-headline">{{ getString "sign-up-headline-1" }}</h2>
{{> feature-list }}
</div>
<div class="flx flx-col sign-up-cta">
{{> sign-up-button buttonValue="sign-up-for-alerts"}}
{{> sign-up-banners/browser-not-required }}
{{> sign-up-banners/login-link }}
<div class="col-9 sign-up-wrapper">
<div class="scan-res sign-up-banner drop-shadow">
<div class="sign-up-headline-list-wrapper flx flx-col">
<h2 class="sign-up-headline">{{ getString "sign-up-headline-1" }}</h2>
{{> feature-list }}
</div>
<div class="flx flx-col sign-up-cta">
{{> sign-up-button buttonValue="sign-up-for-alerts"}}
{{> sign-up-banners/browser-not-required }}
{{> sign-up-banners/login-link }}
</div>
</div>
</div>
</div>

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

@ -1,4 +1,3 @@
{{#allBreaches req.app.locals.breaches }}
<div id="breaches-loader" class="ab-bg breaches-loader"></div>
<div class="ab-bg top-level">
<main class="all-breaches-main clear-header" data-page-label="All Breaches">
@ -9,7 +8,6 @@
</div>
</main>
<section class="all-breaches-wrapper">
{{> back-to-top-button }}
<div class="row flx-col">
<div class="col-12 txt-cntr no-vertical-padding">
{{> fuzzy-find }}
@ -19,11 +17,10 @@
</div>
<div class="row flx-col">
<!-- breach cards -->
<div id="all-breaches" class="all-breaches flx">
</div>
<div id="all-breaches" class="all-breaches flx"></div>
<button id="show-hidden-breaches" class="col violet-btn show-all-breaches">{{ getString "show-all" }}</button>
</div>
</section>
</div>
{{/allBreaches}}
<div id="breach-array-json" hidden=true data-breach-array="{{ getBreachArray }}"></div>
<div id="breach-array-json" hidden=true data-breach-array="{{ getBreachArray req.app.locals.breaches }}"></div>

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

@ -34,7 +34,6 @@
<span class="security-tip-subhead">{{subhead}}</span>
<h2 class="article-headline {{ class }}">{{ title }}</h2>
{{#each copy}}
{{#each leads}}
<p class="article-paragraph lead">
<span class="drop-cap">
@ -46,25 +45,29 @@
{{#if toggles}}
{{#each this.toggles}}
<div class="toggle-parent inactive st-toggle-wrapper">
<div class="toggle-info-wrapper">
<button class="toggle svg-wrap article-toggle" aria-label="{{ getString "show-content" }}">
<span class="article-subhead toggle-subhead">{{{ subhead }}}</span>
{{> svg/toggle-down }}
</button>
{{#if securityTip}}
{{> top-level/security-tips/security-tip-callout }}
{{/if}}
{{#if subhead}}
<div class="toggle-parent inactive st-toggle-wrapper">
<div class="toggle-info-wrapper">
<button class="toggle svg-wrap article-toggle" aria-label="{{ getString "show-content" }}">
<span class="article-subhead toggle-subhead">{{{ subhead }}}</span>
{{> svg/toggle-down }}
</button>
</div>
<div class="toggle-child">
{{> top-level/security-tips/tip-content }}
</div><!--closes toggle-child-->
</div>
<div class="toggle-child">
{{> top-level/security-tips/tip-content }}
{{> top-level/security-tips/security-tip-callout }}
</div><!--closes toggle-child-->
</div>
{{/if}}
{{/each}}
{{/if}}
{{#if subhead}}
<h3 class="article-subhead">{{{ subhead }}}</h3>
{{/if}}
{{> top-level/security-tips/tip-content }}
{{> top-level/security-tips/dos-and-donts }}
{{/each}}
</div>

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

@ -1,17 +1,35 @@
{{#if passwordDosAndDonts }}
<div class="password-tip-list-wrapper">
<h3 class="password-tip-list-headline"> {{ passwordDosAndDonts.listHeadline }}</h3>
<div class="password-tip-list flx">
<ul class="do-list">
{{#each passwordDosAndDonts.doList}}
<li class="do-list-item">{{ this }}</li>
{{/each}}
</ul>
<ul class="dont-list">
{{#each passwordDosAndDonts.dontList}}
<li class="dont-list-item">{{ this }}</li>
{{/each}}
</ul>
<section class="dos-and-donts container">
<h3 class="password-tip-list-headline txt-cntr"> {{ passwordDosAndDonts.listHeadline }}</h3>
<div class="password-tip-list-wrapper">
<div class="pw-tip-table">
<div class="pw-tip-headlines flx">
<div class="pw-do-hl do-dont-hl flx jst-cntr">
<h4 class="flx icon-do">Do</h4>
</div>
<div class="pw-dont-hl do-dont-hl flx jst-cntr">
<h4 class="flx icon-dont">Don't</h4>
</div>
</div>
<div class="password-tip-list flx">
{{#each passwordDosAndDonts.doDontList}}
<div class="pw-tip-item flx">
<div class="pw-do do-dont-wrap flx jst-cntr">
<span class="do-dont">
<span class="do-dont-hl-mobile show-mobile icon-do">Do:</span>
{{{ this.do }}}
</span>
</div>
<div class="pw-dont do-dont-wrap flx jst-cntr">
<span class="do-dont">
<span class="do-dont-hl-mobile show-mobile icon-dont">Don't:</span>
{{ this.dont }}
</span>
</div>
</div>
{{/each}}
</div>
</div>
</div>
</div>
</section>
{{/if}}

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

@ -1,18 +1,20 @@
{{#if securityTip}}
<div class="st-call-out">
<div class="st-headline-icon-wrapper flx flx-row al-cntr">
<svg class="st-icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 16 16"><path fill="#00b4f5" d="M8 1a7 7 0 1 0 7 7 7.008 7.008 0 0 0-7-7zm0 13a6 6 0 1 1 6-6 6.007 6.007 0 0 1-6 6zm0-7a1 1 0 0 0-1 1v3a1 1 0 1 0 2 0V8a1 1 0 0 0-1-1zm0-3.188A1.188 1.188 0 1 0 9.188 5 1.188 1.188 0 0 0 8 3.812z"></path></svg>
<p class="flx flx-row al-cntr al-cntr st-headline">{{{ securityTip.tipHeadline }}}</p>
<div class="inset">
<div class="st-headline-icon-wrapper flx flx-row al-cntr">
<svg class="st-icon" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="30" height="30" viewBox="0 0 16 16"><path fill="#5e5e72" d="M8 1a7 7 0 1 0 7 7 7.008 7.008 0 0 0-7-7zm0 13a6 6 0 1 1 6-6 6.007 6.007 0 0 1-6 6zm0-7a1 1 0 0 0-1 1v3a1 1 0 1 0 2 0V8a1 1 0 0 0-1-1zm0-3.188A1.188 1.188 0 1 0 9.188 5 1.188 1.188 0 0 0 8 3.812z"></path></svg>
<p class="flx flx-row al-cntr al-cntr st-headline">{{{ securityTip.tipHeadline }}}</p>
</div>
{{#if securityTip.tipSubhead }}
<p class="st-subhead">{{{ securityTip.tipSubhead }}}</p>
{{/if}}
{{#if securityTip.tipList }}
<ul class="st-list">
{{#each securityTip.tipList}}
<li class="st-list-item">{{ this }}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{#if securityTip.tipSubhead }}
<p class="st-subhead">{{{ securityTip.tipSubhead }}}</p>
{{/if}}
{{#if securityTip.tipList }}
<ul class="st-list">
{{#each securityTip.tipList}}
<li class="st-list-item">{{ this }}</li>
{{/each}}
</ul>
{{/if}}
</div>
{{/if}}