From 58830be94329ce1a541f1f79c9e4e70aef430b19 Mon Sep 17 00:00:00 2001 From: Emelia Smith Date: Mon, 15 Jan 2024 11:36:30 +0100 Subject: [PATCH 01/43] Streaming: Rework websocket server initialisation & authentication code (#28631) --- streaming/index.js | 128 +++++++++++++++++++++++++++++++++------------ 1 file changed, 95 insertions(+), 33 deletions(-) diff --git a/streaming/index.js b/streaming/index.js index 42d0afc7c5bdea..c8124fcc0f1ae8 100644 --- a/streaming/index.js +++ b/streaming/index.js @@ -182,14 +182,74 @@ const CHANNEL_NAMES = [ ]; const startServer = async () => { + const pgPool = new pg.Pool(pgConfigFromEnv(process.env)); + const server = http.createServer(); + const wss = new WebSocket.Server({ noServer: true }); + + // Set the X-Request-Id header on WebSockets: + wss.on("headers", function onHeaders(headers, req) { + headers.push(`X-Request-Id: ${req.id}`); + }); + const app = express(); app.set('trust proxy', process.env.TRUSTED_PROXY_IP ? process.env.TRUSTED_PROXY_IP.split(/(?:\s*,\s*|\s+)/) : 'loopback,uniquelocal'); - const pgPool = new pg.Pool(pgConfigFromEnv(process.env)); - const server = http.createServer(app); app.use(cors()); + // Handle eventsource & other http requests: + server.on('request', app); + + // Handle upgrade requests: + server.on('upgrade', async function handleUpgrade(request, socket, head) { + /** @param {Error} err */ + const onSocketError = (err) => { + log.error(`Error with websocket upgrade: ${err}`); + }; + + socket.on('error', onSocketError); + + // Authenticate: + try { + await accountFromRequest(request); + } catch (err) { + log.error(`Error authenticating request: ${err}`); + + // Unfortunately for using the on('upgrade') setup, we need to manually + // write a HTTP Response to the Socket to close the connection upgrade + // attempt, so the following code is to handle all of that. + const statusCode = err.status ?? 401; + + /** @type {Record} */ + const headers = { + 'Connection': 'close', + 'Content-Type': 'text/plain', + 'Content-Length': 0, + 'X-Request-Id': request.id, + // TODO: Send the error message via header so it can be debugged in + // developer tools + }; + + // Ensure the socket is closed once we've finished writing to it: + socket.once('finish', () => { + socket.destroy(); + }); + + // Write the HTTP response manually: + socket.end(`HTTP/1.1 ${statusCode} ${http.STATUS_CODES[statusCode]}\r\n${Object.keys(headers).map((key) => `${key}: ${headers[key]}`).join('\r\n')}\r\n\r\n`); + + return; + } + + wss.handleUpgrade(request, socket, head, function done(ws) { + // Remove the error handler: + socket.removeListener('error', onSocketError); + + // Start the connection: + wss.emit('connection', ws, request); + }); + }); + /** * @type {Object.): void>>} */ @@ -360,10 +420,19 @@ const startServer = async () => { const isInScope = (req, necessaryScopes) => req.scopes.some(scope => necessaryScopes.includes(scope)); + /** + * @typedef ResolvedAccount + * @property {string} accessTokenId + * @property {string[]} scopes + * @property {string} accountId + * @property {string[]} chosenLanguages + * @property {string} deviceId + */ + /** * @param {string} token * @param {any} req - * @returns {Promise.} + * @returns {Promise} */ const accountFromToken = (token, req) => new Promise((resolve, reject) => { pgPool.connect((err, client, done) => { @@ -394,14 +463,20 @@ const startServer = async () => { req.chosenLanguages = result.rows[0].chosen_languages; req.deviceId = result.rows[0].device_id; - resolve(); + resolve({ + accessTokenId: result.rows[0].id, + scopes: result.rows[0].scopes.split(' '), + accountId: result.rows[0].account_id, + chosenLanguages: result.rows[0].chosen_languages, + deviceId: result.rows[0].device_id + }); }); }); }); /** * @param {any} req - * @returns {Promise.} + * @returns {Promise} */ const accountFromRequest = (req) => new Promise((resolve, reject) => { const authorization = req.headers.authorization; @@ -494,25 +569,6 @@ const startServer = async () => { reject(err); }); - /** - * @param {any} info - * @param {function(boolean, number, string): void} callback - */ - const wsVerifyClient = (info, callback) => { - // When verifying the websockets connection, we no longer pre-emptively - // check OAuth scopes and drop the connection if they're missing. We only - // drop the connection if access without token is not allowed by environment - // variables. OAuth scope checks are moved to the point of subscription - // to a specific stream. - - accountFromRequest(info.req).then(() => { - callback(true, undefined, undefined); - }).catch(err => { - log.error(info.req.requestId, err.toString()); - callback(false, 401, 'Unauthorized'); - }); - }; - /** * @typedef SystemMessageHandlers * @property {function(): void} onKill @@ -944,8 +1000,8 @@ const startServer = async () => { }; /** - * @param {any} req - * @param {any} ws + * @param {http.IncomingMessage} req + * @param {WebSocket} ws * @param {string[]} streamName * @returns {function(string, string): void} */ @@ -955,7 +1011,9 @@ const startServer = async () => { return; } - ws.send(JSON.stringify({ stream: streamName, event, payload }), (err) => { + const message = JSON.stringify({ stream: streamName, event, payload }); + + ws.send(message, (/** @type {Error} */ err) => { if (err) { log.error(req.requestId, `Failed to send to websocket: ${err}`); } @@ -992,8 +1050,6 @@ const startServer = async () => { }); }); - const wss = new WebSocket.Server({ server, verifyClient: wsVerifyClient }); - /** * @typedef StreamParams * @property {string} [tag] @@ -1173,8 +1229,8 @@ const startServer = async () => { /** * @typedef WebSocketSession - * @property {any} socket - * @property {any} request + * @property {WebSocket} websocket + * @property {http.IncomingMessage} request * @property {Object.} subscriptions */ @@ -1297,7 +1353,11 @@ const startServer = async () => { } }; - wss.on('connection', (ws, req) => { + /** + * @param {WebSocket & { isAlive: boolean }} ws + * @param {http.IncomingMessage} req + */ + function onConnection(ws, req) { // Note: url.parse could throw, which would terminate the connection, so we // increment the connected clients metric straight away when we establish // the connection, without waiting: @@ -1375,7 +1435,9 @@ const startServer = async () => { if (location && location.query.stream) { subscribeWebsocketToChannel(session, firstParam(location.query.stream), location.query); } - }); + } + + wss.on('connection', onConnection); setInterval(() => { wss.clients.forEach(ws => { From e81c5c0a5124fe900bd2ae631a34acedef4d9bcd Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 15 Jan 2024 11:45:48 +0100 Subject: [PATCH 02/43] Ignore the devise-two-factor advisory as we have rate limits in place (#28733) --- .bundler-audit.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .bundler-audit.yml diff --git a/.bundler-audit.yml b/.bundler-audit.yml new file mode 100644 index 00000000000000..0671df390fed81 --- /dev/null +++ b/.bundler-audit.yml @@ -0,0 +1,6 @@ +--- +ignore: + # devise-two-factor advisory about brute-forcing TOTP + # We have rate-limits on authentication endpoints in place (including second + # factor verification) since Mastodon v3.2.0 + - CVE-2024-0227 From 1012ffac9e5c476e1da6fbabe265a5916409c23e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:06:25 +0100 Subject: [PATCH 03/43] New Crowdin Translations (automated) (#28721) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/ast.json | 11 ++++----- app/javascript/mastodon/locales/hi.json | 29 ++++++++++++++++++++++++ config/locales/ast.yml | 19 ++++++++++++++++ config/locales/lt.yml | 11 +++++++-- config/locales/nl.yml | 4 ++-- config/locales/simple_form.ast.yml | 10 ++++++++ config/locales/sk.yml | 4 ++++ 7 files changed, 77 insertions(+), 11 deletions(-) diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json index c4238edcd4000d..4b555c4829c94e 100644 --- a/app/javascript/mastodon/locales/ast.json +++ b/app/javascript/mastodon/locales/ast.json @@ -13,14 +13,12 @@ "about.rules": "Normes del sirvidor", "account.account_note_header": "Nota", "account.add_or_remove_from_list": "Amestar o quitar de les llistes", - "account.badges.bot": "Automatizáu", "account.badges.group": "Grupu", "account.block": "Bloquiar a @{name}", "account.block_domain": "Bloquiar el dominiu {domain}", "account.block_short": "Bloquiar", "account.blocked": "Perfil bloquiáu", "account.browse_more_on_origin_server": "Restolar más nel perfil orixinal", - "account.cancel_follow_request": "Atayar siguimientu", "account.copy": "Copiar I'enllaz al perfil", "account.direct": "Mentar a @{name} per privao", "account.disable_notifications": "Dexar d'avisame cuando @{name} espublice artículos", @@ -28,13 +26,11 @@ "account.edit_profile": "Editar el perfil", "account.enable_notifications": "Avisame cuando @{name} espublice artículos", "account.endorse": "Destacar nel perfil", - "account.featured_tags.last_status_at": "Últimu estáu en {date}", - "account.featured_tags.last_status_never": "Sin estaos", + "account.featured_tags.last_status_never": "Nun hai nengún artículu", "account.featured_tags.title": "Etiquetes destacaes de: {name}", "account.follow": "Siguir", "account.followers": "Siguidores", "account.followers.empty": "Naide sigue a esti perfil.", - "account.followers_counter": "{count, plural, one {{counter} Siguíu} other {{counter} Siguíos}}", "account.following": "Siguiendo", "account.following_counter": "{count, plural,one {Sigue a {counter}} other {Sigue a {counter}}}", "account.follows.empty": "Esti perfil nun sigue a naide.", @@ -42,7 +38,6 @@ "account.hide_reblogs": "Anubrir los artículos compartíos de @{name}", "account.in_memoriam": "N'alcordanza.", "account.joined_short": "Data de xunión", - "account.languages": "Camudar llingües suscrites", "account.link_verified_on": "La propiedá d'esti enllaz foi comprobada'l {date}", "account.media": "Multimedia", "account.mention": "Mentar a @{name}", @@ -108,6 +103,7 @@ "community.column_settings.remote_only": "Namás lo remoto", "compose.language.change": "Camudar la llingua", "compose.language.search": "Buscar llingües…", + "compose.published.body": "Espublizóse l'artículu.", "compose_form.direct_message_warning_learn_more": "Saber más", "compose_form.encryption_warning": "Los artículos de Mastodon nun tán cifraos de puntu a puntu. Nun compartas nengún tipu d'información sensible per Mastodon.", "compose_form.lock_disclaimer": "La to cuenta nun ye {locked}. Cualesquier perfil pue siguite pa ver los artículos que son namás pa siguidores.", @@ -299,6 +295,7 @@ "navigation_bar.lists": "Llistes", "navigation_bar.logout": "Zarrar la sesión", "navigation_bar.mutes": "Perfiles colos avisos desactivaos", + "navigation_bar.opened_in_classic_interface": "Los artículos, les cuentes ya otres páxines específiques ábrense por defeutu na interfaz web clásica.", "navigation_bar.pins": "Artículos fixaos", "navigation_bar.preferences": "Preferencies", "navigation_bar.public_timeline": "Llinia de tiempu federada", @@ -334,7 +331,7 @@ "notifications.group": "{count} avisos", "notifications.mark_as_read": "Marcar tolos avisos como lleíos", "notifications.permission_required": "Los avisos d'escritoriu nun tán disponibles porque nun se concedió'l permisu riquíu.", - "onboarding.actions.go_to_explore": "See what's trending", + "onboarding.profile.note_hint": "Pues @mentar a otros perfiles o poner #etiquetes…", "onboarding.start.lead": "Xá yes parte de Mastodon, una plataforma social multimedia descentralizada onde tu ya non un algoritmu, personalices la to esperiencia. Vamos presentate esti llugar social nuevu:", "onboarding.start.skip": "¿Nun precises ayuda pa comenzar?", "onboarding.steps.follow_people.body": "Mastodon trata namás de siguir a cuentes interesantes.", diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json index 76d7c1d3812f89..412159bef9b7b7 100644 --- a/app/javascript/mastodon/locales/hi.json +++ b/app/javascript/mastodon/locales/hi.json @@ -386,6 +386,7 @@ "navigation_bar.security": "सुरक्षा", "not_signed_in_indicator.not_signed_in": "You need to sign in to access this resource.", "notification.reblog": "{name} boosted your status", + "notification.status": "{name} ने अभी पोस्ट किया", "notifications.clear": "सूचनाएं हटाए", "notifications.column_settings.admin.report": "नई रिपोर्ट:", "notifications.column_settings.favourite": "पसंदीदा:", @@ -399,9 +400,12 @@ "notifications.column_settings.show": "कॉलम में दिखाएँ", "notifications.column_settings.sound": "ध्वनि चलाएँ", "notifications.column_settings.status": "New toots:", + "notifications.column_settings.unread_notifications.category": "अपठित सूचनाएं", + "notifications.column_settings.unread_notifications.highlight": "अपठित सूचनाओं को हाइलाइट करें", "notifications.column_settings.update": "संपादन:", "notifications.filter.all": "सभी", "notifications.filter.boosts": "बूस्ट", + "notifications.filter.favourites": "पसंदीदा", "notifications.filter.follows": "फॉलो", "notifications.filter.mentions": "उल्लेख", "notifications.filter.polls": "चुनाव परिणाम", @@ -416,6 +420,7 @@ "onboarding.follows.title": "Popular on Mastodon", "onboarding.profile.discoverable": "अपना प्रोफाइल खोजने योग्य बनाएं", "onboarding.profile.discoverable_hint": "जब आप मॅस्टोडॉन पर डिस्कवरेबिलिटी चुनते हैं तो आपके पोस्ट ट्रेंडिंग और सर्च में दिख सकते हैं और आपका प्रोफाइल आपके ही जैसे अकाउंट्स को सुझाया जा सकता है।", + "onboarding.profile.display_name": "प्रदर्शित नाम", "onboarding.share.message": "मैं {username} मॅस्टोडॉन पर हूं! मुझे यहां {url} फॉलो करें", "onboarding.share.next_steps": "आगे कि संभवित विधि", "onboarding.start.lead": "Your new Mastodon account is ready to go. Here's how you can make the most of it:", @@ -445,6 +450,9 @@ "recommended": "अनुशंसित", "refresh": "रीफ्रेश करें", "regeneration_indicator.label": "लोड हो रहा है...", + "relative_time.days": "{number}दिन", + "relative_time.full.days": "{number, plural, one {# दिन} other {# दिन}} पहले", + "relative_time.full.hours": "{number, plural,one {# घंटा} other {# घंटे}} पहले", "relative_time.full.just_now": "अभी-अभी", "relative_time.full.minutes": "{number, plural, one {# मिनट} other {# मिनट}} पहले", "relative_time.full.seconds": "{number, plural, one {# सेकंड} other {# सेकंड}} पहले", @@ -454,15 +462,23 @@ "relative_time.seconds": "{number} सेकंड", "relative_time.today": "आज", "reply_indicator.cancel": "रद्द करें", + "report.block": "ब्लॉक", "report.block_explanation": "आपको उनकी पोस्टें नहीं दिखेंगे। वे आपकी पोस्टें को देख नहीं पाएंगे और आपको फ़ॉलो नहीं कर पाएंगे। उन्हे पता लगेगा कि वे blocked हैं।", "report.categories.other": "अन्य", "report.categories.spam": "अवांछित", "report.category.title_account": "रूपरेखा", "report.close": "स्वीकार करें", "report.comment.title": "क्या और कुछ है जिसके बारे में आपको लगता है कि हमें सूचित होना चाहिए?", + "report.next": "आगे", "report.placeholder": "Type or paste additional comments", "report.reasons.dislike": "मुझे यह पसंद नहीं है", + "report.reasons.legal": "यह अवैध है", + "report.reasons.legal_description": "आप मानते हैं कि यह आपके या सर्वर के देश के कानून का उल्लंघन करता है", "report.reasons.other": "कुछ और है।", + "report.reasons.violation": "यह सर्वर नियमों का उल्लंघन करता है", + "report.rules.title": "किन नियमों का उल्लंघन हो रहा है?", + "report.statuses.subtitle": "लागू होने वाले सभी का चयन करें", + "report.statuses.title": "क्या ऐसे कोई पोस्ट हैं जो इस रिपोर्ट का समर्थन करते हों?", "report.submit": "सबमिट करें", "report.target": "Report {target}", "report_notification.attached_statuses": "{count, plural, one {# post} other {# posts}} attached", @@ -480,11 +496,24 @@ "search_results.statuses": "Toots", "sign_in_banner.sign_in": "Sign in", "status.admin_status": "Open this status in the moderation interface", + "status.block": "@{name} को ब्लॉक करें", + "status.bookmark": "बुकमार्क", + "status.cannot_reblog": "रिपोस्ट को बूस्ट नहीं किया जा सकता", "status.copy": "Copy link to status", + "status.delete": "हटाएं", + "status.detailed_status": "विस्तृत वार्ता दृश्य", "status.direct": "निजी संदेश @{name} से", "status.edited_x_times": "Edited {count, plural, one {# time} other {# times}}", + "status.media.open": "खोलने के लिए क्लिक करें", + "status.media.show": "दिखाने के लिए क्लिक करें", + "status.mention": "@{name} का उल्लेख करें", + "status.more": "अतिरिक्त", + "status.mute": "@{name} म्यूट करें", + "status.mute_conversation": "इस वार्तालाप को म्यूट करें", "status.open": "Expand this status", + "status.pin": "प्रोफ़ाइल पर पिन करें", "status.pinned": "Pinned toot", + "status.read_more": "और पढ़ें", "status.reblog": "बूस्ट", "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.", "status.replied_to": "{name} का उत्तर दें", diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 08717c840eaa5f..a32413cb9a73fb 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -23,6 +23,8 @@ ast: are_you_sure: "¿De xuru que quies facer esta aición?" avatar: Avatar by_domain: Dominiu + change_role: + label: Camudar el rol confirming: En confirmación disabled: Conxelóse display_name: Nome visible @@ -59,6 +61,7 @@ ast: suspend: Suspender title: Cuentes username: Nome d'usuariu + warn: Alvertir web: Web action_logs: actions: @@ -181,6 +184,7 @@ ast: availability: no_failures_recorded: Nun se rexistró nengún fallu. title: Disponibilidá + back_to_warning: Alvertencia by_domain: Dominiu content_policies: comment: Nota interna @@ -461,6 +465,7 @@ ast: delete_account_html: Si quies desaniciar la cuenta, pues facelo equí. Va pidísete que confirmes l'aición. description: prefix_sign_up: "¡Rexístrate güei en Mastodon!" + didnt_get_confirmation: "¿Nun recibiesti l'enllaz de confirmación?" dont_have_your_security_key: "¿Nun tienes una llave de seguranza?" forgot_password: "¿Escaeciesti la contraseña?" login: Aniciar la sesión @@ -477,6 +482,8 @@ ast: accept: Aceptar back: Atrás security: Seguranza + setup: + link_not_received: "¿Nun consiguiesti l'enllaz?" sign_in: preamble_html: Anicia la sesión colos tos datos d'accesu en %{domain}. Si la cuenta ta agospiada n'otru sirvidor, nun vas ser a aniciar la sesión equí. title: Aniciu de la sesión en «%{domain}» @@ -535,6 +542,9 @@ ast: your_appeal_approved: Aprobóse la to apellación your_appeal_pending: Unviesti una apellación your_appeal_rejected: Refugóse la to apellación + edit_profile: + basic_information: Información básica + other: Otres preferencies errors: '400': La solicitú qu'unviesti nun yera válida o yera incorreuta. '403': Nun tienes permisu pa ver esta páxina. @@ -622,6 +632,7 @@ ast: muting: Llista de perfiles colos avisos desactivaos upload: Xubir invites: + delete: Desactivar expired: Caducó expires_in: '1800': 30 minutos @@ -715,6 +726,14 @@ ast: other: Otres preferencies posting_defaults: Configuración predeterminada del espublizamientu d'artículos public_timelines: Llinies de tiempu públiques + privacy: + hint_html: "Personaliza cómo quies s'atope esti perfil ya los sos artículos. Hai una variedá de funciones de Mastodon que puen ayudate a algamar audiencies más grandes cuando s'activen. Dedica un momentu pa revisar estes opciones y asegurate de que s'axusten al to casu." + privacy: Privacidá + reach: Algame + reach_hint_html: Controla si quies que te descubran ya te sigan perfiles nuevos. ¿Quies que los tos artículos apaezan na pantalla «Esploración»? ¿Quies qu'otres persones te vean na recomendación de cuentes? ¿Quies aceptar toles solicitúes de siguimientu automáticamente o tener un control minuciosu de caúna? + search: Busca + search_hint_html: Controla cómo quies que t'atopen. ¿Quies que la xente t'atope polo qu'espublices públicamente? ¿Quies que la xente fuera de Mástodon atope esti perfil cuando busque na web? Ten en cuenta que nun se pue garantizar la esclusión total de tolos motores de busca. + title: Privacidá ya algame privacy_policy: title: Política de privacidá relationships: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index b194011a424c3a..8de969f646a739 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -48,15 +48,22 @@ lt: new_email: Naujas el pašto adresas submit: Pakeisti el pašto adresą title: Pakeisti el pašto adresą vartotojui %{username} + change_role: + label: Keisti vaidmenį + no_role: Jokios vaidmenį + title: Keisti vaidmenį %{username} confirm: Patvirtinti confirmed: Patvirtinta confirming: Tvirtinama + custom: Pasirinktinis + delete: Ištrinti duomenis deleted: Ištrinti demote: Pažeminti disable: Išjungti - disable_two_factor_authentication: Išjungti 2 faktorių autentifikaciją + disable_sign_in_token_auth: Išjungti el. pašto prieigos rakto tapatybės nustatymą + disable_two_factor_authentication: Išjungti 2FA disabled: Išjungta - display_name: Matomas vardas + display_name: Rodomas vardas domain: Domenas edit: Keisti email: El paštas diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 34769e08ec1d07..3429ab0e822d2a 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -425,7 +425,7 @@ nl: view: Domeinblokkade bekijken email_domain_blocks: add_new: Nieuwe toevoegen - allow_registrations_with_approval: Inschrijvingen met goedkeuring toestaan + allow_registrations_with_approval: Registraties met goedkeuring toestaan attempts_over_week: one: "%{count} registratiepoging tijdens de afgelopen week" other: "%{count} registratiepogingen tijdens de afgelopen week" @@ -571,7 +571,7 @@ nl: enable_hint: Eenmaal ingeschakeld gaat jouw server zich op alle openbare berichten van deze relayserver abonneren en stuurt het de openbare berichten van jouw server naar de relayserver. enabled: Ingeschakeld inbox_url: Relay-URL - pending: Aan het wachten op toestemming van de relayserver + pending: Aan het wachten op goedkeuring van de relayserver save_and_enable: Opslaan en inschakelen setup: Een verbinding met een relayserver maken signatures_not_enabled: Federatierelays werken mogelijk niet goed wanneer de veilige modus of de beperkte federatiemodus is ingeschakeld diff --git a/config/locales/simple_form.ast.yml b/config/locales/simple_form.ast.yml index 4ffc4bd1662b5b..9b560b67ebbca6 100644 --- a/config/locales/simple_form.ast.yml +++ b/config/locales/simple_form.ast.yml @@ -2,6 +2,9 @@ ast: simple_form: hints: + account: + note: 'Pues @mentar a otros perfiles o poner #etiquetes.' + unlocked: Los perfiles van ser a siguite ensin solicitar la to aprobación. Desmarca esta opción si quies revisar les solicitúes de siguimientu y escoyer si aceptales o refugales. admin_account_action: text_html: Opcional. Pues usar la sintaxis de los artículos ya amestar alvertencies preconfiguraes p'aforrar tiempu type_html: Escueyi qué facer con %{acct} @@ -59,9 +62,11 @@ ast: chosen_languages: Namás los artículos de les llingües que marques son los que van apaecer nes llinies de tiempu públiques labels: account: + discoverable: Destacar el perfil ya los artículos nos algoritmos de descubrimientu fields: name: Etiqueta value: Conteníu + indexable: Incluyir los artículos públicos nos resultaos de busca account_warning_preset: title: Títulu admin_account_action: @@ -166,9 +171,13 @@ ast: pending_account: Una cuenta nueva precisa una revisión reblog: Daquién compartió'l to artículu report: Unvióse un informe nuevu + software_updates: + label: Hai disponible un anovamientu de Mastodon trending_tag: Una tendencia rique una revisión rule: text: Norma + settings: + indexable: Incluyir la páxina del perfil nos motores de busca tag: listable: Permitir qu'esta etiqueta apaeza nes busques ya nes suxerencies name: Etiqueta @@ -176,6 +185,7 @@ ast: usable: Permitir que los artículos usen esta etiqueta user: role: Rol + time_zone: Fusu horariu user_role: name: Nome permissions_as_keys: Permisos diff --git a/config/locales/sk.yml b/config/locales/sk.yml index a91f1d620ec951..9390a713bc112f 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -448,6 +448,7 @@ sk: title: Moderácia private_comment: Súkromný komentár public_comment: Verejný komentár + purge: Vyčisti title: Federácia total_blocked_by_us: Nami blokované total_followed_by_them: Nimi sledované @@ -600,6 +601,8 @@ sk: title: Ohľadom appearance: title: Vzhľad + branding: + title: Značka content_retention: title: Ponechanie obsahu discovery: @@ -721,6 +724,7 @@ sk: disable: Vypni disabled: Vypnuté enable: Povoľ + enabled: Aktívne status: Stav admin_mailer: new_appeal: From 8013d6c56d4003dadb74dbabc8c8c97568f9f336 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:06:28 +0100 Subject: [PATCH 04/43] Update dependency faker to v3.2.3 (#28720) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e9c62eb115950b..0bc7815d85b4d3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -257,7 +257,7 @@ GEM tzinfo excon (0.109.0) fabrication (2.31.0) - faker (3.2.2) + faker (3.2.3) i18n (>= 1.8.11, < 2) faraday (1.10.3) faraday-em_http (~> 1.0) From 8cb4825c8bbfb5ca9c9f96058de053b7d7bf218b Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 15 Jan 2024 12:06:48 +0100 Subject: [PATCH 05/43] Fix sign-up restrictions based on email addresses not being enforced (#28732) --- app/models/user.rb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index 0c589f8068a1d3..f5ed3fa4624c9f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -187,7 +187,7 @@ def to_log_route_param def confirm new_user = !confirmed? - self.approved = true if open_registrations? && !sign_up_from_ip_requires_approval? + self.approved = true if grant_approval_on_confirmation? super @@ -206,7 +206,7 @@ def confirm def confirm! new_user = !confirmed? - self.approved = true if open_registrations? + self.approved = true if grant_approval_on_confirmation? skip_confirmation! save! @@ -426,6 +426,11 @@ def set_approved end end + def grant_approval_on_confirmation? + # Re-check approval on confirmation if the server has switched to open registrations + open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval? + end + def sign_up_from_ip_requires_approval? !sign_up_ip.nil? && IpBlock.where(severity: :sign_up_requires_approval).where('ip >>= ?', sign_up_ip.to_s).exists? end From 367be82a29a217ad86313815c278880d127c8acb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:09:28 +0100 Subject: [PATCH 06/43] Update libretranslate/libretranslate Docker tag to v1.5.4 (#28727) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .devcontainer/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 21ee078d60357b..88979723c338eb 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -70,7 +70,7 @@ services: hard: -1 libretranslate: - image: libretranslate/libretranslate:v1.5.3 + image: libretranslate/libretranslate:v1.5.4 restart: unless-stopped volumes: - lt-data:/home/libretranslate/.local From b5afbe0a61a00ed890f975d1c5e0d1312c6a2589 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:17:25 +0100 Subject: [PATCH 07/43] Update dependency bootsnap to v1.17.1 (#28713) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0bc7815d85b4d3..290702eea99e71 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -155,7 +155,7 @@ GEM binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) blurhash (0.1.7) - bootsnap (1.17.0) + bootsnap (1.17.1) msgpack (~> 1.2) brakeman (6.1.1) racc From a2f02a07758c32f0dcc6388b4f30ca5a84e762f3 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 15 Jan 2024 08:46:47 -0500 Subject: [PATCH 08/43] Disable `Rails/SkipsModelValidations` cop (#28712) --- .rubocop.yml | 5 +-- .rubocop_todo.yml | 35 ------------------- .../admin/system_check/media_privacy_check.rb | 2 +- app/lib/attachment_batch.rb | 2 +- app/models/bulk_import.rb | 4 +-- app/models/follow_request.rb | 2 +- app/models/form/import.rb | 2 +- spec/services/reblog_service_spec.rb | 2 +- spec/workers/redownload_avatar_worker_spec.rb | 2 +- spec/workers/redownload_header_worker_spec.rb | 2 +- 10 files changed, 12 insertions(+), 46 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index a06621d6603a0e..fcdc4e06cbdb22 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -109,9 +109,10 @@ Rails/LexicallyScopedActionFilter: Exclude: - 'app/controllers/auth/*' +# Reason: There are appropriate times to use these features +# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsskipsmodelvalidations Rails/SkipsModelValidations: - Exclude: - - 'db/*migrate/**/*' + Enabled: false # Reason: We want to preserve the ability to migrate from arbitrary old versions, # and cannot guarantee that every installation has run every migration as they upgrade. diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 602d99c9f0034d..2c2366c9cf55a8 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -80,41 +80,6 @@ Rails/RakeEnvironment: - 'lib/tasks/repo.rake' - 'lib/tasks/statistics.rake' -# Configuration parameters: ForbiddenMethods, AllowedMethods. -# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all -Rails/SkipsModelValidations: - Exclude: - - 'app/controllers/admin/invites_controller.rb' - - 'app/controllers/concerns/session_tracking_concern.rb' - - 'app/models/concerns/account/merging.rb' - - 'app/models/concerns/expireable.rb' - - 'app/models/status.rb' - - 'app/models/trends/links.rb' - - 'app/models/trends/preview_card_batch.rb' - - 'app/models/trends/preview_card_provider_batch.rb' - - 'app/models/trends/status_batch.rb' - - 'app/models/trends/statuses.rb' - - 'app/models/trends/tag_batch.rb' - - 'app/models/trends/tags.rb' - - 'app/models/user.rb' - - 'app/services/activitypub/process_status_update_service.rb' - - 'app/services/approve_appeal_service.rb' - - 'app/services/block_domain_service.rb' - - 'app/services/delete_account_service.rb' - - 'app/services/process_mentions_service.rb' - - 'app/services/unallow_domain_service.rb' - - 'app/services/unblock_domain_service.rb' - - 'app/services/update_status_service.rb' - - 'app/workers/activitypub/post_upgrade_worker.rb' - - 'app/workers/move_worker.rb' - - 'app/workers/scheduler/ip_cleanup_scheduler.rb' - - 'app/workers/scheduler/scheduled_statuses_scheduler.rb' - - 'lib/mastodon/cli/accounts.rb' - - 'lib/mastodon/cli/maintenance.rb' - - 'spec/lib/activitypub/activity/follow_spec.rb' - - 'spec/services/follow_service_spec.rb' - - 'spec/services/update_account_service_spec.rb' - # Configuration parameters: Include. # Include: app/models/**/*.rb Rails/UniqueValidationWithoutIndex: diff --git a/app/lib/admin/system_check/media_privacy_check.rb b/app/lib/admin/system_check/media_privacy_check.rb index 1df05b120ea80a..2ddc8e8b07e4c3 100644 --- a/app/lib/admin/system_check/media_privacy_check.rb +++ b/app/lib/admin/system_check/media_privacy_check.rb @@ -78,7 +78,7 @@ def media_attachment @media_attachment ||= begin attachment = Account.representative.media_attachments.first if attachment.present? - attachment.touch # rubocop:disable Rails/SkipsModelValidations + attachment.touch attachment else create_test_attachment! diff --git a/app/lib/attachment_batch.rb b/app/lib/attachment_batch.rb index b28f5c3d7fc14d..32ccb0b13c1fb1 100644 --- a/app/lib/attachment_batch.rb +++ b/app/lib/attachment_batch.rb @@ -37,7 +37,7 @@ def delete def clear remove_files - batch.update_all(nullified_attributes) # rubocop:disable Rails/SkipsModelValidations + batch.update_all(nullified_attributes) end private diff --git a/app/models/bulk_import.rb b/app/models/bulk_import.rb index 810e471849245a..406fb2aba26c7a 100644 --- a/app/models/bulk_import.rb +++ b/app/models/bulk_import.rb @@ -44,8 +44,8 @@ class BulkImport < ApplicationRecord def self.progress!(bulk_import_id, imported: false) # Use `increment_counter` so that the incrementation is done atomically in the database - BulkImport.increment_counter(:processed_items, bulk_import_id) # rubocop:disable Rails/SkipsModelValidations - BulkImport.increment_counter(:imported_items, bulk_import_id) if imported # rubocop:disable Rails/SkipsModelValidations + BulkImport.increment_counter(:processed_items, bulk_import_id) + BulkImport.increment_counter(:imported_items, bulk_import_id) if imported # Since the incrementation has been done atomically, concurrent access to `bulk_import` is now bening bulk_import = BulkImport.find(bulk_import_id) diff --git a/app/models/follow_request.rb b/app/models/follow_request.rb index 3c5e8f96f0d5bc..c13cc718d8f0ce 100644 --- a/app/models/follow_request.rb +++ b/app/models/follow_request.rb @@ -33,7 +33,7 @@ class FollowRequest < ApplicationRecord def authorize! follow = account.follow!(target_account, reblogs: show_reblogs, notify: notify, languages: languages, uri: uri, bypass_limit: true) - ListAccount.where(follow_request: self).update_all(follow_request_id: nil, follow_id: follow.id) # rubocop:disable Rails/SkipsModelValidations + ListAccount.where(follow_request: self).update_all(follow_request_id: nil, follow_id: follow.id) MergeWorker.perform_async(target_account.id, account.id) if account.local? destroy! end diff --git a/app/models/form/import.rb b/app/models/form/import.rb index 712acf37065e17..fc83d9c58c1fdb 100644 --- a/app/models/form/import.rb +++ b/app/models/form/import.rb @@ -69,7 +69,7 @@ def save ApplicationRecord.transaction do now = Time.now.utc @bulk_import = current_account.bulk_imports.create(type: type, overwrite: overwrite || false, state: :unconfirmed, original_filename: data.original_filename, likely_mismatched: likely_mismatched?) - nb_items = BulkImportRow.insert_all(parsed_rows.map { |row| { bulk_import_id: bulk_import.id, data: row, created_at: now, updated_at: now } }).length # rubocop:disable Rails/SkipsModelValidations + nb_items = BulkImportRow.insert_all(parsed_rows.map { |row| { bulk_import_id: bulk_import.id, data: row, created_at: now, updated_at: now } }).length @bulk_import.update(total_items: nb_items) end end diff --git a/spec/services/reblog_service_spec.rb b/spec/services/reblog_service_spec.rb index 357b315af0dc09..e5d0a2d6ced999 100644 --- a/spec/services/reblog_service_spec.rb +++ b/spec/services/reblog_service_spec.rb @@ -46,7 +46,7 @@ def discard_status Status .where(id: reblog_of_id) .where(text: 'discard-status-text') - .update_all(deleted_at: Time.now.utc) # rubocop:disable Rails/SkipsModelValidations + .update_all(deleted_at: Time.now.utc) end end end diff --git a/spec/workers/redownload_avatar_worker_spec.rb b/spec/workers/redownload_avatar_worker_spec.rb index 4ab368e12f11c1..6ef320bc4fd2ad 100644 --- a/spec/workers/redownload_avatar_worker_spec.rb +++ b/spec/workers/redownload_avatar_worker_spec.rb @@ -41,7 +41,7 @@ it 'reprocesses a remote avatar' do stub_request(:get, 'https://example.host/file').to_return request_fixture('avatar.txt') account = Fabricate(:account, avatar_remote_url: 'https://example.host/file') - account.update_column(:avatar_file_name, nil) # rubocop:disable Rails/SkipsModelValidations + account.update_column(:avatar_file_name, nil) result = worker.perform(account.id) diff --git a/spec/workers/redownload_header_worker_spec.rb b/spec/workers/redownload_header_worker_spec.rb index 3b6f497bb80d42..746c1a63ffbb76 100644 --- a/spec/workers/redownload_header_worker_spec.rb +++ b/spec/workers/redownload_header_worker_spec.rb @@ -41,7 +41,7 @@ it 'reprocesses a remote header' do stub_request(:get, 'https://example.host/file').to_return request_fixture('avatar.txt') account = Fabricate(:account, header_remote_url: 'https://example.host/file') - account.update_column(:header_file_name, nil) # rubocop:disable Rails/SkipsModelValidations + account.update_column(:header_file_name, nil) result = worker.perform(account.id) From e621c1c44c49dbed58e6961ad868d356f0534490 Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 15 Jan 2024 18:10:57 +0100 Subject: [PATCH 09/43] Fix registrations not checking MX records for email domain blocks requiring approval (#28608) --- app/models/user.rb | 25 +++++++++++-- .../auth/registrations_controller_spec.rb | 37 +++++++++++++++++++ spec/services/app_sign_up_service_spec.rb | 33 +++++++++++++++++ 3 files changed, 92 insertions(+), 3 deletions(-) diff --git a/app/models/user.rb b/app/models/user.rb index f5ed3fa4624c9f..4bc19b16a6a9ac 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -149,6 +149,10 @@ def self.those_who_can(*any_of_privileges) end end + def self.skip_mx_check? + Rails.env.local? + end + def role if role_id.nil? UserRole.everyone @@ -436,9 +440,24 @@ def sign_up_from_ip_requires_approval? end def sign_up_email_requires_approval? - return false unless email.present? || unconfirmed_email.present? + return false if email.blank? + + _, domain = email.split('@', 2) + return false if domain.blank? + + records = [] + + # Doing this conditionally is not very satisfying, but this is consistent + # with the MX records validations we do and keeps the specs tractable. + unless self.class.skip_mx_check? + Resolv::DNS.open do |dns| + dns.timeouts = 5 + + records = dns.getresources(domain, Resolv::DNS::Resource::IN::MX).to_a.map { |e| e.exchange.to_s }.compact_blank + end + end - EmailDomainBlock.requires_approval?(email.presence || unconfirmed_email, attempt_ip: sign_up_ip) + EmailDomainBlock.requires_approval?(records + [domain], attempt_ip: sign_up_ip) end def open_registrations? @@ -489,7 +508,7 @@ def needs_feed_update? end def validate_email_dns? - email_changed? && !external? && !Rails.env.local? + email_changed? && !external? && !self.class.skip_mx_check? end def validate_role_elevation diff --git a/spec/controllers/auth/registrations_controller_spec.rb b/spec/controllers/auth/registrations_controller_spec.rb index bd1c6165951ebf..0b7f02f5900b7b 100644 --- a/spec/controllers/auth/registrations_controller_spec.rb +++ b/spec/controllers/auth/registrations_controller_spec.rb @@ -137,12 +137,49 @@ context 'when user has an email address requiring approval' do subject do + request.headers['Accept-Language'] = accept_language + post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } + end + + before do Setting.registrations_mode = 'open' Fabricate(:email_domain_block, allow_with_approval: true, domain: 'example.com') + end + + it 'creates unapproved user and redirects to setup' do + subject + expect(response).to redirect_to auth_setup_path + + user = User.find_by(email: 'test@example.com') + expect(user).to_not be_nil + expect(user.locale).to eq(accept_language) + expect(user.approved).to be(false) + end + end + + context 'when user has an email address requiring approval through a MX record' do + subject do request.headers['Accept-Language'] = accept_language post :create, params: { user: { account_attributes: { username: 'test' }, email: 'test@example.com', password: '12345678', password_confirmation: '12345678', agreement: 'true' } } end + before do + Setting.registrations_mode = 'open' + Fabricate(:email_domain_block, allow_with_approval: true, domain: 'mail.example.com') + allow(User).to receive(:skip_mx_check?).and_return(false) + + resolver = instance_double(Resolv::DNS, :timeouts= => nil) + + allow(resolver).to receive(:getresources) + .with('example.com', Resolv::DNS::Resource::IN::MX) + .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'mail.example.com')]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')]) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + end + it 'creates unapproved user and redirects to setup' do subject expect(response).to redirect_to auth_setup_path diff --git a/spec/services/app_sign_up_service_spec.rb b/spec/services/app_sign_up_service_spec.rb index 86e64dab21cdd5..b37b6da1f018ee 100644 --- a/spec/services/app_sign_up_service_spec.rb +++ b/spec/services/app_sign_up_service_spec.rb @@ -48,6 +48,39 @@ end end + context 'when the email address requires approval through MX records' do + before do + Setting.registrations_mode = 'open' + Fabricate(:email_domain_block, allow_with_approval: true, domain: 'smtp.email.com') + allow(User).to receive(:skip_mx_check?).and_return(false) + + resolver = instance_double(Resolv::DNS, :timeouts= => nil) + + allow(resolver).to receive(:getresources) + .with('email.com', Resolv::DNS::Resource::IN::MX) + .and_return([instance_double(Resolv::DNS::Resource::MX, exchange: 'smtp.email.com')]) + allow(resolver).to receive(:getresources).with('email.com', Resolv::DNS::Resource::IN::A).and_return([]) + allow(resolver).to receive(:getresources).with('email.com', Resolv::DNS::Resource::IN::AAAA).and_return([]) + allow(resolver).to receive(:getresources).with('smtp.email.com', Resolv::DNS::Resource::IN::A).and_return([instance_double(Resolv::DNS::Resource::IN::A, address: '2.3.4.5')]) + allow(resolver).to receive(:getresources).with('smtp.email.com', Resolv::DNS::Resource::IN::AAAA).and_return([instance_double(Resolv::DNS::Resource::IN::AAAA, address: 'fd00::2')]) + allow(Resolv::DNS).to receive(:open).and_yield(resolver) + end + + it 'creates an unapproved user', :aggregate_failures do + access_token = subject.call(app, remote_ip, params) + expect(access_token).to_not be_nil + expect(access_token.scopes.to_s).to eq 'read write' + + user = User.find_by(id: access_token.resource_owner_id) + expect(user).to_not be_nil + expect(user.confirmed?).to be false + expect(user.approved?).to be false + + expect(user.account).to_not be_nil + expect(user.invite_request).to be_nil + end + end + context 'when registrations are closed' do before do Setting.registrations_mode = 'none' From 98b5f85f10a3af50a54fcd79e09fc9fd88f774fa Mon Sep 17 00:00:00 2001 From: Claire Date: Mon, 15 Jan 2024 19:04:58 +0100 Subject: [PATCH 10/43] Rename and refactor `User#confirm!` to `User#mark_email_as_confirmed!` (#28735) --- .../admin/confirmations_controller.rb | 2 +- app/models/concerns/user/omniauthable.rb | 2 +- app/models/user.rb | 54 +++++++++---------- lib/mastodon/cli/accounts.rb | 2 +- spec/features/oauth_spec.rb | 2 +- spec/models/user_spec.rb | 4 +- spec/policies/user_policy_spec.rb | 2 +- 7 files changed, 33 insertions(+), 35 deletions(-) diff --git a/app/controllers/admin/confirmations_controller.rb b/app/controllers/admin/confirmations_controller.rb index 6f4e42679722e2..7ccf5c9012de7c 100644 --- a/app/controllers/admin/confirmations_controller.rb +++ b/app/controllers/admin/confirmations_controller.rb @@ -7,7 +7,7 @@ class ConfirmationsController < BaseController def create authorize @user, :confirm? - @user.confirm! + @user.mark_email_as_confirmed! log_action :confirm, @user redirect_to admin_accounts_path end diff --git a/app/models/concerns/user/omniauthable.rb b/app/models/concerns/user/omniauthable.rb index 6d1d1b8cc3fbdc..113bfda23043eb 100644 --- a/app/models/concerns/user/omniauthable.rb +++ b/app/models/concerns/user/omniauthable.rb @@ -61,7 +61,7 @@ def create_for_oauth(auth) user.account.avatar_remote_url = nil end - user.confirm! if email_is_verified + user.mark_email_as_confirmed! if email_is_verified user.save! user end diff --git a/app/models/user.rb b/app/models/user.rb index 4bc19b16a6a9ac..5c90af56d28cdc 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -190,37 +190,16 @@ def to_log_route_param end def confirm - new_user = !confirmed? - self.approved = true if grant_approval_on_confirmation? - - super - - if new_user - # Avoid extremely unlikely race condition when approving and confirming - # the user at the same time - reload unless approved? - - if approved? - prepare_new_user! - else - notify_staff_about_pending_account! - end + wrap_email_confirmation do + super end end - def confirm! - new_user = !confirmed? - self.approved = true if grant_approval_on_confirmation? - - skip_confirmation! - save! - - if new_user - # Avoid extremely unlikely race condition when approving and confirming - # the user at the same time - reload unless approved? - - prepare_new_user! if approved? + # Mark current email as confirmed, bypassing Devise + def mark_email_as_confirmed! + wrap_email_confirmation do + skip_confirmation! + save! end end @@ -435,6 +414,25 @@ def grant_approval_on_confirmation? open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval? end + def wrap_email_confirmation + new_user = !confirmed? + self.approved = true if grant_approval_on_confirmation? + + yield + + if new_user + # Avoid extremely unlikely race condition when approving and confirming + # the user at the same time + reload unless approved? + + if approved? + prepare_new_user! + else + notify_staff_about_pending_account! + end + end + end + def sign_up_from_ip_requires_approval? !sign_up_ip.nil? && IpBlock.where(severity: :sign_up_requires_approval).where('ip >>= ?', sign_up_ip.to_s).exists? end diff --git a/lib/mastodon/cli/accounts.rb b/lib/mastodon/cli/accounts.rb index 4146753035eca9..9dc65c1477d8fd 100644 --- a/lib/mastodon/cli/accounts.rb +++ b/lib/mastodon/cli/accounts.rb @@ -105,7 +105,7 @@ def create(username) if user.save if options[:confirmed] user.confirmed_at = nil - user.confirm! + user.mark_email_as_confirmed! end user.approve! if options[:approve] diff --git a/spec/features/oauth_spec.rb b/spec/features/oauth_spec.rb index 967956cc8ea91a..70356784d2c831 100644 --- a/spec/features/oauth_spec.rb +++ b/spec/features/oauth_spec.rb @@ -49,7 +49,7 @@ let(:user) { Fabricate(:user, email: email, password: password) } before do - user.confirm! + user.mark_email_as_confirmed! user.approve! end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 7f68671df4553c..213022e8301b95 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -461,12 +461,12 @@ end end - describe '#confirm!' do + describe '#mark_email_as_confirmed!' do subject(:user) { Fabricate(:user, confirmed_at: confirmed_at) } before do ActionMailer::Base.deliveries.clear - user.confirm! + user.mark_email_as_confirmed! end after { ActionMailer::Base.deliveries.clear } diff --git a/spec/policies/user_policy_spec.rb b/spec/policies/user_policy_spec.rb index fa476a9fc3d835..7854547d26db60 100644 --- a/spec/policies/user_policy_spec.rb +++ b/spec/policies/user_policy_spec.rb @@ -64,7 +64,7 @@ context 'when record.confirmed?' do it 'denies' do - john.user.confirm! + john.user.mark_email_as_confirmed! expect(subject).to_not permit(admin, john.user) end end From 7f471e70c0e1cc106747634d20f173a68a9272d7 Mon Sep 17 00:00:00 2001 From: HTeuMeuLeu Date: Mon, 15 Jan 2024 19:18:59 +0100 Subject: [PATCH 11/43] Update new email templates (#28416) Co-authored-by: Matt Jankowski --- .../inter/inter-variable-font-slnt-wght.woff2 | Bin 0 -> 325956 bytes .../mailer-new/common/header-bg-end.png | Bin 0 -> 4720 bytes .../mailer-new/common/header-bg-start.png | Bin 0 -> 3171 bytes .../images/mailer-new/common/logo-footer.png | Bin 0 -> 2418 bytes .../images/mailer-new/common/logo-header.png | Bin 0 -> 10846 bytes .../mailer-new/heading/2fa-disabled.png | Bin 0 -> 1945 bytes .../images/mailer-new/heading/2fa-enabled.png | Bin 0 -> 1939 bytes .../mailer-new/heading/2fa-recovery.png | Bin 0 -> 2461 bytes .../mailer-new/heading/appeal-approved.png | Bin 0 -> 1937 bytes .../mailer-new/heading/appeal-rejected.png | Bin 0 -> 1672 bytes .../images/mailer-new/heading/archive.png | Bin 0 -> 1504 bytes .../images/mailer-new/heading/boost.png | Bin 0 -> 1613 bytes .../images/mailer-new/heading/email.png | Bin 0 -> 1615 bytes .../images/mailer-new/heading/favorite.png | Bin 0 -> 2112 bytes .../images/mailer-new/heading/follow.png | Bin 0 -> 1837 bytes .../images/mailer-new/heading/key-added.png | Bin 0 -> 2022 bytes .../images/mailer-new/heading/key-deleted.png | Bin 0 -> 1779 bytes .../mailer-new/heading/key-disabled.png | Bin 0 -> 1940 bytes .../images/mailer-new/heading/key-enabled.png | Bin 0 -> 1937 bytes .../images/mailer-new/heading/login.png | Bin 0 -> 1918 bytes .../images/mailer-new/heading/mention.png | Bin 0 -> 2522 bytes .../images/mailer-new/heading/password.png | Bin 0 -> 2249 bytes .../images/mailer-new/heading/user.png | Bin 0 -> 1837 bytes .../images/mailer-new/heading/warning.png | Bin 0 -> 1929 bytes .../mailer-new/welcome/checkbox-off.png | Bin 0 -> 954 bytes .../images/mailer-new/welcome/checkbox-on.png | Bin 0 -> 1074 bytes .../images/mailer-new/welcome/step1-on.png | Bin 0 -> 1065 bytes .../images/mailer-new/welcome/step2-off.png | Bin 0 -> 505 bytes .../images/mailer-new/welcome/step3-off.png | Bin 0 -> 688 bytes .../images/mailer-new/welcome/step4-off.png | Bin 0 -> 709 bytes .../images/mailer-new/welcome/step5-off.png | Bin 0 -> 547 bytes app/javascript/styles/fonts/inter.scss | 8 + app/javascript/styles/mailer.scss | 782 +++++++++--------- app/mailers/notification_mailer.rb | 2 + .../application/mailer/_button.html.haml | 4 + .../application/mailer/_checklist.html.haml | 29 + app/views/application/mailer/_frame.html.haml | 4 + .../application/mailer/_heading.html.haml | 13 + app/views/layouts/mailer.html.haml | 125 +-- .../notification_mailer/_status.html.haml | 68 +- .../notification_mailer/favourite.html.haml | 56 +- .../notification_mailer/follow.html.haml | 52 +- .../follow_request.html.haml | 52 +- .../notification_mailer/mention.html.haml | 56 +- .../notification_mailer/reblog.html.haml | 56 +- .../user_mailer/appeal_approved.html.haml | 73 +- .../user_mailer/appeal_rejected.html.haml | 73 +- app/views/user_mailer/backup_ready.html.haml | 69 +- .../confirmation_instructions.html.haml | 96 +-- app/views/user_mailer/email_changed.html.haml | 69 +- .../user_mailer/password_change.html.haml | 50 +- .../reconfirmation_instructions.html.haml | 71 +- .../reset_password_instructions.html.haml | 70 +- .../user_mailer/suspicious_sign_in.html.haml | 95 +-- .../user_mailer/two_factor_disabled.html.haml | 53 +- .../user_mailer/two_factor_enabled.html.haml | 53 +- ...wo_factor_recovery_codes_changed.html.haml | 53 +- app/views/user_mailer/warning.html.haml | 140 +--- .../webauthn_credential_added.html.haml | 55 +- .../webauthn_credential_deleted.html.haml | 55 +- .../user_mailer/webauthn_disabled.html.haml | 53 +- .../user_mailer/webauthn_enabled.html.haml | 53 +- app/views/user_mailer/welcome.html.haml | 118 +-- config/initializers/premailer_rails.rb | 1 + config/locales/devise.en.yml | 13 +- config/locales/en.yml | 8 +- 66 files changed, 863 insertions(+), 1765 deletions(-) create mode 100644 app/javascript/fonts/inter/inter-variable-font-slnt-wght.woff2 create mode 100644 app/javascript/images/mailer-new/common/header-bg-end.png create mode 100644 app/javascript/images/mailer-new/common/header-bg-start.png create mode 100644 app/javascript/images/mailer-new/common/logo-footer.png create mode 100644 app/javascript/images/mailer-new/common/logo-header.png create mode 100644 app/javascript/images/mailer-new/heading/2fa-disabled.png create mode 100644 app/javascript/images/mailer-new/heading/2fa-enabled.png create mode 100644 app/javascript/images/mailer-new/heading/2fa-recovery.png create mode 100755 app/javascript/images/mailer-new/heading/appeal-approved.png create mode 100644 app/javascript/images/mailer-new/heading/appeal-rejected.png create mode 100644 app/javascript/images/mailer-new/heading/archive.png create mode 100644 app/javascript/images/mailer-new/heading/boost.png create mode 100644 app/javascript/images/mailer-new/heading/email.png create mode 100644 app/javascript/images/mailer-new/heading/favorite.png create mode 100644 app/javascript/images/mailer-new/heading/follow.png create mode 100755 app/javascript/images/mailer-new/heading/key-added.png create mode 100755 app/javascript/images/mailer-new/heading/key-deleted.png create mode 100755 app/javascript/images/mailer-new/heading/key-disabled.png create mode 100644 app/javascript/images/mailer-new/heading/key-enabled.png create mode 100644 app/javascript/images/mailer-new/heading/login.png create mode 100644 app/javascript/images/mailer-new/heading/mention.png create mode 100755 app/javascript/images/mailer-new/heading/password.png create mode 100644 app/javascript/images/mailer-new/heading/user.png create mode 100755 app/javascript/images/mailer-new/heading/warning.png create mode 100644 app/javascript/images/mailer-new/welcome/checkbox-off.png create mode 100644 app/javascript/images/mailer-new/welcome/checkbox-on.png create mode 100644 app/javascript/images/mailer-new/welcome/step1-on.png create mode 100755 app/javascript/images/mailer-new/welcome/step2-off.png create mode 100755 app/javascript/images/mailer-new/welcome/step3-off.png create mode 100755 app/javascript/images/mailer-new/welcome/step4-off.png create mode 100755 app/javascript/images/mailer-new/welcome/step5-off.png create mode 100644 app/javascript/styles/fonts/inter.scss create mode 100644 app/views/application/mailer/_button.html.haml create mode 100644 app/views/application/mailer/_checklist.html.haml create mode 100644 app/views/application/mailer/_frame.html.haml create mode 100644 app/views/application/mailer/_heading.html.haml diff --git a/app/javascript/fonts/inter/inter-variable-font-slnt-wght.woff2 b/app/javascript/fonts/inter/inter-variable-font-slnt-wght.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e6345f2e3d462ea7f5c0dc51b7aa3ae965acb9fd GIT binary patch literal 325956 zcmV)UK(N1ePew8T0RR911o=b&6951J3{YSI1o+JW0RR9100000000000000000000 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 z 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%0D=P`fV2uDkPGx&7BPWAix>s_E{D%)Q7;hP3Xnks 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 BdWrx5 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/common/header-bg-end.png b/app/javascript/images/mailer-new/common/header-bg-end.png new file mode 100644 index 0000000000000000000000000000000000000000..900196678a3346cd6a396e7ae472ade2a6e22bc9 GIT binary patch literal 4720 zcmaJ^XIN8Pv)+OriXx(jQX~WfX$hglgx(1q1eEHb1PPJ^lhBKRD1y>NdKE$y6Dd*! zEFd6FKt#Goq@&WM-{5yV-~DmV&5!K0CiA}Yt~Img$wZhK>6|#meGCAA6DVCxGXP+q z(bp&zX8N~hjZ6Ujah{}gjdTU?Lh^PXpaC^!ydxTf!aCeQo1q4e8Z91eUSK3ESr8UPekd^{YSZlXybNAwL0P6_;@t`Q8vI4gm#${9)-dT5|s zF}i*P^c6oNb0@!>P6%hPiZV#i2T3QuqDc-QAFMl$i1bkc|K>%~*9T@O81&nPbW;iZ zA5qr~O+XrW0vd#Xz$Bfdq+lR8eI+X|eHnp(!{HJjX(?$LsFXZZT24}01}O(e!el{z zf57yJ1ZNkdnWpyN@#s4xuq%n=frLW6y}cpcG7voB1{8)sAfQsxP-$sNx`!mu7e{jN zk;D-N|1fBxiB1HJ2ML46fesiQ9PyqcB`{s>e~y9m_=grp{QIitmj?B5@PNV~QU}NS z<7jC3|GQ$b|9BHgX6XOw{XdC`=Dr?is2Q4w_ar#cljkCM5Xu9oK|ni@@C0)_-u=%_ znz-Ugc%m!b10*d6fq^a=Iyhl)2Nu!a5JN*G3P&V4;GEDXO(ig$1cJdhBh}R4Fm;3! z{4zog27_s7smsX2F3ZcR$zE22UzV4W{)5%TJ9%Q!IMN@i^MA3I{}p>s5m*m;WKA>y z{l`Qvpo8T<)l1*}Q~zij zz32(_>ds$n_yz!MqbN-^bDyDw3>!R83ukcnN3({ukRb-O;3lanXVgqYo(Hc#(Mr=( z3!xP~-)80I3iMuP1#i^2KDz#4ipxCEJ!__bX3Fe7ZAQ*_;BsX>jQ*nk&4i4+fe7dA zsWtg%@8Z=MbB(AqSXN!Nx&E^Q5yjQH$;SwoT(N$Zh}hUo>e#)lD771ub%Fr^?)Is+ z9y)kk-{-aoA3TA-_w0m&&E@3jhLvR|j-#tHyV7F)J_r&7uF; zIoQwRC57EtS`QbO93Xi^h|osoOvSyd%`KJdJ*TGfUdNK-tBzzxbn;267i@E?e(kFZg_dlhlTu__UJ3)i>gn!1)`OzNH;@OIdm7>|DqO^7w8q(G z?GD@HkI}rXNGV(*eJ_M|14XJ>bB_#ibwA==RCOiuSe`vah)BMDb4#=95CHyCH4x-9 z*07UU^L+U&X>)eYxMRz|(djL4*x+qVQtPv<*X)d}5IYy@xc?W&xm2*-hU{$3{F*`g zW}*c#gO}csCvNSJF|M>l8F$vK>rbg|gwzmM*my3glLb24sTG|`ReQLtU1c6}S*ZMb zBiFpmFH!I7RSc^zzGB5i5M)-V5tELzXtpRJXeeEGK&w4#NTrRB0bqI1h})603o}M$ z2(Hn=@Q#eg^Fvh1R_oi5d6bt1F5fuYz0b?t^I-XO`k2J-N7F#Pjo(9^_lE zZCk(DMfF-$_B}oe0Kp|;J1zK~){)(>l+6K^eY@dBkm<5WOqPeLIZIn};ujY_t)0SO zrmMxyH)z7N$oz89)IpN2fL-{JM>(dv4I?r(1kbLH_&2yAAMm=~N6>!^*83dlNshmp zC|&~2b%VBD=C@;wS#9xCe)#3uB@d^fWR+4kBQ!laP$+m}TJzag*%Gf%%3YnqhWJxz zC;L_6rR94cArhvN^qbO)CFpJ@T=yfnVk}8z51%T`>**+bo@oC=_ z9G+71;;|^iB`dQONr@tWcq=--iprp{o1bQVpM?dGvZKFq=K;#6RSp5!Y@wA>7l(#y z6}w9-Ym8A!jW%CjJ=2hPWlCTc6?;8dP}v%Fb3EY(=70p^AF6(6w|6;&S^T z02KYYF6G#w?yIyKow^6Hry3vH9=8xvUrCm+Y)PrMQbHsVCyK6`l=iAqW}3Q9x!dI( z*#ID~_Z;hnZmmX?&$K{tP(oyb$h5(^(I|Jph=&@U-FN$N`!0hC%8}istx#&0YCiwO z+(+^|ir=Al1=Fl2-lhD}H<=ASg`2Yj!RZvM_`;1hJ{gN;b??e83k$b@jgWE@7vc*} z_G?_JZ@QvIS6%+sSip)6z7LSe#$citu>+mjlOSns&!qjvpqcWE%G$`tQ$OQDlO3FkROM?9d~$`U$Icl^U-QrU0Y$z z+qxr#DU%u?VpQuH0Xvr6=s(YHS^$BndQu&>jyJb$e(=;Td6XWX$)JNc;?gE(yrAOK zH`Ye^JZ-VfjJ z_SXqnUGGCIBKK8S6(Ej}hzUipf?vIMz7G~q_>$xox0LEyYbBHv+}0{PEU7nZ>v#8d zpHB6!({_ci8!}0YePz4nv2eD`D(bACLcezM_UDZ|t>HsSEL&DYFT=y5K{ecc?~>pW zBFKxU+fq7M6Nou8K=T*lS{l-_K3GRL>OMDRoz%{UITSt5SC@esB0lMZ?{;=~PLE0l zom^^?nKH1UjiPPuH(fsySJfUFh)od;xLq;b6-RaE>R=kI{_*)lkf<S|b~~^5n+u&0I_>{6cCt&k?OU4Rsl) z`R9xhog{F^{+<#uczS)-?z9!{r5nM%<>ilaM>x4%0ba-#?kJ&HK>01nz8h5DwlQ?t zNg%ZJ3V6b6^RnbRBvCYQ-iL*lybXm`^Cw$D;bjK z$#W4wLOi`>;owP@>in$2FveFQ(;e?B2ZN|3Z7HP_z4-&h99rF@JGM;$osJ@gNRFqX`Ge%%BA_scK?-g+f8^?XV(O##Z2i>symL(T&&6FVz*7KP&5t!q z#^b|V0F+Cdt>s+utklGXHcTB3JRvY{(=q;nXPP^l^;N*}dSNYcmFn2C;Yr5ej=_rd z{^6;0;k2A{_A=CGHTg+T1rlu~7K^#JX~w~^pn9gV& zUjPN^_$7^%*>-L6v6!`tn3KMWsHQ9!$+8tB%1D;|_XNnl+1VIyu8${8($)Sj7z|>H@*rNYkzVVP5ub;BIBju7C|A zB1W&3iQa)DIZ2!=(mal@dzuvzKaG2G!nTEqE=ps5x>klIwWS4-PcC ze07oY8GRXq=&nf2rj9@wcNn+dL5Y`uGcB*=-f|yBVj$?RaJF0`{`qqK`EsA`NXsIR z&@q>8{&O?GW+Hscj3V{cJTTXj$}`!yn>j~E69Qf_0ojVOe#+Lds}Jwul3cf!4Vx4S zcZCQSMTOyV{bWjy@dm0=@95_A7|f9xeN{y!3;SHojd*>wv?=d!k4qN;*-gXL74{H)`@e6D3QT0jhI3>&RMAPM{C&)Ojzyc!h89m z0=%6Gd3+uU7EykJ(TsPE1L3*bjac4NT^-R^LIa)&INE~{E$ z%{{dzj%KddX3GuIGJ~cds!rIBV^_Oth5gnx zDFc@#1?A8j6VJ$dQ)jfOAC+c!t1b* z^X{=h3@vI5Sdq>)G!_K!tQ<6ofkw-ywhAJP^2+WVix*WEsh)SE<#&2k6RCSkUZ2wK zh%3CwVaGWyxO4OM(kBY`<(k2Qm0aDeviP;PLdEmULRikmr-1=he3Al+>ZuB+P-(~!7a>*GB;!g>%<^=^+C1U#+TqtE%{Ruj(> z^T8aJJ*9h*i|Qm9w|YEp7^f4rkmgnAwVmIHDn9x)5n2D|E}+`3Yg=@$i{w2U+<>VJj)59mT>{r~^~ literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/common/header-bg-start.png b/app/javascript/images/mailer-new/common/header-bg-start.png new file mode 100644 index 0000000000000000000000000000000000000000..0037c1ad933ec87c22430b9a3696b54227cb8a01 GIT binary patch literal 3171 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 TZ!x=MpZyND+iVJ~ckcclmW$@9 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/common/logo-footer.png b/app/javascript/images/mailer-new/common/logo-footer.png new file mode 100644 index 0000000000000000000000000000000000000000..2baafd8d7f8af9dd87e1f2b4a7fe63bc48c5d118 GIT binary patch literal 2418 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 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/2fa-disabled.png b/app/javascript/images/mailer-new/heading/2fa-disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..b1e342a87cdcbc1564b8f46716770e54932e42cb GIT binary patch literal 1945 zcmV;K2WI$*P)=^r=r}L96KR-V^(ffSPx#ym9uSX3a z8IMP3adF6RYwJ<@e3U$|SD%g)9>NkCQYz#5embwzEamg5!RhG?trL&x1fu!5+=x;t zt_6#eP!DNEbbUQy)+}IAIHI#87S>3{wD%gVRmhqId=QIW6yd%sT9Cw{sj1N#uCGqA zuP>^7_dR{sOF}cqXloo?i#7VyE_iU@zzHqh42gKn1O_vc?C&3{cHyc51};;nF%p;A z3L>88-Gc_JU9_SLEyTM72`y)}xL8p@m@d>O!5Oq3!-pO|9A9?6{6t~Ef|w_6(=D=k zV6(4$V6!X+YVndJ;<-qqkO`DfB48n4MoDm$-efG6uul|SXu);eM2nnq4lsXhVi~Hn@cB9|G z0^=m`B$pfV$@itoz?WWM`_di~c%oF)*R!Ni5?G=qxO)%-qa<)8Qney4IE@I%9TAW@ zA|P`%P)OO(*-34iHU-E3fA~Nj7Zxatgi64#_wA#uBS&b1L3~EaDh6uZClgz5HoY@7X5SoK5>V=1%5j+LOYHfTXr5U^P_g1 z0M-bXYJkv2@VT2ei8HJP{7#DimuY}#uWsKCTqPbhoqP7sb}e*d|9I%+9Po4~p zpI*8|TxlEb?oJRxcIunIAkktO2WGi%RCU)XPDOm zkxU(N41*Y0tpVr&WIk(a)X_KTLuP-$Jr-Of|Q_M zAl^$o=rL@y21Hz7C!lR5ukPHT_43{tt=c~hF0c|1qetUDVLc1apVN9lx?$WXzTeIl zIlxOmYkJHi>5ahtuJS23*O6)jQAr$am%n<>Z!y=J4J)Rp2y)1@}YwSX+2QIy&PPY}J zbpkcIRux)N?Rcq6RxY<6Iw>G5ZtvBr&Q!=za{A-^c_%H>NdbFq+$a&x?(u9Ez&Q~K`0&2^`nnAO4`iCo5O5V>hY@M%0=wcw&IaFHfj&q!MqgaX1r4fjI zsN3xk-!q=d9yy{^J0N~N&D2%@f!&|$>&r4 zU@Dc>zBEMwH`0UC)4?DHzVrbJtk7eZV72N}BH!Nr3rRY`3++Df6bJ}6Y7`Y%Fb4OD zgU?fGVufr_`TVFkE($1C$OEm>sIflam0ysG#jqboF9|M^iBC=KvQI3lMriZ=iNuw< zNLFhzSblPufG|&e;W-kVLMipL?K%w=>w)^hG5A^%oFIsMj~-Q=F>71tL*p-Aq)v2q zdpbzQNoW~?cvDk}mEQNL3d#QdAcc1r z%^;1zWTlu_&YA=?BxA9J{=h{Nz7#<&zM9J{rzQabtdTq~q21~U5*o$QB#NF53#vmk zP_uxBKuA5n(XMrbB=N5gUB(M4L3Idcs9QiABPRKNucuUxwotr|l3>UN52eytu(_ZM fLKo8O70u=oki*U<_R1`*00000NkvXXu0mjf5?p@1 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/2fa-enabled.png b/app/javascript/images/mailer-new/heading/2fa-enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce3e04f848c2ade09c9d2fb61ba1789cd891f78 GIT binary patch literal 1939 zcmV;E2WP)pd6V^!9by&P=B>_q?26GI{g9+R6LB zbMCq4+8^-ial~V1*zQ z2#NOmb6%SQ)vR}$LC70KNU2%Xy%I6=7BC~6QgN}cVuC$0knYM?$h-t>NFMDF;Z_#} z?7S5_)s_48Ij}hyk5(XFL z3zrnIAsO#b2tDF5%YcdE@gg-_OI;RO?1T|d`(qHwP4kQU--3TG{5+KHWY#v&n66eI z1ZO}GKDzb6>2DSs4<4X^h1xuEn~s4nKBLsuU|_SL4XgybBH}rSZWF7rc*S`FQoE-& zQ4pL&rze~0zdhP%AIrE<<2nIHL2w)GN+XkMW2!YVPP-WktOTzE1ozRd^uH=E?(Z54 z6zgM#WrfB9E7MXw-j_sN&(DroU^vRbMPOz{w# z^amP2UL3QAATR|RDGH5(z!RObUbZ4HIE)ej*&_lnM+9V!2*?}}kU1hCb1EQY ztgBoDn`>%e!`c`0r^Xzcn3;q-j~~KskN$+P5gGxvuYVPG*S-dOU*2Iv%mxWLaQ`-( z9r+O+KKU2I0B%XPD_{(Xb)^1XI9RtculxE(e}xk_`i-cZVQqorCcobEvDw;?bzRr) z^5K)mX1}gx18lCYop;^djXR9h9v(Qu+8WtfU^elnjXN`PS#ST!dJhSCaMLa=-uBEf z5|6WpYz4gZ{_%`>;&At{*{dN zQM+~ikE>89bg$nxTvxSb-iyHnb^_WD`K%6DR?5JGk<9l!FVzD#*a^5zhyFg-7l}6W zq5to>wzE!mHMqe_Ks#`mn4T<3=uZ)>|98lZ2K$t*!#0`CJ%ds#q#D5-5s*0|Aag`O z=7@mI5doPa0y0MgWDbjpJXHxOOHv!ilB`D7BvWJ5nH~kdweGecVf7&EUt_GC;fkVfqY!7*gGX4 zz4dlc)qZ&8!nS_0Lf6L4xFulK+{2+Fs|!Ixu>G}vqYFq!o;e~Qb3{Pqgl>MI4^3R5 zxeyd|(CD==&J83&Dd1;s#O8(kM}P+L4w>m>VIy=d^w`#xto=2bmBe-a!%~D!KsymY zSra>R!gc<`QiRHd+WAZBM}B%OX}Ln4V8d)hnobWxegQ4Qwv6Phly|r zs4a`4O+Oi)c>D0Y^K>q3Bf3M^1|GlmUDi1hbd1i0jnH)?{5kIwan`P_F>T(!{SlKG z5954_Q1%1u04D56DvdcJAag`O<~S>$OBoZ_inumT320a0>7i}Y8I*EEc~$>qqTlD* zicZd1pgj)eb6r&^=bZK60zk!BRH4{7H!hUk_V3^OWS($W9^5wTeU=i+pW4G4U0qYn z$$`C8i0#&CFjrQLAh%B96|y4KYU5-OL(5>%1EUN|xuN{&flDWy6pwIzwL-E&dwH!= z5nOZBRh&9aMMEtVu4ISR4Feq4SgW6Bmyw#rCJj@h*5(eutFiEQnAFC=?AJb z41vH3RH~b{M!7vw%^YXl@Ws-7t-a6t8t`=oD~RGL^JAGGy#`QI}FiWTxe z0e1P;M_}-RhTisJ9pN;A;38wUW2ZOT2NqN#bkBaDxKanvnnXbD4jx`0pfOKW?I1XY zYPDUbPbAx=k1qU@TEG8IM8IYc$_}-ABOjjrD%-ipVmE0K2Svp4W5kP{>RjwR!ZK{> zjkoB_&gmXY$K?NU2HSRJ(0DOBAfu|#LCx8x-tVXRR>r!Gbv0--oO6Ru(k5>Kl`xs$hmK2O~$ zG%JN|C>{TTP$nU*h6)kRr(gkX=ET%OA~b3@8wF`E=b*$08Y@dd8t&;AJ{6gQzCuN_ Z`5#^g!s90fo;d&j002ovPDHLkV1mJ?au5Ij literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/2fa-recovery.png b/app/javascript/images/mailer-new/heading/2fa-recovery.png new file mode 100644 index 0000000000000000000000000000000000000000..cefb21e1eb0e2b2e8b586af2d006b9fd166a66e3 GIT binary patch literal 2461 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 bqS^cl(R|fHyb>yH00000NkvXXu0mjfSdgWZ literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/appeal-approved.png b/app/javascript/images/mailer-new/heading/appeal-approved.png new file mode 100755 index 0000000000000000000000000000000000000000..b2476ec346b8dd050c29ea9cde84b7608fdada7b GIT binary patch literal 1937 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 gZ9I1&yqdhC>xB|~|7cmFei$GSmFz4 zuaMW~QCP-el<9g@tSF3#yUw})+;i?9_ngo7_x*i;=luTro!>p2s{;hA3$>5kunV^A7PtQK4OS4lUQ_l_&5#bR)1Y-_+ zG>v|cN3T5);ama|C@F@+CxXpI*C!e zC8dxTgs!kMOZ9%d-&!D(3W|s5to=&c7=W4U^-frR*UVM@3Iel68r;&6`+=cL`K|FL7ChfxI6Mr(UVh3=zINV z1UeXA)b+8_#QTmWjF`i4Jz_wl^BJr%>sm8qSL^f?a8@c<{y!O##Sd(&)--SlyMieG zhEh4=3ACvWNN64*KPJbGe#R8BCwz(&ei6T02>icjq50dECBR`d*Tw7FltgE}s$J{q z#g56Sj&ED_uJyg_@_GruH1~ztH0uz)H_O5uNf5&qKmENGkNajNou6N+Sv_!W_lO#?J?z z%&fa4Tk4oFps&-%siH-^Nq%^CPraxyRUdZ?P@Xe-BZaLqQ_Ja#n%B`CZrrprurONL zY>yFUJXN!3sWtAOtccy5s20sN4XvhgW?$FqqcG9>DCH!w@KkGu424l(1K;0PhB4E_ z{lhsa%bjP8_GRr>ZL6IaQ@XQ?15<{Qup7zE$(}h%Fr@O0D&$BS%QUXfaP{#$>+PMr zSybsMVUhj<^S6nFgh9Ml`0XY=Mn-AoDok-`X<@K_Xqb@9zc6=UUFJX@AFMDSnbMz+kg;?^#$UXJk5%WXRjWkw!$o>t9r=AaF`?M=%a`8^ z%bSbddf4yz+~rRB7yc9nTu;|7$VbA7NxKF)0H^i!q;~*F5PJlr`^c3%H0{iIJ_Kla zS9FSv!4*Gt=jWb6j+CW8y*16QXb#y9SJ9&XB7r#l@dtdTI;aY?BeOowgCdfFcox9#E@0?n|X#_D(mM!^IFXcX85#G3{ zrF?h;`iE0n+!d~k_^X!bPtd*@%ul0}xYpbFIbX{Nbe@H}cX_Vff-mx12P!i11;?sj zt@I2r=)?F`>t;jmH|q_$avNkr=A*O4Z5wnoAEZazWNQjjutyFX!M+s?4g^c&FyNM^ zlIBPbjg{Ze;k90ihbhr@BkDp%U&?NAX;~A4jzD-S3o9A)wO<7X(||?Uj@59N*z6R2 zLrrXjg4cbfML7R7Dh9!4n!VLzDJYd5<)k^r*?&dP)weCNTSAr++m}p0B$r8(hmPuA bzIk#QMBce8ax-kvLk3{%UG1uD{cisaA<@44 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/boost.png b/app/javascript/images/mailer-new/heading/boost.png new file mode 100644 index 0000000000000000000000000000000000000000..e33b759976fae85374c78ca4d468daddada55541 GIT binary patch literal 1613 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 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/favorite.png b/app/javascript/images/mailer-new/heading/favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..0e483ee9b2b18cb84809d59a2267fe069bafec1b GIT binary patch literal 2112 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 Ef&-DKJpcdz literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/key-deleted.png b/app/javascript/images/mailer-new/heading/key-deleted.png new file mode 100755 index 0000000000000000000000000000000000000000..2930f591a09963cd87ab35f64520ce6d6c9d8eec GIT binary patch literal 1779 zcmVlOlhag;)Lr_5&71Toyap<9mQHXtnQ!0TtrVUp_;EojMfW)zpxI)bl35lM# z+5utGQ=DUksyd<)sRWWGQZ==}(|HrGyLKF}cl~GIYu`_byk5^btNr}GdGls>6!d|7 zIvt0-y#*&0o6@yf0+dRc-SPULuumDZE-S|=)wJG%TCI@T*eFAfCq8ib-syTN9fD zeV`F94PTLys@O6z(1D)z}2W22v91g1gYNwvD* zfaAz417DJk@zN;}c%pT}F;&t82rMxL?kVg86CiLU?mHtdkVXXLjtIyc5s*0|Aag`O z=7@mI83E>uOiaMh>1miadp6K;vsk}eg{S|SJ+12XLEB6@jmSC!p_sD@ZtUYu8%))^{N#PzvJk+bMWrj zGvEkY0lj_R?~fkA_Jaoy1QZWNwBL2+3|j&Jw^=Ag?SBCoMleSNWR3{P91)N?A|P{A zA(he)F~=@kfG=*`2y_e%14fPT*zgi-hy;5{aU~9_RT?x<->xUfZks?&i6%4%oBkW=MCvapvN-D z2ng6}q0}HPAO$}03MdxpPm_iAFgENLW1e%MmcSsSBQQu3GuEZpXo+J1ei&k*0r}|7 zLc6?I1uHo-W~_$eHNRuN&gE>|&+D`Cen=J?kiR^cUbhyCwN$r#r>Mox-S0ecd}YL6p%eD zF=>iVPeZ$Np$1t2E1R2*><`8J>h9g4l-2NmeR=zKBLeXp@LZ@u<_X<)9Gjc7!nt5y zWQ842pM+LDdGTVCW&d*Lj$KHPDx?KO5=%>VL4hd1!G75c{3%0zwL%m z%s~MwAh1OQ!n!)$}V60Ovh1GSn&AYV!jjF0~W0#9nSf|Dr}D#l9- zAaJ9U+1Rj240`E02&^!<%NoA!59CKje*hUy@WR+9zE}a#MqNb(7Ua-AapT`onnWQR zbgj1PZZ`y!DCB|BXw{8AM71_3q*8c8ND>5!l+(rHY445$vk@jdzXh>Uid2j?nbw^L z1jO((4R3)!3a$0`Uh8yeJ0EBo=Fn?FAc5`oUcPKwF^e5`(8JfS3yUXDD$_}(L5K`1 zUa^=x>~jS^nE+uJlrWiW*XOm; zm4Gh!R4Qu@SOH;B*s*vg%WNf(fCxq-D3vv~x(GtQ*e{}(YM7lJ3P4~1U96BM!7Pk`W3v42{Zj9}aLE(kM`9#%9j{{UEj VvhFQN7B2t*002ovPDHLkV1ge1AJ+f? literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/key-disabled.png b/app/javascript/images/mailer-new/heading/key-disabled.png new file mode 100755 index 0000000000000000000000000000000000000000..e0f259359aebd3150822dc05d39366025019bc94 GIT binary patch literal 1940 zcmV;F2W$9=P)wZd%qW7bL}{B>=^r=r}LAnJU>5Mkw1Uu-gD2n&!Z-g zN+hDRv^4BTBE70mh>_>@>C@5TLs%wDN@YFY&lHrJqe3A)G&7T>4dPLQKr}y}A5}^v zv|tGm8X=>Iu5U!lx&D2MyM`Xw?u}9Pg4Ow4Jra#i|0rx=^14XV7|#9Dew4V#WE&6U7M&#ykm|ZjsXy zoBfp&n-ycA7B592o{L0_nLrt30u~3%7zwV@mx{-e_K8vmEr!m&NN}B;>gd=#luqaH zq~t&?-bE5P5T$(nta%bRP~69kk_(Lk6C`k=4_fz-LqqOzVA=*?F&#?6RHRWb!>CNOM zy`7q(u;8WRaYf95aNk|HK%LvSuj_hoxWnFo-;9pZ&SS?`oJYv~s6!`! z8xc|s5ZVYnfAc1BhP8m-Y7r1J4G`_s?b|`9#KWd*?_S!Wg^nILK%L#)!MWJUlfm)R zOP7c%k&&LBBr#-{{_=MoKVEu{v2E_m8G85lF)b}Dthhe^?p-kU;Q=>7P=LR1=s)^> z9APOST(@WRQw@4vk7v)XU86!iU-P|iDMUms3ET+2+_#V3YsXd--gQ{!fpDK;K~F@o z4UA)$#K5%%gkz4d6L5=85zK58j)D6c1!JGd5Am5%J)7kQI{~*24wjB{Po4xRL8Cyt zmwM7;*k(v>Q!edq6nt>r=zdFF_K%n<>Z z6WX2_Z2Am#9_dL3a=7;u+s(p4C2`EC@e5xO)2V;|~vyNb6E z!I<}Ua*|%&y&Jml2|}3%+7pDsfW?6zK5BybJq`a_s6Ko!RYlpAEt~#B0Wlg_@0%lNfwa_`>YF3APKYpZ+#7 z;-q-M`Fm!Yy9jP>u^a!zP0}+N=R#&B&M&3m3tVvgOKc~S$TLR-WR3{P91)N?A|P`_ zK;}Te90_a@0eO>!fEf~aqEyz`>uB>Nuta&@oKJ;D>y_W`f+f^NN@_J)K7NkG*qnz>I=saYe{f|VBCB3sOpMYWVJUp7)DBjFQkwkQJQM;*GC$QB46ss=q(x`F=_t#z<%d8B8Xt zjd_)Isext)nD~e`Dw}UQh{YKsZCg0@@fc$@lv_rFykP@jOO?As0N9%4osngDwbNNN-d$ aoBsjvPRF(g=axakxVSD3cZjU>QyA-Iy7 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 Ef_qVqzW@LL literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/mention.png b/app/javascript/images/mailer-new/heading/mention.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dccff8ef2f2f5c799d5355d7d711994c4e9468 GIT binary patch literal 2522 zcmV<02_^Q4P)$^sV}B2dQY0#*=Q ziV+szl9ITPZmiK|n>55=A~W;6-}mOu+`04by?N8Q_u~B|!~E&Y>-2r^IrrRi&V2|B zfzzks$tO=RAB|&w9Ai4Jp(F$*<&P#2NRa1cL!Ofj5n-(sS_^gVb5X5tlNoiPZUa>{MWWtmY5CX1JT3U*i^%oj0wC*~8 zL%?;ms};OfE{knGX;`3io#znnfywdlBpa5HSYWU|?`T+IVuAluLp8xO8djJH7{xe+ zfLF-H{UP3q;6D9Dy3v=T;6D9j*DlOQq86$QzEYFgMKTWEkAR;DOh+N};xW?rXo1rR z_(_b(z7_d^(*yy1CkW^{K|s$50(wpm&~t)-o->Z;h&@xl-o3!?iS)6~<`%HE2|RrY z{P8EA8@v{9LJBqa7BD-T-uOHV6!Gz6;NcpuzAnYxgtv&rr8tIX%+3Huj-;XugNF}+ zJ9nh0>+lY*EU=$&iF^D*y2`C~tJ<>%n5w&2(^3x{NN;qr*H--!(hCdZ312vxo@A56 z6-oL_?~MA2uJ0!532okrS`6pkYvty1x_Vb!sS~L*bKcYE zojhQL&S;d9DY~j_E}Kops|Hj z7kWV37nLXL&y%hPKD1nh`dKW2ZjeIi)=rDc6IJTpb>BW%#j1dGYl=L zgKoFQ+^97H^}fxl7C5Ne?FHvv-5us>O;ngYsH4QI&g_ZZ&Bssw#?a8k7(_sugw}e` zu_oX^qh7N*-5QJHQhhHk_5{?$$l0PwFL2u(wWOd8> z`|>0rhKRp%bHAZg0e{sJ*m(jHTA^OTp(Pz# z$d;3&)v~ipuV(OADmdcz=rtht`7>vl&xf%;qX=VfzPY>%OE8~!=umRiz2xLGt)=G} zd-2OJ>1R{`#QT!8o_%}M6Z+&y>-&>_8EJ9HkGGb9D8RSh0naMH8*kL#JDVQcJPwa> z`c&&c$y&zRDXi~}pfxDBHAo|Gw~lFZ$N~x6ul03yt4+KBy#9Loar9&G`_XF6&)dL> z-AQN9H0MAH!o3iKknFTAwf4Ozc+$Csbeu?Ln^C2?KW`9vwH4-J7{}O2oT*0W?er?t_c=#7Dx49} z+<(BJgiX7F-Z)hcq$}0?Ga1qcOYDtv1zkpXdZ!s9%g;Wu+xg`(PFCd2iwZETXZmU` zN7vYY1?vm>ZX|0p(Oe(WjjEndCXZc>3P+9e7y4l^!+Fqjp-j86t*~e%fcZ@h4(4Hf z928z$YOC8tcnE88_wUy?on*Ymnc9=6Zlp*C$R=K0t&l=;4@0lg6NTh@l2wgH+kD-6 zY0Xnzwp<4RM~K?%H;kZ$BGVl+6XfG{L%kGGp*qu;z*biv%mRgCHvkLDOmO=g5P2=2 zNzz+WFDp&G(sY%Z^&+vlmgw^o!9G{l%vP6D{x1<)>pdq3=s7_^&j|v0P7u&@f`Fbw z0k;wG7XBy5K|o&-*odTr16+JD-~uA1fHnM%fS1T5=%Yyf6D-hEV(C4jS`D`l@RHgX z?ndRZU=VW`0k04OYvoH~BUuLuz=3@>fjrcJFL<8_SgGJ5!g|mv=stO$2uL?7>WT(D zKuF1?`{ct$DlJ%{KUBxCq8>K{3|8m|Qlk}Ref8(9EH1^|T50)0!hw#+)Y;X`;x+xH zwrWIm9PcBzQWx2luJax9#Wn$Hp0U8E2)IRr1>JQvU+%!_Wl^TDMZgKD#nrFHtu8<7 z&eBr690TVNum;7uaz!ln_<3&@7vp*PE?$0T5`j^&9m%Qevh;?%-qcq>a`Z$zJyyj} zviLiVz>dQ_XJriUcbfCs-isUrm%8I5Yw=z#(oCwZ~IsgCw07*qoM6N<$f)zO0Gynhq literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/password.png b/app/javascript/images/mailer-new/heading/password.png new file mode 100755 index 0000000000000000000000000000000000000000..552c7c06870404a177c46609133c2df0f3e2d60e GIT binary patch literal 2249 zcmV;)2sZbLP)TF-B^olBJ)h6o}QNCED$Lh6|%USCb6N?%I zqS+mEN!{QCc`u=U^6FuqjU#5=0vf_yCb6*Q;ZUwnpqYAwtV_TPlg_jV*IFE+?EEcj zChGN(1XNbn+tEpPl^^dXq4lV~vha#dMzKb_)&&z^I_EPTv?}7gK^*Eun@>zQqqQ!r zDj-}Y6)8vJGLxW7S>jz+gDQl&(B1wnOG4sQ>lZ5u=$fulpM>;a)7acE)~~_CWddTr z0{=_mHq*vdVTT5S1DmowFw;p7NyJMdUCOY^yy6}K-40WYfJjIy{Ys;(d7$J%cU|Yd zB%~d<(!}S)nVSWz!`RSfO0! zNA6bKCts8sea{y6$rq*FsO?x%W#9_5vu%rxk-!qAU9as(=7lfH_-xA(0omfHaDoKR zh=AM?0huELGDietjtIyc5s*0@)P@{9NObh5+ID;U&z=))Y^d!sYCGCWz`;SHA@%C( zt9*WAlj!~;(eetl4c5e@N~SRfmNq^fE?kf&Ply(Bo>g*(y?_vJYKo}4+dsCw?TMsa z=AlELxcm3}*T5QY+~6-Fdlw4JGsS!G2hrl9C!z_29vmVXIpgn-j}cwJL9Agt3LOme zcMA(dw{Mq=2Vij!c7DM>hQCFh$r;uHemdg6U%Ve}aI&)ES*d1F1WX3>Yua_f;#TSy zS(+{uR*0~JD{KWc8yy3ddIlrzAZN|rN6g3-z83hQ|Gtp`{n>y1`-9!Y7D=Tshpm7Z zRcg>5*2|$D|2^jv8(RUpswo`-X?31?9MA#E2h}+~y2x0TKI|t`uoCSYoBP4i1}E4E2*IYlZme_^734?< z2E3VST&$6efM?I{70*qTDc86CKgDKf$PfPU8OWKMv)9rL3ju@E|KR2pn^;A_{a}5% zB!!I5av)KjR#=Qe&8dHA*u@r0bWU>k z6vYCW6m5NdF_(`G9QU?JD72yq5{EN&Yr-b~hMnKPFZ?r; zUZS0t3x#+Wc4tYS8S$pL{}XU?!TKLu*EipmyReI2`QpJj*fqU(H$GcCkCYjV!#Z>fxdSb3A44(RH-|uatDDDfwO!e(ueul<2*F#hT-$8%Q zPz4WxS>S1MqnYE!vsp?2q^r=#Jw1MdbawjZ@!s6mv#DRaD8JX5I=4^VqsOQhnvHDU z2f$izuUD`39>@M)e-nN1ez=P@?**}c`<>{~BT9@^q|)Ff&z-A$4vqBF&(TJau;hyu z!>jgqXmGD6`BYTq;hMw1LvZI#@*~p3ED*p-PJg0ar^~HGgX3_EFSo0&q{TI;q#rpF ze$9acp14R_hgCK7clzS<@b3g*?eD7lJ%668h>2OC8K*@hEDqCgT0MltnLk_$Ut1AI z+&D81iG>k}%}nvo0OmXth=qOAQo`ae9j9rQ0}EJ|D=cWiJeVM6918HDU_@(v2YjcX zSaIXbI3zX-UHQ}NX8;-rjS_tFQ6a|*A;+ms#My`mwx}Y8ME?k#({CCVVG8*w)vu|tH`^{p;e!fe;j}M z1Y9rvkJ-3c68EPn2R#>^wyB0PrGhz9&}EJY$Q%)nIU*o)L_p?fT>;@nl@-pCzyn7~rramqmQrbAg?uO! zXhy#;2`E;`1C@B0(bl)Szn6(g2lKm_{7%u^g-Uy_&(B$h&0}TNh{6tiM&e3S2XfZM z0-X#VFB1^vsfMUmNJtgRRgRmkQ&X`XI6rUY;A=@p1<+z{&bk+JE}Y3pC#wcF(0KneG0^8_Y`Svurj@I9T}=VO*qGC6XXv42Q7;K^f;!X=)FmK*HD)rDReyP&gr=Z{+fmuD-Re+e>K0Jrx>cJ_ zST`olpQV)Bciu6?N=TS&+R5X*< Xfnf9LBW!=~00000NkvXXu0mjf`*J87 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/heading/user.png b/app/javascript/images/mailer-new/heading/user.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dd58a18d2f36571834e4a8fa41574004b65a88 GIT binary patch literal 1837 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 P00000NkvXXu0mjfT1tpw literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/checkbox-off.png b/app/javascript/images/mailer-new/welcome/checkbox-off.png new file mode 100644 index 0000000000000000000000000000000000000000..51c190efe6dde5e4710d3242c32a5e4b5abc2d9c GIT binary patch literal 954 zcmV;r14aCaP)>Ue2S64sTp+S@rEE-GQHY7r zggBPY+^a-{CNyoP;dsuR4!3dW-^_eB3}I-#@7(V@cjn%TQ2=Rv_aH-eD^Hxqd{t*S&jVEj;<_AHBlj6kl}ndmn(p#@#I z1O#3^Xycueo{ZX5Gm~T@`RXon3f(|tor@bC zuKYQzKaedKFfK0e(;D2`;WT&I@ZPc9nnr&;m;_xv5%p0FYhaLpIVWsQ1PS-Kki+_3 zI*-YmE<}OHMlFlMGx&B#*%}>RG#GoXj_B_x4MjyV+wNLpf* z6!mXXATE*WfACr5bkYLlbe}*K1(LR?k`fkMgclN^W!8lx;L!|fCV6a6;3rRjIjutqBD~U>~l%beAi6o$GK?%qndC*6VXBy5S zF3wTFeMJIb1VB>E@AFB$aQ5edh)u}8NzMxmr?KmAY?U$<{9 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/checkbox-on.png b/app/javascript/images/mailer-new/welcome/checkbox-on.png new file mode 100644 index 0000000000000000000000000000000000000000..162095e7df3df7aded49886f48a7fd4087e96c35 GIT binary patch literal 1074 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_V6+SH32_B-|Ns9FBpVtULPJA= z3?OiDa4@OAB;Y6zQ%g1e&J149o?~0@=Dt3-rL^KodYxV7ow;g6svG36uqzysQuy z4o|Huv zF?!r|3>YqvB|(0{42+CS%uLKItSqeTZ0u|toE(CJLPBC<;$jjCii%3AYK~6M&aQ3= zi76?C1%*W=B@K;@jm<3+CQg_3l=U~w0^^ejhpr#IC${wkSix@3q5;x!vKjI*;s2QS z@BdTs`}!QlL(?Bze^&A5?oxpSo#T@Bau1Hn-%b1<&sli&^yGbc{$V0)Cmb8@8~OF0 zIPhtHjqH=TZF3T$6^k$Y{+OdGg_dn<(2lqw@J? zYY!jpSDKif5R>bp@;Bi0Y*W>)+Y99U&n=r~&de$D{b5n&EW3L#{T(Hv;KWMeC0)*&J0t7h2Lh&W*kdXW1P6}?wR#3I(Wh!d@Q+k zgg<>s!Fe^ompj!CSLP~nZjQ-NA@et+d5~$^LcUKKcDA&(Xsf; z3K6gEdt>kVnu;c@J96K2_2lBiRyMmY%?n!e>DeaJwD7D)az0z0tk~1IM%go6e#)v8 z?)F=qVpm_^c2-;BH|gBV)~jF3kL-(`Ykk#Mc&&zhR4J2Xk@u`JtGn;s<=wiulymv% z>mSeXaXX!e@SnJPu1aU$QWlxmjZfqzs80%7RU<6O{D!CbKHmmCA$FZN1@n)7b2GTJ c(v9_m{km4>nExMI3PCyC)78&qol`;+00|A^7ytkO literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step1-on.png b/app/javascript/images/mailer-new/welcome/step1-on.png new file mode 100644 index 0000000000000000000000000000000000000000..c3776d17dfb7e7ab4694cf0b1786916c34ad768c GIT binary patch literal 1065 zcmV+^1lIeBP)%ZzQ&DEvRoRsd6W=b}X@PEU0iMvU4q`axSWGC#rTQs&6f+a4V*8 zEv9fRr*SQ(aw(~B0Dyojrf?vya3ZRAE~s%TsBtc+a4n~CEU0oUr*SQ(a4e{EEv9ZN zs&Xl*bSO#RKs+0W~%?nh6$ueire?7Y=@!Cl^u_ zU?(RhL~zFOw?qQC5D$!DsG6v$sZwEJM7ISG#>P_)4w`)q6c7Y&VFeE`^?xG(00OZ| zL_t(|UhSD_bJ{Qvh8G#11XHI8gfl77gewPa(k5xHrlb}bCeJ6q zFb})lmF!tl2?Vtt-8!+UcPF)=1R!)9kmX?Ft_gz%6{HcY3f=cqn0M|{cnx16<4-L_ zd`4o_!T`R)#y|@jWQ;~EbjcvD5>ALrhDakaNjsn#8Kp)OGRh5g$tYcFlS!a^b-Zyh zh=hnvPsjvEk>kk)o?{;s)y)zcu+FMffP+L=9yf((j?0O1m-4dXNX0O!qypd8PN$mF z7e{1uD1%m7)!e=iCLmzs`@9ZqptqOH=qO(w#U2Q83P)cV9d>=Clvkqzrs)J@~jO z4|Gw0KbM+|mKLBWm;APYvL}QM9omN3*#BjR(b!wF$)(I<;vh1wsa91v)#~C3$CWo~*7GUfpHv*x1lEsr!b>jHKOt<(Vj`0dN zDORC1zc!RtsyK(l0vm1y5je*t%wv4qB!rJ|M4N!SGJJgeeW{gId=VuNc<`}#T0CPO zheCwMmW=UssQ~^wQ36l2s2DB#)`M*rL05==FA^fM`}9hAqitAceu(jxj50Mp2pXBa zhyj%zjAr~2ODuFQR~{&HbT`Kdpwyj%c5 jZTei#A$z`Aef{wdI}C@qJ4V;j00000NkvXXu0mjfn>)*X literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step2-off.png b/app/javascript/images/mailer-new/welcome/step2-off.png new file mode 100755 index 0000000000000000000000000000000000000000..a262454d2d51eb788973ccb1be7e26c109615c9c GIT binary patch literal 505 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBJOX?|T+`D2C#C!c@{&{khlc(K zf|Qj1xw-#=;<2&+GcrJ2AR8!^knq2u0mL;n{$E)5KPCNtbo74*hyO{b|C3YxAB^@) z1DYaU666;w*~5^}%qY$$A|`f}pHqOThm|vkk0s$o*cBrN21ZX$7srr_xVJYi<~1Ae zv<0#s=ag1l6Kj6&zps07qC%AV)juAqr@Y^GDKOxUbi0-Bu{-QlyDmImy{4zQ8tR7lrZAi}TY#i)F6*Ih^d1Amy(R3xltaYPD8 zao(D0B<6D^`QSVzF`h54w$3j;%gDu5D)@4#@wM6$%E#XE`5l<5S+$Zo&N|*Ns%QGLiYwhg s_IfIt#2-B?bewE>bDsSrjn$u+5B^Zzzopr09#4evj6}9 literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step3-off.png b/app/javascript/images/mailer-new/welcome/step3-off.png new file mode 100755 index 0000000000000000000000000000000000000000..972de65a569aff9f6854996174fc45d1786a9dfd GIT binary patch literal 688 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBCIt9|xTdB32QrgV{-=OZXefvQ z1j(uYb94U#Wn*LiXJmjFK=I_1{|O2IfohVH{x>xIPfiA*)YSilh5wC>L0Y1t|0jV3 zK_t+?bdVrWO-kzjBp^!p@8AFu1Zn}w0=Xa)z-*x5Kr?}YQ74bq10AGa666;w$sB09?~2M*U|?We z;OXKRQW5v|=E=NI4g#$g7j;xC7;ZECEMmm}Kj8iUvc^6q*Dae1e!F!k?bH1<@wRr! z?5g8Ap?o}B&+(j^8TynX?Os4tY8g|Mzijla^9g01b9bK-nX~%3YYoSOee#cFnKPQ% z1#=l}4@Suy=xIo;-r&--&)rnfc$!v|*Y3`$zYk zNV(Og{bWM-zIcJ(jk!-dHCEg^c`!PpV^7`;W&IA$dmi?IPXbqee)T!IXE{T&4Xfk4 zCIx@T3Ck6ZbUU_x5aIc9|HNyKq9=?FUj-IaNqmquUd_(ne9*bU&z8rd&$-VaVNP+x zg-#2B75o1P6x`u?cj>^w6Ir*O+!g7ppTsrs?Tp38xF>QhHJPF>9W*P#q;TN|6ERmoK){kX#}r&1eXk^La0ORn_b=Ffj-w|xwFySwV% uyg0olQ|5hCpU$lq{WSBsd}V5AC3D_RN4+nORXc&v%;4$j=d#Wzp$Pzj&O(L& literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step4-off.png b/app/javascript/images/mailer-new/welcome/step4-off.png new file mode 100755 index 0000000000000000000000000000000000000000..f45e9a2c9ac1818f2819a0895e8794ee5c6c5be0 GIT binary patch literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBdINkyT+`D21DQ!F|C3Yyhlc(K zf)pS-8ARsh{!dN)pOX4NHugVISw;qkOiuZqkN{EuR19P%C4n?HG=M~mjsGVl|1T{3 z4>S#efZBl~Kq(*tNCMSINB>Vu1Ze?sQ_}xuW`d*=Q~o#im6#{T&e?p1yz^U?|D5x@{X_rcG;gw-Y`X2B zf^DhcmV+$D{k{h63vHak4hNjt(6Us*pmnA96@$=3p5SDc8C@1X*7vQO^E={Tm;TMF z4`!>iHBTK{V6IqM_V&)#$ju(L8&!T9_BI2w%KTejPJACTZIm>t%w})|OpG@06>*S%^=TbOdrEki) znWI)-x&5K(`gQN>54}z+vVXyL{>i^->OvuBp70%S3+}m4m!B&<<=%;#EKAuJFZj~a zbV*v|%cmFLstz}O_&YDZy2#r0{+B0ZT9Yh$=FH2Ov)TU0iiB00>^Y*`BDhXWdf8WA zcqe`5ktwDJmp+`h^6SENA2)vf*~fP*`ZUW@k!|*RArgAa&K+kJTy}NCdHJhbKL32o Zt$4wVVVOzqYGCv;c)I$ztaD0e0su0)U7P>_ literal 0 HcmV?d00001 diff --git a/app/javascript/images/mailer-new/welcome/step5-off.png b/app/javascript/images/mailer-new/welcome/step5-off.png new file mode 100755 index 0000000000000000000000000000000000000000..ca270f54781c5a6516884e48c26892a9e73a7d45 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVB@&kNAT+`D2C#C!c@)h~U##&_4* z|NnbgR-8{Z2{}-SROBfNs1B86Ll{%P7cdBkku-+M#gJ{ z*205ckKd*ECp|0mT(^k(+WC{VyOg#@2-fDf7A!jG$#T13m!I5*`^rWp1|59IuL!aR zb~E;H@UT@V3axZ3{P-uIz1RSXdLQyiDSh7EZ1Dd7lWEasmfBCVx%gbpxLxb#QOWt! z*3QW2cd@-xvFniX#Pu(l?kUd|HpK2Sk_VN83uS_g7MZ|jU=w7RxqkKz= z&HC6>&F?|eE8p(fc{R!Am5$h^tY14HOz^w?^10Izsp;STK9n*I+sE+MLA&bl^MqT# Ppl9%O^>bP0l+XkKKuh;E literal 0 HcmV?d00001 diff --git a/app/javascript/styles/fonts/inter.scss b/app/javascript/styles/fonts/inter.scss new file mode 100644 index 00000000000000..bb4899b701efd3 --- /dev/null +++ b/app/javascript/styles/fonts/inter.scss @@ -0,0 +1,8 @@ +@font-face { + font-family: Inter; + src: url('../fonts/inter/inter-variable-font-slnt-wght.woff2') + format('woff2-variations'); + font-weight: 100 900; + font-style: normal; + mso-generic-font-family: swiss; /* stylelint-disable-line property-no-unknown -- Proprietary property for Outlook on Windows. */ +} diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index 92d00cae8b14e1..6d0168969e79ee 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -1,574 +1,534 @@ -@import 'mastodon/variables'; -@import 'fonts/roboto'; +@import 'fonts/inter'; -table, -td, -div { - box-sizing: border-box; -} - -html, body { - width: 100% !important; - min-width: 100%; + accent-color: #6364ff; + word-break: break-word; margin: 0; + background-color: #f3f2f5; padding: 0; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: none; + text-size-adjust: none; } -.email-body { - td, - div, - a, - span { - line-height: inherit; - } -} - -a { - &, - &:visited, - span { - text-decoration: none; - color: $ui-highlight-color; - } - - #outlook & { - padding: 0; - } +p, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + background-color: transparent; + padding: 0; + border: none; + font-family: Inter, 'Lucida Grande', sans-serif; } img { - outline: none; - border: 0; - text-decoration: none; - -ms-interpolation-mode: bicubic; - clear: both; - line-height: 100%; + max-width: 100%; + height: auto; + border: none; + text-indent: 0; + vertical-align: middle; + color: inherit; + font-family: inherit; } table { - border-spacing: 0; - mso-table-lspace: 0; - mso-table-rspace: 0; + border: none; } -td { - vertical-align: top; +table + p { + margin-top: 16px; } -.auto-dir { - p { - unicode-bidi: plaintext; - } +.email { + min-width: 280px; + font-family: Inter, 'Lucida Grande', sans-serif; + word-break: break-word; + color: #17063b; + background-color: #f3f2f5; +} - a { - unicode-bidi: isolate; - } +.email-container { + max-width: 740px; + margin: 0 auto; + width: 100%; } -.email-table, -.content-section, -.column, -.column-cell { +// Outer email card +.email-card-table { + border-collapse: collapse; width: 100%; - min-width: 100%; } -.email-body { - font-size: 0 !important; - line-height: 100%; - text-align: center; - padding-left: 16px; - padding-right: 16px; +.email-card-td { + overflow: hidden; + box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 4%); + background-color: #fff; } -.email-start { - padding-top: 32px; +// Inner email card +.email-inner-card-table { + border-collapse: separate; + width: 100%; + border-radius: 12px; } -.email-end { - padding-bottom: 32px; +.email-inner-card-td-without-padding, +.email-inner-card-td { + border-radius: 12px; + overflow: hidden; + box-shadow: 0 4px 16px 0 rgba(23, 6, 59, 8%); + background-color: #fff; + border: 1px solid #dfdee3; } -.email-body, -html, -body { - background-color: lighten($ui-base-color, 4%); -} - -.email-container, -.email-row, -.col-0, -.col-1, -.col-2, -.col-3, -.col-4, -.col-5, -.col-6 { - font-size: 0; - display: inline-block; - width: 100%; - min-width: 100%; - min-width: 0 !important; - vertical-align: top; +.email-inner-card-td { + padding: 24px; } -.content-cell { +// Utility classes +.email-w-full { width: 100%; - min-width: 100%; - min-width: 0 !important; } -.column-cell { - padding-top: 16px; - padding-bottom: 16px; - vertical-align: top; - - &.button-cell { - padding-top: 0; - } -} +.email-prose { + p { + color: #17063b; + font-size: 14px; + line-height: 20px; -.email-container { - max-width: 632px; - margin: 0 auto; - text-align: center; -} + &:not(:last-child) { + margin-bottom: 16px; + } -.email-row { - display: block; - max-width: 600px !important; - margin: 0 auto; - text-align: center; - clear: both; -} + a:not([class]) { + color: #6364ff; + text-decoration: none; -.col-0 { - max-width: 50px; + &:hover { + color: #563acc !important; + } + } + } } -.col-1 { - max-width: 100px; +.email-padding-24 { + padding: 24px; } -.col-2 { - max-width: 200px; +.email-padding-top-24 { + padding-top: 24px; } -.col-3 { - max-width: 300px; +.email-border-top { + border-top: 1px solid #dfdee3; } -.col-4 { - max-width: 400px; +.email-border-bottom { + border-bottom: 1px solid #dfdee3; } -.col-5 { - max-width: 500px; +// Header +.email-header-td { + padding: 16px 32px; + background-color: #1b001f; + background-image: url('../images/mailer-new/common/header-bg-start.png'); + background-position: left top; + background-repeat: repeat; } -.col-6 { - max-width: 600px; +.email-header-logo-table { + width: auto; + margin: 0; } -.column-cell, -.column-cell td, -p { - font-family: Helvetica, Arial, sans-serif; +.email-header-logo-td { + padding: 16px 0; + font-size: 0; - @media only screen { - font-family: $font-sans-serif, sans-serif !important; + img { + color: #fff; + font-size: 16px; + font-weight: bold; + max-height: 40px; } } -.email-body .column-cell, -.column-cell, -p { - font-size: 15px; - line-height: 23px; - color: $ui-primary-color; - mso-line-height-rule: exactly; - text-rendering: optimizelegibility; -} - -p { - display: block; - margin-top: 0; - margin-bottom: 16px; - - &.small { - font-size: 13px; - } +.email-header-logo-a { + display: inline-block; - &.lead { - font-size: 19px; - line-height: 27px; + img { + display: inline-block; + color: #fff; } } -h1, -h2, -h3, -h4, -h5, -h6 { - color: $ui-secondary-color; - margin-left: 0; - margin-right: 0; - margin-top: 20px; - margin-bottom: 8px; - padding: 0; - font-weight: 500; +.email-header-logo-div { + max-height: 0; } -h1 { - font-size: 26px; - line-height: 36px; +.email-header-logo-p { + word-break: break-all; + padding-left: 40px; + padding-top: 26px; + font-size: 11px; + line-height: 13px; + color: #8d808f; + text-align: left; } -h2 { - font-size: 23px; - line-height: 30px; -} - -h3 { - font-size: 19px; - line-height: 25px; +.email-header-logo-span { + display: block; + text-align: right; } -h5 { - font-size: 16px; - line-height: 21px; - font-weight: 700; - color: lighten($ui-base-color, 34%); +.email-header-heading-td { + padding: 16px 0; } -.input-cell { - h5 { - margin-top: 4px; - } -} +.email-header-heading-img-td { + width: 56px; + text-align: left; + vertical-align: top; -.input { - td { - background: darken($ui-base-color, 8%); - border-radius: 4px; - padding: 16px; - line-height: 20px; - mso-line-height-rule: exactly; - text-align: center; - font-weight: 500; - font-size: 17px; + img { + width: 56px; + height: 56px; + border-radius: 12px; } } -.content-cell, -.blank-cell { - width: 100%; - font-size: 0; - text-align: center; - vertical-align: top; +.email-header-heading-txt-td { + vertical-align: middle; padding-left: 16px; padding-right: 16px; -} -.content-cell { - background-color: darken($ui-base-color, 4%); - - &.darker { - background-color: darken($ui-base-color, 8%); + h1 { + margin-bottom: 5px; + color: #fff; + font-size: 24px; + line-height: 28px; + font-weight: 600; } -} -.hero { - background-color: $ui-base-color; - padding-top: 20px; -} - -.hero-with-button { - padding-bottom: 16px; - - h1 { - margin-bottom: 4px; + p { + color: #a399a5; + font-size: 18px; + line-height: 21.6px; + font-weight: 500; } - p.lead { - margin-bottom: 32px; + &:only-child { + padding-left: 0; + padding-right: 0; } } -.header { - border-radius: 5px 5px 0 0; - background-color: darken($ui-base-color, 8%); +// To make the design work with images off +// we create an empty div that overlaps with +// the rest of the content with a dark background. +.email-header-after-div { + max-height: 0; +} - .column-cell { - text-align: center; - padding-top: 20px; - padding-bottom: 8px; - } +.email-header-after-inside-div { + height: 30px; + background-color: #1b001f; } -.content-start { - padding-top: 32px; +// Body content +.email-body-td { + background-image: url('../images/mailer-new/common/header-bg-end.png'); + background-position: left top; + background-repeat: no-repeat; } -.content-end { - border-radius: 0 0 5px 5px; - padding-top: 16px; +.email-body-padding-td { + padding: 0 32px 32px; + mso-padding-alt: 32px; } -.footer { - .column-cell, - p { - color: lighten($ui-base-color, 34%); - } +.email-body-padding-td { + & > p { + font-size: 14px; + line-height: 20px; + color: #17063b; - p { - margin-bottom: 0; - font-size: 13px; + a { + color: #6364ff; + text-decoration: none; - &.small { - margin-bottom: 0; + &:hover { + color: #563acc !important; + } } } - - a { - color: lighten($ui-base-color, 34%); - text-decoration: underline; - } - - img { - opacity: 0.3; - } } -.logo { - position: relative; - left: -4px; +// Footer +.email-footer-td { + padding: 28px 32px 32px; + text-align: center; } -.button { - display: table; - margin-left: auto; - margin-right: auto; +.email-footer-logo-a { + display: inline-block; +} - td { - line-height: 20px; - mso-line-height-rule: exactly; - border-radius: 4px; - text-align: center; - font-weight: 500; - font-size: 17px; - padding: 0 !important; - - a, - a span { - color: $primary-text-color; - display: block !important; - text-align: center !important; - vertical-align: top !important; - line-height: inherit !important; - } +.email-footer-p { + color: #9b94ab; + text-align: center; + font-size: 12px; + line-height: 20px; - a { - padding: 10px 22px !important; - line-height: 26px !important; - font-weight: 500 !important; - } + a { + color: #9b94ab; + text-decoration: underline; } - &.button-small { - td { - border-radius: 4px; - font-size: 14px; - padding: 8px 16px; - - a { - padding: 5px 16px !important; - line-height: 26px !important; - } - } + &:first-child { + margin-bottom: 12px; } } -.button-default { - background-color: darken($ui-base-color, 8%); +// Button +.email-btn-table { + margin: 0; + max-width: 100%; + border-collapse: separate; + border-radius: 8px; + background-color: #6364ff; } -.button-primary { - background-color: darken($ui-highlight-color, 3%); +.email-btn-td { + height: 40px; + text-align: center; + mso-padding-alt: 0 35px; } -.text-center { +.email-btn-a { + display: block; + border-radius: 8px; + padding-left: 35px; + padding-right: 35px; + padding-top: 10px; + padding-bottom: 10px; text-align: center; + font-family: Inter, 'Lucida Grande', sans-serif; + font-size: 14px; + font-weight: 600; + line-height: 20px; + color: #fff; + text-decoration: none; + transition: background-color 0.3s ease-in-out; } -.text-right { - text-align: right; +// Status +.email-status-header-img { + vertical-align: top; + width: 48px; + + img { + width: 48px; + height: 48px; + border-radius: 8px; + overflow: hidden; + } } -.padded { +.email-status-header-text { padding-left: 16px; padding-right: 16px; + vertical-align: middle; } -.padded-bottom { - padding-bottom: 32px; +.email-status-header-name { + font-size: 16px; + font-weight: 600; + line-height: 24px; + color: #17063b; } -.margin-bottom { - margin-bottom: 20px; +.email-status-header-handle { + font-size: 14px; + line-height: 20px; + color: #746a89; } -.hero-icon { - width: 64px; +.email-status-content { + padding-top: 24px; +} - td { - text-align: center; - vertical-align: middle; - line-height: 100%; - mso-line-height-rule: exactly; - padding: 16px; - border-radius: 80px; - background: $success-green; - } +.email-status-spoiler { + color: #746a89; + font-style: italic; + margin-bottom: 8px; +} - &.warning-icon td { - background: $gold-star; +.email-status-prose { + p { + font-size: 14px; + line-height: 20px; + color: #17063b; } - &.alert-icon td { - background: $error-red; + a { + color: #6364ff; + text-decoration: none; + + &:hover { + color: #563acc !important; + } } +} + +.email-status-media { + margin-top: 16px; + font-size: 14px; + line-height: 20px; + color: #17063b; img { - max-width: 32px; - width: 32px; - height: 32px; - display: block; - line-height: 100%; + border-radius: 8px; } -} -.hr { - width: 100%; + a { + color: #6364ff; + text-decoration: none; - td { - font-size: 0; - line-height: 1px; - mso-line-height-rule: exactly; - min-height: 1px; - overflow: hidden; - height: 2px; - background-color: transparent !important; - border-top: 1px solid lighten($ui-base-color, 8%); + &:hover { + color: #563acc !important; + } } } -.status { - padding-bottom: 32px; +.email-status-footer { + margin-top: 16px; + font-size: 12px; + line-height: 16px; + color: #746a89; - &--highlighted { - border: 1px solid lighten($ui-base-color, 8%); - border-radius: 4px; - padding-bottom: 16px; - margin-bottom: 16px; + a { + color: #746a89; } - .status-header { - td { - font-size: 14px; - padding-bottom: 15px; - } + a:hover { + color: #746a89 !important; + text-decoration: underline !important; + } +} - bdi { - color: $white; - font-size: 16px; - display: block; - font-weight: 500; - } +// Purple frame for emphasis +.email-frame-table { + background-color: #efefff; + border-radius: 8px; +} - td:first-child { - padding-right: 10px; - } +.email-frame-td { + padding: 16px; +} - img { - width: 48px; - height: 48px; - border-radius: 4px; - } - } +.email-frame-wrapper-td { + padding-bottom: 16px; +} - p { - font-size: 19px; - margin-bottom: 20px; +.email-frame-td > p { + text-align: center; + font-size: 16px; + line-height: 24px; +} - &.status-footer { - color: lighten($ui-base-color, 26%); - font-size: 14px; - margin-bottom: 0; +// Checklist item +.email-checklist-wrapper-td { + padding: 4px 0; +} - a { - color: lighten($ui-base-color, 26%); - } - } - } +.email-checklist-table { + border-radius: 12px; + border-width: 1px; + border-style: solid; + border-color: #efefff; + background-color: #fff; } -.border-top { - border-top: 1px solid lighten($ui-base-color, 8%); +.email-checklist-td { + padding: 16px; } -ul { - padding-left: 15px; - margin-top: 0; - margin-bottom: 0; - padding-top: 16px; +.email-checklist-icons-td { + width: 84px; + vertical-align: top; +} - li { - margin-bottom: 16px; - color: lighten($ui-base-color, 26%); +.email-checklist-icons-checkbox-td { + width: 20px; + vertical-align: middle; - span { - color: $ui-primary-color; - } + img { + max-width: 100%; + width: 20px; } } -ul.rules-list { - padding-top: 0; +.email-checklist-icons-step-td { + width: 64px; + text-align: center; + vertical-align: middle; + + img { + max-width: 100%; + width: 40px; + } } -@media only screen and (device-width >= 768px) and (device-width <= 1024px) and (orientation: landscape) { - body { - min-height: 1024px !important; +.email-checklist-text-td { + h3 { + margin: 0 0 4px; + color: #17063b; + font-size: 14px; + font-weight: 600; + line-height: 16.8px; + } + + p { + margin: 0 0 2px; + color: #746a89; + font-size: 14px; + line-height: 16.8px; + } + + .email-btn-table { + width: 100px; + } + + .email-btn-td { + mso-padding-alt: 10px; + } + + .email-btn-a { + padding-left: 10px; + padding-right: 10px; } } -@media (width <= 697px) { - .email-container, - .col-1, - .col-2, - .col-3, - .col-4, - .col-5, - .col-6 { - width: 100% !important; - max-width: none !important; +// Responsive +/* stylelint-disable-next-line media-feature-range-notation -- Basic media queries have better support across email clients. */ +@media only screen and (min-width: 740px) { + .email-desktop-p-8 { + padding: 32px !important; } - .email-start { - padding-top: 16px !important; + .email-desktop-rounded-16px { + border-radius: 16px !important; } - .email-end { - padding-bottom: 16px !important; + .email-header-td { + border-radius: 16px 16px 0 0 !important; } - .padded { - padding-left: 0 !important; - padding-right: 0 !important; + .email-desktop-flex { + display: flex; } } diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 5eecfed10400bc..4eb38ec340620f 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -12,6 +12,8 @@ class NotificationMailer < ApplicationMailer default to: -> { email_address_with_name(@user.email, @me.username) } + layout 'mailer' + def mention return unless @user.functional? && @status.present? diff --git a/app/views/application/mailer/_button.html.haml b/app/views/application/mailer/_button.html.haml new file mode 100644 index 00000000000000..61430732eb3ed3 --- /dev/null +++ b/app/views/application/mailer/_button.html.haml @@ -0,0 +1,4 @@ +%table.email-btn-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-btn-td + = link_to "#{text} ➜", url, class: 'email-btn-a email-btn-hover' diff --git a/app/views/application/mailer/_checklist.html.haml b/app/views/application/mailer/_checklist.html.haml new file mode 100644 index 00000000000000..9ee96559398c43 --- /dev/null +++ b/app/views/application/mailer/_checklist.html.haml @@ -0,0 +1,29 @@ +%table.email-w-full.email-checklist-wrapper-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-checklist-wrapper-td + %table.email-w-full.email-checklist-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-checklist-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-checklist-icons-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-checklist-icons-checkbox-td + - if defined?(checked) && checked + = image_tag full_pack_url('media/images/mailer-new/welcome/checkbox-on.png'), alt: '', width: 20, height: 20 + - else + = image_tag full_pack_url('media/images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 + %td.email-checklist-icons-step-td + - if defined?(step_image_url) + = image_tag step_image_url, alt: '', width: 40, height: 40 + %td.email-checklist-text-td + .email-desktop-flex + %div + - if defined?(title) + %h3= title + - if defined?(text) + %p= text + %div + - if defined?(button_text) && defined?(button_url) && defined?(checked) && !checked + = render 'application/mailer/button', text: button_text, url: button_url diff --git a/app/views/application/mailer/_frame.html.haml b/app/views/application/mailer/_frame.html.haml new file mode 100644 index 00000000000000..74403e7678f68b --- /dev/null +++ b/app/views/application/mailer/_frame.html.haml @@ -0,0 +1,4 @@ +%table.email-w-full.email-frame-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-frame-td + %p= text diff --git a/app/views/application/mailer/_heading.html.haml b/app/views/application/mailer/_heading.html.haml new file mode 100644 index 00000000000000..9fc5dc7471b5e4 --- /dev/null +++ b/app/views/application/mailer/_heading.html.haml @@ -0,0 +1,13 @@ +%table.email-w-full.email-header-heading-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-heading-td + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + - if defined?(heading_image_url) + %td.email-header-heading-img-td + = image_tag heading_image_url, alt: '', width: 56, height: 56 + %td.email-header-heading-txt-td + - if defined?(heading_title) + %h1= heading_title + - if defined?(heading_subtitle) + %p= heading_subtitle diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index 7fa344a9b7e95e..c0f9a0a5595e01 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -1,54 +1,87 @@ !!! -%html{ lang: I18n.locale } +%html{ lang: I18n.locale, dir: locale_direction } %head - %meta{ 'http-equiv' => 'Content-Type', 'content' => 'text/html; charset=utf-8' }/ - %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1.0, shrink-to-fit=no' } - + %meta{ 'charset' => 'utf-8' } + %title Mastodon + %meta{ name: 'x-apple-disable-message-reformatting' } + %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1' } + %meta{ name: 'format-detection', content: 'telephone=no, date=no, address=no, email=no, url=no' } + %meta{ name: 'supported-color-schemes', content: 'light' } + %style + \table { mso-table-lspace: 0pt; mso-table-rspace: 0pt; } + %style{ 'data-premailer': 'ignore' } + \.email a { color: inherit; text-decoration: none; } + \.email-btn-hover:hover { background-color: #563acc !important; } + /[if mso] + + + 96 + + = stylesheet_pack_tag 'mailer' - %body{ dir: locale_direction } - %table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody + %body + .email{ dir: locale_direction } + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.email-body.email-start + %td.email-desktop-p-8 .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.header - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell - = link_to root_url do - = image_tag full_pack_url('media/images/mailer/wordmark.png'), alt: 'Mastodon', height: 34, class: 'logo' + /[if mso] +
+ %table.email-w-full.email-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-card-td.email-desktop-rounded-16px - = yield + -# Header + %table.email-header-table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-td - %table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body.email-end + -# Logo + %table.email-header-logo-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-header-logo-td + /[if mso] + + .email-header-logo-div + %p.email-header-logo-p + %span.email-header-logo-span + = '/ ' + = site_hostname + /[if mso] + + = link_to root_url, class: 'email-header-logo-a' do + = image_tag full_pack_url('media/images/mailer-new/common/logo-header.png'), alt: 'Mastodon', width: 157, height: 40 + + -# Heading + = yield :heading + + .email-header-after-div + .email-header-after-inside-div + %table.email-body-table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-td + -# Content + = yield + + /[if mso] +
+ + -# Footer .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-end - != '  ' - %tr - %td.blank-cell.footer - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %td.column-cell - %p= t 'about.hosted_on', domain: site_hostname - %p - = link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url - - if defined?(@unsubscribe_url) - · - = link_to t('application_mailer.unsubscribe'), @unsubscribe_url - %td.column-cell.text-right - = link_to root_url do - = image_tag full_pack_url('media/images/mailer/logo.png'), alt: 'Mastodon', height: 24 + /[if mso] +
+ %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-footer-td + %p.email-footer-p + = link_to root_url, class: 'email-footer-logo-a' do + = image_tag full_pack_url('media/images/mailer-new/common/logo-footer.png'), alt: 'Mastodon', width: 44, height: 44 + %p.email-footer-p + = t 'about.hosted_on', domain: site_hostname + %p.email-footer-p + = link_to t('application_mailer.notification_preferences'), settings_preferences_notifications_url + - if defined?(@unsubscribe_url) + · + = link_to t('application_mailer.unsubscribe'), @unsubscribe_url + /[if mso] +
diff --git a/app/views/notification_mailer/_status.html.haml b/app/views/notification_mailer/_status.html.haml index e053a30fdec591..bf38dc9aa26ca5 100644 --- a/app/views/notification_mailer/_status.html.haml +++ b/app/views/notification_mailer/_status.html.haml @@ -1,45 +1,31 @@ -- i ||= 0 -- highlighted ||= false +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-status-header-img + = image_tag full_asset_url(status.account.avatar.url), alt: '', width: 48, height: 48 + %td.email-status-header-text + %h2.email-status-header-name + = display_name(status.account) + %p.email-status-header-handle + @#{status.account.pretty_acct} -%table.email-table{ cellspacing: 0, cellpadding: 0, dir: 'ltr' } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell{ class: i.zero? ? 'content-start' : nil } - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.padded.status{ class: highlighted ? 'status--highlighted' : '' } - %table.status-header{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td{ align: 'left', width: 48 } - = image_tag full_asset_url(status.account.avatar.url), alt: '' - %td{ align: 'left' } - %bdi= display_name(status.account) - @#{status.account.pretty_acct} +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-status-content + .auto-dir + - if status.spoiler_text? + %p.email-status-spoiler + = status.spoiler_text - - if status.spoiler_text? - .auto-dir - %p - = status.spoiler_text + .email-status-prose + = status_content_format(status) - .auto-dir - = status_content_format(status) + - if status.ordered_media_attachments.size.positive? + %p.email-status-media + - status.ordered_media_attachments.each do |a| + - if status.local? + = link_to full_asset_url(a.file.url(:original)), full_asset_url(a.file.url(:original)) + - else + = link_to a.remote_url, a.remote_url - - if status.ordered_media_attachments.size.positive? - %p - - status.ordered_media_attachments.each do |a| - - if status.local? - = link_to full_asset_url(a.file.url(:original)), full_asset_url(a.file.url(:original)) - - else - = link_to a.remote_url, a.remote_url - - %p.status-footer - = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}") + %p.email-status-footer + = link_to l(status.created_at.in_time_zone(time_zone.presence), format: :with_time_zone), web_url("@#{status.account.pretty_acct}/#{status.id}") diff --git a/app/views/notification_mailer/favourite.html.haml b/app/views/notification_mailer/favourite.html.haml index 325f0aff5f7d58..26bb31731a3ad5 100644 --- a/app/views/notification_mailer/favourite.html.haml +++ b/app/views/notification_mailer/favourite.html.haml @@ -1,45 +1,13 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('notification_mailer.favourite.title'), heading_subtitle: t('notification_mailer.favourite.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/favorite.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'status', status: @status, time_zone: @me.user_time_zone + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_grade.png'), alt: '' - - %h1= t 'notification_mailer.favourite.title' - %p.lead= t('notification_mailer.favourite.body', name: @account.pretty_acct) - -= render 'status', status: @status, time_zone: @me.user_time_zone - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start.border-top - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url("@#{@status.account.pretty_acct}/#{@status.id}") do - %span= t 'application_mailer.view_status' + %td.email-padding-top-24 + = render 'application/mailer/button', text: t('application_mailer.view_status'), url: web_url("@#{@status.account.pretty_acct}/#{@status.id}") diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml index f250cbbd2aef71..2f7ba0a9c53fbf 100644 --- a/app/views/notification_mailer/follow.html.haml +++ b/app/views/notification_mailer/follow.html.haml @@ -1,43 +1,9 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: '' - - %h1= t 'notification_mailer.follow.title' - %p.lead= t('notification_mailer.follow.body', name: @account.pretty_acct) - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url("@#{@account.pretty_acct}") do - %span= t 'application_mailer.view_profile' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('notification_mailer.follow.title'), heading_subtitle: t('notification_mailer.follow.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/user.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'application/mailer/button', text: t('application_mailer.view_profile'), url: web_url("@#{@account.pretty_acct}") diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml index 3885a411d97a2a..275d0c5b0eba1a 100644 --- a/app/views/notification_mailer/follow_request.html.haml +++ b/app/views/notification_mailer/follow_request.html.haml @@ -1,43 +1,9 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_person_add.png'), alt: '' - - %h1= t 'notification_mailer.follow_request.title' - %p.lead= t('notification_mailer.follow_request.body', name: @account.pretty_acct) - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url('follow_requests') do - %span= t 'notification_mailer.follow_request.action' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('notification_mailer.follow_request.title'), heading_subtitle: t('notification_mailer.follow_request.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/follow.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'application/mailer/button', text: t('notification_mailer.follow_request.action'), url: web_url('follow_requests') diff --git a/app/views/notification_mailer/mention.html.haml b/app/views/notification_mailer/mention.html.haml index e830644c3f4bce..2420a42bf77a84 100644 --- a/app/views/notification_mailer/mention.html.haml +++ b/app/views/notification_mailer/mention.html.haml @@ -1,45 +1,13 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('notification_mailer.mention.title'), heading_subtitle: t('notification_mailer.mention.body', name: @status.account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/mention.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'status', status: @status, time_zone: @me.user_time_zone + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_reply.png'), alt: '' - - %h1= t 'notification_mailer.mention.title' - %p.lead= t('notification_mailer.mention.body', name: @status.account.pretty_acct) - -= render 'status', status: @status, time_zone: @me.user_time_zone - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start.border-top - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url("@#{@status.account.pretty_acct}/#{@status.id}") do - %span= t 'notification_mailer.mention.action' + %td.email-padding-top-24 + = render 'application/mailer/button', text: t('notification_mailer.mention.action'), url: web_url("@#{@status.account.pretty_acct}/#{@status.id}") diff --git a/app/views/notification_mailer/reblog.html.haml b/app/views/notification_mailer/reblog.html.haml index e4f9441236b4f0..b32c984708e9a8 100644 --- a/app/views/notification_mailer/reblog.html.haml +++ b/app/views/notification_mailer/reblog.html.haml @@ -1,45 +1,13 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('notification_mailer.reblog.title'), heading_subtitle: t('notification_mailer.reblog.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/boost.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td + = render 'status', status: @status, time_zone: @me.user_time_zone + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_cached.png'), alt: '' - - %h1= t 'notification_mailer.reblog.title' - %p.lead= t('notification_mailer.reblog.body', name: @account.pretty_acct) - -= render 'status', status: @status, time_zone: @me.user_time_zone - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start.border-top - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url("@#{@status.account.pretty_acct}/#{@status.id}") do - %span= t 'application_mailer.view_status' + %td.email-padding-top-24 + = render 'application/mailer/button', text: t('application_mailer.view_status'), url: web_url("@#{@status.account.pretty_acct}/#{@status.id}") diff --git a/app/views/user_mailer/appeal_approved.html.haml b/app/views/user_mailer/appeal_approved.html.haml index 223ba7f0b88880..2cf62de39b85e8 100644 --- a/app/views/user_mailer/appeal_approved.html.haml +++ b/app/views/user_mailer/appeal_approved.html.haml @@ -1,61 +1,12 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_done.png'), alt: '' - - %h1= t 'user_mailer.appeal_approved.title' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.appeal_approved.explanation', - appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), - strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to root_url do - %span= t 'user_mailer.appeal_approved.action' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_approved.title'), heading_subtitle: t('user_mailer.appeal_approved.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/appeal-approved.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'user_mailer.appeal_approved.explanation', + appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), + strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) + = render 'application/mailer/button', text: t('user_mailer.appeal_approved.action'), url: root_url diff --git a/app/views/user_mailer/appeal_rejected.html.haml b/app/views/user_mailer/appeal_rejected.html.haml index 59354f1d404dd0..c24cf7647fec6d 100644 --- a/app/views/user_mailer/appeal_rejected.html.haml +++ b/app/views/user_mailer/appeal_rejected.html.haml @@ -1,61 +1,12 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_flag.png'), alt: '' - - %h1= t 'user_mailer.appeal_rejected.title' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.appeal_rejected.explanation', - appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), - strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to root_url do - %span= t 'user_mailer.appeal_approved.action' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_rejected.title'), heading_subtitle: t('user_mailer.appeal_rejected.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/appeal-rejected.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'user_mailer.appeal_rejected.explanation', + appeal_date: l(@appeal.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone), + strike_date: l(@appeal.strike.created_at.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) + = render 'application/mailer/button', text: t('user_mailer.appeal_approved.action'), url: root_url diff --git a/app/views/user_mailer/backup_ready.html.haml b/app/views/user_mailer/backup_ready.html.haml index 465ead2c8bac23..4a1e7b1c657d14 100644 --- a/app/views/user_mailer/backup_ready.html.haml +++ b/app/views/user_mailer/backup_ready.html.haml @@ -1,59 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_file_download.png'), alt: '' - - %h1= t 'user_mailer.backup_ready.title' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.backup_ready.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to download_backup_url(@backup) do - %span= t 'exports.archive_takeout.download' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('user_mailer.backup_ready.title'), heading_subtitle: t('user_mailer.backup_ready.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/archive.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'user_mailer.backup_ready.extra' + = render 'application/mailer/button', text: t('exports.archive_takeout.download'), url: download_backup_url(@backup) diff --git a/app/views/user_mailer/confirmation_instructions.html.haml b/app/views/user_mailer/confirmation_instructions.html.haml index 447e689b4078f1..4fd66d07916c74 100644 --- a/app/views/user_mailer/confirmation_instructions.html.haml +++ b/app/views/user_mailer/confirmation_instructions.html.haml @@ -1,80 +1,16 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_email.png'), alt: '' - - %h1= t 'devise.mailer.confirmation_instructions.title' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t @resource.approved? ? 'devise.mailer.confirmation_instructions.explanation' : 'devise.mailer.confirmation_instructions.explanation_when_pending', host: site_hostname - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - - if @resource.created_by_application - = link_to confirmation_url(@resource, confirmation_token: @token, redirect_to_app: 'true') do - %span= t 'devise.mailer.confirmation_instructions.action_with_app', app: @resource.created_by_application.name - - else - = link_to confirmation_url(@resource, confirmation_token: @token) do - %span= t 'devise.mailer.confirmation_instructions.action' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'devise.mailer.confirmation_instructions.extra_html', terms_path: about_more_url, policy_path: privacy_policy_url += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.confirmation_instructions.title'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t @resource.approved? ? 'devise.mailer.confirmation_instructions.explanation' : 'devise.mailer.confirmation_instructions.explanation_when_pending', host: site_hostname + - if @resource.created_by_application + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url + = link_to confirmation_url(@resource, confirmation_token: @token, redirect_to_app: 'true') do + %span= t 'devise.mailer.confirmation_instructions.action_with_app', app: @resource.created_by_application.name + - else + = render 'application/mailer/button', text: t('devise.mailer.confirmation_instructions.action'), url: confirmation_url(@resource, confirmation_token: @token) + %p= t 'devise.mailer.confirmation_instructions.extra_html', terms_path: about_more_url, policy_path: privacy_policy_url diff --git a/app/views/user_mailer/email_changed.html.haml b/app/views/user_mailer/email_changed.html.haml index 96be8624d9d7ef..741c2bde18b9fd 100644 --- a/app/views/user_mailer/email_changed.html.haml +++ b/app/views/user_mailer/email_changed.html.haml @@ -1,58 +1,11 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_email.png'), alt: '' - - %h1= t 'devise.mailer.email_changed.title' - %p.lead= t 'devise.mailer.email_changed.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.input-cell - %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td= @resource.unconfirmed_email - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %p= t 'devise.mailer.email_changed.extra' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.email_changed.title'), heading_subtitle: t('devise.mailer.email_changed.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + = render 'application/mailer/frame', text: @resource.unconfirmed_email + %p= t 'devise.mailer.email_changed.extra' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/password_change.html.haml b/app/views/user_mailer/password_change.html.haml index 559abf027c9f67..08b4ecbbd650c3 100644 --- a/app/views/user_mailer/password_change.html.haml +++ b/app/views/user_mailer/password_change.html.haml @@ -1,40 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.password_change.title' - %p.lead= t 'devise.mailer.password_change.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %p= t 'devise.mailer.password_change.extra' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.password_change.title'), heading_subtitle: t('devise.mailer.password_change.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/password.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.password_change.extra' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/reconfirmation_instructions.html.haml b/app/views/user_mailer/reconfirmation_instructions.html.haml index 7f10ba94fddfcb..8aa2230151517e 100644 --- a/app/views/user_mailer/reconfirmation_instructions.html.haml +++ b/app/views/user_mailer/reconfirmation_instructions.html.haml @@ -1,60 +1,11 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_email.png'), alt: '' - - %h1= t 'devise.mailer.reconfirmation_instructions.title' - %p.lead= t 'devise.mailer.reconfirmation_instructions.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to confirmation_url(@resource, confirmation_token: @token) do - %span= t 'devise.mailer.confirmation_instructions.action' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %p= t 'devise.mailer.reconfirmation_instructions.extra' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.reconfirmation_instructions.title'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t('devise.mailer.reconfirmation_instructions.explanation') + = render 'application/mailer/button', text: t('devise.mailer.confirmation_instructions.action'), url: confirmation_url(@resource, confirmation_token: @token) + %p= t 'devise.mailer.reconfirmation_instructions.extra' diff --git a/app/views/user_mailer/reset_password_instructions.html.haml b/app/views/user_mailer/reset_password_instructions.html.haml index eeed38c9e4ecab..0db79daaf10fec 100644 --- a/app/views/user_mailer/reset_password_instructions.html.haml +++ b/app/views/user_mailer/reset_password_instructions.html.haml @@ -1,60 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.reset_password_instructions.title' - %p.lead= t 'devise.mailer.reset_password_instructions.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_password_url(@resource, reset_password_token: @token) do - %span= t 'devise.mailer.reset_password_instructions.action' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %p= t 'devise.mailer.reset_password_instructions.extra' += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.reset_password_instructions.title'), heading_subtitle: t('devise.mailer.reset_password_instructions.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/password.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.reset_password_instructions.extra' + = render 'application/mailer/button', text: t('devise.mailer.reset_password_instructions.action'), url: edit_password_url(@resource, reset_password_token: @token) diff --git a/app/views/user_mailer/suspicious_sign_in.html.haml b/app/views/user_mailer/suspicious_sign_in.html.haml index 0cd21b4e60a412..e2cb916bfe7e29 100644 --- a/app/views/user_mailer/suspicious_sign_in.html.haml +++ b/app/views/user_mailer/suspicious_sign_in.html.haml @@ -1,71 +1,24 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.warning-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'user_mailer.suspicious_sign_in.title' - %p= t 'user_mailer.suspicious_sign_in.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.suspicious_sign_in.details' - %tr - %td.column-cell.text-center - %p - %strong #{t('sessions.ip')}: - = @remote_ip - %br/ - %strong #{t('sessions.browser')}: - %span{ title: @user_agent } - = t 'sessions.description', - browser: t("sessions.browsers.#{@detection.id}", default: @detection.id.to_s), - platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s) - %br/ - = l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.suspicious_sign_in.further_actions_html', - action: link_to(t('user_mailer.suspicious_sign_in.change_password'), edit_user_registration_url) += content_for :heading do + = render 'application/mailer/heading', heading_title: t('user_mailer.suspicious_sign_in.title'), heading_subtitle: t('user_mailer.suspicious_sign_in.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/login.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'user_mailer.suspicious_sign_in.details' + %p + %strong #{t('sessions.ip')}: + = @remote_ip + %br/ + %strong #{t('sessions.browser')}: + %span{ title: @user_agent } + = t 'sessions.description', + browser: t("sessions.browsers.#{@detection.id}", default: @detection.id.to_s), + platform: t("sessions.platforms.#{@detection.platform.id}", default: @detection.platform.id.to_s) + %br/ + %strong #{t('sessions.date')}: + = l(@timestamp.in_time_zone(@resource.time_zone.presence), format: :with_time_zone) + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url + %p= t 'user_mailer.suspicious_sign_in.further_actions_html', + action: link_to(t('user_mailer.suspicious_sign_in.change_password'), edit_user_registration_url) diff --git a/app/views/user_mailer/two_factor_disabled.html.haml b/app/views/user_mailer/two_factor_disabled.html.haml index 651c6f940e0dea..0d8ff5c690f565 100644 --- a/app/views/user_mailer/two_factor_disabled.html.haml +++ b/app/views/user_mailer/two_factor_disabled.html.haml @@ -1,43 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.two_factor_disabled.title' - %p.lead= t 'devise.mailer.two_factor_disabled.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_disabled.title'), heading_subtitle: t('devise.mailer.two_factor_disabled.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-disabled.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.two_factor_disabled.explanation' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/two_factor_enabled.html.haml b/app/views/user_mailer/two_factor_enabled.html.haml index fc31bd979f5020..6fe03eab2b73b4 100644 --- a/app/views/user_mailer/two_factor_enabled.html.haml +++ b/app/views/user_mailer/two_factor_enabled.html.haml @@ -1,43 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.two_factor_enabled.title' - %p.lead= t 'devise.mailer.two_factor_enabled.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_enabled.title'), heading_subtitle: t('devise.mailer.two_factor_enabled.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-enabled.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.two_factor_enabled.explanation' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml index 833708868badd5..dff0620cefcc91 100644 --- a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml @@ -1,43 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.two_factor_recovery_codes_changed.title' - %p.lead= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_recovery_codes_changed.title'), heading_subtitle: t('devise.mailer.two_factor_recovery_codes_changed.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-recovery.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.two_factor_recovery_codes_changed.explanation' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml index 5d64e83247cd62..4dfbfc231d07c8 100644 --- a/app/views/user_mailer/warning.html.haml +++ b/app/views/user_mailer/warning.html.haml @@ -1,98 +1,46 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t("user_mailer.warning.title.#{@warning.action}"), heading_image_url: full_pack_url('media/images/mailer-new/heading/warning.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td-without-padding + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_flag.png'), alt: '' - - %h1= t "user_mailer.warning.title.#{@warning.action}" - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - - unless @warning.none_action? - %p= t "user_mailer.warning.explanation.#{@warning.action}", instance: @instance - - - if @warning.text.present? - = linkify(@warning.text) - - - if @warning.report && !@warning.report.other? - %p - %strong= t('user_mailer.warning.reason') - = t("user_mailer.warning.categories.#{@warning.report.category}") - - - if @warning.report.violation? && @warning.report.rule_ids.present? - %ul.rules-list - - @warning.report.rules.each do |rule| - %li= rule.text - - - unless @statuses.empty? - %p - %strong= t('user_mailer.warning.statuses') - -- unless @statuses.empty? - - @statuses.each_with_index do |status, i| - = render 'notification_mailer/status', status: status, i: i + 1, highlighted: true, time_zone: @resource.time_zone.presence - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell{ class: @statuses.blank? ? '' : 'content-start' } - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to disputes_strike_url(@warning) do - %span= t 'user_mailer.warning.appeal' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody + %td.email-prose.email-padding-24 + - unless @warning.none_action? + %p= t "user_mailer.warning.explanation.#{@warning.action}", instance: @instance + + - if @warning.text.present? + = linkify(@warning.text) + + - if @warning.report && !@warning.report.other? + %p + %strong= t('user_mailer.warning.reason') + = t("user_mailer.warning.categories.#{@warning.report.category}") + + - if @warning.report.violation? && @warning.report.rule_ids.present? + %ul.rules-list + - @warning.report.rules.each do |rule| + %li= rule.text + + - unless @statuses.empty? + %p + %strong= t('user_mailer.warning.statuses') + + - unless @statuses.empty? + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-border-top + - @statuses.each_with_index do |status, i| + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-border-bottom.email-padding-24 + = render 'notification_mailer/status', status: status, i: i + 1, highlighted: true, time_zone: @resource.time_zone.presence + + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center - %p= t 'user_mailer.warning.appeal_description', instance: @instance + %td.email-prose.email-padding-24 + %p= t 'user_mailer.warning.appeal_description', instance: @instance + = render 'application/mailer/button', text: t('user_mailer.warning.appeal'), url: disputes_strike_url(@warning) diff --git a/app/views/user_mailer/webauthn_credential_added.html.haml b/app/views/user_mailer/webauthn_credential_added.html.haml index 2ecb62d967ab20..334eb3e32dd554 100644 --- a/app/views/user_mailer/webauthn_credential_added.html.haml +++ b/app/views/user_mailer/webauthn_credential_added.html.haml @@ -1,44 +1,13 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.added.title'), heading_subtitle: t('devise.mailer.webauthn_credential.added.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-added.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.webauthn_credential.added.title' - %p.lead #{t('devise.mailer.webauthn_credential.added.explanation')}: - %p.lead= @webauthn_credential.nickname - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') + %td.email-frame-wrapper-td + = render 'application/mailer/frame', text: @webauthn_credential.nickname + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/webauthn_credential_deleted.html.haml b/app/views/user_mailer/webauthn_credential_deleted.html.haml index f282985b1485a8..5fad523b4e84d6 100644 --- a/app/views/user_mailer/webauthn_credential_deleted.html.haml +++ b/app/views/user_mailer/webauthn_credential_deleted.html.haml @@ -1,44 +1,13 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.deleted.title'), heading_subtitle: t('devise.mailer.webauthn_credential.deleted.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-deleted.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.webauthn_credential.deleted.title' - %p.lead #{t('devise.mailer.webauthn_credential.deleted.explanation')}: - %p.lead= @webauthn_credential.nickname - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') + %td.email-frame-wrapper-td + = render 'application/mailer/frame', text: @webauthn_credential.nickname + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/webauthn_disabled.html.haml b/app/views/user_mailer/webauthn_disabled.html.haml index 81a2a7954c7f20..017412536261da 100644 --- a/app/views/user_mailer/webauthn_disabled.html.haml +++ b/app/views/user_mailer/webauthn_disabled.html.haml @@ -1,43 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.webauthn_disabled.title' - %p.lead= t 'devise.mailer.webauthn_disabled.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_disabled.title'), heading_subtitle: t('devise.mailer.webauthn_disabled.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-disabled.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.webauthn_disabled.extra' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/webauthn_enabled.html.haml b/app/views/user_mailer/webauthn_enabled.html.haml index f08e764e8df64e..3257d14df94d2c 100644 --- a/app/views/user_mailer/webauthn_enabled.html.haml +++ b/app/views/user_mailer/webauthn_enabled.html.haml @@ -1,43 +1,10 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_lock_open.png'), alt: '' - - %h1= t 'devise.mailer.webauthn_enabled.title' - %p.lead= t 'devise.mailer.webauthn_enabled.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.content-cell.content-start - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.button-cell - %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to edit_user_registration_url do - %span= t('settings.account_settings') += content_for :heading do + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_enabled.title'), heading_subtitle: t('devise.mailer.webauthn_enabled.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-enabled.png') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td.email-prose + %p= t 'devise.mailer.webauthn_enabled.extra' + = render 'application/mailer/button', text: t('settings.account_settings'), url: edit_user_registration_url diff --git a/app/views/user_mailer/welcome.html.haml b/app/views/user_mailer/welcome.html.haml index 0d8a15cfd794dd..b77d40fb058930 100644 --- a/app/views/user_mailer/welcome.html.haml +++ b/app/views/user_mailer/welcome.html.haml @@ -1,99 +1,25 @@ -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody += content_for :heading do + = render 'application/mailer/heading', heading_title: t('user_mailer.welcome.title', name: @resource.account.username), heading_subtitle: t('user_mailer.welcome.explanation') +%table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-body-padding-td + %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-inner-card-td-without-padding + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.hero - .email-row - .col-6 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.text-center.padded - %table.hero-icon{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td - = image_tag full_pack_url('media/images/mailer/icon_done.png'), alt: '' - - %h1= t 'user_mailer.welcome.title', name: @resource.account.username - %p.lead= t 'user_mailer.welcome.explanation' - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody + %td.email-prose.email-padding-24 + %p + %b= t 'user_mailer.welcome.full_handle' + = render 'application/mailer/frame', text: "#{@resource.account.username}@#{@instance}" + %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.content-start - .email-row - .col-3 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.input-cell.text-center.padded-bottom - %h5= t 'user_mailer.welcome.full_handle' - %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td @#{@resource.account.username}@#{@instance} - .col-3 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell - %p= t 'user_mailer.welcome.full_handle_hint', instance: @instance - -%table.email-table{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.email-body - .email-container - %table.content-section{ cellspacing: 0, cellpadding: 0 } - %tbody + %td.email-border-top.email-prose.email-padding-24 + %p= t 'user_mailer.welcome.edit_profile_step' + = render 'application/mailer/button', text: t('user_mailer.welcome.edit_profile_action'), url: settings_profile_url + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.content-cell.content-start.border-top - .email-row - .col-4 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.padded - = t 'user_mailer.welcome.edit_profile_step' - .col-2 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.padded - %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to settings_profile_url do - %span= t 'user_mailer.welcome.edit_profile_action' - - %tr - %td.content-cell.padded-bottom - .email-row - .col-4 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.padded - = t 'user_mailer.welcome.final_step' - .col-2 - %table.column{ cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.column-cell.padded - %table.button.button-small{ align: 'left', cellspacing: 0, cellpadding: 0 } - %tbody - %tr - %td.button-primary - = link_to web_url do - %span= t 'user_mailer.welcome.final_action' + %td.email-border-top.email-prose.email-padding-24 + %p= t 'user_mailer.welcome.edit_profile_step' + = render 'application/mailer/button', text: t('user_mailer.welcome.final_action'), url: web_url diff --git a/config/initializers/premailer_rails.rb b/config/initializers/premailer_rails.rb index 52576ef883264b..5e9576be7ab108 100644 --- a/config/initializers/premailer_rails.rb +++ b/config/initializers/premailer_rails.rb @@ -5,4 +5,5 @@ Premailer::Rails.config.merge!(remove_ids: true, adapter: :nokogiri, generate_text_part: false, + css_to_attributes: false, strategies: [PremailerWebpackStrategy]) diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index eef8214817b6e7..4439397c8eead1 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -47,16 +47,19 @@ en: subject: 'Mastodon: Reset password instructions' title: Password reset two_factor_disabled: - explanation: Two-factor authentication for your account has been disabled. Login is now possible using only e-mail address and password. + explanation: Login is now possible using only e-mail address and password. subject: 'Mastodon: Two-factor authentication disabled' + subtitle: Two-factor authentication for your account has been disabled. title: 2FA disabled two_factor_enabled: - explanation: Two-factor authentication has been enabled for your account. A token generated by the paired TOTP app will be required for login. + explanation: A token generated by the paired TOTP app will be required for login. subject: 'Mastodon: Two-factor authentication enabled' + subtitle: Two-factor authentication has been enabled for your account. title: 2FA enabled two_factor_recovery_codes_changed: explanation: The previous recovery codes have been invalidated and new ones generated. subject: 'Mastodon: Two-factor recovery codes re-generated' + subtitle: The previous recovery codes have been invalidated and new ones generated. title: 2FA recovery codes changed unlock_instructions: subject: 'Mastodon: Unlock instructions' @@ -70,11 +73,13 @@ en: subject: 'Mastodon: Security key deleted' title: One of your security keys has been deleted webauthn_disabled: - explanation: Authentication with security keys has been disabled for your account. Login is now possible using only the token generated by the paired TOTP app. + explanation: Authentication with security keys has been disabled for your account. + extra: Login is now possible using only the token generated by the paired TOTP app. subject: 'Mastodon: Authentication with security keys disabled' title: Security keys disabled webauthn_enabled: - explanation: Security key authentication has been enabled for your account. Your security key can now be used for login. + explanation: Security key authentication has been enabled for your account. + extra: Your security key can now be used for login. subject: 'Mastodon: Security key authentication enabled' title: Security keys enabled omniauth_callbacks: diff --git a/config/locales/en.yml b/config/locales/en.yml index 50f814a81d56a6..78820c3b59ba79 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1609,6 +1609,7 @@ en: unknown_browser: Unknown Browser weibo: Weibo current_session: Current session + date: Date description: "%{browser} on %{platform}" explanation: These are the web browsers currently logged in to your Mastodon account. ip: IP @@ -1775,16 +1776,19 @@ en: webauthn: Security keys user_mailer: appeal_approved: - action: Go to your account + action: Account Settings explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been approved. Your account is once again in good standing. subject: Your appeal from %{date} has been approved + subtitle: Your account is once again in good standing. title: Appeal approved appeal_rejected: explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been rejected. subject: Your appeal from %{date} has been rejected + subtitle: Your appeal has been rejected. title: Appeal rejected backup_ready: - explanation: You requested a full backup of your Mastodon account. It's now ready for download! + explanation: You requested a full backup of your Mastodon account. + extra: It's now ready for download! subject: Your archive is ready for download title: Archive takeout suspicious_sign_in: From b4c332104a8b3748f619de250f77c0acc8e80628 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Mon, 15 Jan 2024 16:26:11 -0500 Subject: [PATCH 12/43] Use top-level `warn` in JS errors check (#28745) --- spec/support/javascript_errors.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/support/javascript_errors.rb b/spec/support/javascript_errors.rb index bdce1cc76db8a0..a36bf6017e3233 100644 --- a/spec/support/javascript_errors.rb +++ b/spec/support/javascript_errors.rb @@ -9,8 +9,8 @@ expect(error.level).to_not eq('SEVERE'), error.message next unless error.level == 'WARNING' - $stderr.warn 'WARN: javascript warning' - $stderr.warn error.message + warn 'WARN: javascript warning' + warn error.message end end end From f09035cc3fa58b283edd56d472dfd9ab04713217 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 09:32:40 +0100 Subject: [PATCH 13/43] Update dependency stackprof to v0.2.26 (#28743) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 290702eea99e71..d8e67b6bec4961 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -730,7 +730,7 @@ GEM simplecov-lcov (0.8.0) simplecov_json_formatter (0.1.4) smart_properties (1.17.0) - stackprof (0.2.25) + stackprof (0.2.26) statsd-ruby (1.5.0) stoplight (3.0.2) redlock (~> 1.0) From f0abba67db86fb8f514bbf8f5854d4501680cdc6 Mon Sep 17 00:00:00 2001 From: Jeong Arm Date: Tue, 16 Jan 2024 17:35:54 +0900 Subject: [PATCH 14/43] Ignore RecordNotUnique errors in LinkCrawlWorker (#28748) --- app/workers/link_crawl_worker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/workers/link_crawl_worker.rb b/app/workers/link_crawl_worker.rb index b3d8aa26467dfc..c63af1e43aa0a0 100644 --- a/app/workers/link_crawl_worker.rb +++ b/app/workers/link_crawl_worker.rb @@ -7,7 +7,7 @@ class LinkCrawlWorker def perform(status_id) FetchLinkCardService.new.call(Status.find(status_id)) - rescue ActiveRecord::RecordNotFound + rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordNotUnique true end end From 01b6c83c369061c2175d50dfb3ae1db502862664 Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Tue, 16 Jan 2024 11:27:26 +0100 Subject: [PATCH 15/43] Add a new `@/` alias for the root frontend directory and use it where possible (#28753) --- .../mastodon/components/attachment_list.jsx | 2 +- app/javascript/mastodon/components/badge.jsx | 6 ++--- .../components/column_back_button.tsx | 2 +- .../mastodon/components/column_header.jsx | 12 +++++----- .../mastodon/components/copy_icon_button.jsx | 2 +- .../components/dismissable_banner.tsx | 2 +- app/javascript/mastodon/components/domain.tsx | 2 +- .../mastodon/components/dropdown_menu.jsx | 2 +- .../components/edited_timestamp/index.jsx | 2 +- app/javascript/mastodon/components/icon.tsx | 2 +- .../mastodon/components/load_gap.tsx | 2 +- app/javascript/mastodon/components/logo.tsx | 2 +- .../mastodon/components/media_gallery.jsx | 2 +- .../picture_in_picture_placeholder.jsx | 2 +- app/javascript/mastodon/components/poll.jsx | 2 +- .../components/regeneration_indicator.jsx | 2 +- app/javascript/mastodon/components/status.jsx | 8 +++---- .../mastodon/components/status_action_bar.jsx | 22 +++++++++---------- .../mastodon/components/status_content.jsx | 2 +- .../mastodon/components/verified_badge.tsx | 2 +- .../mastodon/components/visibility_icon.tsx | 8 +++---- .../mastodon/features/about/index.jsx | 4 ++-- .../components/follow_request_note.jsx | 4 ++-- .../features/account/components/header.jsx | 12 +++++----- .../account_gallery/components/media_item.jsx | 6 ++--- .../mastodon/features/audio/index.jsx | 12 +++++----- .../mastodon/features/blocks/index.jsx | 2 +- .../features/bookmarked_statuses/index.jsx | 2 +- .../features/community_timeline/index.jsx | 2 +- .../compose/components/action_bar.jsx | 2 +- .../compose/components/compose_form.jsx | 2 +- .../compose/components/poll_button.jsx | 2 +- .../features/compose/components/poll_form.jsx | 4 ++-- .../compose/components/privacy_dropdown.jsx | 8 +++---- .../compose/components/reply_indicator.jsx | 2 +- .../features/compose/components/search.jsx | 6 ++--- .../compose/components/search_results.jsx | 8 +++---- .../features/compose/components/upload.jsx | 6 ++--- .../compose/components/upload_button.jsx | 2 +- .../compose/components/upload_progress.jsx | 2 +- .../mastodon/features/compose/index.jsx | 14 ++++++------ .../components/conversation.jsx | 4 ++-- .../features/direct_timeline/index.jsx | 2 +- .../mastodon/features/directory/index.jsx | 2 +- .../mastodon/features/domain_blocks/index.jsx | 2 +- .../mastodon/features/explore/index.jsx | 4 ++-- .../mastodon/features/explore/results.jsx | 6 ++--- .../features/favourited_statuses/index.jsx | 2 +- .../mastodon/features/favourites/index.jsx | 2 +- .../features/filters/select_filter.jsx | 2 +- .../mastodon/features/firehose/index.jsx | 2 +- .../components/account_authorize.jsx | 4 ++-- .../features/follow_requests/index.jsx | 2 +- .../mastodon/features/followed_tags/index.jsx | 2 +- .../components/announcements.jsx | 8 +++---- .../features/getting_started/index.jsx | 22 +++++++++---------- .../features/hashtag_timeline/index.jsx | 2 +- .../components/explore_prompt.tsx | 2 +- .../mastodon/features/home_timeline/index.jsx | 4 ++-- .../features/interaction_modal/index.jsx | 8 +++---- .../features/keyboard_shortcuts/index.jsx | 2 +- .../features/list_adder/components/list.jsx | 6 ++--- .../list_editor/components/account.jsx | 4 ++-- .../list_editor/components/edit_list_form.jsx | 2 +- .../list_editor/components/search.jsx | 4 ++-- .../mastodon/features/list_timeline/index.jsx | 6 ++--- .../mastodon/features/lists/index.jsx | 2 +- .../mastodon/features/mutes/index.jsx | 2 +- .../components/clear_column_button.jsx | 2 +- .../notifications/components/filter_bar.jsx | 12 +++++----- .../components/follow_request.jsx | 4 ++-- .../notifications/components/notification.jsx | 16 +++++++------- .../notifications_permission_banner.jsx | 4 ++-- .../mastodon/features/notifications/index.jsx | 4 ++-- .../features/onboarding/components/step.jsx | 4 ++-- .../mastodon/features/onboarding/index.jsx | 12 +++++----- .../mastodon/features/onboarding/profile.jsx | 4 ++-- .../mastodon/features/onboarding/share.jsx | 4 ++-- .../picture_in_picture/components/footer.jsx | 10 ++++----- .../picture_in_picture/components/header.jsx | 2 +- .../features/pinned_statuses/index.jsx | 2 +- .../features/public_timeline/index.jsx | 2 +- .../mastodon/features/reblogs/index.jsx | 2 +- .../features/report/components/option.jsx | 2 +- .../features/status/components/action_bar.jsx | 20 ++++++++--------- .../features/status/components/card.jsx | 6 ++--- .../status/components/detailed_status.jsx | 6 ++--- .../mastodon/features/status/index.jsx | 4 ++-- .../subscribed_languages_modal/index.jsx | 2 +- .../features/ui/components/boost_modal.jsx | 2 +- .../ui/components/bundle_modal_error.jsx | 2 +- .../ui/components/compare_history_modal.jsx | 2 +- .../features/ui/components/embed_modal.jsx | 2 +- .../features/ui/components/filter_modal.jsx | 2 +- .../ui/components/focal_point_modal.jsx | 2 +- .../follow_requests_column_link.jsx | 2 +- .../features/ui/components/header.jsx | 2 +- .../features/ui/components/image_modal.jsx | 2 +- .../features/ui/components/list_panel.jsx | 2 +- .../features/ui/components/media_modal.jsx | 6 ++--- .../ui/components/navigation_panel.jsx | 20 ++++++++--------- .../components/notifications_counter_icon.js | 2 +- .../features/ui/components/report_modal.jsx | 2 +- .../features/ui/components/zoomable_image.jsx | 4 ++-- .../mastodon/features/video/index.jsx | 16 +++++++------- config/webpack/shared.js | 3 +++ lib/tasks/icons.rake | 2 +- tsconfig.json | 3 ++- 108 files changed, 253 insertions(+), 249 deletions(-) diff --git a/app/javascript/mastodon/components/attachment_list.jsx b/app/javascript/mastodon/components/attachment_list.jsx index 59d31a3038d39b..c5ac046751893d 100644 --- a/app/javascript/mastodon/components/attachment_list.jsx +++ b/app/javascript/mastodon/components/attachment_list.jsx @@ -7,7 +7,7 @@ import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import LinkIcon from 'mastodon/../material-icons/400-24px/link.svg?react'; +import LinkIcon from '@/material-icons/400-24px/link.svg?react'; import { Icon } from 'mastodon/components/icon'; const filename = url => url.split('/').pop().split('#')[0].split('?')[0]; diff --git a/app/javascript/mastodon/components/badge.jsx b/app/javascript/mastodon/components/badge.jsx index bac80965665e1e..646655c249b872 100644 --- a/app/javascript/mastodon/components/badge.jsx +++ b/app/javascript/mastodon/components/badge.jsx @@ -2,9 +2,9 @@ import PropTypes from 'prop-types'; import { FormattedMessage } from 'react-intl'; -import GroupsIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; -import PersonIcon from 'mastodon/../material-icons/400-24px/person.svg?react'; -import SmartToyIcon from 'mastodon/../material-icons/400-24px/smart_toy.svg?react'; +import GroupsIcon from '@/material-icons/400-24px/group.svg?react'; +import PersonIcon from '@/material-icons/400-24px/person.svg?react'; +import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react'; export const Badge = ({ icon, label, domain }) => ( diff --git a/app/javascript/mastodon/components/column_back_button.tsx b/app/javascript/mastodon/components/column_back_button.tsx index f803f8628936e8..af38c1e1106818 100644 --- a/app/javascript/mastodon/components/column_back_button.tsx +++ b/app/javascript/mastodon/components/column_back_button.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; -import ArrowBackIcon from 'mastodon/../material-icons/400-24px/arrow_back.svg?react'; +import ArrowBackIcon from '@/material-icons/400-24px/arrow_back.svg?react'; import { Icon } from 'mastodon/components/icon'; import { ButtonInTabsBar } from 'mastodon/features/ui/util/columns_context'; diff --git a/app/javascript/mastodon/components/column_header.jsx b/app/javascript/mastodon/components/column_header.jsx index 3e53902de63ec4..901888e7504c3d 100644 --- a/app/javascript/mastodon/components/column_header.jsx +++ b/app/javascript/mastodon/components/column_header.jsx @@ -6,12 +6,12 @@ import { FormattedMessage, injectIntl, defineMessages } from 'react-intl'; import classNames from 'classnames'; import { withRouter } from 'react-router-dom'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; -import ArrowBackIcon from 'mastodon/../material-icons/400-24px/arrow_back.svg?react'; -import ChevronLeftIcon from 'mastodon/../material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from 'mastodon/../material-icons/400-24px/chevron_right.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; -import TuneIcon from 'mastodon/../material-icons/400-24px/tune.svg?react'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import ArrowBackIcon from '@/material-icons/400-24px/arrow_back.svg?react'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import TuneIcon from '@/material-icons/400-24px/tune.svg?react'; import { Icon } from 'mastodon/components/icon'; import { ButtonInTabsBar, useColumnsContext } from 'mastodon/features/ui/util/columns_context'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/components/copy_icon_button.jsx b/app/javascript/mastodon/components/copy_icon_button.jsx index c5216e8f8008e2..0c3c6c290b2637 100644 --- a/app/javascript/mastodon/components/copy_icon_button.jsx +++ b/app/javascript/mastodon/components/copy_icon_button.jsx @@ -7,7 +7,7 @@ import classNames from 'classnames'; import { useDispatch } from 'react-redux'; -import ContentCopyIcon from 'mastodon/../material-icons/400-24px/content_copy.svg?react'; +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; import { showAlert } from 'mastodon/actions/alerts'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/components/dismissable_banner.tsx b/app/javascript/mastodon/components/dismissable_banner.tsx index d3bc28b9b96bca..bc40e46f8da114 100644 --- a/app/javascript/mastodon/components/dismissable_banner.tsx +++ b/app/javascript/mastodon/components/dismissable_banner.tsx @@ -8,7 +8,7 @@ import { useCallback, useState, useEffect } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { changeSetting } from 'mastodon/actions/settings'; import { bannerSettings } from 'mastodon/settings'; import { useAppSelector, useAppDispatch } from 'mastodon/store'; diff --git a/app/javascript/mastodon/components/domain.tsx b/app/javascript/mastodon/components/domain.tsx index 637c286ce47a25..ed5e8e7e4c20ef 100644 --- a/app/javascript/mastodon/components/domain.tsx +++ b/app/javascript/mastodon/components/domain.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { defineMessages, useIntl } from 'react-intl'; -import LockOpenIcon from 'mastodon/../material-icons/400-24px/lock_open.svg?react'; +import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; import { IconButton } from './icon_button'; diff --git a/app/javascript/mastodon/components/dropdown_menu.jsx b/app/javascript/mastodon/components/dropdown_menu.jsx index a8fcfd10978210..04c8bb09800ffa 100644 --- a/app/javascript/mastodon/components/dropdown_menu.jsx +++ b/app/javascript/mastodon/components/dropdown_menu.jsx @@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { CircularProgress } from 'mastodon/components/circular_progress'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/components/edited_timestamp/index.jsx b/app/javascript/mastodon/components/edited_timestamp/index.jsx index 7497ab9922dcaa..4ca00f8dda9713 100644 --- a/app/javascript/mastodon/components/edited_timestamp/index.jsx +++ b/app/javascript/mastodon/components/edited_timestamp/index.jsx @@ -5,7 +5,7 @@ import { FormattedMessage, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; -import ArrowDropDownIcon from 'mastodon/../material-icons/400-24px/arrow_drop_down.svg?react'; +import ArrowDropDownIcon from '@/material-icons/400-24px/arrow_drop_down.svg?react'; import { openModal } from 'mastodon/actions/modal'; import { Icon } from 'mastodon/components/icon'; import InlineAccount from 'mastodon/components/inline_account'; diff --git a/app/javascript/mastodon/components/icon.tsx b/app/javascript/mastodon/components/icon.tsx index 948492d91c21a0..f388380c44aeb8 100644 --- a/app/javascript/mastodon/components/icon.tsx +++ b/app/javascript/mastodon/components/icon.tsx @@ -1,6 +1,6 @@ import classNames from 'classnames'; -import CheckBoxOutlineBlankIcon from 'mastodon/../material-icons/400-24px/check_box_outline_blank.svg?react'; +import CheckBoxOutlineBlankIcon from '@/material-icons/400-24px/check_box_outline_blank.svg?react'; import { isProduction } from 'mastodon/utils/environment'; interface SVGPropsWithTitle extends React.SVGProps { diff --git a/app/javascript/mastodon/components/load_gap.tsx b/app/javascript/mastodon/components/load_gap.tsx index 2a233b6a1cd644..1d4193a35951ab 100644 --- a/app/javascript/mastodon/components/load_gap.tsx +++ b/app/javascript/mastodon/components/load_gap.tsx @@ -2,7 +2,7 @@ import { useCallback } from 'react'; import { useIntl, defineMessages } from 'react-intl'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; import { Icon } from 'mastodon/components/icon'; const messages = defineMessages({ diff --git a/app/javascript/mastodon/components/logo.tsx b/app/javascript/mastodon/components/logo.tsx index 928aa29a7cbc42..b7f8bd6695008a 100644 --- a/app/javascript/mastodon/components/logo.tsx +++ b/app/javascript/mastodon/components/logo.tsx @@ -1,4 +1,4 @@ -import logo from 'mastodon/../images/logo.svg'; +import logo from '@/images/logo.svg'; export const WordmarkLogo: React.FC = () => ( diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index c387bb86989f4e..e5200371aeeb26 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -10,7 +10,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { debounce } from 'lodash'; -import VisibilityOffIcon from 'mastodon/../material-icons/400-24px/visibility_off.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import { Blurhash } from 'mastodon/components/blurhash'; import { autoPlayGif, displayMedia, useBlurhash } from '../initial_state'; diff --git a/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx b/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx index e8cfe6cb321641..50f91a92753cbb 100644 --- a/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx +++ b/app/javascript/mastodon/components/picture_in_picture_placeholder.jsx @@ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; -import CancelPresentationIcon from 'mastodon/../material-icons/400-24px/cancel_presentation.svg?react'; +import CancelPresentationIcon from '@/material-icons/400-24px/cancel_presentation.svg?react'; import { removePictureInPicture } from 'mastodon/actions/picture_in_picture'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/components/poll.jsx b/app/javascript/mastodon/components/poll.jsx index f85c47bb40207c..c7036d111b28bd 100644 --- a/app/javascript/mastodon/components/poll.jsx +++ b/app/javascript/mastodon/components/poll.jsx @@ -10,7 +10,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import escapeTextContentForBrowser from 'escape-html'; import spring from 'react-motion/lib/spring'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { Icon } from 'mastodon/components/icon'; import emojify from 'mastodon/features/emoji/emoji'; import Motion from 'mastodon/features/ui/util/optional_motion'; diff --git a/app/javascript/mastodon/components/regeneration_indicator.jsx b/app/javascript/mastodon/components/regeneration_indicator.jsx index 052e25f25f761f..d42a7d7c72b204 100644 --- a/app/javascript/mastodon/components/regeneration_indicator.jsx +++ b/app/javascript/mastodon/components/regeneration_indicator.jsx @@ -1,6 +1,6 @@ import { FormattedMessage } from 'react-intl'; -import illustration from 'mastodon/../images/elephant_ui_working.svg'; +import illustration from '@/images/elephant_ui_working.svg'; const RegenerationIndicator = () => (

diff --git a/app/javascript/mastodon/components/status.jsx b/app/javascript/mastodon/components/status.jsx index 224c8baded33e4..ff4fe925257690 100644 --- a/app/javascript/mastodon/components/status.jsx +++ b/app/javascript/mastodon/components/status.jsx @@ -9,10 +9,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import PushPinIcon from 'mastodon/../material-icons/400-24px/push_pin.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import { Icon } from 'mastodon/components/icon'; import PictureInPicturePlaceholder from 'mastodon/components/picture_in_picture_placeholder'; import { withOptionalRouter, WithOptionalRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/components/status_action_bar.jsx b/app/javascript/mastodon/components/status_action_bar.jsx index e1e0164642ff51..bfe77a4900d417 100644 --- a/app/javascript/mastodon/components/status_action_bar.jsx +++ b/app/javascript/mastodon/components/status_action_bar.jsx @@ -9,17 +9,17 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import BookmarkIcon from 'mastodon/../material-icons/400-24px/bookmark-fill.svg'; -import BookmarkBorderIcon from 'mastodon/../material-icons/400-24px/bookmark.svg?react'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; -import ReplyAllIcon from 'mastodon/../material-icons/400-24px/reply_all.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; -import StarBorderIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; -import VisibilityIcon from 'mastodon/../material-icons/400-24px/visibility.svg?react'; -import RepeatDisabledIcon from 'mastodon/../svg-icons/repeat_disabled.svg?react'; -import RepeatPrivateIcon from 'mastodon/../svg-icons/repeat_private.svg?react'; +import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg'; +import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import StarBorderIcon from '@/material-icons/400-24px/star.svg?react'; +import VisibilityIcon from '@/material-icons/400-24px/visibility.svg?react'; +import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react'; +import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/components/status_content.jsx b/app/javascript/mastodon/components/status_content.jsx index 6f28f6d6d52256..4a7ba941eb6297 100644 --- a/app/javascript/mastodon/components/status_content.jsx +++ b/app/javascript/mastodon/components/status_content.jsx @@ -9,7 +9,7 @@ import { Link, withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import ChevronRightIcon from 'mastodon/../material-icons/400-24px/chevron_right.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import { Icon } from 'mastodon/components/icon'; import PollContainer from 'mastodon/containers/poll_container'; import { autoPlayGif, languages as preloadedLanguages } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/components/verified_badge.tsx b/app/javascript/mastodon/components/verified_badge.tsx index 4209f68319f2d0..626cc500d6a672 100644 --- a/app/javascript/mastodon/components/verified_badge.tsx +++ b/app/javascript/mastodon/components/verified_badge.tsx @@ -1,4 +1,4 @@ -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { Icon } from './icon'; diff --git a/app/javascript/mastodon/components/visibility_icon.tsx b/app/javascript/mastodon/components/visibility_icon.tsx index 1a752614276312..d6ad4095ebcd90 100644 --- a/app/javascript/mastodon/components/visibility_icon.tsx +++ b/app/javascript/mastodon/components/visibility_icon.tsx @@ -1,9 +1,9 @@ import { defineMessages, useIntl } from 'react-intl'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import LockIcon from 'mastodon/../material-icons/400-24px/lock.svg?react'; -import LockOpenIcon from 'mastodon/../material-icons/400-24px/lock_open.svg?react'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import LockIcon from '@/material-icons/400-24px/lock.svg?react'; +import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { Icon } from './icon'; diff --git a/app/javascript/mastodon/features/about/index.jsx b/app/javascript/mastodon/features/about/index.jsx index bffac6357a993c..3287631ed1ba88 100644 --- a/app/javascript/mastodon/features/about/index.jsx +++ b/app/javascript/mastodon/features/about/index.jsx @@ -10,8 +10,8 @@ import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import ChevronRightIcon from 'mastodon/../material-icons/400-24px/chevron_right.svg?react'; -import ExpandMoreIcon from 'mastodon/../material-icons/400-24px/expand_more.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; +import ExpandMoreIcon from '@/material-icons/400-24px/expand_more.svg?react'; import { fetchServer, fetchExtendedDescription, fetchDomainBlocks } from 'mastodon/actions/server'; import Column from 'mastodon/components/column'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/account/components/follow_request_note.jsx b/app/javascript/mastodon/features/account/components/follow_request_note.jsx index a8b61f9eaf82b1..d57fd030b2d9e2 100644 --- a/app/javascript/mastodon/features/account/components/follow_request_note.jsx +++ b/app/javascript/mastodon/features/account/components/follow_request_note.jsx @@ -3,8 +3,8 @@ import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Icon } from 'mastodon/components/icon'; export default class FollowRequestNote extends ImmutablePureComponent { diff --git a/app/javascript/mastodon/features/account/components/header.jsx b/app/javascript/mastodon/features/account/components/header.jsx index 6f58ae35f1cdb7..233d208c648233 100644 --- a/app/javascript/mastodon/features/account/components/header.jsx +++ b/app/javascript/mastodon/features/account/components/header.jsx @@ -9,12 +9,12 @@ import { NavLink, withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; -import LockIcon from 'mastodon/../material-icons/400-24px/lock.svg?react'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; -import NotificationsIcon from 'mastodon/../material-icons/400-24px/notifications.svg?react'; -import NotificationsActiveIcon from 'mastodon/../material-icons/400-24px/notifications_active-fill.svg?react'; -import ShareIcon from 'mastodon/../material-icons/400-24px/share.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import LockIcon from '@/material-icons/400-24px/lock.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications.svg?react'; +import NotificationsActiveIcon from '@/material-icons/400-24px/notifications_active-fill.svg?react'; +import ShareIcon from '@/material-icons/400-24px/share.svg?react'; import { Avatar } from 'mastodon/components/avatar'; import { Badge, AutomatedBadge, GroupBadge } from 'mastodon/components/badge'; import { Button } from 'mastodon/components/button'; diff --git a/app/javascript/mastodon/features/account_gallery/components/media_item.jsx b/app/javascript/mastodon/features/account_gallery/components/media_item.jsx index a35092893d9a57..087e7757533327 100644 --- a/app/javascript/mastodon/features/account_gallery/components/media_item.jsx +++ b/app/javascript/mastodon/features/account_gallery/components/media_item.jsx @@ -5,9 +5,9 @@ import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import AudiotrackIcon from 'mastodon/../material-icons/400-24px/music_note.svg?react'; -import PlayArrowIcon from 'mastodon/../material-icons/400-24px/play_arrow.svg?react'; -import VisibilityOffIcon from 'mastodon/../material-icons/400-24px/visibility_off.svg?react'; +import AudiotrackIcon from '@/material-icons/400-24px/music_note.svg?react'; +import PlayArrowIcon from '@/material-icons/400-24px/play_arrow.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; import { autoPlayGif, displayMedia, useBlurhash } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/audio/index.jsx b/app/javascript/mastodon/features/audio/index.jsx index 9008e05383057b..fdc1b0be0f11a1 100644 --- a/app/javascript/mastodon/features/audio/index.jsx +++ b/app/javascript/mastodon/features/audio/index.jsx @@ -9,12 +9,12 @@ import { is } from 'immutable'; import { throttle, debounce } from 'lodash'; -import DownloadIcon from 'mastodon/../material-icons/400-24px/download.svg?react'; -import PauseIcon from 'mastodon/../material-icons/400-24px/pause.svg?react'; -import PlayArrowIcon from 'mastodon/../material-icons/400-24px/play_arrow-fill.svg?react'; -import VisibilityOffIcon from 'mastodon/../material-icons/400-24px/visibility_off.svg?react'; -import VolumeOffIcon from 'mastodon/../material-icons/400-24px/volume_off-fill.svg?react'; -import VolumeUpIcon from 'mastodon/../material-icons/400-24px/volume_up-fill.svg?react'; +import DownloadIcon from '@/material-icons/400-24px/download.svg?react'; +import PauseIcon from '@/material-icons/400-24px/pause.svg?react'; +import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off-fill.svg?react'; +import VolumeUpIcon from '@/material-icons/400-24px/volume_up-fill.svg?react'; import { Icon } from 'mastodon/components/icon'; import { formatTime, getPointerPosition, fileNameFromURL } from 'mastodon/features/video'; diff --git a/app/javascript/mastodon/features/blocks/index.jsx b/app/javascript/mastodon/features/blocks/index.jsx index 656784664f120d..1a631d3d07ca56 100644 --- a/app/javascript/mastodon/features/blocks/index.jsx +++ b/app/javascript/mastodon/features/blocks/index.jsx @@ -8,7 +8,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import BlockIcon from 'mastodon/../material-icons/400-24px/block-fill.svg?react'; +import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; import { fetchBlocks, expandBlocks } from '../../actions/blocks'; import { LoadingIndicator } from '../../components/loading_indicator'; diff --git a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx index 15db945956b764..5494ad44b04907 100644 --- a/app/javascript/mastodon/features/bookmarked_statuses/index.jsx +++ b/app/javascript/mastodon/features/bookmarked_statuses/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import BookmarksIcon from 'mastodon/../material-icons/400-24px/bookmarks-fill.svg?react'; +import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; import { fetchBookmarkedStatuses, expandBookmarkedStatuses } from 'mastodon/actions/bookmarks'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import ColumnHeader from 'mastodon/components/column_header'; diff --git a/app/javascript/mastodon/features/community_timeline/index.jsx b/app/javascript/mastodon/features/community_timeline/index.jsx index 5bf66c2a342d0c..0aa1f9aa23a22a 100644 --- a/app/javascript/mastodon/features/community_timeline/index.jsx +++ b/app/javascript/mastodon/features/community_timeline/index.jsx @@ -7,7 +7,7 @@ import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; import { domain } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/compose/components/action_bar.jsx b/app/javascript/mastodon/features/compose/components/action_bar.jsx index bacafaf1e13c70..411ad77c79c0be 100644 --- a/app/javascript/mastodon/features/compose/components/action_bar.jsx +++ b/app/javascript/mastodon/features/compose/components/action_bar.jsx @@ -5,7 +5,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import MenuIcon from 'mastodon/../material-icons/400-24px/menu.svg?react'; +import MenuIcon from '@/material-icons/400-24px/menu.svg?react'; import DropdownMenuContainer from '../../../containers/dropdown_menu_container'; diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index a099707dfbc046..fd66874e71a852 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -10,7 +10,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; -import LockIcon from 'mastodon/../material-icons/400-24px/lock.svg?react'; +import LockIcon from '@/material-icons/400-24px/lock.svg?react'; import { Icon } from 'mastodon/components/icon'; import { WithOptionalRouterPropTypes, withOptionalRouter } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/features/compose/components/poll_button.jsx b/app/javascript/mastodon/features/compose/components/poll_button.jsx index e6ecba1a07fde7..4900d381192779 100644 --- a/app/javascript/mastodon/features/compose/components/poll_button.jsx +++ b/app/javascript/mastodon/features/compose/components/poll_button.jsx @@ -3,7 +3,7 @@ import { PureComponent } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; -import InsertChartIcon from 'mastodon/../material-icons/400-24px/insert_chart.svg?react'; +import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; import { IconButton } from '../../../components/icon_button'; diff --git a/app/javascript/mastodon/features/compose/components/poll_form.jsx b/app/javascript/mastodon/features/compose/components/poll_form.jsx index 1815e22e6f84a0..929b2be57abd2c 100644 --- a/app/javascript/mastodon/features/compose/components/poll_form.jsx +++ b/app/javascript/mastodon/features/compose/components/poll_form.jsx @@ -8,8 +8,8 @@ import classNames from 'classnames'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import AutosuggestInput from 'mastodon/components/autosuggest_input'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx b/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx index 67298c8c438e5d..c3446b8d6051bf 100644 --- a/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx +++ b/app/javascript/mastodon/features/compose/components/privacy_dropdown.jsx @@ -9,10 +9,10 @@ import classNames from 'classnames'; import { supportsPassiveEvents } from 'detect-passive-events'; import Overlay from 'react-overlays/Overlay'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import LockIcon from 'mastodon/../material-icons/400-24px/lock.svg?react'; -import LockOpenIcon from 'mastodon/../material-icons/400-24px/lock_open.svg?react'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import LockIcon from '@/material-icons/400-24px/lock.svg?react'; +import LockOpenIcon from '@/material-icons/400-24px/lock_open.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from '../../../components/icon_button'; diff --git a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx index f16a37347c0aed..8051e01db4f92a 100644 --- a/app/javascript/mastodon/features/compose/components/reply_indicator.jsx +++ b/app/javascript/mastodon/features/compose/components/reply_indicator.jsx @@ -5,7 +5,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import AttachmentList from 'mastodon/components/attachment_list'; import { WithOptionalRouterPropTypes, withOptionalRouter } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/features/compose/components/search.jsx b/app/javascript/mastodon/features/compose/components/search.jsx index 844958bab6cf6d..0bcc41b929a28f 100644 --- a/app/javascript/mastodon/features/compose/components/search.jsx +++ b/app/javascript/mastodon/features/compose/components/search.jsx @@ -8,9 +8,9 @@ import { withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import CancelIcon from 'mastodon/../material-icons/400-24px/cancel-fill.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; +import CancelIcon from '@/material-icons/400-24px/cancel-fill.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import { Icon } from 'mastodon/components/icon'; import { domain, searchEnabled } from 'mastodon/initial_state'; import { HASHTAG_REGEX } from 'mastodon/utils/hashtags'; diff --git a/app/javascript/mastodon/features/compose/components/search_results.jsx b/app/javascript/mastodon/features/compose/components/search_results.jsx index 8a63a01c895f75..694deea04efb96 100644 --- a/app/javascript/mastodon/features/compose/components/search_results.jsx +++ b/app/javascript/mastodon/features/compose/components/search_results.jsx @@ -5,10 +5,10 @@ import { FormattedMessage } from 'react-intl'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import FindInPageIcon from 'mastodon/../material-icons/400-24px/find_in_page.svg?react'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { Icon } from 'mastodon/components/icon'; import { LoadMore } from 'mastodon/components/load_more'; import { SearchSection } from 'mastodon/features/explore/components/search_section'; diff --git a/app/javascript/mastodon/features/compose/components/upload.jsx b/app/javascript/mastodon/features/compose/components/upload.jsx index cb31145e8d4f68..76d394af7a41cc 100644 --- a/app/javascript/mastodon/features/compose/components/upload.jsx +++ b/app/javascript/mastodon/features/compose/components/upload.jsx @@ -7,9 +7,9 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import spring from 'react-motion/lib/spring'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; -import EditIcon from 'mastodon/../material-icons/400-24px/edit.svg?react'; -import InfoIcon from 'mastodon/../material-icons/400-24px/info.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import EditIcon from '@/material-icons/400-24px/edit.svg?react'; +import InfoIcon from '@/material-icons/400-24px/info.svg?react'; import { Icon } from 'mastodon/components/icon'; import Motion from '../../ui/util/optional_motion'; diff --git a/app/javascript/mastodon/features/compose/components/upload_button.jsx b/app/javascript/mastodon/features/compose/components/upload_button.jsx index 090af86b279d01..923d6a3c47e458 100644 --- a/app/javascript/mastodon/features/compose/components/upload_button.jsx +++ b/app/javascript/mastodon/features/compose/components/upload_button.jsx @@ -6,7 +6,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import AddPhotoAlternateIcon from 'mastodon/../material-icons/400-24px/add_photo_alternate.svg?react'; +import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate.svg?react'; import { IconButton } from '../../../components/icon_button'; diff --git a/app/javascript/mastodon/features/compose/components/upload_progress.jsx b/app/javascript/mastodon/features/compose/components/upload_progress.jsx index 8ed09b36ba1e4f..e4973b24fd604f 100644 --- a/app/javascript/mastodon/features/compose/components/upload_progress.jsx +++ b/app/javascript/mastodon/features/compose/components/upload_progress.jsx @@ -5,7 +5,7 @@ import { FormattedMessage } from 'react-intl'; import spring from 'react-motion/lib/spring'; -import UploadFileIcon from 'mastodon/../material-icons/400-24px/upload_file.svg?react'; +import UploadFileIcon from '@/material-icons/400-24px/upload_file.svg?react'; import { Icon } from 'mastodon/components/icon'; import Motion from '../../ui/util/optional_motion'; diff --git a/app/javascript/mastodon/features/compose/index.jsx b/app/javascript/mastodon/features/compose/index.jsx index a19ae71e8ef5a0..ea3a14950126c9 100644 --- a/app/javascript/mastodon/features/compose/index.jsx +++ b/app/javascript/mastodon/features/compose/index.jsx @@ -11,13 +11,13 @@ import { connect } from 'react-redux'; import spring from 'react-motion/lib/spring'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; -import LogoutIcon from 'mastodon/../material-icons/400-24px/logout.svg?react'; -import MenuIcon from 'mastodon/../material-icons/400-24px/menu.svg?react'; -import NotificationsIcon from 'mastodon/../material-icons/400-24px/notifications-fill.svg?react'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; -import SettingsIcon from 'mastodon/../material-icons/400-24px/settings-fill.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import LogoutIcon from '@/material-icons/400-24px/logout.svg?react'; +import MenuIcon from '@/material-icons/400-24px/menu.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; import { openModal } from 'mastodon/actions/modal'; import Column from 'mastodon/components/column'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx b/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx index 9ae95dabe9b168..274cfa69f53db3 100644 --- a/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx +++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.jsx @@ -10,8 +10,8 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; import AttachmentList from 'mastodon/components/attachment_list'; import AvatarComposite from 'mastodon/components/avatar_composite'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/direct_timeline/index.jsx b/app/javascript/mastodon/features/direct_timeline/index.jsx index effc9f29dbfd41..af29d7a5b83257 100644 --- a/app/javascript/mastodon/features/direct_timeline/index.jsx +++ b/app/javascript/mastodon/features/direct_timeline/index.jsx @@ -7,7 +7,7 @@ import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import { mountConversations, unmountConversations, expandConversations } from 'mastodon/actions/conversations'; import { connectDirectStream } from 'mastodon/actions/streaming'; diff --git a/app/javascript/mastodon/features/directory/index.jsx b/app/javascript/mastodon/features/directory/index.jsx index 32d79f23fc60b3..0d3408146e2eef 100644 --- a/app/javascript/mastodon/features/directory/index.jsx +++ b/app/javascript/mastodon/features/directory/index.jsx @@ -9,7 +9,7 @@ import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; import { addColumn, removeColumn, moveColumn, changeColumnParams } from 'mastodon/actions/columns'; import { fetchDirectory, expandDirectory } from 'mastodon/actions/directory'; import Column from 'mastodon/components/column'; diff --git a/app/javascript/mastodon/features/domain_blocks/index.jsx b/app/javascript/mastodon/features/domain_blocks/index.jsx index 5c9b70f02b162f..964eada9c1e5b9 100644 --- a/app/javascript/mastodon/features/domain_blocks/index.jsx +++ b/app/javascript/mastodon/features/domain_blocks/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import BlockIcon from 'mastodon/../material-icons/400-24px/block-fill.svg?react'; +import BlockIcon from '@/material-icons/400-24px/block-fill.svg?react'; import { fetchDomainBlocks, expandDomainBlocks } from '../../actions/domain_blocks'; import { LoadingIndicator } from '../../components/loading_indicator'; diff --git a/app/javascript/mastodon/features/explore/index.jsx b/app/javascript/mastodon/features/explore/index.jsx index 96a39f6b35f867..8ebaccd0132de7 100644 --- a/app/javascript/mastodon/features/explore/index.jsx +++ b/app/javascript/mastodon/features/explore/index.jsx @@ -8,8 +8,8 @@ import { NavLink, Switch, Route } from 'react-router-dom'; import { connect } from 'react-redux'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; import Search from 'mastodon/features/compose/containers/search_container'; diff --git a/app/javascript/mastodon/features/explore/results.jsx b/app/javascript/mastodon/features/explore/results.jsx index 891bddf737b66f..355c0f1c4c8532 100644 --- a/app/javascript/mastodon/features/explore/results.jsx +++ b/app/javascript/mastodon/features/explore/results.jsx @@ -9,9 +9,9 @@ import { List as ImmutableList } from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import FindInPageIcon from 'mastodon/../material-icons/400-24px/find_in_page.svg?react'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import FindInPageIcon from '@/material-icons/400-24px/find_in_page.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { submitSearch, expandSearch } from 'mastodon/actions/search'; import { ImmutableHashtag as Hashtag } from 'mastodon/components/hashtag'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/favourited_statuses/index.jsx b/app/javascript/mastodon/features/favourited_statuses/index.jsx index 29fc6925d6cca4..8e65ff5b68beb4 100644 --- a/app/javascript/mastodon/features/favourited_statuses/index.jsx +++ b/app/javascript/mastodon/features/favourited_statuses/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import { fetchFavouritedStatuses, expandFavouritedStatuses } from 'mastodon/actions/favourites'; import ColumnHeader from 'mastodon/components/column_header'; diff --git a/app/javascript/mastodon/features/favourites/index.jsx b/app/javascript/mastodon/features/favourites/index.jsx index ffab6f02c9629a..27ca169409221f 100644 --- a/app/javascript/mastodon/features/favourites/index.jsx +++ b/app/javascript/mastodon/features/favourites/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import RefreshIcon from 'mastodon/../material-icons/400-24px/refresh.svg?react'; +import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react'; import { fetchFavourites, expandFavourites } from 'mastodon/actions/interactions'; import ColumnHeader from 'mastodon/components/column_header'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/filters/select_filter.jsx b/app/javascript/mastodon/features/filters/select_filter.jsx index 9bf0c3c8e52f45..5b2eb64952f0e5 100644 --- a/app/javascript/mastodon/features/filters/select_filter.jsx +++ b/app/javascript/mastodon/features/filters/select_filter.jsx @@ -7,7 +7,7 @@ import { connect } from 'react-redux'; import fuzzysort from 'fuzzysort'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; import { Icon } from 'mastodon/components/icon'; import { toServerSideType } from 'mastodon/utils/filters'; import { loupeIcon, deleteIcon } from 'mastodon/utils/icons'; diff --git a/app/javascript/mastodon/features/firehose/index.jsx b/app/javascript/mastodon/features/firehose/index.jsx index 22c11a182ff016..6355efbfe00865 100644 --- a/app/javascript/mastodon/features/firehose/index.jsx +++ b/app/javascript/mastodon/features/firehose/index.jsx @@ -6,7 +6,7 @@ import { useIntl, defineMessages, FormattedMessage } from 'react-intl'; import { Helmet } from 'react-helmet'; import { NavLink } from 'react-router-dom'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { addColumn } from 'mastodon/actions/columns'; import { changeSetting } from 'mastodon/actions/settings'; import { connectPublicStream, connectCommunityStream } from 'mastodon/actions/streaming'; diff --git a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx index 1f40e059925533..dd308c87cb1fc3 100644 --- a/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx +++ b/app/javascript/mastodon/features/follow_requests/components/account_authorize.jsx @@ -7,8 +7,8 @@ import { Link } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Avatar } from '../../../components/avatar'; import { DisplayName } from '../../../components/display_name'; diff --git a/app/javascript/mastodon/features/follow_requests/index.jsx b/app/javascript/mastodon/features/follow_requests/index.jsx index 683c7b40707f75..7d651f2ca69c24 100644 --- a/app/javascript/mastodon/features/follow_requests/index.jsx +++ b/app/javascript/mastodon/features/follow_requests/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; import { fetchFollowRequests, expandFollowRequests } from '../../actions/accounts'; import ScrollableList from '../../components/scrollable_list'; diff --git a/app/javascript/mastodon/features/followed_tags/index.jsx b/app/javascript/mastodon/features/followed_tags/index.jsx index de3d7670ec9075..21248e6de99e97 100644 --- a/app/javascript/mastodon/features/followed_tags/index.jsx +++ b/app/javascript/mastodon/features/followed_tags/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { expandFollowedHashtags, fetchFollowedHashtags } from 'mastodon/actions/tags'; import ColumnHeader from 'mastodon/components/column_header'; import { Hashtag } from 'mastodon/components/hashtag'; diff --git a/app/javascript/mastodon/features/getting_started/components/announcements.jsx b/app/javascript/mastodon/features/getting_started/components/announcements.jsx index 6b752df1bd8b48..ea36cefd7dc240 100644 --- a/app/javascript/mastodon/features/getting_started/components/announcements.jsx +++ b/app/javascript/mastodon/features/getting_started/components/announcements.jsx @@ -13,10 +13,10 @@ import TransitionMotion from 'react-motion/lib/TransitionMotion'; import spring from 'react-motion/lib/spring'; import ReactSwipeableViews from 'react-swipeable-views'; -import elephantUIPlane from 'mastodon/../images/elephant_ui_plane.svg'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; -import ChevronLeftIcon from 'mastodon/../material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from 'mastodon/../material-icons/400-24px/chevron_right.svg?react'; +import elephantUIPlane from '@/images/elephant_ui_plane.svg'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; import { AnimatedNumber } from 'mastodon/components/animated_number'; import { Icon } from 'mastodon/components/icon'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/getting_started/index.jsx b/app/javascript/mastodon/features/getting_started/index.jsx index 68ea2013872df7..53bb22ddb26bf7 100644 --- a/app/javascript/mastodon/features/getting_started/index.jsx +++ b/app/javascript/mastodon/features/getting_started/index.jsx @@ -9,17 +9,17 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import BookmarksIcon from 'mastodon/../material-icons/400-24px/bookmarks-fill.svg?react'; -import PeopleIcon from 'mastodon/../material-icons/400-24px/group.svg?react'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; -import MenuIcon from 'mastodon/../material-icons/400-24px/menu.svg?react'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; -import SettingsIcon from 'mastodon/../material-icons/400-24px/settings-fill.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; +import PeopleIcon from '@/material-icons/400-24px/group.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import MenuIcon from '@/material-icons/400-24px/menu.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { fetchFollowRequests } from 'mastodon/actions/accounts'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.jsx b/app/javascript/mastodon/features/hashtag_timeline/index.jsx index 35ed4dc6097dd7..f431a7e9b72130 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/index.jsx +++ b/app/javascript/mastodon/features/hashtag_timeline/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { isEqual } from 'lodash'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import { connectHashtagStream } from 'mastodon/actions/streaming'; import { fetchHashtag, followHashtag, unfollowHashtag } from 'mastodon/actions/tags'; diff --git a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx index 9eeec00e3478dc..960d30e2caea4a 100644 --- a/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx +++ b/app/javascript/mastodon/features/home_timeline/components/explore_prompt.tsx @@ -2,7 +2,7 @@ import { FormattedMessage } from 'react-intl'; import { Link } from 'react-router-dom'; -import background from 'mastodon/../images/friends-cropped.png'; +import background from '@/images/friends-cropped.png'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; export const ExplorePrompt = () => ( diff --git a/app/javascript/mastodon/features/home_timeline/index.jsx b/app/javascript/mastodon/features/home_timeline/index.jsx index 1f93278c0692f2..069f52b0beaf2c 100644 --- a/app/javascript/mastodon/features/home_timeline/index.jsx +++ b/app/javascript/mastodon/features/home_timeline/index.jsx @@ -10,8 +10,8 @@ import { createSelector } from '@reduxjs/toolkit'; import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; -import CampaignIcon from 'mastodon/../material-icons/400-24px/campaign.svg?react'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; +import CampaignIcon from '@/material-icons/400-24px/campaign.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; import { fetchAnnouncements, toggleShowAnnouncements } from 'mastodon/actions/announcements'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; diff --git a/app/javascript/mastodon/features/interaction_modal/index.jsx b/app/javascript/mastodon/features/interaction_modal/index.jsx index 1d503b7343fcec..07f1e6fe5a1e31 100644 --- a/app/javascript/mastodon/features/interaction_modal/index.jsx +++ b/app/javascript/mastodon/features/interaction_modal/index.jsx @@ -9,10 +9,10 @@ import { connect } from 'react-redux'; import { throttle, escapeRegExp } from 'lodash'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; import { openModal, closeModal } from 'mastodon/actions/modal'; import api from 'mastodon/api'; import { Button } from 'mastodon/components/button'; diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx index 6d1df6dd0d166e..622ca525c1a7b2 100644 --- a/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx +++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.jsx @@ -6,7 +6,7 @@ import { Helmet } from 'react-helmet'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import InfoIcon from 'mastodon/../material-icons/400-24px/info.svg?react'; +import InfoIcon from '@/material-icons/400-24px/info.svg?react'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; diff --git a/app/javascript/mastodon/features/list_adder/components/list.jsx b/app/javascript/mastodon/features/list_adder/components/list.jsx index 54ac940da43758..a7cfd60bf3af78 100644 --- a/app/javascript/mastodon/features/list_adder/components/list.jsx +++ b/app/javascript/mastodon/features/list_adder/components/list.jsx @@ -6,9 +6,9 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { Icon } from 'mastodon/components/icon'; import { removeFromListAdder, addToListAdder } from '../../../actions/lists'; diff --git a/app/javascript/mastodon/features/list_editor/components/account.jsx b/app/javascript/mastodon/features/list_editor/components/account.jsx index f406f24fa7f007..77d32af80a25a2 100644 --- a/app/javascript/mastodon/features/list_editor/components/account.jsx +++ b/app/javascript/mastodon/features/list_editor/components/account.jsx @@ -6,8 +6,8 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import AddIcon from 'mastodon/../material-icons/400-24px/add.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import AddIcon from '@/material-icons/400-24px/add.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { removeFromListEditor, addToListEditor } from '../../../actions/lists'; import { Avatar } from '../../../components/avatar'; diff --git a/app/javascript/mastodon/features/list_editor/components/edit_list_form.jsx b/app/javascript/mastodon/features/list_editor/components/edit_list_form.jsx index ad29d08a931f92..89f596636ead95 100644 --- a/app/javascript/mastodon/features/list_editor/components/edit_list_form.jsx +++ b/app/javascript/mastodon/features/list_editor/components/edit_list_form.jsx @@ -5,7 +5,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import { connect } from 'react-redux'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; import { changeListEditorTitle, submitListEditor } from '../../../actions/lists'; import { IconButton } from '../../../components/icon_button'; diff --git a/app/javascript/mastodon/features/list_editor/components/search.jsx b/app/javascript/mastodon/features/list_editor/components/search.jsx index 4c4138c751b404..097d4f3f41a2ff 100644 --- a/app/javascript/mastodon/features/list_editor/components/search.jsx +++ b/app/javascript/mastodon/features/list_editor/components/search.jsx @@ -7,8 +7,8 @@ import classNames from 'classnames'; import { connect } from 'react-redux'; -import CancelIcon from 'mastodon/../material-icons/400-24px/cancel.svg?react'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; +import CancelIcon from '@/material-icons/400-24px/cancel.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import { Icon } from 'mastodon/components/icon'; import { fetchListSuggestions, clearListSuggestions, changeListSuggestions } from '../../../actions/lists'; diff --git a/app/javascript/mastodon/features/list_timeline/index.jsx b/app/javascript/mastodon/features/list_timeline/index.jsx index aa87adf52a574c..24bf122facb347 100644 --- a/app/javascript/mastodon/features/list_timeline/index.jsx +++ b/app/javascript/mastodon/features/list_timeline/index.jsx @@ -11,9 +11,9 @@ import { connect } from 'react-redux'; import Toggle from 'react-toggle'; -import DeleteIcon from 'mastodon/../material-icons/400-24px/delete.svg?react'; -import EditIcon from 'mastodon/../material-icons/400-24px/edit.svg?react'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; +import DeleteIcon from '@/material-icons/400-24px/delete.svg?react'; +import EditIcon from '@/material-icons/400-24px/edit.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns'; import { fetchList, deleteList, updateList } from 'mastodon/actions/lists'; import { openModal } from 'mastodon/actions/modal'; diff --git a/app/javascript/mastodon/features/lists/index.jsx b/app/javascript/mastodon/features/lists/index.jsx index b20bbc6b78a4f1..a7648f55b21f70 100644 --- a/app/javascript/mastodon/features/lists/index.jsx +++ b/app/javascript/mastodon/features/lists/index.jsx @@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchLists } from 'mastodon/actions/lists'; import Column from 'mastodon/components/column'; import ColumnHeader from 'mastodon/components/column_header'; diff --git a/app/javascript/mastodon/features/mutes/index.jsx b/app/javascript/mastodon/features/mutes/index.jsx index 316eaba220e995..3b50244ea4b192 100644 --- a/app/javascript/mastodon/features/mutes/index.jsx +++ b/app/javascript/mastodon/features/mutes/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import VolumeOffIcon from 'mastodon/../material-icons/400-24px/volume_off.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; import { fetchMutes, expandMutes } from '../../actions/mutes'; import { LoadingIndicator } from '../../components/loading_indicator'; diff --git a/app/javascript/mastodon/features/notifications/components/clear_column_button.jsx b/app/javascript/mastodon/features/notifications/components/clear_column_button.jsx index ac7860efd4bdfe..73eaecba59f3fc 100644 --- a/app/javascript/mastodon/features/notifications/components/clear_column_button.jsx +++ b/app/javascript/mastodon/features/notifications/components/clear_column_button.jsx @@ -3,7 +3,7 @@ import { PureComponent } from 'react'; import { FormattedMessage } from 'react-intl'; -import DeleteForeverIcon from 'mastodon/../material-icons/400-24px/delete_forever.svg?react'; +import DeleteForeverIcon from '@/material-icons/400-24px/delete_forever.svg?react'; import { Icon } from 'mastodon/components/icon'; export default class ClearColumnButton extends PureComponent { diff --git a/app/javascript/mastodon/features/notifications/components/filter_bar.jsx b/app/javascript/mastodon/features/notifications/components/filter_bar.jsx index f5651a7d44f26a..c288c2c0de2c9e 100644 --- a/app/javascript/mastodon/features/notifications/components/filter_bar.jsx +++ b/app/javascript/mastodon/features/notifications/components/filter_bar.jsx @@ -3,12 +3,12 @@ import { PureComponent } from 'react'; import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; -import InsertChartIcon from 'mastodon/../material-icons/400-24px/insert_chart.svg?react'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyAllIcon from 'mastodon/../material-icons/400-24px/reply_all.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; import { Icon } from 'mastodon/components/icon'; const tooltips = defineMessages({ diff --git a/app/javascript/mastodon/features/notifications/components/follow_request.jsx b/app/javascript/mastodon/features/notifications/components/follow_request.jsx index c6a039adb5d2d1..4024455cbd7364 100644 --- a/app/javascript/mastodon/features/notifications/components/follow_request.jsx +++ b/app/javascript/mastodon/features/notifications/components/follow_request.jsx @@ -7,8 +7,8 @@ import { Link } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CheckIcon from 'mastodon/../material-icons/400-24px/check.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CheckIcon from '@/material-icons/400-24px/check.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Avatar } from 'mastodon/components/avatar'; import { DisplayName } from 'mastodon/components/display_name'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/notifications/components/notification.jsx b/app/javascript/mastodon/features/notifications/components/notification.jsx index 35b31fcd47741c..d7101f8384f61e 100644 --- a/app/javascript/mastodon/features/notifications/components/notification.jsx +++ b/app/javascript/mastodon/features/notifications/components/notification.jsx @@ -10,14 +10,14 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { HotKeys } from 'react-hotkeys'; -import EditIcon from 'mastodon/../material-icons/400-24px/edit.svg?react'; -import FlagIcon from 'mastodon/../material-icons/400-24px/flag-fill.svg?react'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; -import InsertChartIcon from 'mastodon/../material-icons/400-24px/insert_chart.svg?react'; -import PersonIcon from 'mastodon/../material-icons/400-24px/person-fill.svg?react'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add-fill.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; +import EditIcon from '@/material-icons/400-24px/edit.svg?react'; +import FlagIcon from '@/material-icons/400-24px/flag-fill.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import InsertChartIcon from '@/material-icons/400-24px/insert_chart.svg?react'; +import PersonIcon from '@/material-icons/400-24px/person-fill.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add-fill.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; import { Icon } from 'mastodon/components/icon'; import AccountContainer from 'mastodon/containers/account_container'; import StatusContainer from 'mastodon/containers/status_container'; diff --git a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx index a577abd864110a..1cdf5b5dfef100 100644 --- a/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx +++ b/app/javascript/mastodon/features/notifications/components/notifications_permission_banner.jsx @@ -5,8 +5,8 @@ import { defineMessages, injectIntl, FormattedMessage } from 'react-intl'; import { connect } from 'react-redux'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; -import TuneIcon from 'mastodon/../material-icons/400-24px/tune.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; +import TuneIcon from '@/material-icons/400-24px/tune.svg?react'; import { requestBrowserPermission } from 'mastodon/actions/notifications'; import { changeSetting } from 'mastodon/actions/settings'; import { Button } from 'mastodon/components/button'; diff --git a/app/javascript/mastodon/features/notifications/index.jsx b/app/javascript/mastodon/features/notifications/index.jsx index 0751f1620c4efc..30c63ed32ac0d3 100644 --- a/app/javascript/mastodon/features/notifications/index.jsx +++ b/app/javascript/mastodon/features/notifications/index.jsx @@ -12,8 +12,8 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import DoneAllIcon from 'mastodon/../material-icons/400-24px/done_all.svg?react'; -import NotificationsIcon from 'mastodon/../material-icons/400-24px/notifications-fill.svg?react'; +import DoneAllIcon from '@/material-icons/400-24px/done_all.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; import { compareId } from 'mastodon/compare_id'; import { Icon } from 'mastodon/components/icon'; import { NotSignedInIndicator } from 'mastodon/components/not_signed_in_indicator'; diff --git a/app/javascript/mastodon/features/onboarding/components/step.jsx b/app/javascript/mastodon/features/onboarding/components/step.jsx index 46c9b1645dfb80..a2a1653b8ab25d 100644 --- a/app/javascript/mastodon/features/onboarding/components/step.jsx +++ b/app/javascript/mastodon/features/onboarding/components/step.jsx @@ -2,8 +2,8 @@ import PropTypes from 'prop-types'; import { Link } from 'react-router-dom'; -import ArrowRightAltIcon from 'mastodon/../material-icons/400-24px/arrow_right_alt.svg?react'; -import CheckIcon from 'mastodon/../material-icons/400-24px/done.svg?react'; +import ArrowRightAltIcon from '@/material-icons/400-24px/arrow_right_alt.svg?react'; +import CheckIcon from '@/material-icons/400-24px/done.svg?react'; import { Icon } from 'mastodon/components/icon'; export const Step = ({ label, description, icon, iconComponent, completed, onClick, href, to }) => { diff --git a/app/javascript/mastodon/features/onboarding/index.jsx b/app/javascript/mastodon/features/onboarding/index.jsx index 9271468da074ee..5900b9ec76db14 100644 --- a/app/javascript/mastodon/features/onboarding/index.jsx +++ b/app/javascript/mastodon/features/onboarding/index.jsx @@ -8,12 +8,12 @@ import { Link, Switch, Route, useHistory } from 'react-router-dom'; import { useDispatch } from 'react-redux'; -import illustration from 'mastodon/../images/elephant_ui_conversation.svg'; -import AccountCircleIcon from 'mastodon/../material-icons/400-24px/account_circle.svg?react'; -import ArrowRightAltIcon from 'mastodon/../material-icons/400-24px/arrow_right_alt.svg?react'; -import ContentCopyIcon from 'mastodon/../material-icons/400-24px/content_copy.svg?react'; -import EditNoteIcon from 'mastodon/../material-icons/400-24px/edit_note.svg?react'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; +import illustration from '@/images/elephant_ui_conversation.svg'; +import AccountCircleIcon from '@/material-icons/400-24px/account_circle.svg?react'; +import ArrowRightAltIcon from '@/material-icons/400-24px/arrow_right_alt.svg?react'; +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; +import EditNoteIcon from '@/material-icons/400-24px/edit_note.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; import { focusCompose } from 'mastodon/actions/compose'; import { Icon } from 'mastodon/components/icon'; import Column from 'mastodon/features/ui/components/column'; diff --git a/app/javascript/mastodon/features/onboarding/profile.jsx b/app/javascript/mastodon/features/onboarding/profile.jsx index 5217b42ad53815..14250ae39bd399 100644 --- a/app/javascript/mastodon/features/onboarding/profile.jsx +++ b/app/javascript/mastodon/features/onboarding/profile.jsx @@ -10,8 +10,8 @@ import { useDispatch } from 'react-redux'; import Toggle from 'react-toggle'; -import AddPhotoAlternateIcon from 'mastodon/../material-icons/400-24px/add_photo_alternate.svg?react'; -import EditIcon from 'mastodon/../material-icons/400-24px/edit.svg?react'; +import AddPhotoAlternateIcon from '@/material-icons/400-24px/add_photo_alternate.svg?react'; +import EditIcon from '@/material-icons/400-24px/edit.svg?react'; import { updateAccount } from 'mastodon/actions/accounts'; import { Button } from 'mastodon/components/button'; import { ColumnBackButton } from 'mastodon/components/column_back_button'; diff --git a/app/javascript/mastodon/features/onboarding/share.jsx b/app/javascript/mastodon/features/onboarding/share.jsx index cde63d0b3408ec..32a86ab6cc0724 100644 --- a/app/javascript/mastodon/features/onboarding/share.jsx +++ b/app/javascript/mastodon/features/onboarding/share.jsx @@ -9,8 +9,8 @@ import { Link } from 'react-router-dom'; import SwipeableViews from 'react-swipeable-views'; -import ArrowRightAltIcon from 'mastodon/../material-icons/400-24px/arrow_right_alt.svg?react'; -import ContentCopyIcon from 'mastodon/../material-icons/400-24px/content_copy.svg?react'; +import ArrowRightAltIcon from '@/material-icons/400-24px/arrow_right_alt.svg?react'; +import ContentCopyIcon from '@/material-icons/400-24px/content_copy.svg?react'; import { ColumnBackButton } from 'mastodon/components/column_back_button'; import { Icon } from 'mastodon/components/icon'; import { me, domain } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx index d60cd5e1efacc4..8dfbf54cb649d6 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/footer.jsx @@ -9,11 +9,11 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import OpenInNewIcon from 'mastodon/../material-icons/400-24px/open_in_new.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; -import ReplyAllIcon from 'mastodon/../material-icons/400-24px/reply_all.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; +import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; +import StarIcon from '@/material-icons/400-24px/star.svg?react'; import { initBoostModal } from 'mastodon/actions/boosts'; import { replyCompose } from 'mastodon/actions/compose'; import { reblog, favourite, unreblog, unfavourite } from 'mastodon/actions/interactions'; diff --git a/app/javascript/mastodon/features/picture_in_picture/components/header.jsx b/app/javascript/mastodon/features/picture_in_picture/components/header.jsx index 12a5566d39fa0e..31073d7387c9bc 100644 --- a/app/javascript/mastodon/features/picture_in_picture/components/header.jsx +++ b/app/javascript/mastodon/features/picture_in_picture/components/header.jsx @@ -8,7 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Avatar } from 'mastodon/components/avatar'; import { DisplayName } from 'mastodon/components/display_name'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/pinned_statuses/index.jsx b/app/javascript/mastodon/features/pinned_statuses/index.jsx index 3d6dc753e35709..921e9a60721923 100644 --- a/app/javascript/mastodon/features/pinned_statuses/index.jsx +++ b/app/javascript/mastodon/features/pinned_statuses/index.jsx @@ -8,7 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import PushPinIcon from 'mastodon/../material-icons/400-24px/push_pin.svg?react'; +import PushPinIcon from '@/material-icons/400-24px/push_pin.svg?react'; import { getStatusList } from 'mastodon/selectors'; import { fetchPinnedStatuses } from '../../actions/pin_statuses'; diff --git a/app/javascript/mastodon/features/public_timeline/index.jsx b/app/javascript/mastodon/features/public_timeline/index.jsx index 302a2956ede68a..3601dfeae80a12 100644 --- a/app/javascript/mastodon/features/public_timeline/index.jsx +++ b/app/javascript/mastodon/features/public_timeline/index.jsx @@ -7,7 +7,7 @@ import { Helmet } from 'react-helmet'; import { connect } from 'react-redux'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; import { DismissableBanner } from 'mastodon/components/dismissable_banner'; import { domain } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/reblogs/index.jsx b/app/javascript/mastodon/features/reblogs/index.jsx index 0d5183fb88bce3..3d1fc94cb78d3b 100644 --- a/app/javascript/mastodon/features/reblogs/index.jsx +++ b/app/javascript/mastodon/features/reblogs/index.jsx @@ -10,7 +10,7 @@ import { connect } from 'react-redux'; import { debounce } from 'lodash'; -import RefreshIcon from 'mastodon/../material-icons/400-24px/refresh.svg?react'; +import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react'; import { Icon } from 'mastodon/components/icon'; import { fetchReblogs, expandReblogs } from '../../actions/interactions'; diff --git a/app/javascript/mastodon/features/report/components/option.jsx b/app/javascript/mastodon/features/report/components/option.jsx index d6949f0c513d07..7aa0dd1379740c 100644 --- a/app/javascript/mastodon/features/report/components/option.jsx +++ b/app/javascript/mastodon/features/report/components/option.jsx @@ -3,7 +3,7 @@ import { PureComponent } from 'react'; import classNames from 'classnames'; -import CheckIcon from 'mastodon/../material-icons/400-24px/done.svg?react'; +import CheckIcon from '@/material-icons/400-24px/done.svg?react'; import { Icon } from 'mastodon/components/icon'; export default class Option extends PureComponent { diff --git a/app/javascript/mastodon/features/status/components/action_bar.jsx b/app/javascript/mastodon/features/status/components/action_bar.jsx index b7608245583d2d..4cb06aac2cfe7b 100644 --- a/app/javascript/mastodon/features/status/components/action_bar.jsx +++ b/app/javascript/mastodon/features/status/components/action_bar.jsx @@ -9,16 +9,16 @@ import { withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import { connect } from 'react-redux'; -import BookmarkIcon from 'mastodon/../material-icons/400-24px/bookmark-fill.svg?react'; -import BookmarkBorderIcon from 'mastodon/../material-icons/400-24px/bookmark.svg?react'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import ReplyIcon from 'mastodon/../material-icons/400-24px/reply.svg?react'; -import ReplyAllIcon from 'mastodon/../material-icons/400-24px/reply_all.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; -import StarBorderIcon from 'mastodon/../material-icons/400-24px/star.svg?react'; -import RepeatDisabledIcon from 'mastodon/../svg-icons/repeat_disabled.svg?react'; -import RepeatPrivateIcon from 'mastodon/../svg-icons/repeat_private.svg?react'; +import BookmarkIcon from '@/material-icons/400-24px/bookmark-fill.svg?react'; +import BookmarkBorderIcon from '@/material-icons/400-24px/bookmark.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import ReplyIcon from '@/material-icons/400-24px/reply.svg?react'; +import ReplyAllIcon from '@/material-icons/400-24px/reply_all.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import StarBorderIcon from '@/material-icons/400-24px/star.svg?react'; +import RepeatDisabledIcon from '@/svg-icons/repeat_disabled.svg?react'; +import RepeatPrivateIcon from '@/svg-icons/repeat_private.svg?react'; import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_FEDERATION } from 'mastodon/permissions'; import { WithRouterPropTypes } from 'mastodon/utils/react_router'; diff --git a/app/javascript/mastodon/features/status/components/card.jsx b/app/javascript/mastodon/features/status/components/card.jsx index c211dc64c89dec..f37b558c4cd50e 100644 --- a/app/javascript/mastodon/features/status/components/card.jsx +++ b/app/javascript/mastodon/features/status/components/card.jsx @@ -10,9 +10,9 @@ import classNames from 'classnames'; import Immutable from 'immutable'; import ImmutablePropTypes from 'react-immutable-proptypes'; -import DescriptionIcon from 'mastodon/../material-icons/400-24px/description-fill.svg?react'; -import OpenInNewIcon from 'mastodon/../material-icons/400-24px/open_in_new.svg?react'; -import PlayArrowIcon from 'mastodon/../material-icons/400-24px/play_arrow-fill.svg?react'; +import DescriptionIcon from '@/material-icons/400-24px/description-fill.svg?react'; +import OpenInNewIcon from '@/material-icons/400-24px/open_in_new.svg?react'; +import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; import { RelativeTimestamp } from 'mastodon/components/relative_timestamp'; diff --git a/app/javascript/mastodon/features/status/components/detailed_status.jsx b/app/javascript/mastodon/features/status/components/detailed_status.jsx index 2ebafe7b488bbc..437e9e86bff294 100644 --- a/app/javascript/mastodon/features/status/components/detailed_status.jsx +++ b/app/javascript/mastodon/features/status/components/detailed_status.jsx @@ -8,9 +8,9 @@ import { Link, withRouter } from 'react-router-dom'; import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; import { AnimatedNumber } from 'mastodon/components/animated_number'; import EditedTimestamp from 'mastodon/components/edited_timestamp'; import { getHashtagBarForStatus } from 'mastodon/components/hashtag_bar'; diff --git a/app/javascript/mastodon/features/status/index.jsx b/app/javascript/mastodon/features/status/index.jsx index c8ccddddbe218e..a3034bb5707180 100644 --- a/app/javascript/mastodon/features/status/index.jsx +++ b/app/javascript/mastodon/features/status/index.jsx @@ -14,8 +14,8 @@ import { connect } from 'react-redux'; import { HotKeys } from 'react-hotkeys'; -import VisibilityIcon from 'mastodon/../material-icons/400-24px/visibility.svg?react'; -import VisibilityOffIcon from 'mastodon/../material-icons/400-24px/visibility_off.svg?react'; +import VisibilityIcon from '@/material-icons/400-24px/visibility.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; import { Icon } from 'mastodon/components/icon'; import { LoadingIndicator } from 'mastodon/components/loading_indicator'; import ScrollContainer from 'mastodon/containers/scroll_container'; diff --git a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx index 8c1a8f486cb147..0531346f91dad0 100644 --- a/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx +++ b/app/javascript/mastodon/features/subscribed_languages_modal/index.jsx @@ -8,7 +8,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { followAccount } from 'mastodon/actions/accounts'; import { Button } from 'mastodon/components/button'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.jsx b/app/javascript/mastodon/features/ui/components/boost_modal.jsx index 7e9d8c9819208a..3b3e1e3f97d4de 100644 --- a/app/javascript/mastodon/features/ui/components/boost_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/boost_modal.jsx @@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import RepeatIcon from 'mastodon/../material-icons/400-24px/repeat.svg?react'; +import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; import { changeBoostPrivacy } from 'mastodon/actions/boosts'; import AttachmentList from 'mastodon/components/attachment_list'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/ui/components/bundle_modal_error.jsx b/app/javascript/mastodon/features/ui/components/bundle_modal_error.jsx index dd2a10608d84d6..d1c9e368838719 100644 --- a/app/javascript/mastodon/features/ui/components/bundle_modal_error.jsx +++ b/app/javascript/mastodon/features/ui/components/bundle_modal_error.jsx @@ -3,7 +3,7 @@ import { PureComponent } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; -import RefreshIcon from 'mastodon/../material-icons/400-24px/refresh.svg?react'; +import RefreshIcon from '@/material-icons/400-24px/refresh.svg?react'; import { IconButton } from '../../../components/icon_button'; diff --git a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx index 1080c303c5d7da..4227c741317ffd 100644 --- a/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/compare_history_modal.jsx @@ -8,7 +8,7 @@ import { connect } from 'react-redux'; import escapeTextContentForBrowser from 'escape-html'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { closeModal } from 'mastodon/actions/modal'; import { IconButton } from 'mastodon/components/icon_button'; import InlineAccount from 'mastodon/components/inline_account'; diff --git a/app/javascript/mastodon/features/ui/components/embed_modal.jsx b/app/javascript/mastodon/features/ui/components/embed_modal.jsx index 595e9771b5e4fe..a4e5fc9dfb3449 100644 --- a/app/javascript/mastodon/features/ui/components/embed_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/embed_modal.jsx @@ -4,7 +4,7 @@ import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import api from 'mastodon/api'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/ui/components/filter_modal.jsx b/app/javascript/mastodon/features/ui/components/filter_modal.jsx index 25cda00bea9df5..477575bd7b3ece 100644 --- a/app/javascript/mastodon/features/ui/components/filter_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/filter_modal.jsx @@ -5,7 +5,7 @@ import { defineMessages, FormattedMessage, injectIntl } from 'react-intl'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { fetchFilters, createFilter, createFilterStatus } from 'mastodon/actions/filters'; import { fetchStatus } from 'mastodon/actions/statuses'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx index a3bb22bd99ef09..25ad1e2e9ff05c 100644 --- a/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/focal_point_modal.jsx @@ -16,7 +16,7 @@ import tesseractWorkerPath from 'tesseract.js/dist/worker.min.js'; // eslint-disable-next-line import/no-extraneous-dependencies import tesseractCorePath from 'tesseract.js-core/tesseract-core.wasm.js'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { Button } from 'mastodon/components/button'; import { GIFV } from 'mastodon/components/gifv'; import { IconButton } from 'mastodon/components/icon_button'; diff --git a/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx b/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx index 6df753b0694389..4aa009263150cd 100644 --- a/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx +++ b/app/javascript/mastodon/features/ui/components/follow_requests_column_link.jsx @@ -6,7 +6,7 @@ import { injectIntl, defineMessages } from 'react-intl'; import { List as ImmutableList } from 'immutable'; import { connect } from 'react-redux'; -import PersonAddIcon from 'mastodon/../material-icons/400-24px/person_add.svg?react'; +import PersonAddIcon from '@/material-icons/400-24px/person_add.svg?react'; import { fetchFollowRequests } from 'mastodon/actions/accounts'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; import ColumnLink from 'mastodon/features/ui/components/column_link'; diff --git a/app/javascript/mastodon/features/ui/components/header.jsx b/app/javascript/mastodon/features/ui/components/header.jsx index b4f388ba84cfde..2f8636b12a0e99 100644 --- a/app/javascript/mastodon/features/ui/components/header.jsx +++ b/app/javascript/mastodon/features/ui/components/header.jsx @@ -7,7 +7,7 @@ import { Link, withRouter } from 'react-router-dom'; import { connect } from 'react-redux'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; import { openModal } from 'mastodon/actions/modal'; import { fetchServer } from 'mastodon/actions/server'; import { Avatar } from 'mastodon/components/avatar'; diff --git a/app/javascript/mastodon/features/ui/components/image_modal.jsx b/app/javascript/mastodon/features/ui/components/image_modal.jsx index 5a700dc1f74eec..f08ce15342e061 100644 --- a/app/javascript/mastodon/features/ui/components/image_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/image_modal.jsx @@ -5,7 +5,7 @@ import { defineMessages, injectIntl } from 'react-intl'; import classNames from 'classnames'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { IconButton } from 'mastodon/components/icon_button'; import ImageLoader from './image_loader'; diff --git a/app/javascript/mastodon/features/ui/components/list_panel.jsx b/app/javascript/mastodon/features/ui/components/list_panel.jsx index 634f13e6118ee8..fec21f14ca15c8 100644 --- a/app/javascript/mastodon/features/ui/components/list_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/list_panel.jsx @@ -5,7 +5,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; import { fetchLists } from 'mastodon/actions/lists'; import ColumnLink from './column_link'; diff --git a/app/javascript/mastodon/features/ui/components/media_modal.jsx b/app/javascript/mastodon/features/ui/components/media_modal.jsx index b5b5d88693f9fa..0f6e8a727bea3f 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/media_modal.jsx @@ -9,9 +9,9 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import ReactSwipeableViews from 'react-swipeable-views'; -import ChevronLeftIcon from 'mastodon/../material-icons/400-24px/chevron_left.svg?react'; -import ChevronRightIcon from 'mastodon/../material-icons/400-24px/chevron_right.svg?react'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import ChevronLeftIcon from '@/material-icons/400-24px/chevron_left.svg?react'; +import ChevronRightIcon from '@/material-icons/400-24px/chevron_right.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { getAverageFromBlurhash } from 'mastodon/blurhash'; import { GIFV } from 'mastodon/components/gifv'; import { Icon } from 'mastodon/components/icon'; diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx index 72da652b3d6c0e..d3f46c6d466317 100644 --- a/app/javascript/mastodon/features/ui/components/navigation_panel.jsx +++ b/app/javascript/mastodon/features/ui/components/navigation_panel.jsx @@ -5,16 +5,16 @@ import { defineMessages, injectIntl } from 'react-intl'; import { Link } from 'react-router-dom'; -import AlternateEmailIcon from 'mastodon/../material-icons/400-24px/alternate_email.svg?react'; -import BookmarksIcon from 'mastodon/../material-icons/400-24px/bookmarks-fill.svg?react'; -import HomeIcon from 'mastodon/../material-icons/400-24px/home-fill.svg?react'; -import ListAltIcon from 'mastodon/../material-icons/400-24px/list_alt.svg?react'; -import MoreHorizIcon from 'mastodon/../material-icons/400-24px/more_horiz.svg?react'; -import PublicIcon from 'mastodon/../material-icons/400-24px/public.svg?react'; -import SearchIcon from 'mastodon/../material-icons/400-24px/search.svg?react'; -import SettingsIcon from 'mastodon/../material-icons/400-24px/settings-fill.svg?react'; -import StarIcon from 'mastodon/../material-icons/400-24px/star-fill.svg?react'; -import TagIcon from 'mastodon/../material-icons/400-24px/tag.svg?react'; +import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; +import BookmarksIcon from '@/material-icons/400-24px/bookmarks-fill.svg?react'; +import HomeIcon from '@/material-icons/400-24px/home-fill.svg?react'; +import ListAltIcon from '@/material-icons/400-24px/list_alt.svg?react'; +import MoreHorizIcon from '@/material-icons/400-24px/more_horiz.svg?react'; +import PublicIcon from '@/material-icons/400-24px/public.svg?react'; +import SearchIcon from '@/material-icons/400-24px/search.svg?react'; +import SettingsIcon from '@/material-icons/400-24px/settings-fill.svg?react'; +import StarIcon from '@/material-icons/400-24px/star-fill.svg?react'; +import TagIcon from '@/material-icons/400-24px/tag.svg?react'; import { WordmarkLogo } from 'mastodon/components/logo'; import { NavigationPortal } from 'mastodon/components/navigation_portal'; import { timelinePreview, trendsEnabled } from 'mastodon/initial_state'; diff --git a/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js b/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js index 34e868acc87e20..7d59d616d83003 100644 --- a/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js +++ b/app/javascript/mastodon/features/ui/components/notifications_counter_icon.js @@ -1,6 +1,6 @@ import { connect } from 'react-redux'; -import NotificationsIcon from 'mastodon/../material-icons/400-24px/notifications-fill.svg?react'; +import NotificationsIcon from '@/material-icons/400-24px/notifications-fill.svg?react'; import { IconWithBadge } from 'mastodon/components/icon_with_badge'; diff --git a/app/javascript/mastodon/features/ui/components/report_modal.jsx b/app/javascript/mastodon/features/ui/components/report_modal.jsx index aae0e96ac4fb6b..6584364609522c 100644 --- a/app/javascript/mastodon/features/ui/components/report_modal.jsx +++ b/app/javascript/mastodon/features/ui/components/report_modal.jsx @@ -7,7 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import ImmutablePureComponent from 'react-immutable-pure-component'; import { connect } from 'react-redux'; -import CloseIcon from 'mastodon/../material-icons/400-24px/close.svg?react'; +import CloseIcon from '@/material-icons/400-24px/close.svg?react'; import { submitReport } from 'mastodon/actions/reports'; import { fetchServer } from 'mastodon/actions/server'; import { expandAccountTimeline } from 'mastodon/actions/timelines'; diff --git a/app/javascript/mastodon/features/ui/components/zoomable_image.jsx b/app/javascript/mastodon/features/ui/components/zoomable_image.jsx index e3fa7c3b8a5ab8..272a3cff009186 100644 --- a/app/javascript/mastodon/features/ui/components/zoomable_image.jsx +++ b/app/javascript/mastodon/features/ui/components/zoomable_image.jsx @@ -3,8 +3,8 @@ import { PureComponent } from 'react'; import { defineMessages, injectIntl } from 'react-intl'; -import FullscreenExitIcon from 'mastodon/../material-icons/400-24px/fullscreen_exit.svg?react'; -import RectangleIcon from 'mastodon/../material-icons/400-24px/rectangle.svg?react'; +import FullscreenExitIcon from '@/material-icons/400-24px/fullscreen_exit.svg?react'; +import RectangleIcon from '@/material-icons/400-24px/rectangle.svg?react'; import { IconButton } from 'mastodon/components/icon_button'; const messages = defineMessages({ diff --git a/app/javascript/mastodon/features/video/index.jsx b/app/javascript/mastodon/features/video/index.jsx index efcbbc174e9ab7..89a8ba560a0e85 100644 --- a/app/javascript/mastodon/features/video/index.jsx +++ b/app/javascript/mastodon/features/video/index.jsx @@ -9,14 +9,14 @@ import { is } from 'immutable'; import { throttle } from 'lodash'; -import FullscreenIcon from 'mastodon/../material-icons/400-24px/fullscreen.svg?react'; -import FullscreenExitIcon from 'mastodon/../material-icons/400-24px/fullscreen_exit.svg?react'; -import PauseIcon from 'mastodon/../material-icons/400-24px/pause.svg?react'; -import PlayArrowIcon from 'mastodon/../material-icons/400-24px/play_arrow-fill.svg?react'; -import RectangleIcon from 'mastodon/../material-icons/400-24px/rectangle.svg?react'; -import VisibilityOffIcon from 'mastodon/../material-icons/400-24px/visibility_off.svg?react'; -import VolumeOffIcon from 'mastodon/../material-icons/400-24px/volume_off-fill.svg?react'; -import VolumeUpIcon from 'mastodon/../material-icons/400-24px/volume_up-fill.svg?react'; +import FullscreenIcon from '@/material-icons/400-24px/fullscreen.svg?react'; +import FullscreenExitIcon from '@/material-icons/400-24px/fullscreen_exit.svg?react'; +import PauseIcon from '@/material-icons/400-24px/pause.svg?react'; +import PlayArrowIcon from '@/material-icons/400-24px/play_arrow-fill.svg?react'; +import RectangleIcon from '@/material-icons/400-24px/rectangle.svg?react'; +import VisibilityOffIcon from '@/material-icons/400-24px/visibility_off.svg?react'; +import VolumeOffIcon from '@/material-icons/400-24px/volume_off-fill.svg?react'; +import VolumeUpIcon from '@/material-icons/400-24px/volume_up-fill.svg?react'; import { Blurhash } from 'mastodon/components/blurhash'; import { Icon } from 'mastodon/components/icon'; import { playerSettings } from 'mastodon/settings'; diff --git a/config/webpack/shared.js b/config/webpack/shared.js index 7c00d85d362d8b..8e77a840a518e3 100644 --- a/config/webpack/shared.js +++ b/config/webpack/shared.js @@ -96,6 +96,9 @@ module.exports = { resolve(settings.source_path), 'node_modules', ], + alias: { + "@": resolve(settings.source_path), + } }, resolveLoader: { diff --git a/lib/tasks/icons.rake b/lib/tasks/icons.rake index 3e3d0daac5adfd..374ea149fee388 100644 --- a/lib/tasks/icons.rake +++ b/lib/tasks/icons.rake @@ -22,7 +22,7 @@ def find_used_icons Dir[Rails.root.join('app', 'javascript', '**', '*.*s*')].map do |path| File.open(path, 'r') do |file| - pattern = %r{\Aimport .* from 'mastodon/../material-icons/(?[0-9]+)-(?[0-9]+)px/(?[^-]*)(?-fill)?.svg\?react';} + pattern = %r{\Aimport .* from '@/material-icons/(?[0-9]+)-(?[0-9]+)px/(?[^-]*)(?-fill)?.svg\?react';} file.each_line do |line| match = pattern.match(line) next if match.blank? diff --git a/tsconfig.json b/tsconfig.json index d1a77e5493846d..a193ea35f2fdac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "tsBuildInfoFile": "tmp/cache/tsconfig.tsbuildinfo", "paths": { "mastodon": ["app/javascript/mastodon"], - "mastodon/*": ["app/javascript/mastodon/*"] + "mastodon/*": ["app/javascript/mastodon/*"], + "@/*": ["app/javascript/*"] } }, "include": [ From e85e2929aac2b86f8c7d4060b04330bf70e83c5f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:53:32 +0100 Subject: [PATCH 16/43] Update eslint (non-major) (#28729) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 160 +++++++++++++++++++----------------------------------- 1 file changed, 57 insertions(+), 103 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3a7563b31bb473..26368006d15248 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3679,14 +3679,14 @@ __metadata: linkType: hard "@typescript-eslint/eslint-plugin@npm:^6.0.0": - version: 6.16.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.16.0" + version: 6.19.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.19.0" dependencies: "@eslint-community/regexpp": "npm:^4.5.1" - "@typescript-eslint/scope-manager": "npm:6.16.0" - "@typescript-eslint/type-utils": "npm:6.16.0" - "@typescript-eslint/utils": "npm:6.16.0" - "@typescript-eslint/visitor-keys": "npm:6.16.0" + "@typescript-eslint/scope-manager": "npm:6.19.0" + "@typescript-eslint/type-utils": "npm:6.19.0" + "@typescript-eslint/utils": "npm:6.19.0" + "@typescript-eslint/visitor-keys": "npm:6.19.0" debug: "npm:^4.3.4" graphemer: "npm:^1.4.0" ignore: "npm:^5.2.4" @@ -3699,54 +3699,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: c8a68e0953d8b94f6b85d3a82090e61e670bcb0945cbee4d741321c56db727429ad47c48b8403ad1dab3b0842689bd2d4b85c99b76c51ac4f5be7f5f61c4c314 + checksum: ab1a5ace6663b0c6d2418e321328fa28aa4bdc4b5fae257addec01346fb3a9c2d3a2960ade0f7114e6974c513a28632c9e8e602333cc0fab3135c445babdef59 languageName: node linkType: hard "@typescript-eslint/parser@npm:^6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/parser@npm:6.17.0" + version: 6.19.0 + resolution: "@typescript-eslint/parser@npm:6.19.0" dependencies: - "@typescript-eslint/scope-manager": "npm:6.17.0" - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/typescript-estree": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" + "@typescript-eslint/scope-manager": "npm:6.19.0" + "@typescript-eslint/types": "npm:6.19.0" + "@typescript-eslint/typescript-estree": "npm:6.19.0" + "@typescript-eslint/visitor-keys": "npm:6.19.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 66b53159688083eb48259de5b4daf076f3de284ac3b4d2618bda3f7ab2d8ee27b01ae851b08e8487047e33ff3668424f17d677d66413164cb231f1519dcff82f + checksum: d547bfb1aaed112cfc0f9f0be8506a280952ba3b61be42b749352139361bd94e4a47fa043d819e19c6a498cacbd8bb36a46e3628c436a7e2009e7ac27afc8861 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.16.0": - version: 6.16.0 - resolution: "@typescript-eslint/scope-manager@npm:6.16.0" +"@typescript-eslint/scope-manager@npm:6.19.0": + version: 6.19.0 + resolution: "@typescript-eslint/scope-manager@npm:6.19.0" dependencies: - "@typescript-eslint/types": "npm:6.16.0" - "@typescript-eslint/visitor-keys": "npm:6.16.0" - checksum: 3b275e528d19f4f36c4acd6cb872b5f004175512dce30cef0ac7a9121bb23d21e5e0f4b62658dbfea2b15851e7fa930372696f25a6c87492f863171ab56f5364 + "@typescript-eslint/types": "npm:6.19.0" + "@typescript-eslint/visitor-keys": "npm:6.19.0" + checksum: 1ec7b9dedca7975f0aa4543c1c382f7d6131411bd443a5f9b96f137acb6adb450888ed13c95f6d26546b682b2e0579ce8a1c883fdbe2255dc0b61052193b8243 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/scope-manager@npm:6.17.0" +"@typescript-eslint/type-utils@npm:6.19.0": + version: 6.19.0 + resolution: "@typescript-eslint/type-utils@npm:6.19.0" dependencies: - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" - checksum: b7ac7d9c39515c2a1b3844577fab967bf126ec25ccf28076240748b3f42d60ab3e64131bfffee61f66251bdf2d59e50e39f5cb0bee7987c85c49140c75d26b5f - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:6.16.0": - version: 6.16.0 - resolution: "@typescript-eslint/type-utils@npm:6.16.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:6.16.0" - "@typescript-eslint/utils": "npm:6.16.0" + "@typescript-eslint/typescript-estree": "npm:6.19.0" + "@typescript-eslint/utils": "npm:6.19.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^1.0.1" peerDependencies: @@ -3754,30 +3744,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a5339cc1375d12411fcb242249143b28401fb18890bb2a1cff5275ba946affb4a2066cd8203e83ac383bd9d791a79ea6ee1cbf7a30deed5c832ed002897bbf82 + checksum: 5b146b985481e587122026c703ac9f537ad7e90eee1dca814971bca0d7e4a5d4ff9861fb4bf749014c28c6a4fbb4a01a4527355961315eb9501f3569f8e8dd38 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.16.0": - version: 6.16.0 - resolution: "@typescript-eslint/types@npm:6.16.0" - checksum: 74d9a8b7fd1b85fd1824295c92bc2f506148e450c9897f65ddaa089091017df4e25676c5b098b75c8f00529b84492f303a6b1870bb0ffee83997081325891d53 +"@typescript-eslint/types@npm:6.19.0": + version: 6.19.0 + resolution: "@typescript-eslint/types@npm:6.19.0" + checksum: 6f81860a3c14df55232c2e6dec21fb166867b9f30b3c3369b325aef5ee1c7e41e827c0504654daa49c8ff1a3a9ca9d9bfe76786882b6212a7c1b58991a9c80b9 languageName: node linkType: hard -"@typescript-eslint/types@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/types@npm:6.17.0" - checksum: c458d985b9ab4f369018536bcb88f0aedafb0c8c4b22ffd376e0c0c768a44e3956475c85ebeef40ae44238841c8df268893477b85873aa2621995c37e738e37e - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.16.0": - version: 6.16.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.16.0" +"@typescript-eslint/typescript-estree@npm:6.19.0": + version: 6.19.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.19.0" dependencies: - "@typescript-eslint/types": "npm:6.16.0" - "@typescript-eslint/visitor-keys": "npm:6.16.0" + "@typescript-eslint/types": "npm:6.19.0" + "@typescript-eslint/visitor-keys": "npm:6.19.0" debug: "npm:^4.3.4" globby: "npm:^11.1.0" is-glob: "npm:^4.0.3" @@ -3787,63 +3770,34 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: c7109e90b40b3c8f1042beb7f1a7a97eeba3b6a903acd82df4947900d68bd31d04b530a190c099666c5ca4886efc162de7b42de754a44b189e41237210797d9e + checksum: 5b365f009e43c7beafdbb7d8ecad78ee1087b0a4338cd9ec695eed514b7b4c1089e56239761139ddae629ec0ce8d428840c6ebfeea3618d2efe00c84f8794da5 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" - dependencies: - "@typescript-eslint/types": "npm:6.17.0" - "@typescript-eslint/visitor-keys": "npm:6.17.0" - debug: "npm:^4.3.4" - globby: "npm:^11.1.0" - is-glob: "npm:^4.0.3" - minimatch: "npm:9.0.3" - semver: "npm:^7.5.4" - ts-api-utils: "npm:^1.0.1" - peerDependenciesMeta: - typescript: - optional: true - checksum: 5a858288bb05f45a2a45b04394115826ff19f85555144bfb67dc281d4e75fc3a1e1aceb3dee68022e86b91f199d1310c15bda3100a4890004b8e474d86afad51 - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:6.16.0, @typescript-eslint/utils@npm:^6.5.0": - version: 6.16.0 - resolution: "@typescript-eslint/utils@npm:6.16.0" +"@typescript-eslint/utils@npm:6.19.0, @typescript-eslint/utils@npm:^6.5.0": + version: 6.19.0 + resolution: "@typescript-eslint/utils@npm:6.19.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" "@types/json-schema": "npm:^7.0.12" "@types/semver": "npm:^7.5.0" - "@typescript-eslint/scope-manager": "npm:6.16.0" - "@typescript-eslint/types": "npm:6.16.0" - "@typescript-eslint/typescript-estree": "npm:6.16.0" + "@typescript-eslint/scope-manager": "npm:6.19.0" + "@typescript-eslint/types": "npm:6.19.0" + "@typescript-eslint/typescript-estree": "npm:6.19.0" semver: "npm:^7.5.4" peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 586c4c0e1ca249daf9958f0d88df3af010a7592a19db1a7dc198754542b584314896536fe56ea9c93dd0ddd531154e7697002643d46e24a8d3a459721a626e91 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.16.0": - version: 6.16.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.16.0" - dependencies: - "@typescript-eslint/types": "npm:6.16.0" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 13c4d90355e288eac432d2845e37bb2acc03dab6d8568564558c1914a9aa44352f2a7ff29d0f50e0b3e68d66cca5f27b2732af5ff193b82571b4366309842880 + checksum: 343ff4cd4f7e102df8c46b41254d017a33d95df76455531fda679fdb92aebb9c111df8ee9ab54972e73c1e8fad9dd7e421001233f0aee8115384462b0821852e languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.17.0": - version: 6.17.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" +"@typescript-eslint/visitor-keys@npm:6.19.0": + version: 6.19.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.19.0" dependencies: - "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.19.0" eslint-visitor-keys: "npm:^3.4.1" - checksum: 75a48f5810c6a69bc1c082b07d2b840c40895807b1b4ecf9d3ab9eb783176eeb3e7b11eb89d652e8331da79d604f82300f315ffc21cd937819197a8601b48d1d + checksum: bb34e922e018aadf34866995ea5949d6623f184cc4f6470ab05767dd208ffabb003b7dc3872199714574b7f10afe89d49c6f89a4e8d086edea82be73e189f1bb languageName: node linkType: hard @@ -7341,9 +7295,9 @@ __metadata: linkType: hard "eslint-define-config@npm:^2.0.0": - version: 2.0.0 - resolution: "eslint-define-config@npm:2.0.0" - checksum: 617c3143bc1ed8df0b20ae632d428d5f241dbb04483631e1410c58fe65ba3e503cf94631c5973115482b58ba464d052422a718c0f4d49182f8d13ffbb36bf1d6 + version: 2.1.0 + resolution: "eslint-define-config@npm:2.1.0" + checksum: 034bd6bfbfec2db6c720a51815de6b072efeef7afbf99d90c23a1871f9cd741bb77f9d34e0bc2465262298c6110c5c45b704714d8575c6567fd2df963fb792ea languageName: node linkType: hard @@ -7437,8 +7391,8 @@ __metadata: linkType: hard "eslint-plugin-jsdoc@npm:^48.0.0": - version: 48.0.1 - resolution: "eslint-plugin-jsdoc@npm:48.0.1" + version: 48.0.2 + resolution: "eslint-plugin-jsdoc@npm:48.0.2" dependencies: "@es-joy/jsdoccomment": "npm:~0.41.0" are-docs-informative: "npm:^0.0.2" @@ -7451,7 +7405,7 @@ __metadata: spdx-expression-parse: "npm:^4.0.0" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 9b211cfb2e07e076dad12681cd2045c65766dd24fe9399fd0adeaf6f8785f9a4dd58608f1183195f63d3c6c91013aa1cf9edc9101580cff9cb60e1e688f456f9 + checksum: 6e6062c22fa4039e4be898a62f8ca0edef8bcbdc8257abb18302471e9819ccd63941971cf8de0ccf4eb59b3508902aa06de56214d80bdfc9bde7cadb94906190 languageName: node linkType: hard @@ -7482,8 +7436,8 @@ __metadata: linkType: hard "eslint-plugin-prettier@npm:^5.0.0": - version: 5.1.2 - resolution: "eslint-plugin-prettier@npm:5.1.2" + version: 5.1.3 + resolution: "eslint-plugin-prettier@npm:5.1.3" dependencies: prettier-linter-helpers: "npm:^1.0.0" synckit: "npm:^0.8.6" @@ -7497,7 +7451,7 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: e16c9fbb0e9f8da45bdbb1cf6e4a190266235c3686deede3815196d2604bbe2bac531d1fc9adc3c0b9a03d88b55bd3bfaa4f9d85e34e73dc040d545a1931fab9 + checksum: f45d5fc1fcfec6b0cf038a7a65ddd10a25df4fe3f9e1f6b7f0d5100e66f046a26a2492e69ee765dddf461b93c114cf2e1eb18d4970aafa6f385448985c136e09 languageName: node linkType: hard From 4e277f83dc740b3a842c7fd8ed167c3c76fcabf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:34:22 +0100 Subject: [PATCH 17/43] Update devDependencies (non-major) (#28728) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renaud Chaput --- app/javascript/mastodon/reducers/accounts.ts | 22 +++++++------------ yarn.lock | 23 +++++++++++++------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/app/javascript/mastodon/reducers/accounts.ts b/app/javascript/mastodon/reducers/accounts.ts index e6f07340c048ac..5a9cc7220c7624 100644 --- a/app/javascript/mastodon/reducers/accounts.ts +++ b/app/javascript/mastodon/reducers/accounts.ts @@ -59,25 +59,19 @@ export const accountsReducer: Reducer = ( return normalizeAccounts(state, action.payload.accounts); else if (followAccountSuccess.match(action)) { return state - .update( - action.payload.relationship.id, - (account) => account?.update('followers_count', (n) => n + 1), + .update(action.payload.relationship.id, (account) => + account?.update('followers_count', (n) => n + 1), ) - .update( - getCurrentUser(), - (account) => account?.update('following_count', (n) => n + 1), + .update(getCurrentUser(), (account) => + account?.update('following_count', (n) => n + 1), ); } else if (unfollowAccountSuccess.match(action)) return state - .update( - action.payload.relationship.id, - (account) => - account?.update('followers_count', (n) => Math.max(0, n - 1)), + .update(action.payload.relationship.id, (account) => + account?.update('followers_count', (n) => Math.max(0, n - 1)), ) - .update( - getCurrentUser(), - (account) => - account?.update('following_count', (n) => Math.max(0, n - 1)), + .update(getCurrentUser(), (account) => + account?.update('following_count', (n) => Math.max(0, n - 1)), ); else return state; }; diff --git a/yarn.lock b/yarn.lock index 26368006d15248..a8aa653844fff2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2895,15 +2895,15 @@ __metadata: linkType: hard "@testing-library/jest-dom@npm:^6.0.0": - version: 6.1.6 - resolution: "@testing-library/jest-dom@npm:6.1.6" + version: 6.2.0 + resolution: "@testing-library/jest-dom@npm:6.2.0" dependencies: "@adobe/css-tools": "npm:^4.3.2" "@babel/runtime": "npm:^7.9.2" aria-query: "npm:^5.0.0" chalk: "npm:^3.0.0" css.escape: "npm:^1.5.1" - dom-accessibility-api: "npm:^0.5.6" + dom-accessibility-api: "npm:^0.6.3" lodash: "npm:^4.17.15" redent: "npm:^3.0.0" peerDependencies: @@ -2920,7 +2920,7 @@ __metadata: optional: true vitest: optional: true - checksum: f98f79f3e470517469c86947d0ff1bb83ac2e59fd2a29728ab306eca5fba63c948084ec06b7b531642e6002d1f0211d918c298c628f0d386c0ef63ba881c47ba + checksum: 71421693e0ad6a46be7d16f00b58a45725c238693972b8b5b1fd9ab797902ccf1209cf259afe8da1bf59d7c958762c46ee85d1aa5b164a5ec330981ea2376b08 languageName: node linkType: hard @@ -6780,13 +6780,20 @@ __metadata: languageName: node linkType: hard -"dom-accessibility-api@npm:^0.5.6, dom-accessibility-api@npm:^0.5.9": +"dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" checksum: b2c2eda4fae568977cdac27a9f0c001edf4f95a6a6191dfa611e3721db2478d1badc01db5bb4fa8a848aeee13e442a6c2a4386d65ec65a1436f24715a2f8d053 languageName: node linkType: hard +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: 10bee5aa514b2a9a37c87cd81268db607a2e933a050074abc2f6fa3da9080ebed206a320cbc123567f2c3087d22292853bdfdceaffdd4334ffe2af9510b29360 + languageName: node + linkType: hard + "dom-helpers@npm:^3.4.0": version: 3.4.0 resolution: "dom-helpers@npm:3.4.0" @@ -13201,11 +13208,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.0": - version: 3.1.1 - resolution: "prettier@npm:3.1.1" + version: 3.2.2 + resolution: "prettier@npm:3.2.2" bin: prettier: bin/prettier.cjs - checksum: facc944ba20e194ff4db765e830ffbcb642803381f0d2033ed397e79904fa4ccc877dc25ad68f42d36985c01d051c990ca1b905fb83d2d7d65fe69e4386fa1a3 + checksum: e84d0d2a4ce2b88ee1636904effbdf68b59da63d9f887128f2ed5382206454185432e7c0a9578bc4308bc25d099cfef47fd0b9c211066777854e23e65e34044d languageName: node linkType: hard From bd538598c2f5196ef009a80ade31f72df6b6259f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:34:53 +0100 Subject: [PATCH 18/43] Update formatjs monorepo (#28751) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 158 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 109 insertions(+), 49 deletions(-) diff --git a/yarn.lock b/yarn.lock index a8aa653844fff2..b05a43982e67db 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1811,6 +1811,16 @@ __metadata: languageName: node linkType: hard +"@formatjs/ecma402-abstract@npm:1.18.2": + version: 1.18.2 + resolution: "@formatjs/ecma402-abstract@npm:1.18.2" + dependencies: + "@formatjs/intl-localematcher": "npm:0.5.4" + tslib: "npm:^2.4.0" + checksum: 87afb37dd937555e712ca85d5142a9083d617c491d1dddf8d660fdfb6186272d2bc75b78809b076388d26f016200c8bddbce73281fd707eb899da2bf3bc9b7ca + languageName: node + linkType: hard + "@formatjs/fast-memoize@npm:2.2.0": version: 2.2.0 resolution: "@formatjs/fast-memoize@npm:2.2.0" @@ -1831,6 +1841,17 @@ __metadata: languageName: node linkType: hard +"@formatjs/icu-messageformat-parser@npm:2.7.5": + version: 2.7.5 + resolution: "@formatjs/icu-messageformat-parser@npm:2.7.5" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/icu-skeleton-parser": "npm:1.7.2" + tslib: "npm:^2.4.0" + checksum: b1995ee0844c48d1b4bf184017a65600eb1d324107046c8b67d77e08d7da74bbbbf00dccbf2bc418480c8510443b3eb157646404fbacd71fa6e7d572d0ffc910 + languageName: node + linkType: hard + "@formatjs/icu-skeleton-parser@npm:1.7.0": version: 1.7.0 resolution: "@formatjs/icu-skeleton-parser@npm:1.7.0" @@ -1841,25 +1862,35 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-displaynames@npm:6.6.4": - version: 6.6.4 - resolution: "@formatjs/intl-displaynames@npm:6.6.4" +"@formatjs/icu-skeleton-parser@npm:1.7.2": + version: 1.7.2 + resolution: "@formatjs/icu-skeleton-parser@npm:1.7.2" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - "@formatjs/intl-localematcher": "npm:0.5.2" + "@formatjs/ecma402-abstract": "npm:1.18.2" tslib: "npm:^2.4.0" - checksum: 009e443dd0d10776b8573d0181407d4c0d6c7a2ff537a5ea1e36413d1b08db9c21dfef272eabab8efabd01a58b64f663a30e4d584fd761df3fd68a5d23fe444b + checksum: 7ca30ac360a5a971b5a06b4ae0263f0ddbde4751ff470486767f544f0399c5c85affab7170e5dd227c65afac4797e79a5e8abe65a70a335b96ab77b5d314abcb languageName: node linkType: hard -"@formatjs/intl-listformat@npm:7.5.3": - version: 7.5.3 - resolution: "@formatjs/intl-listformat@npm:7.5.3" +"@formatjs/intl-displaynames@npm:6.6.6": + version: 6.6.6 + resolution: "@formatjs/intl-displaynames@npm:6.6.6" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - "@formatjs/intl-localematcher": "npm:0.5.2" + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: de741ce84b16fed57016afbfe446ebd57cd23a046859a9353f5d455f8bc9114493bf83b9e18429268c7ce8f77bc54516a9b8190baf09fbb25c9b06cfc80101d4 + checksum: 4ba40057cfafaabf04485137bc96705d5ed7ac48f17ed7dfe8dbd7f71119667b6c0b7fa75469e32b70c9bada2c5d03af37a5261d655a37b81c63ba907edbb2e8 + languageName: node + linkType: hard + +"@formatjs/intl-listformat@npm:7.5.5": + version: 7.5.5 + resolution: "@formatjs/intl-listformat@npm:7.5.5" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/intl-localematcher": "npm:0.5.4" + tslib: "npm:^2.4.0" + checksum: bc9d8cbe42bd9513db0b2b221c0b1a752892005a90fa629b4cf7df1cbd3b96997cddbf420e562ebdfdc691a28d9b759ccae9633d5987aa0bceed5aef77a07ca4 languageName: node linkType: hard @@ -1872,34 +1903,63 @@ __metadata: languageName: node linkType: hard +"@formatjs/intl-localematcher@npm:0.5.4": + version: 0.5.4 + resolution: "@formatjs/intl-localematcher@npm:0.5.4" + dependencies: + tslib: "npm:^2.4.0" + checksum: c9ff5d34ca8b6fe59f8f303a3cc31a92d343e095a6987e273e5cc23f0fe99feb557a392a05da95931c7d24106acb6988e588d00ddd05b0934005aafd7fdbafe6 + languageName: node + linkType: hard + "@formatjs/intl-pluralrules@npm:^5.2.2": - version: 5.2.10 - resolution: "@formatjs/intl-pluralrules@npm:5.2.10" + version: 5.2.12 + resolution: "@formatjs/intl-pluralrules@npm:5.2.12" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - "@formatjs/intl-localematcher": "npm:0.5.2" + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/intl-localematcher": "npm:0.5.4" tslib: "npm:^2.4.0" - checksum: 1050416613e80bff2c58546c80c8d52ed97847d13c90535a53d058e44969369b50e1cfdb464e9e9ef4802c934c84ea0e656c3f4e3b4d5ac7496b722c759da4cf + checksum: 0f4d9f4f272dd962b2f742519045ad43a1b6358755787d3394efcc5884b02184cc8d76fb13d98b1f30c41a813b81f82dd2342e1fb0fbd7b7efa69f5d0d59c4d0 languageName: node linkType: hard -"@formatjs/intl@npm:2.9.9": - version: 2.9.9 - resolution: "@formatjs/intl@npm:2.9.9" +"@formatjs/intl@npm:2.9.11": + version: 2.9.11 + resolution: "@formatjs/intl@npm:2.9.11" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" + "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.3" - "@formatjs/intl-displaynames": "npm:6.6.4" - "@formatjs/intl-listformat": "npm:7.5.3" - intl-messageformat: "npm:10.5.8" + "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/intl-displaynames": "npm:6.6.6" + "@formatjs/intl-listformat": "npm:7.5.5" + intl-messageformat: "npm:10.5.10" tslib: "npm:^2.4.0" peerDependencies: - typescript: 5 + typescript: ^4.7 || 5 peerDependenciesMeta: typescript: optional: true - checksum: b26904da605ab309535dfbbfbd403a3bb33d51d3c969c548b88fa04755be3aff60b1bddd1c453514a84048c7432271cef507ac66de32dcfa66b3f842a1ddb977 + checksum: 003a4356e698cf847aeb701565cad701f3afba2a31d8d3c2fe0d5790d90ef866bea30cf2cc20151b15085db10e436376d38c10b911b3fe5afdef5c32333d09f3 + languageName: node + linkType: hard + +"@formatjs/ts-transformer@npm:3.13.11": + version: 3.13.11 + resolution: "@formatjs/ts-transformer@npm:3.13.11" + dependencies: + "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@types/json-stable-stringify": "npm:^1.0.32" + "@types/node": "npm:14 || 16 || 17" + chalk: "npm:^4.0.0" + json-stable-stringify: "npm:^1.0.1" + tslib: "npm:^2.4.0" + typescript: "npm:5" + peerDependencies: + ts-jest: ">=27" + peerDependenciesMeta: + ts-jest: + optional: true + checksum: 2f7c48e742a152d0499615d01113fab23089c3c56beaa3234f53bbe48393b6351c68eba1aa23d6dec57ebfd7b1d12b165215950eeb87dd90072519dcc0a2e022 languageName: node linkType: hard @@ -4694,21 +4754,21 @@ __metadata: linkType: hard "babel-plugin-formatjs@npm:^10.5.1": - version: 10.5.10 - resolution: "babel-plugin-formatjs@npm:10.5.10" + version: 10.5.12 + resolution: "babel-plugin-formatjs@npm:10.5.12" dependencies: "@babel/core": "npm:^7.10.4" "@babel/helper-plugin-utils": "npm:^7.10.4" "@babel/plugin-syntax-jsx": "npm:7" "@babel/traverse": "npm:7" "@babel/types": "npm:^7.12.11" - "@formatjs/icu-messageformat-parser": "npm:2.7.3" - "@formatjs/ts-transformer": "npm:3.13.9" + "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/ts-transformer": "npm:3.13.11" "@types/babel__core": "npm:^7.1.7" "@types/babel__helper-plugin-utils": "npm:^7.10.0" "@types/babel__traverse": "npm:^7.1.7" tslib: "npm:^2.4.0" - checksum: bff65cd2a88a0ae00eabab1d022ffc44c4385b7e529cac42375bb1828c678c7a71a78f644512e5d1dd8cd532d418c16acdbabcef2bf6670e24404f4f164a74ce + checksum: 64fe3a38b283bb46e5528ad2f72287ca8a163227b0eea3bbe1bedff6d885b2be38c9fb8ed3843a72b723aeb2a7ad4d32b48e52030698631dc646aa15017f4208 languageName: node linkType: hard @@ -9260,15 +9320,15 @@ __metadata: languageName: node linkType: hard -"intl-messageformat@npm:10.5.8, intl-messageformat@npm:^10.3.5": - version: 10.5.8 - resolution: "intl-messageformat@npm:10.5.8" +"intl-messageformat@npm:10.5.10, intl-messageformat@npm:^10.3.5": + version: 10.5.10 + resolution: "intl-messageformat@npm:10.5.10" dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" + "@formatjs/ecma402-abstract": "npm:1.18.2" "@formatjs/fast-memoize": "npm:2.2.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.3" + "@formatjs/icu-messageformat-parser": "npm:2.7.5" tslib: "npm:^2.4.0" - checksum: 1d2854aae8471ec48165ca265760d6c5b1814eca831c88db698eb29b5ed20bee21ca8533090c9d28d9c6f1d844dda210b0bc58a2e036446158fae0845e5eed4f + checksum: 2016c0561e5172b28f180669e28992d04944752d61ebcb539232cc289e7627fd92fe64c73985bc32bddd5cc683f7b77863c1b58507d214ce3a87982d50571658 languageName: node linkType: hard @@ -13568,26 +13628,26 @@ __metadata: linkType: hard "react-intl@npm:^6.4.2": - version: 6.5.5 - resolution: "react-intl@npm:6.5.5" - dependencies: - "@formatjs/ecma402-abstract": "npm:1.18.0" - "@formatjs/icu-messageformat-parser": "npm:2.7.3" - "@formatjs/intl": "npm:2.9.9" - "@formatjs/intl-displaynames": "npm:6.6.4" - "@formatjs/intl-listformat": "npm:7.5.3" + version: 6.6.1 + resolution: "react-intl@npm:6.6.1" + dependencies: + "@formatjs/ecma402-abstract": "npm:1.18.2" + "@formatjs/icu-messageformat-parser": "npm:2.7.5" + "@formatjs/intl": "npm:2.9.11" + "@formatjs/intl-displaynames": "npm:6.6.6" + "@formatjs/intl-listformat": "npm:7.5.5" "@types/hoist-non-react-statics": "npm:^3.3.1" "@types/react": "npm:16 || 17 || 18" hoist-non-react-statics: "npm:^3.3.2" - intl-messageformat: "npm:10.5.8" + intl-messageformat: "npm:10.5.10" tslib: "npm:^2.4.0" peerDependencies: react: ^16.6.0 || 17 || 18 - typescript: 5 + typescript: ^4.7 || 5 peerDependenciesMeta: typescript: optional: true - checksum: 9ff6200f195557804b735d618ee593aed7848e84213ac4eb9c57708f55c0d93232e0dd338c990348ba3b1d73dca071502a2051d4a2790838d962c3ccde87fa6c + checksum: 9277269eadbe432a9651af66402240b8a91a567c769ac9c1a774575999f63689a31dccf22a09a1d78d1b8fed4ecad103bdcc609e476ee7e60dabf0cbce6556d3 languageName: node linkType: hard From 537f49e8162fa56d3a52390da76939fc89053c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Wed, 17 Jan 2024 12:15:18 +0900 Subject: [PATCH 19/43] =?UTF-8?q?Remove:=20#372=20=E3=83=89=E3=83=A1?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=96=E3=83=AD=E3=83=83=E3=82=AF=E3=81=AB?= =?UTF-8?q?=E3=81=8A=E3=81=84=E3=81=A6=E3=80=81DB=E3=81=AE=E4=B8=8D?= =?UTF-8?q?=E8=A6=81=E3=81=AA=E3=82=AB=E3=83=A9=E3=83=A0=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=20(#471)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/domain_block.rb | 44 +++++++++---------- config/locales/en.yml | 2 - config/locales/ja.yml | 3 -- ...2353_remove_legacy_domain_block_columns.rb | 18 ++++++++ db/schema.rb | 6 +-- lib/tasks/dangerous.rake | 9 ++-- 6 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 db/post_migrate/20240117022353_remove_legacy_domain_block_columns.rb diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb index f2f0615434320f..a0d4f1afea35c6 100644 --- a/app/models/domain_block.rb +++ b/app/models/domain_block.rb @@ -4,30 +4,26 @@ # # Table name: domain_blocks # -# id :bigint(8) not null, primary key -# domain :string default(""), not null -# created_at :datetime not null -# updated_at :datetime not null -# severity :integer default("silence") -# reject_media :boolean default(FALSE), not null -# reject_reports :boolean default(FALSE), not null -# private_comment :text -# public_comment :text -# obfuscate :boolean default(FALSE), not null -# reject_favourite :boolean default(FALSE), not null -# reject_reply :boolean default(FALSE), not null -# reject_send_not_public_searchability :boolean default(FALSE), not null -# reject_send_public_unlisted :boolean default(FALSE), not null -# reject_send_dissubscribable :boolean default(FALSE), not null -# reject_send_media :boolean default(FALSE), not null -# reject_send_sensitive :boolean default(FALSE), not null -# reject_hashtag :boolean default(FALSE), not null -# reject_straight_follow :boolean default(FALSE), not null -# reject_new_follow :boolean default(FALSE), not null -# hidden :boolean default(FALSE), not null -# detect_invalid_subscription :boolean default(FALSE), not null -# reject_reply_exclude_followers :boolean default(FALSE), not null -# reject_friend :boolean default(FALSE), not null +# id :bigint(8) not null, primary key +# domain :string default(""), not null +# created_at :datetime not null +# updated_at :datetime not null +# severity :integer default("silence") +# reject_media :boolean default(FALSE), not null +# reject_reports :boolean default(FALSE), not null +# private_comment :text +# public_comment :text +# obfuscate :boolean default(FALSE), not null +# reject_favourite :boolean default(FALSE), not null +# reject_reply :boolean default(FALSE), not null +# reject_send_sensitive :boolean default(FALSE), not null +# reject_hashtag :boolean default(FALSE), not null +# reject_straight_follow :boolean default(FALSE), not null +# reject_new_follow :boolean default(FALSE), not null +# hidden :boolean default(FALSE), not null +# detect_invalid_subscription :boolean default(FALSE), not null +# reject_reply_exclude_followers :boolean default(FALSE), not null +# reject_friend :boolean default(FALSE), not null # class DomainBlock < ApplicationRecord diff --git a/config/locales/en.yml b/config/locales/en.yml index 970c1fe005b3a5..798afeea6e29d6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -456,8 +456,6 @@ en: reject_reports_hint: Ignore all reports coming from this domain. Irrelevant for suspensions reject_send_sensitive: センシティブな投稿を配送しない reject_send_sensitive_hint: 相手サーバーからのフェッチは防げません。停止とは無関係です - reject_send_unlisted_dissubscribable: 購読拒否アカウントの未収載投稿を配送しない - reject_send_unlisted_dissubscribable_hint: 相手サーバーからのフェッチは防げません。停止とは無関係です reject_straight_follow: Reject straight follow reject_straight_follow_hint: The server accounts must be authenticated when follow our accounts undo: Undo domain block diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 0047d4bbf428d5..234334065b8916 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -451,8 +451,6 @@ ja: reject_reports_hint: このドメインからの通報をすべて無視します。停止とは無関係です reject_send_sensitive: センシティブな投稿を配送しない reject_send_sensitive_hint: 相手サーバーからのフェッチは防げません。停止とは無関係です - reject_send_unlisted_dissubscribable: 購読拒否アカウントの未収載投稿を配送しない - reject_send_unlisted_dissubscribable_hint: 相手サーバーからのフェッチは防げません。停止とは無関係です reject_straight_follow: フォローを強制的に審査制にする reject_straight_follow_hint: 相手からのフォローは当サーバーのアカウントの承認が必須になります undo: ドメインブロックを戻す @@ -562,7 +560,6 @@ ja: reject_reply_exclude_followers: フォロー相手以外からのリプライを拒否 reject_reports: 通報を拒否 reject_send_sensitive: センシティブ投稿配送なし - reject_send_unlisted_dissubscribable: 購読拒否未収載投稿配送なし reject_straight_follow: フォローを制限 silence: 制限 suspend: サスペンド diff --git a/db/post_migrate/20240117022353_remove_legacy_domain_block_columns.rb b/db/post_migrate/20240117022353_remove_legacy_domain_block_columns.rb new file mode 100644 index 00000000000000..958d7491e58789 --- /dev/null +++ b/db/post_migrate/20240117022353_remove_legacy_domain_block_columns.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +require Rails.root.join('lib', 'mastodon', 'migration_helpers') + +class RemoveLegacyDomainBlockColumns < ActiveRecord::Migration[7.1] + include Mastodon::MigrationHelpers + + disable_ddl_transaction! + + def change + safety_assured do + remove_column :domain_blocks, :reject_send_not_public_searchability, :boolean, null: false, default: false + remove_column :domain_blocks, :reject_send_public_unlisted, :boolean, null: false, default: false + remove_column :domain_blocks, :reject_send_dissubscribable, :boolean, null: false, default: false + remove_column :domain_blocks, :reject_send_media, :boolean, null: false, default: false + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 1024b851139650..5bbcc29f37d0ac 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_01_17_021025) do +ActiveRecord::Schema[7.1].define(version: 2024_01_17_022353) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -566,10 +566,6 @@ t.boolean "obfuscate", default: false, null: false t.boolean "reject_favourite", default: false, null: false t.boolean "reject_reply", default: false, null: false - t.boolean "reject_send_not_public_searchability", default: false, null: false - t.boolean "reject_send_public_unlisted", default: false, null: false - t.boolean "reject_send_dissubscribable", default: false, null: false - t.boolean "reject_send_media", default: false, null: false t.boolean "reject_send_sensitive", default: false, null: false t.boolean "reject_hashtag", default: false, null: false t.boolean "reject_straight_follow", default: false, null: false diff --git a/lib/tasks/dangerous.rake b/lib/tasks/dangerous.rake index 8086e56e5b5e9d..2a300efd81427e 100644 --- a/lib/tasks/dangerous.rake +++ b/lib/tasks/dangerous.rake @@ -78,6 +78,7 @@ namespace :dangerous do 20230223102416 20230222232121 20240117021025 + 20240117022353 ) # Removed: account_groups target_tables = %w( @@ -128,10 +129,10 @@ namespace :dangerous do %w(domain_blocks reject_new_follow), %w(domain_blocks reject_reply), %w(domain_blocks reject_reply_exclude_followers), - %w(domain_blocks reject_send_dissubscribable), - %w(domain_blocks reject_send_media), - %w(domain_blocks reject_send_not_public_searchability), - %w(domain_blocks reject_send_public_unlisted), + # Removed: domain_blocks reject_send_dissubscribable + # Removed: domain_blocks reject_send_media + # Removed: domain_blocks reject_send_not_public_searchability + # Removed: domain_blocks reject_send_public_unlisted # Removed: domain_blocks reject_send_unlisted_dissubscribable %w(domain_blocks reject_send_sensitive), %w(domain_blocks reject_straight_follow), From 77843c0bdc9a400c571bc344416c2ed73da4bd1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Wed, 17 Jan 2024 14:49:37 +0900 Subject: [PATCH 20/43] =?UTF-8?q?Test:=20=E6=9C=AC=E5=AE=B6=E3=81=AB?= =?UTF-8?q?=E6=88=BB=E3=81=A3=E3=81=A6=E3=81=8B=E3=82=89=E5=86=8D=E3=81=B3?= =?UTF-8?q?kmyblue=E3=82=92=E5=B0=8E=E5=85=A5=E3=81=97=E3=81=9F=E3=81=A8?= =?UTF-8?q?=E3=81=8D=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=20(#474)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Test: 本家に戻ってから再びkmyblueを導入したときのテスト * Fix test * Fix test * Fix --- .github/workflows/test-ruby.yml | 90 +++++++++++++++++++++++++++++++++ lib/tasks/dangerous.rake | 8 +-- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test-ruby.yml b/.github/workflows/test-ruby.yml index 5274d92ac1da41..1c9665f32b21da 100644 --- a/.github/workflows/test-ruby.yml +++ b/.github/workflows/test-ruby.yml @@ -348,3 +348,93 @@ jobs: with: name: test-search-screenshots path: tmp/screenshots/ + + test-back-and-return: + name: Back to original and return test + runs-on: ubuntu-latest + + needs: + - build + + services: + postgres: + image: postgres:14-alpine + env: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + redis: + image: redis:7-alpine + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 6379:6379 + + env: + DB_HOST: localhost + DB_USER: postgres + DB_PASS: postgres + DISABLE_SIMPLECOV: ${{ matrix.ruby-version != '.ruby-version' }} + RAILS_ENV: test + ALLOW_NOPAM: true + PAM_ENABLED: true + PAM_DEFAULT_SERVICE: pam_test + PAM_CONTROLLED_SERVICE: pam_test_controlled + OIDC_ENABLED: true + OIDC_SCOPE: read + SAML_ENABLED: true + CAS_ENABLED: true + BUNDLE_WITH: 'pam_authentication test' + GITHUB_RSPEC: ${{ matrix.ruby-version == '.ruby-version' && github.event.pull_request && 'true' }} + ES_ENABLED: false + BACK_UPSTREAM_FORCE: true + + strategy: + fail-fast: false + matrix: + ruby-version: + - '.ruby-version' + steps: + - uses: actions/checkout@v4 + + - uses: actions/download-artifact@v3 + with: + path: './' + name: ${{ github.sha }} + + - name: Expand archived asset artifacts + run: | + tar xvzf artifacts.tar.gz + + - name: Set up Ruby environment + uses: ./.github/actions/setup-ruby + with: + ruby-version: ${{ matrix.ruby-version}} + additional-system-dependencies: ffmpeg imagemagick libpam-dev + + - name: Load database schema + run: './bin/rails db:create db:schema:load db:seed' + + - name: Back to upstream schema + run: 'bundle exec rake dangerous:back_upstream' + + - name: Return to kmyblue + run: './bin/rails db:migrate' + + - run: bin/rspec + + - name: Upload coverage reports to Codecov + if: matrix.ruby-version == '.ruby-version' + uses: codecov/codecov-action@v3 + with: + files: coverage/lcov/mastodon-back-ret.lcov diff --git a/lib/tasks/dangerous.rake b/lib/tasks/dangerous.rake index 2a300efd81427e..ebe3967e0937e5 100644 --- a/lib/tasks/dangerous.rake +++ b/lib/tasks/dangerous.rake @@ -7,9 +7,11 @@ namespace :dangerous do prompt = TTY::Prompt.new - exit(0) unless prompt.yes?('[1/3] Do you really want to go back to the original Mastodon?', default: false) - exit(0) unless prompt.yes?('[2/3] All proprietary data of kmyblue will be deleted and cannot be restored. Are you sure?', default: false) - exit(0) unless prompt.yes?('[3/3] This operation is irreversible. You have backups in case this operation causes a system malfunction, do you not?', default: false) + unless ENV['BACK_UPSTREAM_FORCE'] + exit(0) unless prompt.yes?('[1/3] Do you really want to go back to the original Mastodon?', default: false) + exit(0) unless prompt.yes?('[2/3] All proprietary data of kmyblue will be deleted and cannot be restored. Are you sure?', default: false) + exit(0) unless prompt.yes?('[3/3] This operation is irreversible. You have backups in case this operation causes a system malfunction, do you not?', default: false) + end target_migrations = %w( 20231022074913 From 8cc322a0e10a5455f2def59b9492edb1fcc098b4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:06:38 +0100 Subject: [PATCH 21/43] Update dependency concurrent-ruby to v1.2.3 (#28754) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index d8e67b6bec4961..1592a7b5727532 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -188,7 +188,7 @@ GEM climate_control (0.2.0) cocoon (1.2.15) color_diff (0.1) - concurrent-ruby (1.2.2) + concurrent-ruby (1.2.3) connection_pool (2.4.1) cose (1.3.0) cbor (~> 0.5.9) From 0ce081fe494712e8fe6f785aeaa33994bbeb1a24 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 04:08:17 -0500 Subject: [PATCH 22/43] Remove monkey patch in favor of supported Devise config value (#28760) --- config/initializers/devise.rb | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 2c6099623db501..f935090efc2b9b 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -2,15 +2,6 @@ require 'devise/strategies/authenticatable' -# TODO: Remove this patch when this PR or similar is merged into Devise: -# https://github.com/heartcombo/devise/pull/5645 -# We rely on ENV vars and not secrets/credentials, so the deprecation is just noise. -class Devise::SecretKeyFinder - def find - @application.secret_key_base - end -end - Warden::Manager.after_set_user except: :fetch do |user, warden| session_id = warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'] session_id = user.activate_session(warden.request) unless user.session_activations.active?(session_id) @@ -133,9 +124,11 @@ def session_cookie # The secret key used by Devise. Devise uses this key to generate # random tokens. Changing this key will render invalid all existing # confirmation, reset password and unlock tokens in the database. - # Devise will use the `secret_key_base` on Rails 4+ applications as its `secret_key` - # by default. You can change it below and use your own secret key. - # config.secret_key = '2f86974c4dd7735170fd70fbf399f7a477ffd635ef240d07a22cf4bd7cd13dbae17c4383a2996d0c1e79a991ec18a91a17424c53e4771adb75a8b21904bd1403' + # + # Set explicitly to Rails default to avoid deprecation warnings. + # https://github.com/heartcombo/devise/pull/5645#issuecomment-1871849856 + # Remove when Devise changes `SecretKeyFinder` to not emit deprecations. + config.secret_key = Rails.application.secret_key_base # ==> Mailer Configuration # Configure the e-mail address which will be shown in Devise::Mailer, From 259874f2aceb6282081f303800f5f40b2510e875 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:11:18 +0100 Subject: [PATCH 23/43] Update dependency @rails/ujs to v7.1.3 (#28771) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index b05a43982e67db..953147fe4cf83c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2675,9 +2675,9 @@ __metadata: linkType: hard "@rails/ujs@npm:^7.1.1": - version: 7.1.2 - resolution: "@rails/ujs@npm:7.1.2" - checksum: 072962733c371fa0fff5e88a0aecd8e91c892f9dc2d31723b7586b45c723206d6b82ac71b0d7db26ea0a5ce60e0832430b061e4669b8f2aa813c3ea975aac98a + version: 7.1.3 + resolution: "@rails/ujs@npm:7.1.3" + checksum: 68112d9add9dbc59b40c2ec1bc095a67445c57d20d0ab7d817ce3de0cd90374e2690af8ad54ce6ecc2d1c748b34c0c44d0fbd2f515ce2c443d7c5d23d00b9ce5 languageName: node linkType: hard From afb5e6cf46723ce70bd6a45c62c23466ceb9d985 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:11:22 +0100 Subject: [PATCH 24/43] Update dependency rails to v7.1.3 (#28772) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 112 +++++++++++++++++++++++++-------------------------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1592a7b5727532..736a829f07df2e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -21,35 +21,35 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + actioncable (7.1.3) + actionpack (= 7.1.3) + activesupport (= 7.1.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actionmailbox (7.1.3) + actionpack (= 7.1.3) + activejob (= 7.1.3) + activerecord (= 7.1.3) + activestorage (= 7.1.3) + activesupport (= 7.1.3) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.2) - actionpack (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activesupport (= 7.1.2) + actionmailer (7.1.3) + actionpack (= 7.1.3) + actionview (= 7.1.3) + activejob (= 7.1.3) + activesupport (= 7.1.3) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.2) - actionview (= 7.1.2) - activesupport (= 7.1.2) + actionpack (7.1.3) + actionview (= 7.1.3) + activesupport (= 7.1.3) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -57,15 +57,15 @@ GEM rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.2) - actionpack (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actiontext (7.1.3) + actionpack (= 7.1.3) + activerecord (= 7.1.3) + activestorage (= 7.1.3) + activesupport (= 7.1.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.2) - activesupport (= 7.1.2) + actionview (7.1.3) + activesupport (= 7.1.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) @@ -75,22 +75,22 @@ GEM activemodel (>= 4.1) case_transform (>= 0.2) jsonapi-renderer (>= 0.1.1.beta1, < 0.3) - activejob (7.1.2) - activesupport (= 7.1.2) + activejob (7.1.3) + activesupport (= 7.1.3) globalid (>= 0.3.6) - activemodel (7.1.2) - activesupport (= 7.1.2) - activerecord (7.1.2) - activemodel (= 7.1.2) - activesupport (= 7.1.2) + activemodel (7.1.3) + activesupport (= 7.1.3) + activerecord (7.1.3) + activemodel (= 7.1.3) + activesupport (= 7.1.3) timeout (>= 0.4.0) - activestorage (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activesupport (= 7.1.2) + activestorage (7.1.3) + actionpack (= 7.1.3) + activejob (= 7.1.3) + activerecord (= 7.1.3) + activesupport (= 7.1.3) marcel (~> 1.0) - activesupport (7.1.2) + activesupport (7.1.3) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -454,7 +454,7 @@ GEM uri net-http-persistent (4.0.2) connection_pool (~> 2.2) - net-imap (0.4.4) + net-imap (0.4.9.1) date net-protocol net-ldap (0.19.0) @@ -462,7 +462,7 @@ GEM net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.4.0.1) net-protocol nio4r (2.5.9) nokogiri (1.16.0) @@ -552,27 +552,27 @@ GEM rack rack-proxy (0.7.6) rack - rack-session (1.0.1) + rack-session (1.0.2) rack (< 3) rack-test (2.1.0) rack (>= 1.3) rackup (1.0.0) rack (< 3) webrick - rails (7.1.2) - actioncable (= 7.1.2) - actionmailbox (= 7.1.2) - actionmailer (= 7.1.2) - actionpack (= 7.1.2) - actiontext (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activemodel (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + rails (7.1.3) + actioncable (= 7.1.3) + actionmailbox (= 7.1.3) + actionmailer (= 7.1.3) + actionpack (= 7.1.3) + actiontext (= 7.1.3) + actionview (= 7.1.3) + activejob (= 7.1.3) + activemodel (= 7.1.3) + activerecord (= 7.1.3) + activestorage (= 7.1.3) + activesupport (= 7.1.3) bundler (>= 1.15.0) - railties (= 7.1.2) + railties (= 7.1.3) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -587,9 +587,9 @@ GEM rails-i18n (7.0.8) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + railties (7.1.3) + actionpack (= 7.1.3) + activesupport (= 7.1.3) irb rackup (>= 1.0.0) rake (>= 12.2) From 1b0cb3b54d1a1b08922527aefc8135d56d3a1a8d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 04:18:13 -0500 Subject: [PATCH 25/43] Announcement reactions query spec improvement and refactor (#28768) --- app/models/announcement.rb | 41 +++++++++++++++++++++++--------- spec/models/announcement_spec.rb | 23 ++++++++++++------ 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/app/models/announcement.rb b/app/models/announcement.rb index 86f7037a56a369..e630570020ea57 100644 --- a/app/models/announcement.rb +++ b/app/models/announcement.rb @@ -75,22 +75,41 @@ def emojis end def reactions(account = nil) - records = begin - scope = announcement_reactions.group(:announcement_id, :name, :custom_emoji_id).order(Arel.sql('MIN(created_at) ASC')) - - if account.nil? - scope.select('name, custom_emoji_id, count(*) as count, false as me') - else - scope.select("name, custom_emoji_id, count(*) as count, exists(select 1 from announcement_reactions r where r.account_id = #{account.id} and r.announcement_id = announcement_reactions.announcement_id and r.name = announcement_reactions.name) as me") + grouped_ordered_announcement_reactions.select( + [:name, :custom_emoji_id, 'COUNT(*) as count'].tap do |values| + values << value_for_reaction_me_column(account) end - end.to_a - - ActiveRecord::Associations::Preloader.new(records: records, associations: :custom_emoji).call - records + ).to_a.tap do |records| + ActiveRecord::Associations::Preloader.new(records: records, associations: :custom_emoji).call + end end private + def grouped_ordered_announcement_reactions + announcement_reactions + .group(:announcement_id, :name, :custom_emoji_id) + .order( + Arel.sql('MIN(created_at)').asc + ) + end + + def value_for_reaction_me_column(account) + if account.nil? + 'FALSE AS me' + else + <<~SQL.squish + EXISTS( + SELECT 1 + FROM announcement_reactions inner_reactions + WHERE inner_reactions.account_id = #{account.id} + AND inner_reactions.announcement_id = announcement_reactions.announcement_id + AND inner_reactions.name = announcement_reactions.name + ) AS me + SQL + end + end + def set_published return unless scheduled_at.blank? || scheduled_at.past? diff --git a/spec/models/announcement_spec.rb b/spec/models/announcement_spec.rb index 612ba8bb0de457..1e7283ca77090f 100644 --- a/spec/models/announcement_spec.rb +++ b/spec/models/announcement_spec.rb @@ -115,26 +115,35 @@ describe '#reactions' do context 'with announcement_reactions present' do + let(:account_reaction_emoji) { Fabricate :custom_emoji } + let(:other_reaction_emoji) { Fabricate :custom_emoji } let!(:account) { Fabricate(:account) } let!(:announcement) { Fabricate(:announcement) } - let!(:announcement_reaction) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 10.days.ago) } - let!(:announcement_reaction_account) { Fabricate(:announcement_reaction, announcement: announcement, created_at: 5.days.ago, account: account) } before do - Fabricate(:announcement_reaction) + Fabricate(:announcement_reaction, announcement: announcement, created_at: 10.days.ago, name: other_reaction_emoji.shortcode) + Fabricate(:announcement_reaction, announcement: announcement, created_at: 5.days.ago, account: account, name: account_reaction_emoji.shortcode) + Fabricate(:announcement_reaction) # For some other announcement end it 'returns the announcement reactions for the announcement' do results = announcement.reactions - expect(results.first.name).to eq(announcement_reaction.name) - expect(results.last.name).to eq(announcement_reaction_account.name) + expect(results).to have_attributes( + size: eq(2), + first: have_attributes(name: other_reaction_emoji.shortcode, me: false), + last: have_attributes(name: account_reaction_emoji.shortcode, me: false) + ) end - it 'returns the announcement reactions for the announcement limited to account' do + it 'returns the announcement reactions for the announcement with `me` set correctly' do results = announcement.reactions(account) - expect(results.first.name).to eq(announcement_reaction.name) + expect(results).to have_attributes( + size: eq(2), + first: have_attributes(name: other_reaction_emoji.shortcode, me: false), + last: have_attributes(name: account_reaction_emoji.shortcode, me: true) + ) end end end From c523a9601b40719f8f3efb6c66842544dd25656d Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 04:22:16 -0500 Subject: [PATCH 26/43] Rename local webpack* var in development env CSP config (#28766) --- config/initializers/content_security_policy.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index a8b61e356f01ab..e43e38786c471c 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -52,9 +52,9 @@ def sso_host if Rails.env.development? webpacker_public_host = ENV.fetch('WEBPACKER_DEV_SERVER_PUBLIC', Webpacker.config.dev_server[:public]) - webpacker_urls = %w(ws http).map { |protocol| "#{protocol}#{Webpacker.dev_server.https? ? 's' : ''}://#{webpacker_public_host}" } + front_end_build_urls = %w(ws http).map { |protocol| "#{protocol}#{Webpacker.dev_server.https? ? 's' : ''}://#{webpacker_public_host}" } - p.connect_src :self, :data, :blob, *media_hosts, Rails.configuration.x.streaming_api_base_url, *webpacker_urls + p.connect_src :self, :data, :blob, *media_hosts, Rails.configuration.x.streaming_api_base_url, *front_end_build_urls p.script_src :self, :unsafe_inline, :unsafe_eval, assets_host else p.connect_src :self, :data, :blob, *media_hosts, Rails.configuration.x.streaming_api_base_url From baab58c80b5e98c705e63cfb9d8c496269c58227 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 17 Jan 2024 11:42:47 +0100 Subject: [PATCH 27/43] Fix various icon alignment issues (#28775) --- app/javascript/styles/mastodon/components.scss | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 7f0f15f1133b3f..ab8939e1314078 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -1398,8 +1398,7 @@ body > [data-popper-placement] { .icon { width: 15px; height: 15px; - position: relative; - top: 0.145em; + vertical-align: middle; } } @@ -5544,6 +5543,10 @@ a.status-card { padding-inline-end: 10px; } + .icon { + vertical-align: middle; + } + .button { flex: 0 0 auto; } @@ -6170,6 +6173,7 @@ a.status-card { .icon { color: $dark-text-color; + vertical-align: middle; } } } From cb5ac15923332a198148756ebcaef78cb0eff10b Mon Sep 17 00:00:00 2001 From: Renaud Chaput Date: Wed, 17 Jan 2024 13:19:51 +0100 Subject: [PATCH 28/43] Use a helper to avoid using `media/` asset prefixes (#28756) --- app/helpers/mascot_helper.rb | 2 +- app/helpers/routing_helper.rb | 8 ++++++-- app/serializers/manifest_serializer.rb | 2 +- app/serializers/rest/instance_serializer.rb | 2 +- app/serializers/rest/v1/instance_serializer.rb | 2 +- app/views/application/mailer/_checklist.html.haml | 4 ++-- app/views/layouts/application.html.haml | 6 +++--- app/views/layouts/mailer.html.haml | 4 ++-- app/views/notification_mailer/favourite.html.haml | 2 +- app/views/notification_mailer/follow.html.haml | 2 +- app/views/notification_mailer/follow_request.html.haml | 2 +- app/views/notification_mailer/mention.html.haml | 2 +- app/views/notification_mailer/reblog.html.haml | 2 +- app/views/shared/_og.html.haml | 2 +- app/views/user_mailer/appeal_approved.html.haml | 2 +- app/views/user_mailer/appeal_rejected.html.haml | 2 +- app/views/user_mailer/backup_ready.html.haml | 2 +- app/views/user_mailer/confirmation_instructions.html.haml | 2 +- app/views/user_mailer/email_changed.html.haml | 2 +- app/views/user_mailer/password_change.html.haml | 2 +- .../user_mailer/reconfirmation_instructions.html.haml | 2 +- .../user_mailer/reset_password_instructions.html.haml | 2 +- app/views/user_mailer/suspicious_sign_in.html.haml | 2 +- app/views/user_mailer/two_factor_disabled.html.haml | 2 +- app/views/user_mailer/two_factor_enabled.html.haml | 2 +- .../two_factor_recovery_codes_changed.html.haml | 2 +- app/views/user_mailer/warning.html.haml | 2 +- app/views/user_mailer/webauthn_credential_added.html.haml | 2 +- .../user_mailer/webauthn_credential_deleted.html.haml | 2 +- app/views/user_mailer/webauthn_disabled.html.haml | 2 +- app/views/user_mailer/webauthn_enabled.html.haml | 2 +- 31 files changed, 40 insertions(+), 36 deletions(-) diff --git a/app/helpers/mascot_helper.rb b/app/helpers/mascot_helper.rb index 8ee04383ecea46..34b656411ebce3 100644 --- a/app/helpers/mascot_helper.rb +++ b/app/helpers/mascot_helper.rb @@ -2,7 +2,7 @@ module MascotHelper def mascot_url - full_asset_url(instance_presenter.mascot&.file&.url || asset_pack_path('media/images/elephant_ui_plane.svg')) + full_asset_url(instance_presenter.mascot&.file&.url || frontend_asset_path('images/elephant_ui_plane.svg')) end def instance_presenter diff --git a/app/helpers/routing_helper.rb b/app/helpers/routing_helper.rb index 2fb9ce72cbeb0e..15d988f64d2ef2 100644 --- a/app/helpers/routing_helper.rb +++ b/app/helpers/routing_helper.rb @@ -24,8 +24,12 @@ def asset_host Rails.configuration.action_controller.asset_host || root_url end - def full_pack_url(source, **options) - full_asset_url(asset_pack_path(source, **options)) + def frontend_asset_path(source, **options) + asset_pack_path("media/#{source}", **options) + end + + def frontend_asset_url(source, **options) + full_asset_url(frontend_asset_path(source, **options)) end def use_storage? diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb index 501bb788e7cdbe..1c1f7d0ad534a3 100644 --- a/app/serializers/manifest_serializer.rb +++ b/app/serializers/manifest_serializer.rb @@ -39,7 +39,7 @@ def short_name def icons ICON_SIZES.map do |size| { - src: full_pack_url("media/icons/android-chrome-#{size}x#{size}.png"), + src: frontend_asset_url("icons/android-chrome-#{size}x#{size}.png"), sizes: "#{size}x#{size}", type: 'image/png', purpose: 'any maskable', diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb index d7ed381e16b36c..fa926cd287227d 100644 --- a/app/serializers/rest/instance_serializer.rb +++ b/app/serializers/rest/instance_serializer.rb @@ -28,7 +28,7 @@ def thumbnail } else { - url: full_pack_url('media/images/preview.png'), + url: frontend_asset_url('images/preview.png'), } end end diff --git a/app/serializers/rest/v1/instance_serializer.rb b/app/serializers/rest/v1/instance_serializer.rb index 99d1b2bd62b75f..fdf939cfc34998 100644 --- a/app/serializers/rest/v1/instance_serializer.rb +++ b/app/serializers/rest/v1/instance_serializer.rb @@ -33,7 +33,7 @@ def contact_account end def thumbnail - instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url(:'@1x')) : full_pack_url('media/images/preview.png') + instance_presenter.thumbnail ? full_asset_url(instance_presenter.thumbnail.file.url(:'@1x')) : frontend_asset_url('images/preview.png') end def stats diff --git a/app/views/application/mailer/_checklist.html.haml b/app/views/application/mailer/_checklist.html.haml index 9ee96559398c43..83072bd36b04e2 100644 --- a/app/views/application/mailer/_checklist.html.haml +++ b/app/views/application/mailer/_checklist.html.haml @@ -11,9 +11,9 @@ %tr %td.email-checklist-icons-checkbox-td - if defined?(checked) && checked - = image_tag full_pack_url('media/images/mailer-new/welcome/checkbox-on.png'), alt: '', width: 20, height: 20 + = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-on.png'), alt: '', width: 20, height: 20 - else - = image_tag full_pack_url('media/images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 + = image_tag frontend_asset_url('images/mailer-new/welcome/checkbox-off.png'), alt: '', width: 20, height: 20 %td.email-checklist-icons-step-td - if defined?(step_image_url) = image_tag step_image_url, alt: '', width: 40, height: 40 diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 6f6b1825f6ce25..c7210736703a41 100755 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -14,12 +14,12 @@ %link{ rel: 'icon', href: '/favicon.ico', type: 'image/x-icon' }/ - %w(16 32 48).each do |size| - %link{ rel: 'icon', sizes: "#{size}x#{size}", href: asset_pack_path("media/icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/ + %link{ rel: 'icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/favicon-#{size}x#{size}.png"), type: 'image/png' }/ - %w(57 60 72 76 114 120 144 152 167 180 1024).each do |size| - %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: asset_pack_path("media/icons/apple-touch-icon-#{size}x#{size}.png") }/ + %link{ rel: 'apple-touch-icon', sizes: "#{size}x#{size}", href: frontend_asset_path("icons/apple-touch-icon-#{size}x#{size}.png") }/ - %link{ rel: 'mask-icon', href: asset_pack_path('media/images/logo-symbol-icon.svg'), color: '#6364FF' }/ + %link{ rel: 'mask-icon', href: frontend_asset_path('images/logo-symbol-icon.svg'), color: '#6364FF' }/ %link{ rel: 'manifest', href: manifest_path(format: :json) }/ %meta{ name: 'theme-color', content: '#191b22' }/ %meta{ name: 'apple-mobile-web-app-capable', content: 'yes' }/ diff --git a/app/views/layouts/mailer.html.haml b/app/views/layouts/mailer.html.haml index c0f9a0a5595e01..270f2b1e0cb32b 100644 --- a/app/views/layouts/mailer.html.haml +++ b/app/views/layouts/mailer.html.haml @@ -50,7 +50,7 @@ /[if mso] = link_to root_url, class: 'email-header-logo-a' do - = image_tag full_pack_url('media/images/mailer-new/common/logo-header.png'), alt: 'Mastodon', width: 157, height: 40 + = image_tag frontend_asset_url('images/mailer-new/common/logo-header.png'), alt: 'Mastodon', width: 157, height: 40 -# Heading = yield :heading @@ -75,7 +75,7 @@ %td.email-footer-td %p.email-footer-p = link_to root_url, class: 'email-footer-logo-a' do - = image_tag full_pack_url('media/images/mailer-new/common/logo-footer.png'), alt: 'Mastodon', width: 44, height: 44 + = image_tag frontend_asset_url('images/mailer-new/common/logo-footer.png'), alt: 'Mastodon', width: 44, height: 44 %p.email-footer-p = t 'about.hosted_on', domain: site_hostname %p.email-footer-p diff --git a/app/views/notification_mailer/favourite.html.haml b/app/views/notification_mailer/favourite.html.haml index 26bb31731a3ad5..62c0a39abe14f0 100644 --- a/app/views/notification_mailer/favourite.html.haml +++ b/app/views/notification_mailer/favourite.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('notification_mailer.favourite.title'), heading_subtitle: t('notification_mailer.favourite.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/favorite.png') + = render 'application/mailer/heading', heading_title: t('notification_mailer.favourite.title'), heading_subtitle: t('notification_mailer.favourite.body', name: @account.pretty_acct), heading_image_url: frontend_asset_url('images/mailer-new/heading/favorite.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml index 2f7ba0a9c53fbf..607cdb366698a1 100644 --- a/app/views/notification_mailer/follow.html.haml +++ b/app/views/notification_mailer/follow.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('notification_mailer.follow.title'), heading_subtitle: t('notification_mailer.follow.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/user.png') + = render 'application/mailer/heading', heading_title: t('notification_mailer.follow.title'), heading_subtitle: t('notification_mailer.follow.body', name: @account.pretty_acct), heading_image_url: frontend_asset_url('images/mailer-new/heading/user.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml index 275d0c5b0eba1a..12e3e2ee333de3 100644 --- a/app/views/notification_mailer/follow_request.html.haml +++ b/app/views/notification_mailer/follow_request.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('notification_mailer.follow_request.title'), heading_subtitle: t('notification_mailer.follow_request.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/follow.png') + = render 'application/mailer/heading', heading_title: t('notification_mailer.follow_request.title'), heading_subtitle: t('notification_mailer.follow_request.body', name: @account.pretty_acct), heading_image_url: frontend_asset_url('images/mailer-new/heading/follow.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/notification_mailer/mention.html.haml b/app/views/notification_mailer/mention.html.haml index 2420a42bf77a84..83fa5086a6b252 100644 --- a/app/views/notification_mailer/mention.html.haml +++ b/app/views/notification_mailer/mention.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('notification_mailer.mention.title'), heading_subtitle: t('notification_mailer.mention.body', name: @status.account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/mention.png') + = render 'application/mailer/heading', heading_title: t('notification_mailer.mention.title'), heading_subtitle: t('notification_mailer.mention.body', name: @status.account.pretty_acct), heading_image_url: frontend_asset_url('images/mailer-new/heading/mention.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/notification_mailer/reblog.html.haml b/app/views/notification_mailer/reblog.html.haml index b32c984708e9a8..f91c678cf535f2 100644 --- a/app/views/notification_mailer/reblog.html.haml +++ b/app/views/notification_mailer/reblog.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('notification_mailer.reblog.title'), heading_subtitle: t('notification_mailer.reblog.body', name: @account.pretty_acct), heading_image_url: full_pack_url('media/images/mailer-new/heading/boost.png') + = render 'application/mailer/heading', heading_title: t('notification_mailer.reblog.title'), heading_subtitle: t('notification_mailer.reblog.body', name: @account.pretty_acct), heading_image_url: frontend_asset_url('images/mailer-new/heading/boost.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/shared/_og.html.haml b/app/views/shared/_og.html.haml index 385351ee14aff4..d1e3cd9c6fe7e1 100644 --- a/app/views/shared/_og.html.haml +++ b/app/views/shared/_og.html.haml @@ -8,7 +8,7 @@ = opengraph 'og:type', 'website' = opengraph 'og:title', instance_presenter.title = opengraph 'og:description', description -= opengraph 'og:image', full_asset_url(thumbnail&.file&.url(:'@1x') || asset_pack_path('media/images/preview.png', protocol: :request)) += opengraph 'og:image', full_asset_url(thumbnail&.file&.url(:'@1x') || frontend_asset_path('images/preview.png')) = opengraph 'og:image:width', thumbnail ? thumbnail.meta['width'] : '1200' = opengraph 'og:image:height', thumbnail ? thumbnail.meta['height'] : '630' = opengraph 'twitter:card', 'summary_large_image' diff --git a/app/views/user_mailer/appeal_approved.html.haml b/app/views/user_mailer/appeal_approved.html.haml index 2cf62de39b85e8..54e9a94a544c16 100644 --- a/app/views/user_mailer/appeal_approved.html.haml +++ b/app/views/user_mailer/appeal_approved.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_approved.title'), heading_subtitle: t('user_mailer.appeal_approved.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/appeal-approved.png') + = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_approved.title'), heading_subtitle: t('user_mailer.appeal_approved.subtitle'), heading_image_url: frontend_asset_url('images/mailer-new/heading/appeal-approved.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/appeal_rejected.html.haml b/app/views/user_mailer/appeal_rejected.html.haml index c24cf7647fec6d..b493712b05cf56 100644 --- a/app/views/user_mailer/appeal_rejected.html.haml +++ b/app/views/user_mailer/appeal_rejected.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_rejected.title'), heading_subtitle: t('user_mailer.appeal_rejected.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/appeal-rejected.png') + = render 'application/mailer/heading', heading_title: t('user_mailer.appeal_rejected.title'), heading_subtitle: t('user_mailer.appeal_rejected.subtitle'), heading_image_url: frontend_asset_url('images/mailer-new/heading/appeal-rejected.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/backup_ready.html.haml b/app/views/user_mailer/backup_ready.html.haml index 4a1e7b1c657d14..99a48e7fdb4a3d 100644 --- a/app/views/user_mailer/backup_ready.html.haml +++ b/app/views/user_mailer/backup_ready.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.backup_ready.title'), heading_subtitle: t('user_mailer.backup_ready.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/archive.png') + = render 'application/mailer/heading', heading_title: t('user_mailer.backup_ready.title'), heading_subtitle: t('user_mailer.backup_ready.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/archive.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/confirmation_instructions.html.haml b/app/views/user_mailer/confirmation_instructions.html.haml index 4fd66d07916c74..74b2d49a4710fe 100644 --- a/app/views/user_mailer/confirmation_instructions.html.haml +++ b/app/views/user_mailer/confirmation_instructions.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.confirmation_instructions.title'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.confirmation_instructions.title'), heading_image_url: frontend_asset_url('images/mailer-new/heading/email.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/email_changed.html.haml b/app/views/user_mailer/email_changed.html.haml index 741c2bde18b9fd..71678ad029aead 100644 --- a/app/views/user_mailer/email_changed.html.haml +++ b/app/views/user_mailer/email_changed.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.email_changed.title'), heading_subtitle: t('devise.mailer.email_changed.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.email_changed.title'), heading_subtitle: t('devise.mailer.email_changed.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/email.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/password_change.html.haml b/app/views/user_mailer/password_change.html.haml index 08b4ecbbd650c3..44c8c0dcafb9b7 100644 --- a/app/views/user_mailer/password_change.html.haml +++ b/app/views/user_mailer/password_change.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.password_change.title'), heading_subtitle: t('devise.mailer.password_change.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/password.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.password_change.title'), heading_subtitle: t('devise.mailer.password_change.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/password.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/reconfirmation_instructions.html.haml b/app/views/user_mailer/reconfirmation_instructions.html.haml index 8aa2230151517e..854887a7e01ba0 100644 --- a/app/views/user_mailer/reconfirmation_instructions.html.haml +++ b/app/views/user_mailer/reconfirmation_instructions.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.reconfirmation_instructions.title'), heading_image_url: full_pack_url('media/images/mailer-new/heading/email.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.reconfirmation_instructions.title'), heading_image_url: frontend_asset_url('images/mailer-new/heading/email.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/reset_password_instructions.html.haml b/app/views/user_mailer/reset_password_instructions.html.haml index 0db79daaf10fec..a1384fcc270a6d 100644 --- a/app/views/user_mailer/reset_password_instructions.html.haml +++ b/app/views/user_mailer/reset_password_instructions.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.reset_password_instructions.title'), heading_subtitle: t('devise.mailer.reset_password_instructions.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/password.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.reset_password_instructions.title'), heading_subtitle: t('devise.mailer.reset_password_instructions.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/password.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/suspicious_sign_in.html.haml b/app/views/user_mailer/suspicious_sign_in.html.haml index e2cb916bfe7e29..deee7a1ce16db1 100644 --- a/app/views/user_mailer/suspicious_sign_in.html.haml +++ b/app/views/user_mailer/suspicious_sign_in.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('user_mailer.suspicious_sign_in.title'), heading_subtitle: t('user_mailer.suspicious_sign_in.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/login.png') + = render 'application/mailer/heading', heading_title: t('user_mailer.suspicious_sign_in.title'), heading_subtitle: t('user_mailer.suspicious_sign_in.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/login.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/two_factor_disabled.html.haml b/app/views/user_mailer/two_factor_disabled.html.haml index 0d8ff5c690f565..28f6ca66007bc8 100644 --- a/app/views/user_mailer/two_factor_disabled.html.haml +++ b/app/views/user_mailer/two_factor_disabled.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_disabled.title'), heading_subtitle: t('devise.mailer.two_factor_disabled.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-disabled.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_disabled.title'), heading_subtitle: t('devise.mailer.two_factor_disabled.subtitle'), heading_image_url: frontend_asset_url('images/mailer-new/heading/2fa-disabled.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/two_factor_enabled.html.haml b/app/views/user_mailer/two_factor_enabled.html.haml index 6fe03eab2b73b4..691dc661a09c5d 100644 --- a/app/views/user_mailer/two_factor_enabled.html.haml +++ b/app/views/user_mailer/two_factor_enabled.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_enabled.title'), heading_subtitle: t('devise.mailer.two_factor_enabled.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-enabled.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_enabled.title'), heading_subtitle: t('devise.mailer.two_factor_enabled.subtitle'), heading_image_url: frontend_asset_url('images/mailer-new/heading/2fa-enabled.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml index dff0620cefcc91..2d063e4c76919e 100644 --- a/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml +++ b/app/views/user_mailer/two_factor_recovery_codes_changed.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_recovery_codes_changed.title'), heading_subtitle: t('devise.mailer.two_factor_recovery_codes_changed.subtitle'), heading_image_url: full_pack_url('media/images/mailer-new/heading/2fa-recovery.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.two_factor_recovery_codes_changed.title'), heading_subtitle: t('devise.mailer.two_factor_recovery_codes_changed.subtitle'), heading_image_url: frontend_asset_url('images/mailer-new/heading/2fa-recovery.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/warning.html.haml b/app/views/user_mailer/warning.html.haml index 4dfbfc231d07c8..837cde550e5a4d 100644 --- a/app/views/user_mailer/warning.html.haml +++ b/app/views/user_mailer/warning.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t("user_mailer.warning.title.#{@warning.action}"), heading_image_url: full_pack_url('media/images/mailer-new/heading/warning.png') + = render 'application/mailer/heading', heading_title: t("user_mailer.warning.title.#{@warning.action}"), heading_image_url: frontend_asset_url('images/mailer-new/heading/warning.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/webauthn_credential_added.html.haml b/app/views/user_mailer/webauthn_credential_added.html.haml index 334eb3e32dd554..3e167662380884 100644 --- a/app/views/user_mailer/webauthn_credential_added.html.haml +++ b/app/views/user_mailer/webauthn_credential_added.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.added.title'), heading_subtitle: t('devise.mailer.webauthn_credential.added.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-added.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.added.title'), heading_subtitle: t('devise.mailer.webauthn_credential.added.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/key-added.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/webauthn_credential_deleted.html.haml b/app/views/user_mailer/webauthn_credential_deleted.html.haml index 5fad523b4e84d6..59dcb75d3a812e 100644 --- a/app/views/user_mailer/webauthn_credential_deleted.html.haml +++ b/app/views/user_mailer/webauthn_credential_deleted.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.deleted.title'), heading_subtitle: t('devise.mailer.webauthn_credential.deleted.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-deleted.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_credential.deleted.title'), heading_subtitle: t('devise.mailer.webauthn_credential.deleted.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/key-deleted.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/webauthn_disabled.html.haml b/app/views/user_mailer/webauthn_disabled.html.haml index 017412536261da..0f7c534bc4505e 100644 --- a/app/views/user_mailer/webauthn_disabled.html.haml +++ b/app/views/user_mailer/webauthn_disabled.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_disabled.title'), heading_subtitle: t('devise.mailer.webauthn_disabled.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-disabled.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_disabled.title'), heading_subtitle: t('devise.mailer.webauthn_disabled.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/key-disabled.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td diff --git a/app/views/user_mailer/webauthn_enabled.html.haml b/app/views/user_mailer/webauthn_enabled.html.haml index 3257d14df94d2c..cd11aa5a40fe97 100644 --- a/app/views/user_mailer/webauthn_enabled.html.haml +++ b/app/views/user_mailer/webauthn_enabled.html.haml @@ -1,5 +1,5 @@ = content_for :heading do - = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_enabled.title'), heading_subtitle: t('devise.mailer.webauthn_enabled.explanation'), heading_image_url: full_pack_url('media/images/mailer-new/heading/key-enabled.png') + = render 'application/mailer/heading', heading_title: t('devise.mailer.webauthn_enabled.title'), heading_subtitle: t('devise.mailer.webauthn_enabled.explanation'), heading_image_url: frontend_asset_url('images/mailer-new/heading/key-enabled.png') %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr %td.email-body-padding-td From 9a475ea8b32eed5ce163600d4747fe553bb7045e Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 08:38:37 -0500 Subject: [PATCH 29/43] Finish up the CLI spec area pattern adoption for `CLI::Accounts#refresh` specs (#28764) --- spec/lib/mastodon/cli/accounts_spec.rb | 254 +++++++++++-------------- 1 file changed, 109 insertions(+), 145 deletions(-) diff --git a/spec/lib/mastodon/cli/accounts_spec.rb b/spec/lib/mastodon/cli/accounts_spec.rb index 64df29ebb33330..26ad983bbced97 100644 --- a/spec/lib/mastodon/cli/accounts_spec.rb +++ b/spec/lib/mastodon/cli/accounts_spec.rb @@ -660,106 +660,69 @@ def latest_backup end describe '#refresh' do + let(:action) { :refresh } + context 'with --all option' do - let!(:local_account) { Fabricate(:account, domain: nil) } - let!(:remote_account_example_com) { Fabricate(:account, domain: 'example.com') } - let!(:account_example_net) { Fabricate(:account, domain: 'example.net') } - let(:scope) { Account.remote } + let(:options) { { all: true } } + let!(:local_account) { Fabricate(:account, domain: nil) } + let(:remote_com_avatar_url) { 'https://example.host/avatar/com' } + let(:remote_com_header_url) { 'https://example.host/header/com' } + let(:remote_account_example_com) { Fabricate(:account, domain: 'example.com', avatar_remote_url: remote_com_avatar_url, header_remote_url: remote_com_header_url) } + let(:remote_net_avatar_url) { 'https://example.host/avatar/net' } + let(:remote_net_header_url) { 'https://example.host/header/net' } + let(:account_example_net) { Fabricate(:account, domain: 'example.net', avatar_remote_url: remote_net_avatar_url, header_remote_url: remote_net_header_url) } + let(:scope) { Account.remote } before do - # TODO: we should be using `stub_parallelize_with_progress!` but - # this makes the assertions harder to write - allow(cli).to receive(:parallelize_with_progress).and_yield(remote_account_example_com) - .and_yield(account_example_net) - .and_return([2, nil]) - cli.options = { all: true } - end - - it 'refreshes the avatar for all remote accounts' do - allow(remote_account_example_com).to receive(:reset_avatar!) - allow(account_example_net).to receive(:reset_avatar!) - - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') - - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(remote_account_example_com).to have_received(:reset_avatar!).once - expect(account_example_net).to have_received(:reset_avatar!).once - end - - it 'does not refresh avatar for local accounts' do - allow(local_account).to receive(:reset_avatar!) - - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') - - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(local_account).to_not have_received(:reset_avatar!) - end - - it 'refreshes the header for all remote accounts' do - allow(remote_account_example_com).to receive(:reset_header!) - allow(account_example_net).to receive(:reset_header!) + stub_parallelize_with_progress! - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') + stub_request(:get, remote_com_avatar_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, remote_com_header_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, remote_net_avatar_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, remote_net_header_url) + .to_return request_fixture('avatar.txt') - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(remote_account_example_com).to have_received(:reset_header!).once - expect(account_example_net).to have_received(:reset_header!).once + remote_account_example_com + .update_column(:avatar_file_name, nil) + account_example_net + .update_column(:avatar_file_name, nil) end - it 'does not refresh the header for local accounts' do - allow(local_account).to receive(:reset_header!) - - expect { cli.refresh } + it 'refreshes the avatar and header for all remote accounts' do + expect { subject } .to output_results('Refreshed 2 accounts') + .and not_change(local_account, :updated_at) - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(local_account).to_not have_received(:reset_header!) - end - - it 'displays a successful message' do - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') + # One request from factory creation, one more from task + expect(a_request(:get, remote_com_avatar_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, remote_com_header_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, remote_net_avatar_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, remote_net_header_url)) + .to have_been_made.at_least_times(2) end context 'with --dry-run option' do - before do - cli.options = { all: true, dry_run: true } - end - - it 'does not refresh the avatar for any account' do - allow(local_account).to receive(:reset_avatar!) - allow(remote_account_example_com).to receive(:reset_avatar!) - allow(account_example_net).to receive(:reset_avatar!) - - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') - - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(local_account).to_not have_received(:reset_avatar!) - expect(remote_account_example_com).to_not have_received(:reset_avatar!) - expect(account_example_net).to_not have_received(:reset_avatar!) - end - - it 'does not refresh the header for any account' do - allow(local_account).to receive(:reset_header!) - allow(remote_account_example_com).to receive(:reset_header!) - allow(account_example_net).to receive(:reset_header!) + let(:options) { { all: true, dry_run: true } } - expect { cli.refresh } + it 'does not refresh the avatar or header for any account' do + expect { subject } .to output_results('Refreshed 2 accounts') - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(local_account).to_not have_received(:reset_header!) - expect(remote_account_example_com).to_not have_received(:reset_header!) - expect(account_example_net).to_not have_received(:reset_header!) - end - - it 'displays a successful message with (DRY RUN)' do - expect { cli.refresh } - .to output_results('Refreshed 2 accounts (DRY RUN)') + # One request from factory creation, none from task due to dry run + expect(a_request(:get, remote_com_avatar_url)) + .to have_been_made.once + expect(a_request(:get, remote_com_header_url)) + .to have_been_made.once + expect(a_request(:get, remote_net_avatar_url)) + .to have_been_made.once + expect(a_request(:get, remote_net_header_url)) + .to have_been_made.once end end end @@ -782,7 +745,7 @@ def latest_backup allow(account_example_com_a).to receive(:reset_avatar!) allow(account_example_com_b).to receive(:reset_avatar!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK') expect(account_example_com_a).to have_received(:reset_avatar!).once @@ -792,7 +755,7 @@ def latest_backup it 'does not reset the avatar for unspecified accounts' do allow(account_example_net).to receive(:reset_avatar!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK') expect(account_example_net).to_not have_received(:reset_avatar!) @@ -802,7 +765,7 @@ def latest_backup allow(account_example_com_a).to receive(:reset_header!) allow(account_example_com_b).to receive(:reset_header!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK') expect(account_example_com_a).to have_received(:reset_header!).once @@ -812,7 +775,7 @@ def latest_backup it 'does not reset the header for unspecified accounts' do allow(account_example_net).to receive(:reset_header!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK') expect(account_example_net).to_not have_received(:reset_header!) @@ -822,7 +785,7 @@ def latest_backup it 'displays a failure message' do allow(account_example_com_a).to receive(:reset_avatar!).and_raise(Mastodon::UnexpectedResponseError) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results("Account failed: #{account_example_com_a.username}@#{account_example_com_a.domain}") end end @@ -831,22 +794,20 @@ def latest_backup it 'exits with an error message' do allow(Account).to receive(:find_remote).with(account_example_com_b.username, account_example_com_b.domain).and_return(nil) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('No such account') .and raise_error(SystemExit) end end context 'with --dry-run option' do - before do - cli.options = { dry_run: true } - end + let(:options) { { dry_run: true } } it 'does not refresh the avatar for any account' do allow(account_example_com_a).to receive(:reset_avatar!) allow(account_example_com_b).to receive(:reset_avatar!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK (DRY RUN)') expect(account_example_com_a).to_not have_received(:reset_avatar!) @@ -857,7 +818,7 @@ def latest_backup allow(account_example_com_a).to receive(:reset_header!) allow(account_example_com_b).to receive(:reset_header!) - expect { cli.refresh(*arguments) } + expect { subject } .to output_results('OK (DRY RUN)') expect(account_example_com_a).to_not have_received(:reset_header!) @@ -867,67 +828,70 @@ def latest_backup end context 'with --domain option' do - let!(:account_example_com_a) { Fabricate(:account, domain: 'example.com') } - let!(:account_example_com_b) { Fabricate(:account, domain: 'example.com') } - let!(:account_example_net) { Fabricate(:account, domain: 'example.net') } - let(:domain) { 'example.com' } - let(:scope) { Account.remote.where(domain: domain) } + let(:domain) { 'example.com' } + let(:options) { { domain: domain } } - before do - allow(cli).to receive(:parallelize_with_progress).and_yield(account_example_com_a) - .and_yield(account_example_com_b) - .and_return([2, nil]) - cli.options = { domain: domain } - end - - it 'refreshes the avatar for all accounts on specified domain' do - allow(account_example_com_a).to receive(:reset_avatar!) - allow(account_example_com_b).to receive(:reset_avatar!) - - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') + let(:com_a_avatar_url) { 'https://example.host/avatar/a' } + let(:com_a_header_url) { 'https://example.host/header/a' } + let(:account_example_com_a) { Fabricate(:account, domain: domain, avatar_remote_url: com_a_avatar_url, header_remote_url: com_a_header_url) } - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(account_example_com_a).to have_received(:reset_avatar!).once - expect(account_example_com_b).to have_received(:reset_avatar!).once - end + let(:com_b_avatar_url) { 'https://example.host/avatar/b' } + let(:com_b_header_url) { 'https://example.host/header/b' } + let(:account_example_com_b) { Fabricate(:account, domain: domain, avatar_remote_url: com_b_avatar_url, header_remote_url: com_b_header_url) } - it 'does not refresh the avatar for accounts outside specified domain' do - allow(account_example_net).to receive(:reset_avatar!) + let(:net_avatar_url) { 'https://example.host/avatar/net' } + let(:net_header_url) { 'https://example.host/header/net' } + let(:account_example_net) { Fabricate(:account, domain: 'example.net', avatar_remote_url: net_avatar_url, header_remote_url: net_header_url) } - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') - - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(account_example_net).to_not have_received(:reset_avatar!) - end - - it 'refreshes the header for all accounts on specified domain' do - allow(account_example_com_a).to receive(:reset_header!) - allow(account_example_com_b).to receive(:reset_header!) - - expect { cli.refresh } - .to output_results('Refreshed 2 accounts') - - expect(cli).to have_received(:parallelize_with_progress).with(scope) - expect(account_example_com_a).to have_received(:reset_header!).once - expect(account_example_com_b).to have_received(:reset_header!).once - end - - it 'does not refresh the header for accounts outside specified domain' do - allow(account_example_net).to receive(:reset_header!) + before do + stub_parallelize_with_progress! - expect { cli.refresh } + stub_request(:get, com_a_avatar_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, com_a_header_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, com_b_avatar_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, com_b_header_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, net_avatar_url) + .to_return request_fixture('avatar.txt') + stub_request(:get, net_header_url) + .to_return request_fixture('avatar.txt') + + account_example_com_a + .update_column(:avatar_file_name, nil) + account_example_com_b + .update_column(:avatar_file_name, nil) + account_example_net + .update_column(:avatar_file_name, nil) + end + + it 'refreshes the avatar and header for all accounts on specified domain' do + expect { subject } .to output_results('Refreshed 2 accounts') - expect(cli).to have_received(:parallelize_with_progress).with(scope).once - expect(account_example_net).to_not have_received(:reset_header!) + # One request from factory creation, one more from task + expect(a_request(:get, com_a_avatar_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, com_a_header_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, com_b_avatar_url)) + .to have_been_made.at_least_times(2) + expect(a_request(:get, com_b_header_url)) + .to have_been_made.at_least_times(2) + + # One request from factory creation, none from task + expect(a_request(:get, net_avatar_url)) + .to have_been_made.once + expect(a_request(:get, net_header_url)) + .to have_been_made.once end end context 'when neither a list of accts nor options are provided' do it 'exits with an error message' do - expect { cli.refresh } + expect { subject } .to output_results('No account(s) given') .and raise_error(SystemExit) end From 1ab42ad12b3bbc9e17607f6c6deea8ad722bb9fb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:23:14 +0100 Subject: [PATCH 30/43] New Crowdin Translations (automated) (#28749) Co-authored-by: GitHub Actions --- app/javascript/mastodon/locales/fo.json | 10 ++++++ app/javascript/mastodon/locales/gl.json | 30 ++++++++--------- app/javascript/mastodon/locales/ia.json | 7 ++++ app/javascript/mastodon/locales/lt.json | 44 ++++++++++++------------- config/locales/an.yml | 2 -- config/locales/ar.yml | 2 -- config/locales/be.yml | 2 -- config/locales/bg.yml | 8 +++-- config/locales/br.yml | 5 +++ config/locales/ca.yml | 8 +++-- config/locales/ckb.yml | 1 - config/locales/co.yml | 1 - config/locales/cs.yml | 2 -- config/locales/cy.yml | 14 +++++--- config/locales/da.yml | 8 +++-- config/locales/de.yml | 10 ++++-- config/locales/devise.an.yml | 4 --- config/locales/devise.ar.yml | 4 --- config/locales/devise.ast.yml | 4 --- config/locales/devise.be.yml | 4 --- config/locales/devise.bg.yml | 23 ++++++++----- config/locales/devise.bn.yml | 2 -- config/locales/devise.br.yml | 4 --- config/locales/devise.ca.yml | 13 +++++--- config/locales/devise.ckb.yml | 4 --- config/locales/devise.co.yml | 4 --- config/locales/devise.cs.yml | 4 --- config/locales/devise.cy.yml | 13 +++++--- config/locales/devise.da.yml | 13 +++++--- config/locales/devise.de.yml | 13 +++++--- config/locales/devise.el.yml | 13 +++++--- config/locales/devise.en-GB.yml | 4 --- config/locales/devise.eo.yml | 4 --- config/locales/devise.es-AR.yml | 13 +++++--- config/locales/devise.es-MX.yml | 13 +++++--- config/locales/devise.es.yml | 13 +++++--- config/locales/devise.et.yml | 13 +++++--- config/locales/devise.eu.yml | 13 +++++--- config/locales/devise.fa.yml | 4 --- config/locales/devise.fi.yml | 4 --- config/locales/devise.fo.yml | 13 +++++--- config/locales/devise.fr-CA.yml | 9 ++--- config/locales/devise.fr.yml | 9 ++--- config/locales/devise.fy.yml | 13 +++++--- config/locales/devise.gd.yml | 4 --- config/locales/devise.gl.yml | 13 +++++--- config/locales/devise.he.yml | 13 +++++--- config/locales/devise.hu.yml | 4 --- config/locales/devise.hy.yml | 4 --- config/locales/devise.id.yml | 4 --- config/locales/devise.ie.yml | 11 ++++--- config/locales/devise.io.yml | 4 --- config/locales/devise.is.yml | 13 +++++--- config/locales/devise.it.yml | 13 +++++--- config/locales/devise.ja.yml | 13 +++++--- config/locales/devise.kab.yml | 2 -- config/locales/devise.kk.yml | 2 -- config/locales/devise.ko.yml | 4 --- config/locales/devise.ku.yml | 4 --- config/locales/devise.lad.yml | 5 +-- config/locales/devise.lt.yml | 13 +++++--- config/locales/devise.lv.yml | 4 --- config/locales/devise.ms.yml | 4 --- config/locales/devise.my.yml | 4 --- config/locales/devise.nl.yml | 13 +++++--- config/locales/devise.nn.yml | 4 --- config/locales/devise.no.yml | 4 --- config/locales/devise.oc.yml | 4 --- config/locales/devise.pl.yml | 13 +++++--- config/locales/devise.pt-BR.yml | 11 ++++--- config/locales/devise.pt-PT.yml | 13 +++++--- config/locales/devise.ro.yml | 4 --- config/locales/devise.ru.yml | 4 --- config/locales/devise.sc.yml | 4 --- config/locales/devise.sco.yml | 4 --- config/locales/devise.si.yml | 4 --- config/locales/devise.sk.yml | 6 ++-- config/locales/devise.sl.yml | 4 --- config/locales/devise.sq.yml | 4 --- config/locales/devise.sr-Latn.yml | 13 +++++--- config/locales/devise.sr.yml | 13 +++++--- config/locales/devise.sv.yml | 10 +++--- config/locales/devise.ta.yml | 2 -- config/locales/devise.th.yml | 4 --- config/locales/devise.tr.yml | 13 +++++--- config/locales/devise.uk.yml | 4 --- config/locales/devise.vi.yml | 13 +++++--- config/locales/devise.zh-CN.yml | 13 +++++--- config/locales/devise.zh-HK.yml | 13 +++++--- config/locales/devise.zh-TW.yml | 13 +++++--- config/locales/el.yml | 8 +++-- config/locales/en-GB.yml | 2 -- config/locales/eo.yml | 2 -- config/locales/es-AR.yml | 8 +++-- config/locales/es-MX.yml | 8 +++-- config/locales/es.yml | 8 +++-- config/locales/et.yml | 8 +++-- config/locales/eu.yml | 8 +++-- config/locales/fa.yml | 2 -- config/locales/fi.yml | 2 -- config/locales/fo.yml | 9 +++-- config/locales/fr-CA.yml | 8 +++-- config/locales/fr.yml | 8 +++-- config/locales/fy.yml | 8 +++-- config/locales/gd.yml | 2 -- config/locales/gl.yml | 8 +++-- config/locales/he.yml | 8 +++-- config/locales/hu.yml | 2 -- config/locales/ia.yml | 2 -- config/locales/id.yml | 2 -- config/locales/ie.yml | 7 ++-- config/locales/io.yml | 2 -- config/locales/is.yml | 8 +++-- config/locales/it.yml | 8 +++-- config/locales/ja.yml | 8 +++-- config/locales/ka.yml | 1 - config/locales/kab.yml | 2 -- config/locales/kk.yml | 1 - config/locales/ko.yml | 4 +-- config/locales/ku.yml | 2 -- config/locales/lad.yml | 5 +-- config/locales/lt.yml | 9 ++++- config/locales/lv.yml | 2 -- config/locales/ms.yml | 2 -- config/locales/my.yml | 2 -- config/locales/nl.yml | 8 +++-- config/locales/nn.yml | 2 -- config/locales/no.yml | 2 -- config/locales/oc.yml | 3 -- config/locales/pl.yml | 8 +++-- config/locales/pt-BR.yml | 7 ++-- config/locales/pt-PT.yml | 8 +++-- config/locales/ro.yml | 1 - config/locales/ru.yml | 2 -- config/locales/sc.yml | 1 - config/locales/sco.yml | 2 -- config/locales/si.yml | 2 -- config/locales/sk.yml | 8 +++-- config/locales/sl.yml | 8 +++-- config/locales/sq.yml | 2 -- config/locales/sr-Latn.yml | 8 +++-- config/locales/sr.yml | 8 +++-- config/locales/sv.yml | 8 +++-- config/locales/th.yml | 2 -- config/locales/tr.yml | 8 +++-- config/locales/uk.yml | 4 +-- config/locales/vi.yml | 8 +++-- config/locales/zh-CN.yml | 8 +++-- config/locales/zh-HK.yml | 8 +++-- config/locales/zh-TW.yml | 8 +++-- 150 files changed, 585 insertions(+), 471 deletions(-) diff --git a/app/javascript/mastodon/locales/fo.json b/app/javascript/mastodon/locales/fo.json index 9259f201540513..94d13e8d910a1e 100644 --- a/app/javascript/mastodon/locales/fo.json +++ b/app/javascript/mastodon/locales/fo.json @@ -393,6 +393,7 @@ "lists.search": "Leita millum fólk, sum tú fylgir", "lists.subheading": "Tínir listar", "load_pending": "{count, plural, one {# nýtt evni} other {# nýggj evni}}", + "loading_indicator.label": "Innlesur…", "media_gallery.toggle_visible": "{number, plural, one {Fjal mynd} other {Fjal myndir}}", "moved_to_account_banner.text": "Konta tín {disabledAccount} er í løtuni óvirkin, tí tú flutti til {movedToAccount}.", "mute_modal.duration": "Tíðarbil", @@ -483,6 +484,15 @@ "onboarding.follows.title": "Vælumtókt á Mastodon", "onboarding.profile.discoverable": "Ger tað møguligt hjá øðrum at finna vangan hjá mær", "onboarding.profile.discoverable_hint": "Tá tú játtar at onnur skulu kunna finna teg á Mastodon, so kann henda, at postar tínir síggjast í leitiúrslitum og rákum, og vangin hjá tær kann vera skotin upp fyri fólki við áhugamálum sum minna um tíni.", + "onboarding.profile.display_name": "Navn, sum skal vísast", + "onboarding.profile.display_name_hint": "Títt fulla navn ella títt stuttliga navn…", + "onboarding.profile.lead": "Tú kanst altíð gera hetta liðugt seinni í stillingunum, har enn fleiri tillagingarmøguleikar eru tøkir.", + "onboarding.profile.note": "Ævilýsing", + "onboarding.profile.note_hint": "Tú kanst @umrøða onnur fólk ella #frámerki…", + "onboarding.profile.save_and_continue": "Goym og halt fram", + "onboarding.profile.title": "Vangauppsetan", + "onboarding.profile.upload_avatar": "Legg vangamynd upp", + "onboarding.profile.upload_header": "Legg vangahøvd upp", "onboarding.share.lead": "Lat fólk vita, hvussu tey kunnu finna teg á Mastodon!", "onboarding.share.message": "Eg eri {username} á #Mastodon! Kom og fylg mær á {url}", "onboarding.share.next_steps": "Møgulig næstu stig:", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 48bbb6b3077fa9..e857b6955421b2 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -20,7 +20,7 @@ "account.block_short": "Bloquear", "account.blocked": "Bloqueada", "account.browse_more_on_origin_server": "Busca máis no perfil orixinal", - "account.cancel_follow_request": "Cancelar a solicitude de seguimento", + "account.cancel_follow_request": "Desbotar a solicitude de seguimento", "account.copy": "Copiar ligazón ao perfil", "account.direct": "Mencionar de xeito privado a @{name}", "account.disable_notifications": "Deixar de notificarme cando @{name} publica", @@ -184,7 +184,7 @@ "confirmations.mute.explanation": "Isto agochará as súas publicacións ou as que a mencionen, mais poderá ler as túas publicacións e ser seguidora túa.", "confirmations.mute.message": "Tes a certeza de querer acalar a {name}?", "confirmations.redraft.confirm": "Eliminar e reescribir", - "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as comparticións e favoritas, e as respostas á publicación orixinal ficarán orfas.", + "confirmations.redraft.message": "Tes a certeza de querer eliminar esta publicación e reescribila? Perderás as promocións e favorecementos, e as respostas á publicación orixinal ficarán orfas.", "confirmations.reply.confirm": "Responder", "confirmations.reply.message": "Ao responder sobrescribirás a mensaxe que estás a compor. Tes a certeza de que queres continuar?", "confirmations.unfollow.confirm": "Deixar de seguir", @@ -204,7 +204,7 @@ "disabled_account_banner.text": "Actualmente a túa conta {disabledAccount} está desactivada.", "dismissable_banner.community_timeline": "Estas son as publicacións máis recentes das persoas que teñen a súa conta en {domain}.", "dismissable_banner.dismiss": "Desbotar", - "dismissable_banner.explore_links": "As persoas deste servidor e da rede descentralizada están a falar destas historias agora mesmo.", + "dismissable_banner.explore_links": "Estas son as novas historias más compartidas hoxe na web social. Aparecen primeiro as novas compartidas por máis persoas diferentes.", "dismissable_banner.explore_statuses": "Estas son as publicacións da web social que hoxe están gañando popularidade. As publicacións con máis promocións e favorecemento teñen puntuación máis alta.", "dismissable_banner.explore_tags": "Estes cancelos están gañando popularidade entre as persoas deste servidor e noutros servidores da rede descentralizada.", "dismissable_banner.public_timeline": "Estas son as publicacións públicas máis recentes das persoas que as usuarias de {domain} están a seguir.", @@ -240,7 +240,7 @@ "empty_column.follow_requests": "Non tes peticións de seguimento. Cando recibas unha, amosarase aquí.", "empty_column.followed_tags": "Aínda non seguiches ningún cancelo. Cando o fagas aparecerán aquí.", "empty_column.hashtag": "Aínda non hai nada con este cancelo.", - "empty_column.home": "A túa cronoloxía inicial está baleira! Segue a outras usuarias para enchela. {suggestions}", + "empty_column.home": "A túa cronoloxía inicial está baleira! Sigue a outras usuarias para enchela.", "empty_column.list": "Aínda non hai nada nesta listaxe. Cando as usuarias incluídas na listaxe publiquen mensaxes, amosaranse aquí.", "empty_column.lists": "Aínda non tes listaxes. Cando crees unha, amosarase aquí.", "empty_column.mutes": "Aínda non silenciaches a ningúnha usuaria.", @@ -346,7 +346,7 @@ "keyboard_shortcuts.down": "Para mover cara abaixo na listaxe", "keyboard_shortcuts.enter": "Para abrir publicación", "keyboard_shortcuts.favourite": "Marcar como favorita", - "keyboard_shortcuts.favourites": "Para abrir a listaxe das favoritas", + "keyboard_shortcuts.favourites": "Para abrir a lista das favoritas", "keyboard_shortcuts.federated": "Para abrir a cronoloxía federada", "keyboard_shortcuts.heading": "Atallos do teclado", "keyboard_shortcuts.home": "Para abrir a cronoloxía inicial", @@ -383,7 +383,7 @@ "lists.delete": "Eliminar listaxe", "lists.edit": "Editar listaxe", "lists.edit.submit": "Mudar o título", - "lists.exclusive": "Agocha estas publicacións no inicio", + "lists.exclusive": "Agocha estas publicacións no Inicio", "lists.new.create": "Engadir listaxe", "lists.new.title_placeholder": "Título da nova listaxe", "lists.replies_policy.followed": "Toda usuaria seguida", @@ -480,8 +480,8 @@ "onboarding.actions.go_to_home": "Vai á cronoloxía de inicio", "onboarding.compose.template": "Ola #Mastodon!", "onboarding.follows.empty": "Desgraciadamente agora mesmo non hai nada que mostrar. Podes intentalo coa busca ou na páxina descubrir para atopar persoas ás que seguir, ou intentalo máis tarde.", - "onboarding.follows.lead": "Podes facer que a túa cronoloxía de inicio sexa como ti a queres. Canta máis xente sigas máis interesante será. Estes perfís poderían axudarche a comezar —sempre poderás deixar de seguilos despois!", - "onboarding.follows.title": "Popular en Mastodon", + "onboarding.follows.lead": "A cronoloxía de Inicio é o principal xeito de desfrutar Mastodon. Cantas máis persoas sigas mais interesante e activa será. Para comezar, aquí tes algunhas suxestións:", + "onboarding.follows.title": "Personaliza a cronoloxía de inicio", "onboarding.profile.discoverable": "Que o meu perfil se poida atopar", "onboarding.profile.discoverable_hint": "Cando elixes que poidan atoparte en Mastodon as túas publicacións aparecerán nos resultados das buscas e nos temas en voga, e o teu perfil podería ser suxerido para seguimento a persoas con intereses semellantes aos teus.", "onboarding.profile.display_name": "Nome público", @@ -494,20 +494,20 @@ "onboarding.profile.upload_avatar": "Subir imaxe do perfil", "onboarding.profile.upload_header": "Subir cabeceira para o perfil", "onboarding.share.lead": "Fai que as persoas saiban como atoparte en Mastodon!", - "onboarding.share.message": "Son {username} en #Mastodon! Ségueme en {url}", + "onboarding.share.message": "Son {username} en #Mastodon! Sígueme en {url}", "onboarding.share.next_steps": "Seguintes pasos:", "onboarding.share.title": "Comparte o teu perfil", - "onboarding.start.lead": "A túa nova conta en Mastodon está preparada. Mira de que xeito lle podes sacar proveito:", + "onboarding.start.lead": "Xa formas parte de Mastodon, unha plataforma de relacións sociais descentralizada, única, onde ti —e non un algoritmo— elixes o que les. Axudámosche cos primeiros pasos:", "onboarding.start.skip": "Queres omitir todo isto?", "onboarding.start.title": "Pois xa está!", - "onboarding.steps.follow_people.body": "Constrúes a túa cronoloxía. Énchea con persoas interesantes.", - "onboarding.steps.follow_people.title": "Segue a {count, plural, one {unha persoa} other {# persoas}}", - "onboarding.steps.publish_status.body": "Saúda a todo o mundo.", + "onboarding.steps.follow_people.body": "Mastodon consiste en seguir a persoas interesantes.", + "onboarding.steps.follow_people.title": "Personaliza a túa cronoloxía", + "onboarding.steps.publish_status.body": "Exprésate con texto, fotos, vídeos ou enquisas {emoji}", "onboarding.steps.publish_status.title": "Escribe a túa primeira publicación", "onboarding.steps.setup_profile.body": "Ao engadir información ao teu perfil é máis probable que teñas máis interaccións.", "onboarding.steps.setup_profile.title": "Personaliza o perfil", "onboarding.steps.share_profile.body": "Dille ás amizades como poden atoparte en Mastodon!", - "onboarding.steps.share_profile.title": "Comparte o teu perfil", + "onboarding.steps.share_profile.title": "Comparte o teu perfil en Mastodon", "onboarding.tips.2fa": "Sabes que? Podes protexer a túa conta configurando un segundo factor de autenticación nos axustes. Funciona con calquera app TOTP, non precisas un número de teléfono!", "onboarding.tips.accounts_from_other_servers": "Sabes que? Como Mastodon é descentralizado, algúns perfís que atopes estarán en servidores diferentes ao teu. Pero podes interactuar igualmente con eles! O seu servidor é o que ven despois da @ no seu identificador!", "onboarding.tips.migration": "Sabes que? Se cres que {domain} non é o servidor axeitado para ti, podes mover a conta a outro servidor Mastodon sen perder as túas seguidoras. Incluso podes hospedar o teu propio servidor!", @@ -573,7 +573,7 @@ "report.reasons.dislike": "Non me gusta", "report.reasons.dislike_description": "Non é algo que queiras ver", "report.reasons.legal": "É ilegal", - "report.reasons.legal_description": "Cres que atenta contra as leis do país do teu servidor", + "report.reasons.legal_description": "Cres que atenta contra as leis do país do teu pais ou servidor", "report.reasons.other": "É outra cousa", "report.reasons.other_description": "O problema non cae dentro de outras categorías", "report.reasons.spam": "É spam", diff --git a/app/javascript/mastodon/locales/ia.json b/app/javascript/mastodon/locales/ia.json index e790306e9cab62..a660eb77ff592b 100644 --- a/app/javascript/mastodon/locales/ia.json +++ b/app/javascript/mastodon/locales/ia.json @@ -9,14 +9,20 @@ "account.block": "Blocar @{name}", "account.block_short": "Blocar", "account.blocked": "Blocate", + "account.browse_more_on_origin_server": "Navigar plus sur le profilo original", "account.copy": "Copiar ligamine a profilo", + "account.domain_blocked": "Dominio blocate", "account.edit_profile": "Modificar profilo", + "account.enable_notifications": "Notifica me quando @{name} publica", "account.endorse": "Evidentiar sur le profilo", "account.featured_tags.last_status_at": "Ultime message in {date}", "account.featured_tags.last_status_never": "Necun messages", + "account.featured_tags.title": "Hashtags eminente de {name}", "account.follow": "Sequer", "account.follow_back": "Sequer etiam", "account.followers": "Sequitores", + "account.followers.empty": "Iste usator ancora non ha sequitores.", + "account.followers_counter": "{count, plural, one {{counter} sequitor} other {{counter} sequitores}}", "account.following": "Sequente", "account.go_to_profile": "Vader al profilo", "account.hide_reblogs": "Celar boosts de @{name}", @@ -30,6 +36,7 @@ "account.mute_short": "Silentiar", "account.muted": "Silentiate", "account.no_bio": "Nulle description fornite.", + "account.open_original_page": "Aperir le pagina original", "account.posts": "Messages", "account.posts_with_replies": "Messages e responsas", "account.share": "Compartir profilo de @{name}", diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json index ec0d30363c7f5b..623ff2248f9ae5 100644 --- a/app/javascript/mastodon/locales/lt.json +++ b/app/javascript/mastodon/locales/lt.json @@ -9,7 +9,7 @@ "about.domain_blocks.suspended.explanation": "Jokie duomenys iš šio serverio nebus apdorojami, saugomi ar keičiami, todėl bet kokia sąveika ar bendravimas su šio serverio naudotojais bus neįmanomas.", "about.domain_blocks.suspended.title": "Uždrausta", "about.not_available": "Ši informacija nebuvo pateikta šiame serveryje.", - "about.powered_by": "Decentralizuota socialinė žiniasklaida, kurią valdo {mastodon}", + "about.powered_by": "Decentralizuota socialinė medija, kurią valdo {mastodon}", "about.rules": "Serverio taisyklės", "account.account_note_header": "Pastaba", "account.add_or_remove_from_list": "Pridėti arba ištrinti iš sąrašų", @@ -27,24 +27,24 @@ "account.domain_blocked": "Užblokuotas domenas", "account.edit_profile": "Redaguoti profilį", "account.enable_notifications": "Pranešti man, kai @{name} paskelbia", - "account.endorse": "Savybė profilyje", + "account.endorse": "Rekomenduoti profilyje", "account.featured_tags.last_status_at": "Paskutinį kartą paskelbta {date}", "account.featured_tags.last_status_never": "Nėra įrašų", - "account.featured_tags.title": "{name} rekomenduojamos grotažymės", + "account.featured_tags.title": "{name} rekomenduojami saitažodžiai", "account.follow": "Sekti", "account.follow_back": "Sekti atgal", "account.followers": "Sekėjai", "account.followers.empty": "Šio naudotojo dar niekas neseka.", "account.followers_counter": "{count, plural, one {{counter} sekėjas} few {{counter} sekėjai} many {{counter} sekėjo} other {{counter} sekėjų}}", - "account.following": "Seka", - "account.following_counter": "{count, plural, one {{counter} Seka} few {{counter} Seka} many {{counter} Seka} other {{counter} Seka}}", + "account.following": "Sekama", + "account.following_counter": "{count, plural, one {{counter} sekimas} few {{counter} sekimai} many {{counter} sekimo} other {{counter} sekimų}}", "account.follows.empty": "Šis (-i) naudotojas (-a) dar nieko neseka.", "account.go_to_profile": "Eiti į profilį", "account.hide_reblogs": "Slėpti pakėlimus iš @{name}", "account.in_memoriam": "Atminimui.", "account.joined_short": "Prisijungė", "account.languages": "Keisti prenumeruojamas kalbas", - "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}", + "account.link_verified_on": "Šios nuorodos nuosavybė buvo patikrinta {date}.", "account.locked_info": "Šios paskyros privatumo būsena nustatyta kaip užrakinta. Savininkas (-ė) rankiniu būdu peržiūri, kas gali sekti.", "account.media": "Medija", "account.mention": "Paminėti @{name}", @@ -58,8 +58,8 @@ "account.open_original_page": "Atidaryti originalinį puslapį", "account.posts": "Įrašai", "account.posts_with_replies": "Įrašai ir atsakymai", - "account.report": "Pranešti @{name}", - "account.requested": "Laukiama patvirtinimo. Spausk, kad atšaukti sekimo užklausą", + "account.report": "Pranešti apie @{name}", + "account.requested": "Laukiama patvirtinimo. Spustelėk, jei nori atšaukti sekimo prašymą.", "account.requested_follow": "{name} paprašė tave sekti", "account.share": "Bendrinti @{name} profilį", "account.show_reblogs": "Rodyti pakėlimus iš @{name}", @@ -69,28 +69,28 @@ "account.unblock_short": "Atblokuoti", "account.unendorse": "Nerodyti profilyje", "account.unfollow": "Nebesekti", - "account.unmute": "Atitildyti @{name}", - "account.unmute_notifications_short": "Atitildyti pranešimus", - "account.unmute_short": "Atitildyti", - "account_note.placeholder": "Spausk norėdamas (-a) pridėti pastabą", - "admin.dashboard.daily_retention": "Vartotojų išbuvimo rodiklis pagal dieną po registracijos", - "admin.dashboard.monthly_retention": "Naudotojų išlaikymo rodiklis pagal mėnesį po registracijos", + "account.unmute": "Atšaukti nutildymą @{name}", + "account.unmute_notifications_short": "Atšaukti nutildymą pranešimams", + "account.unmute_short": "Atšaukti nutildymą", + "account_note.placeholder": "Spustelėk norėdamas (-a) pridėti pastabą", + "admin.dashboard.daily_retention": "Naudotojų pasilikimo rodiklis pagal dieną po registracijos", + "admin.dashboard.monthly_retention": "Naudotojų pasilikimo rodiklis pagal mėnesį po registracijos", "admin.dashboard.retention.average": "Vidurkis", - "admin.dashboard.retention.cohort": "Registravimo mėnuo", + "admin.dashboard.retention.cohort": "Registracijos mėnuo", "admin.dashboard.retention.cohort_size": "Nauji naudotojai", "admin.impact_report.instance_accounts": "Paskyrų profiliai, kuriuos tai ištrintų", "admin.impact_report.instance_followers": "Sekėjai, kuriuos prarastų mūsų naudotojai", "admin.impact_report.instance_follows": "Sekėjai, kuriuos prarastų jų naudotojai", "admin.impact_report.title": "Poveikio apibendrinimas", "alert.rate_limited.message": "Pabandyk vėliau po {retry_time, time, medium}.", - "alert.rate_limited.title": "Spartos ribojimas", + "alert.rate_limited.title": "Sparta ribota", "alert.unexpected.message": "Įvyko netikėta klaida.", "alert.unexpected.title": "Ups!", "announcement.announcement": "Skelbimas", "attachments_list.unprocessed": "(neapdorotas)", "audio.hide": "Slėpti garsą", "autosuggest_hashtag.per_week": "{count} per savaitę", - "boost_modal.combo": "Gali spausti {combo}, kad praleisti kitą kartą", + "boost_modal.combo": "Gali paspausti {combo}, kad praleisti kitą kartą", "bundle_column_error.copy_stacktrace": "Kopijuoti klaidos ataskaitą", "bundle_column_error.error.body": "Užklausos puslapio nepavyko atvaizduoti. Tai gali būti dėl mūsų kodo klaidos arba naršyklės suderinamumo problemos.", "bundle_column_error.error.title": "O, ne!", @@ -104,10 +104,10 @@ "bundle_modal_error.message": "Kraunant šį komponentą kažkas nepavyko.", "bundle_modal_error.retry": "Bandyti dar kartą", "closed_registrations.other_server_instructions": "Kadangi Mastodon yra decentralizuotas, gali susikurti paskyrą kitame serveryje ir vis tiek bendrauti su šiuo serveriu.", - "closed_registrations_modal.description": "Sukurti paskyrą {domain} šiuo metu neįmanoma, tačiau nepamiršk, kad norint naudotis Mastodon nebūtina turėti paskyrą {domain}.", + "closed_registrations_modal.description": "Sukurti paskyrą {domain} šiuo metu neįmanoma, tačiau nepamiršk, kad norint naudotis Mastodon nebūtina turėti paskyrą domene {domain}.", "closed_registrations_modal.find_another_server": "Rasti kitą serverį", "closed_registrations_modal.preamble": "Mastodon yra decentralizuotas, todėl nesvarbu, kur susikursi paskyrą, galėsi sekti ir bendrauti su bet kuriuo šiame serveryje esančiu asmeniu. Jį gali net savarankiškai talpinti!", - "closed_registrations_modal.title": "Užsiregistravimas į Mastodon", + "closed_registrations_modal.title": "Užsiregistruoti Mastodon", "column.about": "Apie", "column.blocks": "Užblokuoti naudotojai", "column.bookmarks": "Žymės", @@ -116,15 +116,15 @@ "column.directory": "Naršyti profilius", "column.domain_blocks": "Užblokuoti domenai", "column.favourites": "Mėgstamiausi", - "column.firehose": "Tiesioginiai padavimai", - "column.follow_requests": "Sekti prašymus", + "column.firehose": "Tiesioginiai srautai", + "column.follow_requests": "Sekimo prašymus", "column.home": "Pagrindinis", "column.lists": "Sąrašai", "column.mutes": "Nutildyti naudotojai", "column.notifications": "Pranešimai", "column.pins": "Prisegti įrašai", "column.public": "Federacinė laiko skalė", - "column_back_button.label": "Atgal", + "column_back_button.label": "Grįžti", "column_header.hide_settings": "Slėpti nustatymus", "column_header.moveLeft_settings": "Judinti stulpelį į kairę", "column_header.moveRight_settings": "Judinti stulpelį į dešinę", diff --git a/config/locales/an.yml b/config/locales/an.yml index de791679b6b7df..17077041da5f25 100644 --- a/config/locales/an.yml +++ b/config/locales/an.yml @@ -1548,7 +1548,6 @@ an: webauthn: Claus de seguranza user_mailer: appeal_approved: - action: Ir ta la tuya cuenta explanation: L'apelación de l'amonestación contra la tuya cuenta d'o %{strike_date} que ninviés lo %{appeal_date} estió aprebada. La tuya cuenta se troba de nuevo en buen estau. subject: La tuya apelación d'o %{date} ha estau aprebada title: Apelación aprebada @@ -1557,7 +1556,6 @@ an: subject: La tuya apelación d'o %{date} ha estau refusada title: Apelación refusada backup_ready: - explanation: Has solicitau una copia completa d'a tuya cuenta de Mastodon. Ya ye preparada pa descargar! subject: Lo tuyo fichero ye preparau pa descargar title: Descargar fichero suspicious_sign_in: diff --git a/config/locales/ar.yml b/config/locales/ar.yml index c1b2677dcc9265..3c8c643fe76518 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -1871,7 +1871,6 @@ ar: webauthn: مفاتيح الأمان user_mailer: appeal_approved: - action: انتقل إلى حسابك explanation: تمت الموافقة على استئناف السجل ضد حسابك في %{strike_date} الذي قدمته في %{appeal_date}. حسابك مرة أخرى في حالة جيدة. subject: تم قبول طعنك الذي قدمته بتاريخ %{date} title: تم قبول طعنك @@ -1880,7 +1879,6 @@ ar: subject: تم رفض طعنك الذي قدمته بتاريخ %{date} title: رُفض الاستئناف backup_ready: - explanation: لقد قمت بطلب نسخة كاملة لحسابك على ماستدون. إنها متوفرة الآن للتنزيل! subject: نسخة بيانات حسابك جاهزة للتنزيل title: المغادرة بأرشيف الحساب suspicious_sign_in: diff --git a/config/locales/be.yml b/config/locales/be.yml index ca9b0d2b88ab97..c0ed043f8e0927 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -1838,7 +1838,6 @@ be: webauthn: Ключы бяспекі user_mailer: appeal_approved: - action: Перайсці ў свой уліковы запіс explanation: Апеляцыя на папярэджанне супраць вашага ўліковага запісу ад %{strike_date}, якую вы падалі %{appeal_date}, была ўхвалена. Ваш уліковы запіс зноў на добрым рахунку. subject: Вашая апеляцыя ад %{date} была ўхваленая title: Абскарджанне ўхвалена @@ -1847,7 +1846,6 @@ be: subject: Вашая апеляцыя ад %{date} была адхіленая title: Абскарджанне адхілена backup_ready: - explanation: Вы запатрабавалі поўнае рэзервовае капіраванне вашага ўліковага запісу Mastodon. Цяпер яго можна спампаваць! subject: Ваш архіў гатовы да спампавання title: Ваш архіў можна спампаваць suspicious_sign_in: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 1865aa5fca3aca..377babe22e1800 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1608,6 +1608,7 @@ bg: unknown_browser: Неизвестен браузър weibo: Weibo current_session: Текуща сесия + date: Дата description: "%{browser} на %{platform}" explanation: Това са уеб браузърите, от които в момента сте влезли с вашия Mastodon акаунт. ip: IP адрес @@ -1774,16 +1775,19 @@ bg: webauthn: Ключове за сигурност user_mailer: appeal_approved: - action: Към акаунта ви + action: Настройки на акаунта explanation: Жалбата, която изпратихте на %{appeal_date}, срещу нарушението за вашия акаунт, направено на %{strike_date}, е приета. Вашият акаунт е отново с добра репутация. subject: Вашето обжалване от %{date} е било одобрено + subtitle: Вашият акаунт още веднъж е в добра репутация. title: Одобрено обжалване appeal_rejected: explanation: Жалбата, която изпратихте на %{appeal_date}, срещу нарушението за вашия акаунт, направено на %{strike_date}, е отхвърлена. subject: Вашето обжалване от %{date} е било отхвърлено + subtitle: Обжалването ви е отхвърлено. title: Отхвърлено обжалване backup_ready: - explanation: Изискахте пълно резервно копиране на акаунта си в Mastodon. Вече е готово за изтегляне! + explanation: Изисквахте пълно резервно копие на акаунта си в Mastodon. + extra: Вече е готово за теглене! subject: Вашият архив е готов за изтегляне title: Сваляне на архива suspicious_sign_in: diff --git a/config/locales/br.yml b/config/locales/br.yml index 8a70a90cfe3729..7af72457d0c338 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -471,6 +471,7 @@ br: safari: Safari uc_browser: UC Browser weibo: Weibo + date: Deiziad description: "%{browser} war %{platform}" ip: IP platforms: @@ -529,6 +530,10 @@ br: disable: Diweredekaat edit: Kemmañ user_mailer: + appeal_approved: + action: Arventennoù ar gont + backup_ready: + extra: Prest eo da vezañ pellgarget! warning: categories: spam: Spam diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 25f19ef25f3d8e..580c4a3ed9d439 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -1605,6 +1605,7 @@ ca: unknown_browser: Navegador Desconegut weibo: Weibo current_session: Sessió actual + date: Data description: "%{browser} de %{platform}" explanation: Aquests són els navegadors web que actualment han iniciat la sessió amb el teu compte de Mastodon. ip: IP @@ -1771,16 +1772,19 @@ ca: webauthn: Claus de seguretat user_mailer: appeal_approved: - action: Ves al teu compte + action: Configuració del compte explanation: L'apel·lació a l'acció contra el teu compte del %{strike_date} que has enviat el %{appeal_date} ha estat aprovada. El teu compte torna a estar en bon estat. subject: La teva apel·lació del %{date} ha estat aprovada + subtitle: El vostre compte torna a estar correcte. title: Apel·lació aprovada appeal_rejected: explanation: L'apel·lació a l'acció contra el teu compte del %{strike_date} que has enviat el %{appeal_date} ha estat rebutjada. subject: La teva apel·lació del %{date} ha estat rebutjada + subtitle: S'ha rebutjat la vostra apel·lació. title: Apel·lació rebutjada backup_ready: - explanation: Has sol·licitat una copia completa del teu compte Mastodon. Ara ja està a punt per a descàrrega! + explanation: Heu demanat una còpia completa de les dades del vostre compte de Mastodon. + extra: Ja us ho podeu baixar subject: L'arxiu està preparat per a descàrrega title: Recollida de l'arxiu suspicious_sign_in: diff --git a/config/locales/ckb.yml b/config/locales/ckb.yml index 9a974b9ed75606..7905024381f473 100644 --- a/config/locales/ckb.yml +++ b/config/locales/ckb.yml @@ -1015,7 +1015,6 @@ ckb: webauthn: کلیلەکانی پاراستن user_mailer: backup_ready: - explanation: ئێوە وشانێکی پاڵپشتی تەواوت لە هەژمارەکەی خۆت داوا کردووە، ئەم پاڵپشتییە ئێستا ئامادەی بارکردنە! subject: ئارشیڤی ئێوە ئامادەی داگرتنە title: وەرگرتنی ئارشیڤ warning: diff --git a/config/locales/co.yml b/config/locales/co.yml index e613ea76064eed..f5b6b46d920ab6 100644 --- a/config/locales/co.yml +++ b/config/locales/co.yml @@ -1034,7 +1034,6 @@ co: webauthn: Chjave di sicurità user_mailer: backup_ready: - explanation: Avete dumandatu un’archiviu cumpletu di u vostru contu Mastodon. Avà hè prontu per scaricà! subject: U vostru archiviu hè prontu à scaricà title: Archiviu prontu warning: diff --git a/config/locales/cs.yml b/config/locales/cs.yml index e3e804172abcde..eafbead761ddb0 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -1792,7 +1792,6 @@ cs: webauthn: Bezpečnostní klíče user_mailer: appeal_approved: - action: Přejít do vašeho účtu explanation: Odvolání proti prohřešku vašeho účtu ze dne %{strike_date}, které jste podali %{appeal_date}, bylo schváleno. Váš účet je opět v pořádku. subject: Vaše odvolání ze dne %{date} bylo schváleno title: Odvolání schváleno @@ -1801,7 +1800,6 @@ cs: subject: Vaše odvolání z %{date} bylo zamítnuto title: Odvolání zamítnuto backup_ready: - explanation: Vyžádali jste si úplnou zálohu svého účtu Mastodon. Nyní je připravena ke stažení! subject: Váš archiv je připraven ke stažení title: Stažení archivu suspicious_sign_in: diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 70b994903ec7fd..768dd3e0c8975e 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -21,7 +21,7 @@ cy: link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date} nothing_here: Does dim byd yma! pin_errors: - following: Rhaid i chi fod yn dilyn y person yr ydych am ei gymeradwyo yn barod + following: Rhaid i chi fod yn dilyn yn barod y person rydych am ei gymeradwyo posts: few: Postiadau many: Postiadau @@ -74,7 +74,7 @@ cy: edit: Golygu email: E-bost email_status: Statws e-bost - enable: Dad rewi + enable: Dadrewi enable_sign_in_token_auth: Galluogi dilysu tocynnau e-bost enabled: Wedi ei alluogi enabled_msg: Wedi dadrewi cyfrif %{username} yn llwyddiannus @@ -85,7 +85,7 @@ cy: invite_request_text: Rhesymau dros ymuno invited_by: Gwahoddwyd gan ip: IP - joined: Ymunwyd + joined: Wedi ymuno location: all: Popeth local: Lleol @@ -1712,6 +1712,7 @@ cy: unknown_browser: Porwr Anhysbys weibo: Weibo current_session: Sesiwn gyfredol + date: Dyddiad description: "%{browser} ar %{platform}" explanation: Dyma'r porwyr gwe sydd wedi mewngofnodi i'ch cyfrif Mastodon ar hyn o bryd. ip: IP @@ -1902,16 +1903,19 @@ cy: webauthn: Allweddi diogelwch user_mailer: appeal_approved: - action: Ewch i'ch cyfrif + action: Gosodiadau Cyfrif explanation: Mae apêl y rhybudd yn erbyn eich cyfrif ar %{strike_date} a gyflwynwyd gennych ar %{appeal_date} wedi'i chymeradwyo. Mae eich cyfrif unwaith eto yn gadarnhaol. subject: Mae eich apêl gan %{date} wedi'i chymeradwyo + subtitle: Mae eich cyfrif unwaith eto mewn sefyllfa dda. title: Cymeradwywyd yr apêl appeal_rejected: explanation: Mae apêl y rhybudd yn erbyn eich cyfrif ar %{strike_date} a gyflwynwyd gennych ar %{appeal_date} wedi'i gwrthod. subject: Mae eich apêl ar %{date} wedi'i gwrthod + subtitle: Mae eich apêl wedi'i gwrthod title: Mae'r apêl wedi'i gwrthod backup_ready: - explanation: Fe wnaethoch chi gais am gopi wrth gefn llawn o'ch cyfrif Mastodon. Mae nawr yn barod i'w lawrlwytho! + explanation: Rydych wedi gofyn am gopi wrth gefn llawn o'ch cyfrif Mastodon. + extra: Mae nawr yn barod i'w lwytho i lawr! subject: Mae eich archif yn barod i'w lawrlwytho title: Allfudo archif suspicious_sign_in: diff --git a/config/locales/da.yml b/config/locales/da.yml index 3d6850ca5ea330..e09a6eb2f5b77d 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -1608,6 +1608,7 @@ da: unknown_browser: Ukendt browser weibo: Weibo current_session: Aktuelle session + date: Dato description: "%{browser} på %{platform}" explanation: Disse webbrowsere er pt. logget ind på din Mastodon-konto. ip: IP @@ -1774,16 +1775,19 @@ da: webauthn: Sikkerhedsnøgler user_mailer: appeal_approved: - action: Gå til din konto + action: Kontoindstillinger explanation: Appellen af kontoadvarslen fra %{strike_date}, indsendt af dig pr. %{appeal_date}, er blevet godkendt. Din kontostatus er igen god. subject: Din appel pr. %{date} er godkendt + subtitle: Dit kontoomdømme er nu igen godt. title: Appel godkendt appeal_rejected: explanation: Appellen af kontoadvarslen fra %{strike_date}, indsendt af dig pr. %{appeal_date}, er blevet afvist. subject: Din appel pr. %{date} er afvist + subtitle: Din appel er afvist. title: Appel afvist backup_ready: - explanation: Den anmodede fulde sikkerhedskopi af din Mastodon-konto er nu klar til download! + explanation: Der er anmodet om en fuld sikkerhedskopi af din Mastodon-konto. + extra: Sikkerhedskopien kan nu downloades! subject: Dit arkiv er klar til download title: Arkiv download suspicious_sign_in: diff --git a/config/locales/de.yml b/config/locales/de.yml index 4542871d802de8..dc78b188e20da5 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1608,6 +1608,7 @@ de: unknown_browser: Unbekannter Browser weibo: Weibo current_session: Aktuelle Sitzung + date: Datum description: "%{browser} auf %{platform}" explanation: Dies sind die Webbrowser, die derzeit mit deinem Mastodon-Konto verbunden sind. ip: IP-Adresse @@ -1774,16 +1775,19 @@ de: webauthn: Sicherheitsschlüssel user_mailer: appeal_approved: - action: Dein Konto aufrufen - explanation: Der Einspruch gegen deinen Verstoß vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde genehmigt. Dein Konto ist wieder in gutem Zustand. + action: Kontoeinstellungen + explanation: Der Einspruch gegen deinen Verstoß vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde genehmigt. Dein Konto ist wieder in Ordnung. subject: Dein Einspruch vom %{date} wurde angenommen + subtitle: Dein Konto ist wieder in Ordnung. title: Einspruch angenommen appeal_rejected: explanation: Der Einspruch gegen deinen Verstoß vom %{strike_date}, den du am %{appeal_date} eingereicht hast, wurde abgelehnt. subject: Dein Einspruch vom %{date} wurde abgelehnt + subtitle: Dein Einspruch wurde abgelehnt. title: Einspruch abgelehnt backup_ready: - explanation: Du hast eine vollständige Sicherung deines Mastodon-Kontos angefordert. Die Sicherung kann jetzt heruntergeladen werden! + explanation: Du hast eine vollständige Datensicherung deines Mastodon-Kontos angefordert. + extra: Sie ist jetzt zum Herunterladen bereit! subject: Dein persönliches Archiv kann heruntergeladen werden title: Archiv-Download suspicious_sign_in: diff --git a/config/locales/devise.an.yml b/config/locales/devise.an.yml index f179f915dcfd4c..4be18845cc80b6 100644 --- a/config/locales/devise.an.yml +++ b/config/locales/devise.an.yml @@ -47,11 +47,9 @@ an: subject: 'Mastodon: Instruccions pa reiniciar clau' title: Reiniciar clau two_factor_disabled: - explanation: L'autenticación de dos factors pa la tuya cuenta ha estau deshabilitada. Agora puetz connectar-te nomás usando l'adreza de correu electronico y la clau. subject: 'Mastodon: L''autenticación de dos factors ye deshabilitada' title: 2FA desactivada two_factor_enabled: - explanation: L'autenticación de dos factors pa la tuya cuenta ha estau habilitada. Se requiere un token chenerau per l'aplicación TOTP emparellada pa ingresar. subject: 'Mastodon: L''autenticación de dos factors ye habilitada' title: 2FA activada two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ an: subject: 'Mastodon: Clau de seguranza eliminada' title: Una d'as tuyas claus de seguranza ha estau eliminada webauthn_disabled: - explanation: L'autenticación con claus de seguranza ha estau deshabilitada pa la tuya cuenta. Agora l'inicio de sesión nomás ye posible utilizando lo token chenerau per l'aplicación TOTP emparellada. subject: 'Mastodon: Autenticación con claus de seguranza deshabilitada' title: Claus de seguranza deshabilitadas webauthn_enabled: - explanation: L'autenticación con clau de seguranza ha estau habilitada pa la tuya cuenta. Agora la tuya clau de seguranza puede estar utilizada pa iniciar sesión. subject: 'Mastodon: Autenticación de clau de seguranza habilitada' title: Claus de seguranza habilitadas omniauth_callbacks: diff --git a/config/locales/devise.ar.yml b/config/locales/devise.ar.yml index 97d1710edf8f48..28e721e6672c43 100644 --- a/config/locales/devise.ar.yml +++ b/config/locales/devise.ar.yml @@ -47,11 +47,9 @@ ar: subject: 'ماستدون: تعليمات استعادة كلمة المرور' title: إعادة تعيين كلمة السر two_factor_disabled: - explanation: تم تعطيل المصادقة بخطوتين لحسابك الخاص. إنّ الولوج ممكن الآن باستخدام عنوان البريد الإلكتروني وكلمة المرور فقط. subject: 'ماستدون: نظام المصادقة بخطوتين مُعطّل' title: إنّ 2FA معطّل two_factor_enabled: - explanation: تم تفعيل المصادقة بخطوتين على حسابك. سيُطلب منك رمز تم توليده بواسطة تطبيق TOTP المقترن للولوج. subject: 'ماستدون: تم تفعيل نظام المصادقة بخطوتين' title: إنّ 2FA نشِط two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ar: subject: 'ماستدون: تم حذف مفتاح الأمان' title: تم حذف أحد مفاتيح الأمان الخاصة بك webauthn_disabled: - explanation: تم تعطيل الاستيثاق مع مفاتيح الأمان لحسابك. تسجيل الدخول الآن ممكن باستخدام الرمز (token) الذي تم إنشاؤه بواسطة تطبيق TOTP المقترن. subject: 'ماستدون: الاستيثاق مع مفاتيح الأمان معطلة' title: مفاتيح الأمان معطلة webauthn_enabled: - explanation: تم تفعيل استيثاق مفتاح الأمان للحساب الخاص بك. يمكن الآن استخدام مفتاح الأمان الخاص بك لتسجيل الدخول. subject: 'ماستدون: تم تفعيل نظام استيثاق مفتاح الأمان' title: مفاتيح الأمان مفعلة omniauth_callbacks: diff --git a/config/locales/devise.ast.yml b/config/locales/devise.ast.yml index a4378dee92bed7..47372c2f07a68d 100644 --- a/config/locales/devise.ast.yml +++ b/config/locales/devise.ast.yml @@ -42,11 +42,9 @@ ast: subject: 'Mastodon: instrucciones pa camudar la contraseña' title: Cambéu de la contaseña two_factor_disabled: - explanation: Desactivóse l'autenticación en dos pasos na cuenta. Agora ye posible aniciar la sesión cola direición de corréu electrónicu ya la contraseña. subject: 'Mastodon: desactivóse l''autenticación en dos pasos' title: Autenticación de dos pasos activada two_factor_enabled: - explanation: Activóse l'autenticación en dos pasos na cuenta. Agora los pases que xenere l'aplicación TOTP empareyada son obligatorios p'aniciar la sesión. subject: 'Mastodon: activóse l''autenticación en dos pasos' title: Autenticación de dos pasos desactivada two_factor_recovery_codes_changed: @@ -62,11 +60,9 @@ ast: deleted: title: Desanicióse una de les to llaves de seguranza webauthn_disabled: - explanation: Desactivóse l'autenticación con llaves de seguranza na cuenta. Agora namás ye posible aniciar la sesión col pase xeneráu pola aplicación TOTP empareyada. subject: 'Mastodon: desactivóse l''autenticación con llaves de seguranza' title: Llaves de seguranza desactivaes webauthn_enabled: - explanation: Activóse l'autenticación con llaves de seguranza na cuenta. Agora pues usar la llave p'aniciar la sesión. subject: 'Mastodon: activóse l''autenticación con llaves de seguranza' title: Llaves de seguranza activaes passwords: diff --git a/config/locales/devise.be.yml b/config/locales/devise.be.yml index e5e8aea91ed7e0..8679275c208d96 100644 --- a/config/locales/devise.be.yml +++ b/config/locales/devise.be.yml @@ -47,11 +47,9 @@ be: subject: 'Mastodon: Інструкцыі па скіданню пароля' title: Скіданне пароля two_factor_disabled: - explanation: Двухфактарная аўтэнтыфікацыя на вашым акаўнце была адключана. Цяпер для ўваходу патрэбны толькі электронная пошта і пароль. subject: 'Mastodon: двухфактарная аўтэнтыфікацыя адключана' title: двухэтапнае спраўджанне адключана two_factor_enabled: - explanation: Двухфактарная аўтэнтыфікацыя на вашым акаўнце была ўключана. Цяпер для ўваходу ў сістэму патрэбны токен, згенераваны даданай TOTP праграмай. subject: 'Mastodon: двухфактарная аўтэнтыфікацыя ўключана' title: двухэтапнае спраўджанне уключана two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ be: subject: 'Mastodon: ключ бяспекі выдалены' title: Адзін з вашых ключоў бяспекі быў выдалены webauthn_disabled: - explanation: Аўтэнтыфікацыя з дапамогай ключоў бяспекі была адключана для вашага ўліковага запісу. Уваход цяпер магчымы толькі з токенам, згенераваным спалучаным TOTP прыкладаннем. subject: 'Mastodon: Аўтэнтыфікацыя з дапамогай ключоў бяспекі адключана' title: Ключы бяспекі адключаны webauthn_enabled: - explanation: Аўтэнтыфікацыя праз ключ бяспекі была ўключана для вашага ўліковага запісу. Цяпер вы можаце выкарыстоўваць ваш ключ бяспекі для ўваходу. subject: 'Mastodon: Аўтэнтыфікацыя праз ключ бяспекі была ўключана' title: Ключы бяспекі ўключаны omniauth_callbacks: diff --git a/config/locales/devise.bg.yml b/config/locales/devise.bg.yml index 5046771340e509..f3586bcd859825 100644 --- a/config/locales/devise.bg.yml +++ b/config/locales/devise.bg.yml @@ -18,7 +18,7 @@ bg: unconfirmed: Преди да продължите, трябва да потвърдите адреса на имейла си. mailer: confirmation_instructions: - action: Потвърдете адреса на имейла + action: Потвърждаване на адреса на имейла action_with_app: Потвърдете и се върнете към %{app} explanation: Създали сте акаунт на %{host} с този имейл адрес. Само на едно щракване разстояние сте от активирането му. Ако това не сте били вие, моля, игнорирайте този имейл. explanation_when_pending: Кандидатствахте за покана до %{host} с този имейл адрес. След като потвърдите своя имейл адрес, ние ще разгледаме вашето заявление. Можете да влезете, за да промените данните си или да изтриете акаунта си, но нямате достъп до повечето функции, докато акаунтът ви не бъде одобрен. Ако вашето заявление бъде отхвърлено, вашите данни ще бъдат премахнати, така че няма да се изискват допълнителни действия от вас. Ако това не сте били вие, моля, игнорирайте този имейл. @@ -39,7 +39,7 @@ bg: explanation: Потвърдете новия адрес, за да промените имейла си. extra: Ако тази промяна не е започната от вас, то пренебрегнете този имейл. Адресът на имейла за акаунта в Mastodon няма да се промени, докато не влезете в горната връзка. subject: 'Mastodon: Потвърдете имейла за %{instance}' - title: Потвърдете своя имейл адрес + title: Потвърждаване на адреса на имейла reset_password_instructions: action: Промяна на паролата explanation: Поискахте нова парола за акаунта си. @@ -47,16 +47,19 @@ bg: subject: 'Mastodon: Указания за задаване на нова парола' title: Нулиране на парола two_factor_disabled: - explanation: Двуфакторното удостоверяване за вашия акаунт е деактивирано. Влизането вече е възможно, като се използват само имейл адрес и парола. + explanation: Влизането вече е възможно, употребявайки само адрес на имейла и парола. subject: 'Mastodon: Двуфакторното удостоверяване е деактивирано' + subtitle: Двуфакторното удостоверяване за акаунта ви е изключено. title: Двуфакторното изключено two_factor_enabled: - explanation: За акаунта ви е включено двуфакторно удостоверяване. Отсега нататък ще ви трябва и временен код от сдвоеното приложение за удостоверяване TOTP, за да влезете. + explanation: Породени токени от сдвоено приложение TOTP ще се изискват за вход. subject: 'Mastodon: Включено двуфакторно удостоверяване' + subtitle: Двуфакторното удостоверяване е включено за акаунта ви. title: 2FA активирано two_factor_recovery_codes_changed: explanation: Предишните кодове за възстановяване са анулирани и се пораждат нови. subject: 'Mastodon: Породени пак са двуфакторни кодове за възстановяване' + subtitle: Предишните кодове за възстановяване са обезсилени и се пораждат нови. title: Кодове за 2 факт. удост. за възстановяване са променени unlock_instructions: subject: 'Mastodon: указания за отключване' @@ -70,11 +73,13 @@ bg: subject: 'Mastodon: Ключът за сигурност е изтрит' title: Един от ключовете ви за сигурност е изтрит webauthn_disabled: - explanation: Удостоверяването с ключове за сигурност е изключено за акаунта ви. Влизането вече е възможно, използвайки само ключа, породен от сдвоеното приложение TOTP. + explanation: Удостоверяването на ключовете за сигурност е изключено за акаунта ви. + extra: Влизането вече е възможно, употребявайки само породени токени от сдвоено приложение TOTP. subject: 'Mastodon: Изключено удостоверяване с ключове за сигурност' title: Изключени ключове за сигурност webauthn_enabled: - explanation: Удостоверяването с ключ за сигурност е активирано за вашия акаунт. Вашият ключ за сигурност вече може да се използва за вход. + explanation: Удостоверяването на ключа за сигурност е включено за акаунта ви. + extra: Вашият ключ за сигурност вече може да се употребява за вход. subject: 'Mastodon: Включено удостоверяване с ключ за сигурност' title: Включени ключове за сигурност omniauth_callbacks: @@ -82,8 +87,8 @@ bg: success: Успешно упълномощаване от акаунт на %{kind}. passwords: no_token: Не можете да осъществите достъп до тази страница, ако не сте я отворили чрез линк от получен имейл за възстановяване на паролата. Ако сте отворили линка за възстановяване на паролата от имейл, моля, уверете се, че сте използвали целия предоставен URL адрес. - send_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на е-пощата си до няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо. - send_paranoid_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на е-пощата си до няколко минути. Проверете си папката за спам, ако не сте получили това е-писмо. + send_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на имейла си до няколко минути. Проверете папката си за спам, ако не сте получили това е-писмо. + send_paranoid_instructions: Ако адресът на имейла ви съществува в базата ни данни, то ще получите връзка за възстановяване на парола на имейла си до няколко минути. Проверете папката си за спам, ако не сте получили това е-писмо. updated: Паролата ви беше променена успешно. Сега сте влезли. updated_not_active: Паролата ви беше променена успешно. registrations: @@ -101,7 +106,7 @@ bg: signed_out: Успешно излизане. unlocks: send_instructions: Ще получите имейл с указания как да отключите акаунта си до няколко минути. Проверете папката си за спам, ако не сте получили такъв имейл. - send_paranoid_instructions: Ако вашият акаунт съществува, ще получите имейл с указания за отключването му до няколко минути. Проверете спам папката си, ако не сте получили такъв имейл. + send_paranoid_instructions: Ако акаунта ви съществува, то ще получите е-писмо с указания за отключването му до няколко минути. Проверете папката си за спам, ако не сте получили това е-писмо. unlocked: Акаунтът ви е успешно отключен. Влезте, за да продължите. errors: messages: diff --git a/config/locales/devise.bn.yml b/config/locales/devise.bn.yml index e0d83613e8aacf..b046289039db17 100644 --- a/config/locales/devise.bn.yml +++ b/config/locales/devise.bn.yml @@ -47,11 +47,9 @@ bn: subject: 'মাস্টাডন: পাসওয়ার্ড বদলানোর নির্দেশনা' title: পাসওয়ার্ড বদলানো two_factor_disabled: - explanation: আপনার অ্যাকাউন্টের জন্য দ্বি-ফ্যাক্টর প্রমাণীকরণ অক্ষম করা হয়েছে। লগইন এখন কেবলমাত্র ইমেল ঠিকানা এবং পাসওয়ার্ড ব্যবহার করে সম্ভব। subject: 'মস্তোডন: দ্বি-গুণক প্রমাণীকরণ অক্ষম' title: 2FA অক্ষম two_factor_enabled: - explanation: আপনার অ্যাকাউন্টের জন্য দ্বি-ফ্যাক্টর প্রমাণীকরণ সক্ষম করা হয়েছে। জোড়যুক্ত TOTP অ্যাপ্লিকেশন দ্বারা উত্পাদিত একটি টোকেন লগইনের জন্য প্রয়োজন হবে। subject: 'মস্তোডন: দ্বি-গুণক প্রমাণীকরণ সক্ষম হয়েছে' title: 2FA সক্ষম two_factor_recovery_codes_changed: diff --git a/config/locales/devise.br.yml b/config/locales/devise.br.yml index 4a16157f81958c..205e11e797c584 100644 --- a/config/locales/devise.br.yml +++ b/config/locales/devise.br.yml @@ -47,11 +47,9 @@ br: subject: 'Mastodon: Adkorañ kemennoù ar ger-tremen' title: Adderaouekaat ar ger-tremen two_factor_disabled: - explanation: Dilesadur dre eil-elfenn a zo bet nac'het. Gallout a reer mont-tre en ur implijout nemet ur chomlec'h-postel hag ur ger-tremen. subject: 'Mastodon: dilesadur dre eil-elfenn nac''het' title: 2FA diweredekaet two_factor_enabled: - explanation: Dilesadur dre eil-elfenn a zo aotreet evit ho kont. Ret a vo implij ur jedouer krouet gant an app TOTP koublet evit mont-tre. subject: 'Mastodon: dilesadur dre eil-elfenn aotreet' title: 2FA gweredekaet two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ br: subject: 'Mastodon: alc''hwezioù surentez dilamet' title: Unan eus hoc'h alc'hwezioù surentez a zo bet dilamet webauthn_disabled: - explanation: Dilezadur dre alc'hwezioù surentel a zo bet nac'het evit ho kont. Gallout a reer mont-tre en ur implijout ar jedouer krouet gant app TOTP koublet. subject: 'Mastodon: dilesadur dre alc''hwezioù surentez nac''het' title: Alc'hwezioù surentez nac'het webauthn_enabled: - explanation: Dilesadur dre alc'hwez surentez a zo bet aotreet evit ho kont. Hoc'h alc'hwez surentez a c'hell bezañ implijet evit mont-tre. subject: 'Mastodon: dilesadur dre alc''hwezioù surentez aotreet' title: Alc'hwezioù surentez aotreet omniauth_callbacks: diff --git a/config/locales/devise.ca.yml b/config/locales/devise.ca.yml index 6ebdafb9ec07bd..2bf741ee4089ac 100644 --- a/config/locales/devise.ca.yml +++ b/config/locales/devise.ca.yml @@ -49,16 +49,19 @@ ca: subject: 'Mastodon: Instruccions per a reiniciar contrasenya' title: Contrasenya restablerta two_factor_disabled: - explanation: L'autenticació de doble factor per al teu compte s'ha desactivat. Ara només pots iniciar la sessió fent servir la teva adreça de correu-e i la contrasenya. + explanation: Només es pot accedir amb compte de correu i contrasenya. subject: 'Mastodon: Autenticació de doble factor desactivada' + subtitle: S'ha deshabilitat l'autenticació de doble factor al vostre compte. title: A2F desactivada two_factor_enabled: - explanation: L'autenticació de doble factor s'ha habilitat per al teu compte. Per a iniciar la sessió es requerirà un token generat per l'aplicació TOTP que hi hagis emparellat. + explanation: Per accedir fa falta un token generat per l'aplicació TOTP aparellada. subject: 'Mastodon: Autenticació de doble factor activada' + subtitle: S'ha habilitat l'autenticació de doble factor al vostre compte. title: A2F activada two_factor_recovery_codes_changed: explanation: Els codis de recuperació anteriors ja no són vàlids i se n'han generat de nous. subject: 'Mastodon: codis de recuperació de doble factor regenerats' + subtitle: S'han invalidat els codis de recuperació anteriors i se n'ha generat de nous. title: Codis de recuperació A2F canviats unlock_instructions: subject: 'Mastodon: Instruccions per a desblocar' @@ -72,11 +75,13 @@ ca: subject: 'Mastodon: Clau de seguretat esborrada' title: Una de les teves claus de seguretat ha estat esborrada webauthn_disabled: - explanation: S'ha desactivat l'autenticació amb claus de seguretat per al teu compte. Ara només pots iniciar la sessió usant el token generat per l'aplicació TOTP. + explanation: S'ha deshabilitat l'autenticació amb claus de seguretat al vostre compte. + extra: Ara només podeu accedir amb el token generat amb l'aplicació TOTP aparellada. subject: 'Mastodon: S''ha desactivat l''autenticació amb claus de seguretat' title: Claus de seguretat desactivades webauthn_enabled: - explanation: S'ha activat l'autenticació amb claus de seguretat. Ja pots usar la teva clau de seguretat per a iniciar sessió. + explanation: S'ha habilitat l'accés amb clau de seguretat al vostre compte. + extra: Ara podeu accedir amb la vostra clau de seguretat. subject: 'Mastodon: Autenticació amb clau de seguretat activada' title: Claus de seguretat activades omniauth_callbacks: diff --git a/config/locales/devise.ckb.yml b/config/locales/devise.ckb.yml index 1261ebb648d2fa..f33959d76cbdc0 100644 --- a/config/locales/devise.ckb.yml +++ b/config/locales/devise.ckb.yml @@ -47,11 +47,9 @@ ckb: subject: 'ماستۆدۆن: رێکردنەوەی رێنماییەکانی تێپەڕوشە' title: گەڕانەوەی تێپەڕوشە two_factor_disabled: - explanation: سەلماندنی دوو-فاکتەر بۆ هەژمارەکەت کە لە کارخراوە. چوونەژوورەوە ئێستا دەکرێت تەنها ناونیشانی ئیمەیڵ و تێپەڕوشەکەت بەکاربهێنی. subject: 'ماستۆدۆن: سەلماندنی دوو-فاکتەری ناچالاک کراوە' title: 2FA ناچالاک کرا two_factor_enabled: - explanation: سەلماندنی دوو-فاکتەر بۆ هەژمارەکەت چالاک کراوە. ئاماژەیەک کە لەلایەن نەرمەکالایTOTP جووتکراو دروست کراوە پێویستە بە چوونە ژوورەوە. subject: 'ماستۆدۆن: سەلماندنی دوو-فاکتەری چالاک کراوە' title: 2FA چالاک کرا two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ckb: subject: 'ماستۆدۆن: کلیلی پاراستن سڕایەوە' title: کلیلە کانی پاراستنی یەکێک لە ئێوە سڕایەوە webauthn_disabled: - explanation: سەلماندن بە کلیلەپارێزراوەکان لە کارخراوە بۆ هەژمارەکەت. چوونەژوورەوە ئێستا دەکرێت تەنها ئەو نیشانەیە بەکاربێنیت کە لەلایەن نەرمەکالایTOTP دروست کراوە. subject: 'ماستۆدۆن: سەلماندن لەگەڵ کلیلە پاسایشی ناچالاک کراوە' title: کلیلە پارستنەکان ناچالاک کراون webauthn_enabled: - explanation: سەلماندنی کلیلی ئاسایش چالاک کراوە بۆ هەژمارەکەت. ئێستا کلیلی پاراستن دەتوانرێت بۆ چوونە ژوورەوە بەکار بێت. subject: 'ماستۆدۆن: سەلماندنی کلیلی پاراستن چالاک کراوە' title: کلیلە کانی پاراستن چالاک کرا omniauth_callbacks: diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml index 8409cfad9b2b82..d66163787502c5 100644 --- a/config/locales/devise.co.yml +++ b/config/locales/devise.co.yml @@ -47,11 +47,9 @@ co: subject: 'Mastodon: Cambià a chjave d’accessu' title: Cambià a chjave two_factor_disabled: - explanation: L'autentificazione à dui fattori per u vostru contu hè stata disattivata. A cunnessione hè avà pussibule cù l'usu solu di u vostru e-mail è di a chjave d'accessu. subject: 'Mastodon: Autentificazione à dui fattori disattivata' title: A2F disattivata two_factor_enabled: - explanation: L'autentificazione à dui fattori hè stata attivata per u vostru contu. Un codice, o fiscia, generata da l'applicazione TOTP assuciata sarà dumandata per cunnettavvi. subject: 'Mastodon: Autentificazione à dui fattori attivata' title: A2F attivata two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ co: subject: 'Mastodon: Chjave di sicurità sguassata' title: Una di e vostre chjave di sicurità hè stata sguassata webauthn_disabled: - explanation: L'autentificazione cù una chjave di sicurità hè stata disattivata per u vostru contu. Avà pudete solu cunnettavi cù u codice di cunnessione generatu da l'applicazione TOTP appaghjata. subject: 'Mastodon: Autentificazione cù chjave di sicurità disattivata' title: Chjave di sicurità disattivate webauthn_enabled: - explanation: L'autentificazione cù una chjave di sicurità hè stata attivata per u vostru contu. Avà a vostra chjave pò esse utilizata per cunnettavi. subject: 'Mastodon: Identificazione cù chjave di sicurità attivata' title: Chjave di sicurità attivate omniauth_callbacks: diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml index 32a1ed2c6733e3..fb3893325c26f1 100644 --- a/config/locales/devise.cs.yml +++ b/config/locales/devise.cs.yml @@ -47,11 +47,9 @@ cs: subject: 'Mastodon: Instrukce pro obnovení hesla' title: Obnovení hesla two_factor_disabled: - explanation: Dvoufázové ověřování bylo pro váš účet vypnuto. Pro přihlášení vám nyní stačí pouze e-mailová adresa a heslo. subject: 'Mastodon: Dvoufázové ověření bylo vypnuto' title: 2FA bylo vypnuto two_factor_enabled: - explanation: Dvoufázové ověřování bylo pro váš účet zapnuto. Pro přihlášení bude vyžadován token vygenerovaný spárovanou TOTP aplikací. subject: 'Mastodon: Dvoufázové ověření bylo zapnuto' title: 2FA bylo zapnuto two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ cs: subject: 'Mastodon: Bezpečnostní klíč byl smazán' title: Jeden z vašich bezpečnostních klíčů byl smazán webauthn_disabled: - explanation: Pro váš účet bylo vypnuto ověření bezpečnostními klíči. Přihlášení je nyní možné pouze s tokenem vygenerovaným spárovanou TOTP aplikací. subject: 'Mastodon: Přihlašování bezpečnostními klíči bylo vypnuto' title: Bezpečnostní klíče byly zakázány webauthn_enabled: - explanation: Pro váš účet bylo povoleno ověření bezpečnostními klíči. Nyní můžete svůj bezpečnostní klíč použít pro přihlášení. subject: 'Mastodon: Přihlašování bezpečnostními klíči bylo povoleno' title: Bezpečnostní klíče byly povoleny omniauth_callbacks: diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml index 44c09153ff5269..d3eeb8eeb60e2d 100644 --- a/config/locales/devise.cy.yml +++ b/config/locales/devise.cy.yml @@ -47,16 +47,19 @@ cy: subject: 'Mastodon: Ailosod cyfarwyddiadau cyfrinair' title: Ailosod cyfrinair two_factor_disabled: - explanation: Mae dilysiad dau ffactor ar gyfer eich cyfrif wedi'i analluogi. Mae modd mewngofnodi nawr gan ddefnyddio cyfeiriad e-bost a chyfrinair yn unig. + explanation: Mae modd mewngofnodi nawr gan ddefnyddio dim ond cyfeiriad e-bost a chyfrinair. subject: 'Mastodon: mae dilysu dau ffactor wedi''i alluogi' + subtitle: Mae dilysiad dau ffactor ar gyfer eich cyfrif wedi'i analluogi. title: Dilysu dau ffactor yn anabl two_factor_enabled: - explanation: Mae dilysu dau ffactor wedi'i alluogi ar gyfer eich cyfrif. Bydd angen tocyn a gynhyrchir gan yr ap TOTP pâr i fewngofnodi. + explanation: Bydd angen tocyn wedi'i gynhyrchu gan yr ap TOTP pâr i fewngofnodi. subject: 'Mastodon: mae dilysu dau ffactor wedi''i alluogi' + subtitle: Mae dilysiad dau ffactor wedi'i alluogi ar gyfer eich cyfrif. title: Mae dilysu dau ffactor wedi'i alluogi two_factor_recovery_codes_changed: explanation: Mae'r codau adfer blaenorol wedi'u hannilysu a chynhyrchwyd rhai newydd. subject: 'Mastodon: Mae codau adfer dau ffactor wedi''u hadfywio' + subtitle: Mae'r codau adfer blaenorol wedi'u hannilysu a rhai newydd wedi'u cynhyrchu. title: Newidiodd codau adfer 2FA unlock_instructions: subject: 'Mastodon: Cyfarwyddiadau datgloi' @@ -70,11 +73,13 @@ cy: subject: 'Mastodon: Allwedd ddiogelwch wedi''i dileu' title: Mae un o'ch allweddi diogelwch wedi'i ddileu webauthn_disabled: - explanation: Mae dilysu gydag allweddi diogelwch wedi'i analluogi ar gyfer eich cyfrif. Mae mewngofnodi bellach yn bosibl gan ddefnyddio'r tocyn a gynhyrchir gan yr ap TOTP pâr yn unig. + explanation: Mae dilysu gydag allweddi diogelwch wedi'i analluogi ar gyfer eich cyfrif. + extra: Mae mewngofnodi bellach yn bosibl gan ddefnyddio'r tocyn wedi'i gynhyrchu gan yr ap TOTP pâr yn unig. subject: 'Mastodon: Dilysiad gydag allweddi diogelwch wedi''i analluogi' title: Allweddi diogelwch wedi'u hanalluogi webauthn_enabled: - explanation: Mae dilysiad allwedd diogelwch wedi'i alluogi ar gyfer eich cyfrif. Gellir defnyddio'ch allwedd ddiogelwch nawr ar gyfer mewngofnodi. + explanation: Mae dilysiad allwedd diogelwch wedi'i alluogi ar gyfer eich cyfrif. + extra: Mae modd defnyddio'ch allwedd ddiogelwch nawr i fewngofnodi. subject: 'Mastodon: Dilysiad allwedd diogelwch wedi''i alluogi' title: Allweddi diogelwch wedi'u galluogi omniauth_callbacks: diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml index 17593be3fdd5ac..daf802cdb734de 100644 --- a/config/locales/devise.da.yml +++ b/config/locales/devise.da.yml @@ -47,16 +47,19 @@ da: subject: 'Mastodon: Instruktioner til adgangskodenulstilling' title: Adgangskodenulstilling two_factor_disabled: - explanation: Tofaktorgodkendelse for kontoen er blevet deaktiveret. Indlogning er nu kun mulig via email og adgangskode. + explanation: Indlogning er nu mulig via kun e-mailadresse og adgangskode. subject: 'Mastodon: Tofaktorgodkendelse deaktiveret' + subtitle: Tofaktorgodkendelse for kontoen er blevet deaktiveret. title: 2FA deaktiveret two_factor_enabled: - explanation: Tofaktorgodkendelse er blevet aktiveret for kontoen. Indlogning vil kærve et token genereret af den parrede TOTP-app. + explanation: Token genereret af parret TOTP-app vil være nødvendig for indlogning. subject: 'Mastodon: Tofaktorgodkendelse aktiveret' + subtitle: Tofaktorgodkendelse er blevet aktiveret for kontoen. title: 2FA aktiveret two_factor_recovery_codes_changed: explanation: De tidligere gendannelseskoder er ugyldiggjorte og nye er genereret. subject: 'Mastodan: Tofaktorgendannelseskoder genereret igen' + subtitle: Tidligere gendannelseskoder er ugyldiggjorte og nye er genereret. title: 2FA gendannelseskoder skiftet unlock_instructions: subject: 'Mastodon: Oplåsningsinstruktioner' @@ -70,11 +73,13 @@ da: subject: 'Mastodon: Sikkerhedsnøgle slettet' title: En af dine sikkerhedsnøgler er blevet slettet webauthn_disabled: - explanation: Godkendelse med sikkerhedsnøgler er blevet deaktiveret for kontoen. Indlogning er nu kun mulig via token genereret af den parrede TOTP-app. + explanation: Godkendelse med sikkerhedsnøgler er blevet deaktiveret for kontoen. + extra: Indlogning er nu mulig kun via tokenet genereret af parret TOTP-app. subject: 'Mastodon: Godkendelse med sikkerhedsnøgler deaktiveret' title: Sikkerhedsnøgler deaktiveret webauthn_enabled: - explanation: Sikkerhedsnøglegodkendelse er aktiveret for kontoen. Din sikkerhedsnøgle kan nu bruges til indlogning. + explanation: Sikkerhedsnøglegodkendelse er blevet aktiveret for kontoen. + extra: Sikkerhedsnøglen kan nu bruges til indlogning. subject: 'Mastodon: Sikkerhedsnøglegodkendelse aktiveret' title: Sikkerhedsnøgler aktiveret omniauth_callbacks: diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml index a77240dabe1a8e..cf05ddc16b1994 100644 --- a/config/locales/devise.de.yml +++ b/config/locales/devise.de.yml @@ -47,16 +47,19 @@ de: subject: 'Mastodon: Anleitung zum Zurücksetzen deines Passworts' title: Passwort zurücksetzen two_factor_disabled: - explanation: Zwei-Faktor-Authentisierung (2FA) für dein Konto wurde deaktiviert. Eine Anmeldung ist jetzt nur noch mit E-Mail-Adresse und Passwort möglich. + explanation: Das Anmelden ist jetzt nur noch mit einer E-Mail-Adresse und einem Passwort möglich. subject: 'Mastodon: Zwei‐Faktor‐Authentisierung (2FA) deaktiviert' + subtitle: Zwei-Faktor-Authentisierung wurde für dein Konto deaktiviert. title: 2FA deaktiviert two_factor_enabled: - explanation: Die Zwei-Faktor-Authentisierung (2FA) wurde für dein Konto aktiviert. Das zeitbasierte Einmalpasswort, das von deiner TOTP-App generiert wird, muss bei jeder Anmeldung zusätzlich eingegeben werden. + explanation: Für das Anmelden wird ein Token benötigt, das von der hinterlegten TOTP-App generiert wird. subject: 'Mastodon: Zwei‐Faktor‐Authentisierung (2FA) aktiviert' + subtitle: Zwei-Faktor-Authentisierung wurde für dein Konto aktiviert. title: 2FA aktiviert two_factor_recovery_codes_changed: explanation: Die vorherigen Wiederherstellungscodes wurden ungültig gemacht und es wurden neue erstellt. subject: 'Mastodon: Zwei-Faktor-Wiederherstellungscodes neu erstellt' + subtitle: Die vorherigen Wiederherstellungscodes wurden ungültig gemacht und es wurden neue erstellt. title: 2FA-Wiederherstellungscodes geändert unlock_instructions: subject: 'Mastodon: Anleitung zum Entsperren deines Kontos' @@ -70,11 +73,13 @@ de: subject: 'Mastodon: Sicherheitsschlüssel entfernt' title: Einer deiner Sicherheitsschlüssel wurde entfernt webauthn_disabled: - explanation: Das Authentisieren mit Sicherheitsschlüsseln wurde für dein Konto deaktiviert. Die Anmeldung ist jetzt nur noch mit dem zeitbasierten Einmalpasswort möglich, das von deiner TOTP-App generiert wird. + explanation: Die Authentisierung mit Sicherheitsschlüsseln wurde für dein Konto deaktiviert. + extra: Das Anmelden ist jetzt nur noch mit Token aus der TOTP-App möglich, die im Konto hinterlegt wurde. subject: 'Mastodon: Authentisierung mit Sicherheitsschlüsseln deaktiviert' title: Sicherheitsschlüssel deaktiviert webauthn_enabled: - explanation: Die Authentisierung mit Sicherheitsschlüssel wurde für dein Konto aktiviert. Dein Sicherheitsschlüssel kann nun für die Anmeldung verwendet werden. + explanation: Die Authentisierung mit Sicherheitsschlüsseln wurde für dein Konto aktiviert. + extra: Dein Sicherheitsschlüssel kann jetzt zum Anmelden verwendet werden. subject: 'Mastodon: Authentisierung mit Sicherheitsschlüssel aktiviert' title: Sicherheitsschlüssel aktiviert omniauth_callbacks: diff --git a/config/locales/devise.el.yml b/config/locales/devise.el.yml index 13daa4b97a7fc3..52674dc8493994 100644 --- a/config/locales/devise.el.yml +++ b/config/locales/devise.el.yml @@ -47,16 +47,19 @@ el: subject: 'Mastodon: Οδηγίες επαναφοράς συνθηματικού' title: Επαναφορά συνθηματικού two_factor_disabled: - explanation: Η επαλήθευση 2 βημάτων (2FA) έχει απενεργοποιηθεί για το λογαριασμό σου. Η σύνδεση γίνεται απλά με το email και το συνθηματικό. + explanation: Η σύνδεση είναι τώρα δυνατή χρησιμοποιώντας μόνο τη διεύθυνση ηλεκτρονικού ταχυδρομείου και τον κωδικό πρόσβασης. subject: 'Mastodon: Απενεργοποιήθηκε η επαλήθευση 2 βημάτων (2FA)' + subtitle: Ο έλεγχος ταυτότητας δύο παραγόντων για τον λογαριασμό σας έχει απενεργοποιηθεί. title: Επαλήθευση 2 βημάτων ανενεργή (2FA) two_factor_enabled: - explanation: Έχει ενεργοποιηθεί η πιστοποίηση 2 παραγόντων για το λογαριασμό σου (2FA). Για να συνδεθείς θα απαιτηθεί πιστοποιημένο τεκμήριο από κάποια ζευγαρωμένη εφαρμογή. + explanation: Ένα διακριτικό που δημιουργείται από τη συνδεδεμένη εφαρμογή TOTP θα απαιτείται για τη σύνδεση. subject: 'Mastodon: Ενεργοποιήθηκε η επαλήθευση 2 βημάτων (2FA)' + subtitle: Ο έλεγχος ταυτότητας δύο παραγόντων έχει ενεργοποιηθεί για τον λογαριασμό σας. title: Επαλήθευση 2 βημάτων ενεργή (2FA) two_factor_recovery_codes_changed: explanation: Οι προηγούμενοι κωδικοί ανάκτησης ακυρώθηκαν και δημιουργήθηκαν νέοι. subject: 'Mastodon: Δημιουργήθηκαν νέοι κωδικοί ανάκτησης' + subtitle: Οι προηγούμενοι κωδικοί ανάκτησης ακυρώθηκαν και δημιουργήθηκαν νέοι. title: Οι κωδικοί ανάκτησης επαλήθευσης 2 βημάτων (2FA) άλλαξαν unlock_instructions: subject: 'Mastodon: Οδηγίες ξεκλειδώματος' @@ -70,11 +73,13 @@ el: subject: 'Mastodon: Διαγράφηκε ένα κλειδί ασφαλείας' title: Ένα από τα κλειδιά ασφαλείας σου διαγράφηκε webauthn_disabled: - explanation: Η επαλήθευση με κλειδί ασφαλείας έχει απενεργοποιηθεί για τον λογαριασμό σας. Η σύνδεση είναι τώρα εφικτή μόνο με τη χρήση κλειδιού που δημιουργημένου με την συνδεδεμένη εφαρμογή TOTP. + explanation: Ο έλεγχος ταυτότητας με κλειδιά ασφαλείας έχει απενεργοποιηθεί για τον λογαριασμό σας. + extra: Η σύνδεση είναι πλέον δυνατή χρησιμοποιώντας μόνο το διακριτικό που δημιουργείται από την εφαρμογή TOTP. subject: 'Mastodon: Η αυθεντικοποίηση με χρήση κλειδιών ασφαλείας απενεργοποιήθηκε' title: Τα κλειδιά ασφαλείας απενεργοποιήθηκαν webauthn_enabled: - explanation: Η επαλήθευση με κλειδί ασφαλείας έχει ενεργοποιηθεί για τον λογαριασμό σας. Μπορείτε να το χρησιμοποιήσετε για να συνδεθείτε. + explanation: Ο έλεγχος ταυτότητας κλειδιού ασφαλείας έχει ενεργοποιηθεί για τον λογαριασμό σας. + extra: Το κλειδί ασφαλείας σας μπορεί τώρα να χρησιμοποιηθεί για τη σύνδεση. subject: 'Mastodon: Ενεργοποιήθηκε η επαλήθευση με κλειδί ασφαλείας' title: Τα κλειδιά ασφαλείας ενεργοποιήθηκαν omniauth_callbacks: diff --git a/config/locales/devise.en-GB.yml b/config/locales/devise.en-GB.yml index e7ab9462dc31aa..8fa02bbd4a0e3e 100644 --- a/config/locales/devise.en-GB.yml +++ b/config/locales/devise.en-GB.yml @@ -47,11 +47,9 @@ en-GB: subject: 'Mastodon: Reset password instructions' title: Password reset two_factor_disabled: - explanation: Two-factor authentication for your account has been disabled. Login is now possible using only e-mail address and password. subject: 'Mastodon: Two-factor authentication disabled' title: 2FA disabled two_factor_enabled: - explanation: Two-factor authentication has been enabled for your account. A token generated by the paired TOTP app will be required for login. subject: 'Mastodon: Two-factor authentication enabled' title: 2FA enabled two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ en-GB: subject: 'Mastodon: Security key deleted' title: One of your security keys has been deleted webauthn_disabled: - explanation: Authentication with security keys has been disabled for your account. Login is now possible using only the token generated by the paired TOTP app. subject: 'Mastodon: Authentication with security keys disabled' title: Security keys disabled webauthn_enabled: - explanation: Security key authentication has been enabled for your account. Your security key can now be used for login. subject: 'Mastodon: Security key authentication enabled' title: Security keys enabled omniauth_callbacks: diff --git a/config/locales/devise.eo.yml b/config/locales/devise.eo.yml index 1c13490e530c0a..af1769aa66f13b 100644 --- a/config/locales/devise.eo.yml +++ b/config/locales/devise.eo.yml @@ -47,11 +47,9 @@ eo: subject: 'Mastodon: Instrukcioj por ŝanĝi pasvorton' title: Pasvorto restarigita two_factor_disabled: - explanation: Dufaktora aŭtentigo por via konto malebligis. Ensalutado nun eblas per nur retpoŝtadreso kaj pasvorto. subject: 'Mastodon: dufaktora aŭtentigo malebligita' title: 2FA estas malŝaltita two_factor_enabled: - explanation: Dufaktora aŭtentigo sukcese ebligita por via akonto. Vi bezonos ĵetonon kreitan per parigitan aplikaĵon por ensaluti. subject: 'Mastodon: Dufaktora aŭtentigo ebligita' title: 2FA aktivigita two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ eo: subject: 'Mastodon: sekureca ŝlosilo forigita' title: Unu el viaj sekurecaj ŝlosiloj estis forigita webauthn_disabled: - explanation: Aŭtentikigo per sekurecaj ŝlosiloj estis malebligita por via konto. Ensaluto nun eblas per nur la signo generita de la parigita TOTP-programo. subject: 'Mastodon: sekureca-ŝlosila aŭtentigo malebligita' title: Sekurecaj ŝlosiloj malaktivigitaj webauthn_enabled: - explanation: Sekureca ŝlosila aŭtentokontrolo estis ebligita por via konto. Via sekureca ŝlosilo nun uzeblas por ensaluti. subject: 'Mastodon: sekureca-ŝlosila aŭtentigo ebligita' title: Sekurecaj ŝlosiloj aktivigitaj omniauth_callbacks: diff --git a/config/locales/devise.es-AR.yml b/config/locales/devise.es-AR.yml index d9c922ed86a3b9..ca60ee5debca62 100644 --- a/config/locales/devise.es-AR.yml +++ b/config/locales/devise.es-AR.yml @@ -47,16 +47,19 @@ es-AR: subject: 'Mastodon: instrucciones para cambiar la contraseña' title: Cambiar contraseña two_factor_disabled: - explanation: La autenticación de dos factores para tu cuenta está deshabilitada. Ahora el inicio de sesión sólo es posible usando la dirección de correo electrónico y la contraseña. + explanation: Ahora es posible iniciar sesión utilizando sólo la dirección de correo electrónico y la contraseña. subject: 'Mastodon: autenticación de dos factores, deshabilitada' + subtitle: Se deshabilitó la autenticación de dos factores para tu cuenta. title: 2FA deshabilitada two_factor_enabled: - explanation: La autenticación de dos factores para tu cuenta está habilitada. Se requiere una clave generada por la aplicación TOTP asociada para iniciar sesión. + explanation: Para iniciar sesión, se requerirá una clave numérica ("token") generada por la aplicación TOTP emparejada. subject: 'Mastodon: autenticación de dos factores, habilitada' + subtitle: Se habilitó la autenticación de dos factores para tu cuenta. title: 2FA habilitada two_factor_recovery_codes_changed: explanation: Los códigos anteriores de recuperación fueron invalidados y se generaron unos nuevos. subject: 'Mastodon: códigos de recuperación de dos factores, regenerados' + subtitle: Los códigos de recuperación anteriores ya no son válidos y se generaron códigos nuevos. title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: instrucciones de desbloqueo' @@ -70,11 +73,13 @@ es-AR: subject: 'Mastodon: llave de seguridad eliminada' title: Se eliminó una de tus llaves de seguridad webauthn_disabled: - explanation: Se deshabilitó la autenticación con llaves de seguridad en tu cuenta. El inicio de sesión ahora es posible usando sólo la clave generada por la aplicación TOTP asociada. + explanation: Se deshabilitó la autenticación con claves de seguridad para tu cuenta. + extra: Ahora es posible iniciar sesión utilizando sólo la clave numérica ("token") generada por la aplicación TOTP emparejada. subject: 'Mastodon: autenticación con llaves de seguridad, deshabilitada' title: Llaves de seguridad deshabilitadas webauthn_enabled: - explanation: Se habilitó la autenticación de llave de seguridad en tu cuenta. Ahora tu llave de seguridad se puede usar para iniciar sesión. + explanation: Se habilitó la autenticación con llave de seguridad para tu cuenta. + extra: Ahora es posible iniciar sesión utilizando tu llave de seguridad. subject: 'Mastodon: autenticación con llaves de seguridad, habilitada' title: Llaves de seguridad habilitadas omniauth_callbacks: diff --git a/config/locales/devise.es-MX.yml b/config/locales/devise.es-MX.yml index 83b425d4410f53..c4a7f319af02f5 100644 --- a/config/locales/devise.es-MX.yml +++ b/config/locales/devise.es-MX.yml @@ -47,16 +47,19 @@ es-MX: subject: 'Mastodon: Instrucciones para reiniciar contraseña' title: Reiniciar contraseña two_factor_disabled: - explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña. + explanation: Ahora es posible iniciar sesión utilizando solamente la dirección de correo electrónico y la contraseña. subject: 'Mastodon: La autenticación de dos factores está deshabilitada' + subtitle: La autenticación de doble factor para tu cuenta ha sido deshabilitada. title: 2FA desactivada two_factor_enabled: - explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar. + explanation: Se requerirá un token generado por la aplicación TOTP emparejada para iniciar sesión. subject: 'Mastodon: La autenticación de dos factores está habilitada' + subtitle: La autenticación de doble factor ha sido habilitada para tu cuenta. title: 2FA activada two_factor_recovery_codes_changed: explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos. subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados' + subtitle: Los códigos de recuperación anteriores han sido invalidados y se han generado códigos nuevos. title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: Instrucciones para desbloquear' @@ -70,11 +73,13 @@ es-MX: subject: 'Mastodon: Clave de seguridad eliminada' title: Una de sus claves de seguridad ha sido eliminada webauthn_disabled: - explanation: La autenticación con claves de seguridad ha sido desactivada para tu cuenta. El inicio de sesión es ahora posible únicamente utilizando el token generado por la aplicación emparejada TOTP. + explanation: La autenticación con claves de seguridad ha sido desactivada para tu cuenta. + extra: Ahora es posible iniciar sesión utilizando únicamente el token generado por la aplicación TOTP emparejada. subject: 'Mastodon: Autenticación con claves de seguridad desactivada' title: Claves de seguridad desactivadas webauthn_enabled: - explanation: La autenticación con clave de seguridad ha sido habilitada para su cuenta. Su clave de seguridad ahora puede ser usada para iniciar sesión. + explanation: La autenticación con clave de seguridad ha sido habilitada para tu cuenta. + extra: Tu clave de seguridad ahora puede usarse para iniciar sesión. subject: 'Mastodon: Autenticación con clave de seguridad activada' title: Claves de seguridad activadas omniauth_callbacks: diff --git a/config/locales/devise.es.yml b/config/locales/devise.es.yml index ef6a70ee4f8e97..642871710db300 100644 --- a/config/locales/devise.es.yml +++ b/config/locales/devise.es.yml @@ -47,16 +47,19 @@ es: subject: 'Mastodon: Instrucciones para reiniciar contraseña' title: Reiniciar contraseña two_factor_disabled: - explanation: La autenticación de dos factores para tu cuenta ha sido deshabilitada. Ahora puedes conectarte solamente usando la dirección de correo electrónico y la contraseña. + explanation: Ahora es posible iniciar sesión utilizando únicamente la dirección de correo electrónico y la contraseña. subject: 'Mastodon: La autenticación de dos factores está deshabilitada' + subtitle: La autenticación de doble factor para tu cuenta ha sido deshabilitada. title: 2FA desactivada two_factor_enabled: - explanation: La autenticación de dos factores para tu cuenta ha sido habilitada. Se requiere un token generado por la aplicación TOTP emparejada para ingresar. + explanation: Se requerirá un token generado por la aplicación TOTP emparejada para iniciar sesión. subject: 'Mastodon: La autenticación de dos factores está habilitada' + subtitle: La autenticación de doble factor ha sido habilitada para tu cuenta. title: 2FA activada two_factor_recovery_codes_changed: explanation: Los códigos de recuperación previos han sido invalidados y se generaron códigos nuevos. subject: 'Mastodon: Los códigos de recuperación de dos factores fueron regenerados' + subtitle: Los códigos de recuperación anteriores han sido invalidados y se han generado códigos nuevos. title: Códigos de recuperación 2FA cambiados unlock_instructions: subject: 'Mastodon: Instrucciones para desbloquear' @@ -70,11 +73,13 @@ es: subject: 'Mastodon: Clave de seguridad eliminada' title: Una de tus claves de seguridad ha sido eliminada webauthn_disabled: - explanation: La autenticación con claves de seguridad ha sido deshabilitada para tu cuenta. Ahora el inicio de sesión solo es posible utilizando el token generado por la aplicación TOTP emparejada. + explanation: La autenticación con claves de seguridad ha sido desactivada para tu cuenta. + extra: Ahora es posible iniciar sesión utilizando únicamente el token generado por la aplicación TOTP emparejada. subject: 'Mastodon: Autenticación con claves de seguridad deshabilitada' title: Claves de seguridad deshabilitadas webauthn_enabled: - explanation: La autenticación con clave de seguridad ha sido habilitada para tu cuenta. Ahora tu clave de seguridad puede ser utilizada para iniciar sesión. + explanation: La autenticación con clave de seguridad ha sido habilitada para tu cuenta. + extra: Tu clave de seguridad ahora puede usarse para iniciar sesión. subject: 'Mastodon: Autenticación de clave de seguridad habilitada' title: Claves de seguridad habilitadas omniauth_callbacks: diff --git a/config/locales/devise.et.yml b/config/locales/devise.et.yml index da1cc989d23f57..3e749f9a0b8098 100644 --- a/config/locales/devise.et.yml +++ b/config/locales/devise.et.yml @@ -47,16 +47,19 @@ et: subject: 'Mastodon: salasõna lähtestamisjuhendid' title: Salasõna lähtestamine two_factor_disabled: - explanation: Kontol on kaheastmeline autentimine välja lülitatud. Sisenemine on võimalik ainult kasutades e-postiaadressi ja salasõna. + explanation: Sisselogimine on nüüd võimalik vaid e-postiaadressi ja salasõnaga. subject: 'Mastodon: Kaheastmeline autentimine välja lülitatud' + subtitle: Kaheastmeline autoriseerimine on sinu konto jaoks nüüd välja lülitatud. title: 2FA keelatud two_factor_enabled: - explanation: Kontol on sisse lülitatud kaheastmeline autentimine. Sisenemiseks on vajalik ühekordne aeguv võti TOTP-rakenduse poolt. + explanation: Sisenemiseks on vaja seotud kaheastmelise autoriseerimise äpi genereeritud võtit. subject: 'Mastodon: kaheastmeline autentimine sisse lülitatud' + subtitle: Sinu konto jaoks on kaheastmeline autoriseerimine sisse lülitatud. title: 2FA lubatud two_factor_recovery_codes_changed: explanation: Eelmised taastekoodid on nüüd kehtetud ning loodud uued. subject: 'Mastodon: Kaheastmelise autentimise taastuskoodid taasloodud' + subtitle: Eelmised taastekoodid on tühistatud ja uued genereeritud. title: 2FA taastekoodid muudetud unlock_instructions: subject: 'Mastodon: Lahti lukustamis juhendid' @@ -70,11 +73,13 @@ et: subject: 'Mastodon: turvavõti kustutatud' title: Üks sinu turvavõtmetest on kustutatud webauthn_disabled: - explanation: Autentimine turvavõtmetega on kontol välja lülitatud. Sisse logimine on nüüd võimalik ainult kasutades seotud TOTP rakenduse poolt genereeritud võtit. + explanation: Turvavõtmega autoriseerimine on sinu konto jaoks välja lülitatud. + extra: Sisenemine on nüüd võimalik vaid seotud kaheastmelise autoriseerimise äpi genereeritud võtmega. subject: 'Mastodon: autentimine turvavõtmega on välja lülitatud' title: Turvavõtmed on välja lülitatud webauthn_enabled: - explanation: Turvavõtmega autentimine on nüüd kontol sisse lülitatud. Nüüd saab kasutada sisse logimiseks sinu turvavõtit. + explanation: Turvavõtmega autoriseerimine on sinu konto jaoks nüüd sisse lülitatud. + extra: Nüüd saab sisselogimiseks kasutada sinu turvavõtit. subject: 'Mastodon: turvavõtme autentimine sisse lülitatud' title: Turvavõtmed on sisse lülitatud omniauth_callbacks: diff --git a/config/locales/devise.eu.yml b/config/locales/devise.eu.yml index eb23e06d4a3a15..624f9ee93d8972 100644 --- a/config/locales/devise.eu.yml +++ b/config/locales/devise.eu.yml @@ -47,16 +47,19 @@ eu: subject: 'Mastodon: Pasahitza berrezartzeko argibideak' title: Pasahitza berrezartzea two_factor_disabled: - explanation: Bi faktoreetako autentifikazioa desgaitu da zure kontuan. Orain saioa hasi daiteke e-mail helbidea eta pasahitza bakarrik erabilita. + explanation: Orain posible da helbide elektronikoa eta pasahitza erabiliz saioa hastea. subject: 'Mastodon: Bi faktoreetako autentifikazioa desgaituta' + subtitle: Kontuaren bi faktoreko autentifikazioa desgaitu da. title: 2FA desgaituta two_factor_enabled: - explanation: Bi faktoreetako autentifikazioa gaitu da zure kontuan. Token bat sortu du lotutako TOTP aplikazioak eta saioa hasteko eskatuko da. + explanation: Parekatutako TOTP aplikazioak sortutako tokena beharko da saioa hasteko. subject: 'Mastodon: Bi faktoreetako autentifikazioa gaituta' + subtitle: Kontuaren bi faktoreko autentifikazioa gaitu da. title: 2FA gaituta two_factor_recovery_codes_changed: explanation: Aurreko kodeak baliogabetu dira eta berriak sortu dira. subject: 'Mastodon: Bi faktoreetako berreskuratze kodeak birsortuta' + subtitle: Aurreko berreskuratze-kodeak baliogabetu eta berriak sortu dira. title: 2FA berreskuratze kodeak aldatuta unlock_instructions: subject: 'Mastodon: Desblokeatzeko argibideak' @@ -70,11 +73,13 @@ eu: subject: 'Mastodon: Segurtasun gakoa ezabatu da' title: Zure segurtasun gakoetako bat ezabatu da webauthn_disabled: - explanation: Segurtasun gako bidezko autentifikazioa desgaitu da zure kontuan. Saioa hasteko modu bakarra parekatutako TOTP aplikazioak sortutako tokena erabiltzea da orain. + explanation: Kontuaren segurtasun-gako bidezko autentifikazioa desgaitu da. + extra: Parekatutako TOTP aplikazioak sortutako tokena erabiliz bakarrik has daiteke saioa orain. subject: 'Mastodon: Segurtasun gakoekin autentifikatzea desgaituta' title: Segurtasun gakoak desgaituta webauthn_enabled: - explanation: Segurtasun gako bidezko autentifikazioa gaitu da zure kontuan. Orain zure segurtasun gakoa erabil dezakezu saioa hasteko. + explanation: Kontuaren segurtasun-gako bidezko autentifikazioa gaitu da. + extra: Orain, segurtasun-gakoa erabil daiteke saioa hasteko. subject: 'Mastodon: Segurtasun gako bidezko autentifikazioa gaituta' title: Segurtasun gakoak gaituta omniauth_callbacks: diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml index 07db5395da0cc6..d4198626d4982a 100644 --- a/config/locales/devise.fa.yml +++ b/config/locales/devise.fa.yml @@ -47,11 +47,9 @@ fa: subject: 'ماستودون: راهنمایی برای بازنشانی گذرواژه' title: بازنشانی گذرواژه two_factor_disabled: - explanation: ورود دومرحله‌ای برای حساب شما غیرفعال شده است. از الان می‌توانید تنها با نشانی ایمیل و گذرواژه وارد حساب خود شوید. subject: 'ماستودون: تأیید هویت دو مرحله‌ای از کار افتاد' title: ورود دومرحله‌ای غیرفعال two_factor_enabled: - explanation: ورود دومرحله‌ای برای حساب شما فعال شده است. برای ورود به کدی نیاز خواهید داشت که نرم‌افزار TOTP از پیش تنظیم شده برایتان می‌سازد. subject: 'ماستودون: تأیید هویت دومرحله‌ای به کار افتاد' title: ورود دومرحله‌ای فعال two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ fa: subject: 'ماستودون: کلید امنیتی حذف شد' title: یکی از کلیدهای امنیتیتان حذف شد webauthn_disabled: - explanation: تأیید هویت با کلیدهای امنیتی برای حسابتان از کار افتاده است. ورود اکنون فقط با ژتون ایجاد شده با کارهٔ TOTP جفت‌شده امکان‌پذیر است. subject: 'ماستودون: تأیید هویت با کلیدهای امنیتی از کار افتاد' title: کلیدهای امنیتی از کار افتادند webauthn_enabled: - explanation: تأیید هویت با کلید امنیتی برای حسابتان به کار افتاده است. اکنون کلید امنیتیتان می‌تواند برای ورود استفاده شود. subject: 'ماستودون: تأیید هویت با کلید امنیتی به کار افتاد' title: کلیدهای امنیتی به کار افتادند omniauth_callbacks: diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml index 7846ebd8c281dc..bedf8a56f600c8 100644 --- a/config/locales/devise.fi.yml +++ b/config/locales/devise.fi.yml @@ -47,11 +47,9 @@ fi: subject: 'Mastodon: ohjeet salasanan vaihtoon' title: Salasanan vaihto two_factor_disabled: - explanation: Tilisi kaksivaiheinen todennus poistettiin käytöstä. Kirjautuminen onnistuu nyt pelkällä sähköpostiosoitella ja salasanalla. subject: 'Mastodon: kaksivaiheinen todennus poistettu käytöstä' title: 2-vaiheinen todennus pois käytöstä two_factor_enabled: - explanation: Kaksivaiheinen todennus on otettu käyttöön tilillesi. Kirjautumiseen tarvitaan kaksivaiheisen todennuksen sovelluksesta saatu koodi. subject: 'Mastodon: kaksivaiheinen todennus otettu käyttöön' title: 2-vaiheinen todennus käytössä two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ fi: subject: 'Mastodon: suojausavain poistettu' title: Yksi suojausavaimistasi on poistettu webauthn_disabled: - explanation: Suojausavaimilla todennus on poistettu käytöstä tililtäsi. Kirjautuminen on nyt mahdollista vain paritetun TOTP-sovelluksen luomaa koodia käyttämällä. subject: 'Mastodon: Todennus suojausavaimilla poistettu käytöstä' title: Suojausavaimet poistettu käytöstä webauthn_enabled: - explanation: Todennus suojausavaimella on otettu käyttöön tilillesi. Suojausavaintasi voidaan nyt käyttää kirjautumiseen. subject: 'Mastodon: Todennus suojausavaimella on otettu käyttöön' title: Suojausavaimet käytössä omniauth_callbacks: diff --git a/config/locales/devise.fo.yml b/config/locales/devise.fo.yml index 35fa0954f47e0c..1f7708bb44fe26 100644 --- a/config/locales/devise.fo.yml +++ b/config/locales/devise.fo.yml @@ -47,16 +47,19 @@ fo: subject: 'Mastodon: Vegleiðing at skifta loyniorð' title: Skift loyniorð two_factor_disabled: - explanation: Tvey-faktor samgildi (2FA) fyri tína kontu er gjørt óvirkið. Nú er møguligt at rita inn við einans at nýta teldupost og loyniorð. + explanation: Innritan er nú møgulig við einans at brúka teldupost og loyniorð. subject: 'Mastodon: Váttan í tveimum stigum er gjørd óvirkin' + subtitle: Váttan í tveimum stigum (2FA) er gjørd óvirkin fyri tína kontu. title: 2FA óvirkið two_factor_enabled: - explanation: Váttan í tveimum stigum er gjørd virkin fyri tína kontu. Eitt merki framleitt av paraðu TOTP appini verður framyvir kravt fyri at rita inn. + explanation: Eitt tekin, sum er gjørt við eini paraðari TOTP app, verður kravt fyri at rita inn. subject: 'Mastodon: Váttan í tveimum stigum er virkin' + subtitle: Váttan í tveimum stigum (2FA) er gjørd virkin fyri tína kontu. title: 2FA virkið two_factor_recovery_codes_changed: explanation: Undanfarnu endurskapanarkodurnar eru ógildaðar og nýggjar eru framleiddar. subject: 'Mastodon: Endurskapanarkodurnar til váttan í tveimum stigum eru framleiddar umaftur' + subtitle: Undanfarnu kodur til endurgerð eru nú óvirknar og nýggjar eru gjørdar. title: 2FA endurskapanarkodur eru broyttar unlock_instructions: subject: 'Mastodon: Vegleiðing í at læsa upp' @@ -70,11 +73,13 @@ fo: subject: 'Mastodon: Trygdarlykilin strikaður' title: Ein av trygdarlyklunum hjá tær er strikaður webauthn_disabled: - explanation: Váttan við trygdarlyklum er gjørd óvirkin fyri tína kontu. Nú ber til at rita inn einans við teknum, sum eru framleidd av paraðu TOTP appini. + explanation: Samgildi við trygdarlyklum er gjørt óvirkið fyri tína kontu. + extra: Innritan er nú møgulig við einans at brúka teknið, sum er gjørt við paraðu TOTP appini. subject: 'Mastodon: Váttan við trygdarlyklum er gjørd óvirkin' title: Trygdarlyklar óvirknir webauthn_enabled: - explanation: Váttan við trygdarlyklum er gjørd virkin á tínari kontu. Nú kann tín trygdarlykil nýtast at rita inn við. + explanation: Trygdarlyklasamgildi er gjørt virkið fyri tína kontu. + extra: Trygdarlyklarnir hjá tær kunnu nú brúkast til innritan. subject: 'Mastodon: Váttan við trygdarlykli gjørd virkin' title: Trygdarlyklar gjørdir virknir omniauth_callbacks: diff --git a/config/locales/devise.fr-CA.yml b/config/locales/devise.fr-CA.yml index e9f09a69806862..34104e0ac56206 100644 --- a/config/locales/devise.fr-CA.yml +++ b/config/locales/devise.fr-CA.yml @@ -47,16 +47,19 @@ fr-CA: subject: 'Mastodon: Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe two_factor_disabled: - explanation: L'authentification à deux facteurs pour votre compte a été désactivée. La connexion est maintenant possible en utilisant uniquement l'adresse courriel et le mot de passe. + explanation: La connexion est maintenant possible en n'utilisant uniquement l'adresse e-mail et le mot de passe. subject: 'Mastodon: authentification à deux facteurs désactivée' + subtitle: L'authentification à deux facteurs pour votre compte a été désactivée. title: A2F désactivée two_factor_enabled: - explanation: L'authentification à deux facteurs a été activée pour votre compte. Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. + explanation: Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. subject: 'Mastodon: authentification à deux facteurs activée' + subtitle: L'authentification à deux facteurs est maintenant activée pour votre compte. title: A2F activée two_factor_recovery_codes_changed: explanation: Les codes de récupération précédents ont été invalidés et de nouveaux ont été générés. subject: 'Mastodon: codes de récupération à deux facteurs régénérés' + subtitle: Les codes de récupération précédents ont été invalidés et de nouveaux codes ont été générés. title: Codes de récupération A2F modifiés unlock_instructions: subject: 'Mastodon: Instructions pour déverrouiller votre compte' @@ -70,11 +73,9 @@ fr-CA: subject: 'Mastodon: Clé de sécurité supprimée' title: Une de vos clés de sécurité a été supprimée webauthn_disabled: - explanation: L'authentification avec les clés de sécurité a été désactivée pour votre compte. La connexion est maintenant possible en utilisant uniquement le jeton généré par l'application TOTP appairée. subject: 'Mastodon: Authentification avec clés de sécurité désactivée' title: Clés de sécurité désactivées webauthn_enabled: - explanation: L'authentification par clé de sécurité a été activée pour votre compte. Votre clé de sécurité peut maintenant être utilisée pour vous connecter. subject: 'Mastodon: Authentification de la clé de sécurité activée' title: Clés de sécurité activées omniauth_callbacks: diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml index 8eb744d94c10f9..1fc6663bfe1894 100644 --- a/config/locales/devise.fr.yml +++ b/config/locales/devise.fr.yml @@ -47,16 +47,19 @@ fr: subject: 'Mastodon : Instructions pour changer votre mot de passe' title: Réinitialisation du mot de passe two_factor_disabled: - explanation: L'authentification à deux facteurs pour votre compte a été désactivée. La connexion est maintenant possible en utilisant uniquement l'adresse courriel et le mot de passe. + explanation: La connexion est maintenant possible en n'utilisant uniquement l'adresse e-mail et le mot de passe. subject: 'Mastodon : authentification à deux facteurs désactivée' + subtitle: L'authentification à deux facteurs pour votre compte a été désactivée. title: 2FA désactivée two_factor_enabled: - explanation: L'authentification à deux facteurs a été activée pour votre compte. Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. + explanation: Un jeton généré par l'application appairée TOTP sera nécessaire pour vous connecter. subject: 'Mastodon : authentification à deux facteurs activée' + subtitle: L'authentification à deux facteurs est maintenant activée pour votre compte. title: A2F activée two_factor_recovery_codes_changed: explanation: Les codes de récupération précédents ont été invalidés et de nouveaux ont été générés. subject: 'Mastodon : codes de récupération à deux facteurs régénérés' + subtitle: Les codes de récupération précédents ont été invalidés et de nouveaux codes ont été générés. title: Codes de récupération A2F modifiés unlock_instructions: subject: 'Mastodon : Instructions pour déverrouiller votre compte' @@ -70,11 +73,9 @@ fr: subject: 'Mastodon: Clé de sécurité supprimée' title: Une de vos clés de sécurité a été supprimée webauthn_disabled: - explanation: L'authentification avec les clés de sécurité a été désactivée pour votre compte. La connexion est maintenant possible en utilisant uniquement le jeton généré par l'application TOTP appairée. subject: 'Mastodon: Authentification avec clés de sécurité désactivée' title: Clés de sécurité désactivées webauthn_enabled: - explanation: L'authentification par clé de sécurité a été activée pour votre compte. Votre clé de sécurité peut maintenant être utilisée pour vous connecter. subject: 'Mastodon: Authentification de la clé de sécurité activée' title: Clés de sécurité activées omniauth_callbacks: diff --git a/config/locales/devise.fy.yml b/config/locales/devise.fy.yml index 910d2d30947b1b..05fd7b807108b3 100644 --- a/config/locales/devise.fy.yml +++ b/config/locales/devise.fy.yml @@ -49,16 +49,19 @@ fy: subject: 'Mastodon: Wachtwurd opnij ynstelle' title: Wachtwurd opnij ynstelle two_factor_disabled: - explanation: Twa-stapsferifikaasje foar jo account is útskeakele. Jo kinne no allinnich oanmelde mei in e-mailadres en wachtwurd. + explanation: Jo kinne no oanmelde mei allinnich in e-mailadres en wachtwurd. subject: 'Mastodon: Twa-stapsferifikaasje útskeakele' + subtitle: Twastapsferifikaasje foar jo account is útskeakele. title: Twa-stapsferifikaasje útskeakele two_factor_enabled: - explanation: Twa-stapsferifikaasje foar jo account is ynskeakele. Om oanmelde te kinnen is in troch in twa-stapsferifikaasje-app generearre tagongskoade nedich. + explanation: Jo hawwe in troch de autentikaasje-app genearre tagongskoade nedich om oan te melden. subject: 'Mastodon: Twa-stapsferifikaasje ynskeakele' + subtitle: Twastapsferifikaasje is foar jo account ynskeakele. title: Twa-stapsferifikaasje ynskeakele two_factor_recovery_codes_changed: explanation: De foarige werstelkoaden binne ûnjildich makke en nije binne oanmakke. subject: 'Mastodon: Twa-staps-werstelkoaden binne opnij oanmakke' + subtitle: De foarige werstelkoaden binne ûnjildich makke en nije binne oanmakke. title: Werstelkoaden twa-stapsferifikaasje wizige unlock_instructions: subject: 'Mastodon: Ynstruksjes foar ûntskoatteljen' @@ -72,11 +75,13 @@ fy: subject: 'Mastodon: Befeiligingskaai fuortsmiten' title: Ien fan jo befeiligingskaaien is fuortsmiten webauthn_disabled: - explanation: Ferifikaasje mei befeiligingskaaien is útskeakele foar jo account. Oanmelden is no allinnich mooglik mei it gebrûk fan in troch in keppele TOTP-app generearre kaai. + explanation: Ferifikaasje mei befeiligingskaaien is foar jo account útskeakele. + extra: It is no allinnich mooglik om oan te melden mei in troch de autentikaasje-app genearre tagongskoade. subject: 'Mastodon: Ferifikaasje mei befeiligingskaaien is útskeakele' title: Befeiligingskaaien útskeakele webauthn_enabled: - explanation: Ferifikaasje mei befeiligingskaaien is ynskeakele foar jo account. Jo befeiligingskaai kin no brûkt wurde om oan te melden. + explanation: Ferifikaasje mei befeiligingskaaien is foar jo account ynskeakele. + extra: Jo befeiligingskaai kin no brûkt wurde om oan te melden. subject: 'Mastodon: Ferifikaasje mei befeiligingskaaien is ynskeakele' title: Befeiligingskaaien ynskeakele omniauth_callbacks: diff --git a/config/locales/devise.gd.yml b/config/locales/devise.gd.yml index c8a34054cf18e0..1bf489cfbb308b 100644 --- a/config/locales/devise.gd.yml +++ b/config/locales/devise.gd.yml @@ -47,11 +47,9 @@ gd: subject: 'Mastodon: Stiùireadh air ath-shuidheachadh an fhacail-fhaire' title: Ath-shuidheachadh an fhacail-fhaire two_factor_disabled: - explanation: Chaidh an dearbhadh dà-cheumnach a chur à comas dhan chunntas agad. ’S urrainn dhut clàradh a-steach le seòladh puist-d is facal-faire a-mhàin a-nis. subject: 'Mastodon: Tha an dearbhadh dà-cheumnach à comas' title: Dearbhadh dà-cheumnach à comas two_factor_enabled: - explanation: Chaidh an dearbhadh dà-cheumnach a chur an comas dhan chunntas agad. Bidh feum air tòcan a ghineas an aplacaid TOTP a chaidh a phaidhreachadh airson clàradh a-steach. subject: 'Mastodon: Tha an dearbhadh dà-cheumnach an comas' title: Dearbhadh dà-cheumnach an comas two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ gd: subject: 'Mastodon: Chaidh iuchair tèarainteachd a sguabadh às' title: Chaidh tè dhe na h-iuchraichean tèarainteachd agad a sguabadh às webauthn_disabled: - explanation: Chaidh an dearbhadh le iuchraichean tèarainteachd a chur à comas dhan chunntas agad. ’S urrainn dhut clàradh a-steach leis an tòcan a ghineas an aplacaid TOTP paidhrichte a-mhàin a-nis. subject: 'Mastodon: Tha dearbhadh le iuchraichean tèarainteachd à comas' title: Chaidh na h-iuchraichean tèarainteachd a chur à comas webauthn_enabled: - explanation: Chaidh an dearbhadh le iuchair tèarainteachd a chur an comas dhan chunntas agad. ’S urrainn dhut an iuchair tèarainteachd agad a chleachdadh airson clàradh a-steach a-nis. subject: 'Mastodon: Tha dearbhadh le iuchair tèarainteachd an comas' title: Chaidh na h-iuchraichean tèarainteachd a chur an comas omniauth_callbacks: diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml index b392f4642c01bd..b9f4a0a0056381 100644 --- a/config/locales/devise.gl.yml +++ b/config/locales/devise.gl.yml @@ -47,16 +47,19 @@ gl: subject: 'Mastodon: Instrucións para restabelecer o contrasinal' title: Restabelecer contrasinal two_factor_disabled: - explanation: A autenticación de dobre factor para a túa conta foi desactivada. É agora posíbel acceder só co teu enderezo de email e contrasinal. + explanation: Agora xa podes acceder usando simplemente o correo e contrasinal. subject: 'Mastodon: Autenticación de dobre factor desactivada' + subtitle: Desactivouse o segundo factor de autenticación. title: 2FA desactivado two_factor_enabled: - explanation: A autenticación de dobre factor foi activada para a túa conta. Un token, xerado pola aplicación TOTP emparellada, será necesario para acceder. + explanation: Vai ser preciso usar un código creado pola app TOTP emparellada. subject: 'Mastodon: Activouse a autenticación de dobre factor' + subtitle: Activouse o segundo factor de autenticación para a conta. title: 2FA activado two_factor_recovery_codes_changed: explanation: Os códigos de recuperación anteriores fican anulados e os novos foron xerados. subject: 'Mastodon: Xerados novos códigos de recuperación de dobre factor' + subtitle: Os anteriores códigos de recuperación quedaron desactivados e crearonse uns novos. title: Códigos de recuperación 2FA mudados unlock_instructions: subject: 'Mastodon: Instrucións para desbloquear' @@ -70,11 +73,13 @@ gl: subject: 'Mastodon: Chave de seguridade eliminada' title: Eliminouse unha das túas chaves de seguridade webauthn_disabled: - explanation: Desactivouse para a túa conta a autenticación con chaves de seguridade. Agora a conexión é posible usando só o token creado pola app TOTP emparellada. + explanation: Desactivouse para a conta a autenticación con chaves de seguridade. + extra: Agora só se pode acceder usando o código creado pola app TOTP emparellada. subject: 'Mastodon: Desactivouse a autenticación con chave de seguridade' title: Chaves de seguridade desactivadas webauthn_enabled: - explanation: Activouse para a conta a autenticación con chave de seguridade. Xa podes usar a chave de seguridade para contectar. + explanation: Activouse para a conta a autenticación con chave de seguridade. + extra: Xa podes usar a chave de seguridade para acceder. subject: 'Mastodon: Autenticación con chave de seguridade activada' title: Chaves de seguridade activas omniauth_callbacks: diff --git a/config/locales/devise.he.yml b/config/locales/devise.he.yml index e45f62b031ff42..f2ec3a6716e1cd 100644 --- a/config/locales/devise.he.yml +++ b/config/locales/devise.he.yml @@ -47,16 +47,19 @@ he: subject: 'מסטודון: הוראות לאיפוס סיסמה' title: איפוס סיסמה two_factor_disabled: - explanation: האימות הדו-גורמי לחשבונך בוטל. ניתן עתה להכנס לחשבון עם כתובת דוא"ל וסיסמא בלבד. + explanation: החיבור כרגע אפשרי בעזרת שם משתמש וסיסמא ותו לא. subject: 'מסטודון: אימות דו גורמי מושבת' + subtitle: אימות דו-שלבי כובה לחשבון זה. title: אימות דו-גורמי הושעה two_factor_enabled: - explanation: אימות דו-גורמי הופעל בחשבונך. עתה על מנת להכנס לחשבון נדרש אסימון המיוצר על אפליקציית ה-TOTP המצומדת. + explanation: כדי להתחבר דרוש קוד חד פעמי מיישומון TOTP ששידכת לחשבון זה. subject: 'מסטודון: אימות דו גורמי הופעל' + subtitle: אימות דו־שלבי הופעל לחשבונך. title: אימות דו־גורמי הופעל two_factor_recovery_codes_changed: explanation: צפני האיחזור הקודמים בוטלו, וחדשים נוצרו. subject: 'מסטודון: צפני אחזור דו-גורמי יוצרו מחדש' + subtitle: צפני האיחזור הקודמים בוטלו, וחדשים נוצרו. title: צפני אחזור דו-גורמי השתנו unlock_instructions: subject: 'מסטודון: הוראות לביטול נעילה' @@ -70,11 +73,13 @@ he: subject: 'מסטודון: מפתח האבטחה נמחק' title: אחד ממפתחות האבטחה שלך נמחק webauthn_disabled: - explanation: בוטלה האפשרות לאמת את חשבונך בעזרת מפתחות אבטחה. כניסה לחשבון אפשרית עכשיו רק בעזרת אסימון שיוצר באפליקציית ה-TOTP המצומדת. + explanation: אימות במפתחות אבטחה כובה לחשבונך. + extra: חיבור כעת ניתן רק על ידי הקוד שיוצר על ידי יישומון TOTP ששודך. subject: 'מסטודון: אימות בעזרת מפתחות אבטחה הושעה' title: מפתחות אבטחה הושעו webauthn_enabled: - explanation: אימות בעזרת מפתחות אבטחה הופעלו עבור חשבונך. ניתן עתה להשתמש במפתח האבטחה שלך על מנת להכנס לחשבון. + explanation: אימות מפתח בטחון הופעל בחשבונך. + extra: ניתן להשתמש כעת במפתח האבטחה שלך כדי להתחבר. subject: 'מסטודון: אימות בעזרת מפתח אבטחה אופשר' title: מפתחות אבטחה אופשרו omniauth_callbacks: diff --git a/config/locales/devise.hu.yml b/config/locales/devise.hu.yml index 6eb1524ed19809..522ac66ad3591b 100644 --- a/config/locales/devise.hu.yml +++ b/config/locales/devise.hu.yml @@ -47,11 +47,9 @@ hu: subject: 'Mastodon: Jelszóvisszaállítási utasítások' title: Jelszó visszaállítása two_factor_disabled: - explanation: A fiókod kétlépcsős hitelesítését kikapcsoltuk. A bejelentkezés mostantól csak az e-mail cím és a jelszó használatával lesz lehetséges. subject: Kétlépcsős azonosítás kikapcsolva title: Kétlépcsős hitelesítés kikapcsolva two_factor_enabled: - explanation: A kétlépcsős hitelesítést engedélyeztük a fiókodban. A bejelentkezéshez a párosított TOTP alkalmazás által generált tokenre lesz szükség. subject: 'Mastodon: Kétlépcsős azonosítás engedélyezve' title: Kétlépcsős hitelesítés engedélyezve two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ hu: subject: 'Mastodon: A biztonsági kulcs törlésre került' title: Az egyik biztonsági kulcsodat törölték webauthn_disabled: - explanation: A biztonsági kulccsal történő hitelesítést letiltottuk a fiókodon. Bejelentkezni csak a párosított TOTP app által generált tokennel lehet. subject: 'Mastodon: A biztonsági kulccsal történő hitelesítés letiltásra került' title: A biztonsági kulcsok letiltásra kerültek webauthn_enabled: - explanation: A biztonsági kulccsal történő hitelesítést engedélyeztük a fiókodon. A biztonsági kulcsodat mostantól használhatod bejelentkezésre. subject: 'Mastodon: A biztonsági kulcsos hitelesítés engedélyezésre került' title: A biztonsági kulcsok engedélyezésre kerültek omniauth_callbacks: diff --git a/config/locales/devise.hy.yml b/config/locales/devise.hy.yml index 2d235c0af1407d..ee23163f519d31 100644 --- a/config/locales/devise.hy.yml +++ b/config/locales/devise.hy.yml @@ -47,11 +47,9 @@ hy: subject: Մաստոդոն․ Գաղտնաբառի վերականգնման նկարագրութիւններ title: Վերականգնել գաղտնաբառը two_factor_disabled: - explanation: 2FA֊ն քո հաշուի համար անջատուեց։ Մուտքն այժմ հնարաւոր է միայն էլ․ փոտի եւ գաղտնաբառի միջոցով։ subject: Մաստոդոն․ 2FA֊ն անջատուեց title: 2FA անջատուած է two_factor_enabled: - explanation: 2FA֊ն քո հաշուի համար միացուած է։ TOTP ծրագրի միջոցով գեներացուած token֊ը պէտք է օգտագործես մուտք գործելու համար։ subject: Մաստոդոն․ 2FA-ն միացուեց title: 2FA միացուած է two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ hy: subject: Մաստոդոն․ Անվտանգութեան բանալին ջնջուել է title: Անվտանգութեան բանալիներիցդ մեկը ջնջուել է webauthn_disabled: - explanation: Անվտանգութեան բանալիներով նոյնականացումը քո հաշուից կասեցուել է։ Մուտք գործելն այժմ հնարաւոր է՝ օգտագործելով միայն զուգաւորուած TOTP յաւելուածից գեներացուած կտրօնը։ subject: Մաստոդոն․ Նոյնականացումն անվտանգութեան բանալիներով կասեցուած է title: Անվտանգութեան բանալիները կասեցուել են webauthn_enabled: - explanation: Անվտանգութեան բանալիով նոյնականացումը քո հաշուի համար միացուած է։ Քո անվտանգութեան բանալին այժմ կարող է օգտագործուել մուտք գործելու համար։ subject: Մաստոդոն․ Անվտանգութեան բանալիով նոյնականացումը միացուած է title: Անվտանգութեան բանալիները միացուել են omniauth_callbacks: diff --git a/config/locales/devise.id.yml b/config/locales/devise.id.yml index 2e51a69dc26978..c0dede95aa8160 100644 --- a/config/locales/devise.id.yml +++ b/config/locales/devise.id.yml @@ -47,11 +47,9 @@ id: subject: 'Mastodon: Petunjuk mereset kata sandi' title: Reset kata sandi two_factor_disabled: - explanation: Otentifikasi dua-faktor untuk akun Anda dimatikan. Kini Masuk dapat dilakukan hanya dengan alamat email dan kata sandi. subject: 'Mastodon: Otentifikasi dua-faktor dimatikan' title: 2FA dimatikan two_factor_enabled: - explanation: Otentifikasi dua-faktor telah dimatikan untuk Akun Anda. Token yang dibuat menggunakan aplikasi TOTP berpasangan akan diperlukan untuk masuk. subject: 'Mastodon: Otentifikasi dua-faktor diaktifkan' title: 2FA diaktifkan two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ id: subject: 'Mastodon: Kunci keamanan dihapus' title: Salah satu dari kunci keamanan Anda telah dihapus webauthn_disabled: - explanation: Autentikasi dengan kunci keamanan telah dinonaktifkan untuk akun ini. Proses masuk akun hanya mungkin menggunakan token yang dibuat dengan aplikasi TOTP. subject: 'Mastodon: Autentikasi dengan kunci keamanan dinoaktifkan' title: Kunci keamanan dinonaktifkan webauthn_enabled: - explanation: Autentikasi kunci keamanan telah diaktifkan untuk akun Anda. Kunci keamanan Anda kini dapat dipakai untuk masuk. subject: 'Mastodon: Autentikasi kunci keamanan aktif' title: Kunci keamanan aktif omniauth_callbacks: diff --git a/config/locales/devise.ie.yml b/config/locales/devise.ie.yml index 05a41147d83982..97cda4e8c6d521 100644 --- a/config/locales/devise.ie.yml +++ b/config/locales/devise.ie.yml @@ -47,16 +47,18 @@ ie: subject: 'Mastodon: Instructiones por reiniciar li passa-parol' title: Reiniciar passa-parol two_factor_disabled: - explanation: 2-factor autentication por tui conto ha esset desactivisat. Aperter session nu es possibil solmen per email-adresse e passa-parol. + explanation: Aperter session es nu possibil solmen per email-adresse e passa-parol. subject: 'Mastodon: 2-factor autentication desactivat' + subtitle: 2-factor autentication por tui conto ha esset desactivisat. title: 2FA desvalidat two_factor_enabled: - explanation: 2-factor autentication ha esset activat por tui conto. Un gage generat per li acuplat apli TOTP va esser besonat por intrar. subject: 'Mastodon: 2-factor autentication activat' + subtitle: 2-factor autentication ha esset activisat por tui conto. title: 2FA permisset two_factor_recovery_codes_changed: explanation: Li anteyan codes de recuperation ha esset ínvalidat, e novis generat. subject: 'Mastodon: 2-factor codes de recuperation regenerat' + subtitle: Li anteyan codes de recuperation ha esset ínvalidat, e novis generat. title: 2FA codes de recuperation changeat unlock_instructions: subject: 'Mastodon: Desserral instructiones' @@ -70,11 +72,12 @@ ie: subject: 'Mastodon: Clave de securitá deletet' title: Un ex tui claves de securitá ha esset deletet webauthn_disabled: - explanation: Autentication per claves de securitá ha esset desactivat por tui conto. Ja on posse intrar solmen con li gage generat per li acuplat apli TOTP. + explanation: Autentication per clave de securitá ha esset desactivisat por tui conto. subject: 'Mastodon: Autentication con claves de securitá desactivisat' title: Claves de securitá desactivisat webauthn_enabled: - explanation: Autentication per clave de securitá ha esset activat por tui conto. Ja li clave de securitá posse esser usat por intrar. + explanation: Autentication per clave de securitá ha esset activisat por tui conto. + extra: Tui clave de securitá nu posse esser usat por aperter session. subject: 'Mastodon: Autentication per clave de securitá activat' title: Claves de securitá activisat omniauth_callbacks: diff --git a/config/locales/devise.io.yml b/config/locales/devise.io.yml index fb90c08c7ff659..6bf0b52cef18b0 100644 --- a/config/locales/devise.io.yml +++ b/config/locales/devise.io.yml @@ -47,11 +47,9 @@ io: subject: Instrucioni por chanjar la pasvorto title: Richanjo di pasvorto two_factor_disabled: - explanation: 2-faktorverifiko por vua konto deaktivigesis. Eniro esas nun posible per nur retpostadreso e pasvorto. subject: 'Mastodon: 2-faktorverifiko deaktivigesis' title: 2FA deaktivigesis two_factor_enabled: - explanation: 2-faktorverifiko aktivigesis por vua konto. Fisho quo facesis da parigita softwaro TOTP bezonesos por eniro. subject: 'Mastodon: 2-faktorverifiko aktivigesis' title: 2FA aktivigesis two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ io: subject: 'Mastodon: Sekurklefo efacesis' title: 1 de vua sekurklefi efacesis webauthn_disabled: - explanation: Verifiko per sekurklefi deaktivigesis por vua konto. Eniro nun esas posibla per nur ficho quo facesis da parita softwaro TOTP. subject: 'Mastodon: Verifiko per sekurklefi deaktivigesis' title: Sekurklefi deaktivigesis webauthn_enabled: - explanation: Sekurklefverifiko aktivigesis por vua konto. Vua sekurklefo nun povas uzesar por eniro. subject: 'Mastodon: Sekurklefverifiko aktivigesis' title: Sekurklefi aktivigesis omniauth_callbacks: diff --git a/config/locales/devise.is.yml b/config/locales/devise.is.yml index 3b7cf109874ab3..12015fa29d628a 100644 --- a/config/locales/devise.is.yml +++ b/config/locales/devise.is.yml @@ -47,16 +47,19 @@ is: subject: 'Mastodon: Leiðbeiningar til að endurstilla lykilorð' title: Endurstilling lykilorðs two_factor_disabled: - explanation: Tveggja-þátta auðkenning fyrir aðganginn þinn hefur verið gerð óvirk. Núna er einungis hægt að skrá inn með tölvupóstfangi og lykilorði. + explanation: Innskráning er núna möguleg með því að nota aðeins tölvupóstfang og lykilorð. subject: 'Mastodon: Tveggja-þátta auðkenning er óvirk' + subtitle: Tveggja-þátta auðkenning fyrir aðganginn þinn hefur verið gerð óvirk. title: 2FA tveggja-þátta auðkenning er óvirk two_factor_enabled: - explanation: Tveggja-þátta auðkenning hefur verið gerð virk fyrir aðganginn þinn. Krafist er teikns útbúnu af paraða TOTP-forritinu til að skrá inn. + explanation: Teikn sem útbúið hefur verið af pöruðu TOTP-forriti verður nauðsynlegt til innskráningar. subject: 'Mastodon: Tveggja-þátta auðkenning er virk' + subtitle: Tveggja-þátta auðkenning fyrir aðganginn þinn hefur verið gerð virk. title: 2FA tveggja-þátta auðkenning er virk two_factor_recovery_codes_changed: explanation: Fyrri endurheimtukóðar tveggja-þátta auðkenningar voru ógiltir og nýir útbúnir í staðinn. subject: 'Mastodon: Endurheimtukóðar tveggja-þátta auðkenningar voru endurnýjaðir' + subtitle: Fyrri endurheimtukóðar tveggja-þátta auðkenningar voru ógiltir og nýir útbúnir í staðinn. title: Endurheimtukóðar tveggja-þátta auðkenningar breyttust unlock_instructions: subject: 'Mastodon: Leiðbeiningar til að aflæsa' @@ -70,11 +73,13 @@ is: subject: 'Mastodon: Öryggislykli eytt' title: Einum af öryggilyklunum þínum hefur verið eytt webauthn_disabled: - explanation: Auðkenning með öryggislyklum hefur verið gerð óvirk fyrir aðganginn þinn. Innskráning er núna einungis möguleg með teikni útbúnu af paraða TOTP-forritinu. + explanation: Auðkenning með öryggislyklum hefur verið gerð óvirk fyrir aðganginn þinn. + extra: Innskráning er núna möguleg með því að nota einungis teikn útbúnu af paraða TOTP-forritinu. subject: 'Mastodon: Auðkenning með öryggislyklum er óvirk' title: Öryggislyklar eru óvirkir webauthn_enabled: - explanation: Auðkenning með öryggislykli hefur verið gerð virk fyrir aðganginn þinn. Nú er hægt að nota öryggislykilinn þinn til að skrá inn. + explanation: Auðkenning með öryggislykli hefur verið gerð virk fyrir aðganginn þinn. + extra: Nú er hægt að nota öryggislykilinn þinn til að skrá inn. subject: 'Mastodon: Auðkenning með öryggislykli er virk' title: Öryggislyklar eru virkir omniauth_callbacks: diff --git a/config/locales/devise.it.yml b/config/locales/devise.it.yml index 5ea3aeac473923..19bd999aade12e 100644 --- a/config/locales/devise.it.yml +++ b/config/locales/devise.it.yml @@ -47,16 +47,19 @@ it: subject: 'Mastodon: Istruzioni di ripristino della password' title: Ripristino della password two_factor_disabled: - explanation: L'autenticazione a due fattori per il tuo profilo è stata disabilitata. L'accesso è ora possibile utilizzando solo l'indirizzo email e la password. + explanation: Il login è ora possibile utilizzando solo un indirizzo e-mail e una password. subject: 'Mastodon: Autenticazione a due fattori disabilitata' + subtitle: L'autenticazione a due fattori per il tuo account è stata disabilitata. title: A2F disabilitata two_factor_enabled: - explanation: L'autenticazione a due fattori è stata abilitata per il tuo profilo. Un token, generato dall'app TOTP collegata, sarà richiesto per l'accesso. + explanation: Un token generato dall'app TOTP accoppiata sarà richiesto per il login. subject: 'Mastodon: Autenticazione a due fattori abilitata' + subtitle: L'autenticazione a due fattori è stata abilitata per il tuo account. title: A2F abilitata two_factor_recovery_codes_changed: explanation: I precedenti codici di recupero sono stati annullati e dei nuovi sono stati generati. subject: 'Mastodon: Codici di recupero a due fattori rigenerati' + subtitle: I precedenti codici di recupero sono stati annullati e dei nuovi sono stati generati. title: Codici di recupero A2F cambiati unlock_instructions: subject: 'Mastodon: Istruzioni di sblocco' @@ -70,11 +73,13 @@ it: subject: 'Mastodon: Chiave di sicurezza eliminata' title: Una delle tue chiavi di sicurezza è stata eliminata webauthn_disabled: - explanation: L'autenticazione con le chiavi di sicurezza è stata disabilitata per il tuo profilo. L'accesso è ora possibile utilizzando solo il token, generato dall'app TOTP associata. + explanation: L'autenticazione con le chiavi di sicurezza è stata disabilitata per il tuo account. + extra: Il login è ora possibile utilizzando solo il token generato dall'app TOTP accoppiata. subject: 'Mastodon: Autenticazione con chiavi di sicurezza disabilitata' title: Chiavi di sicurezza disabilitate webauthn_enabled: - explanation: L'autenticazione con chiavi di sicurezza è stata abilitata per il tuo profilo. La tua chiave di sicurezza è ora utilizzabile per l'accesso. + explanation: L'autenticazione della chiave di sicurezza è stata abilitata per il tuo account. + extra: La tua chiave di sicurezza può ora essere utilizzata per il login. subject: 'Mastodon: Autenticazione con chiavi di sicurezza abilitata' title: Chiavi di sicurezza abilitate omniauth_callbacks: diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml index ca8ac0584769bb..9a3ffd9c4d569f 100644 --- a/config/locales/devise.ja.yml +++ b/config/locales/devise.ja.yml @@ -47,16 +47,19 @@ ja: subject: 'Mastodon: パスワード再発行' title: パスワード再発行 two_factor_disabled: - explanation: あなたのアカウントの二要素認証が無効化されました。メールとパスワードのみでログインできます。 + explanation: メールアドレスとパスワードのみでログイン可能になりました。 subject: 'Mastodon: 二要素認証が無効になりました' + subtitle: 二要素認証が無効になっています。 title: 二要素認証が無効化されました two_factor_enabled: - explanation: あなたのアカウントの二要素認証が有効化されました。ログインするには TOTP アプリで生成されたコードが必要です。 + explanation: ログインには設定済みのTOTPアプリが生成したトークンが必要です。 subject: 'Mastodon: 二要素認証が有効になりました' + subtitle: 二要素認証が有効になりました。 title: 二要素認証が有効化されました two_factor_recovery_codes_changed: explanation: 以前のリカバリーコードが無効化され、新しいコードが生成されました。 subject: 'Mastodon: 二要素認証のリカバリーコードが再生成されました' + subtitle: 以前のリカバリーコードが無効化され、新しいコードが生成されました。 title: 二要素認証のリカバリーコードが変更されました unlock_instructions: subject: 'Mastodon: アカウントのロックの解除' @@ -70,11 +73,13 @@ ja: subject: 'Mastodon: セキュリティキーが削除されました' title: セキュリティキーが削除されました webauthn_disabled: - explanation: アカウントのセキュリティキーによる認証が無効になりました。ペアリングされたTOTPアプリによって生成されたトークンのみを使用してログインが可能になりました。 + explanation: セキュリティキー認証が無効になっています。 + extra: 設定済みのTOTPアプリが生成したトークンのみでログインできるようになりました。 subject: 'Mastodon: セキュリティキー認証が無効になりました' title: セキュリティキーは無効になっています webauthn_enabled: - explanation: あなたのアカウントでセキュリティキー認証が有効になりました。セキュリティキーをログインに使用できるようになりました。 + explanation: セキュリティキー認証が有効になりました。 + extra: ログインにセキュリティキーを使用できるようになりました。 subject: 'Mastodon: セキュリティキー認証が有効になりました' title: セキュリティキーは有効になっています omniauth_callbacks: diff --git a/config/locales/devise.kab.yml b/config/locales/devise.kab.yml index eb599e55e82628..2f60629fd70cbb 100644 --- a/config/locales/devise.kab.yml +++ b/config/locales/devise.kab.yml @@ -47,11 +47,9 @@ kab: subject: 'Mastodon: Iwellihen n uwennez n wawal uffir' title: Aɛiwed n wawal uffir two_factor_disabled: - explanation: Asesṭeb s snat n tarayin insa i umiḍan-ik·im. Tzemreḍ ad teqnneḍ tura s imayl d wawal uffir kan. subject: 'Mastodon: Asesteb s snat n tarrayin yensa' title: Asesteb s snat n tarrayin insa two_factor_enabled: - explanation: Asesṭeb s snat n tarayin yermed i umiḍan-ik·im. anekcum isra tangalt akken ad yeddu. subject: 'Mastodon: Asesteb s snat n tarrayin yermed' title: Asesteb s snat n tarrayin irmed two_factor_recovery_codes_changed: diff --git a/config/locales/devise.kk.yml b/config/locales/devise.kk.yml index 7ddeb86047e8c0..06fad30aec55e1 100644 --- a/config/locales/devise.kk.yml +++ b/config/locales/devise.kk.yml @@ -47,11 +47,9 @@ kk: subject: 'Mastodon: Құпиясөзді қалпына келтіру нұсқаулықтары' title: Құпиясөзді қалпына келтіру two_factor_disabled: - explanation: Екі факторлы аутентификация сіздің аккаунтыңыз үшін жабық. Email адресіңіз және құпиясөзіңіз арқылы кіруіңізге болады. subject: 'Mastodon: Екі факторлы аутентификация жабық' title: 2FA жабық two_factor_enabled: - explanation: Екі факторлы аутентификация аккаунтыңызға қосылды. TOTP арқылы жасалған токен міндетті кіруіңіз үшін. subject: 'Mastodon: Екі факторлы аутентификация ашық' title: 2FA ашық two_factor_recovery_codes_changed: diff --git a/config/locales/devise.ko.yml b/config/locales/devise.ko.yml index 65f660f1050317..88865aec5840b3 100644 --- a/config/locales/devise.ko.yml +++ b/config/locales/devise.ko.yml @@ -47,11 +47,9 @@ ko: subject: 'Mastodon: 암호 재설정 설명' title: 암호 재설정 two_factor_disabled: - explanation: 당신의 계정에 설정된 이중 인증이 비활성화 되었습니다. 이제 이메일과 암호만으로 로그인이 가능합니다. subject: '마스토돈: 이중 인증 비활성화' title: 2FA 비활성화 됨 two_factor_enabled: - explanation: 당신의 계정에 이중 인증이 활성화되었습니다. 로그인시 페어링된 T-OTP 앱에서 생성된 토큰이 필요합니다. subject: '마스토돈: 이중 인증 활성화' title: 2FA 활성화 됨 two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ko: subject: '마스토돈: 보안 키 삭제' title: 보안 키가 삭제되었습니다 webauthn_disabled: - explanation: 보안 키를 이용한 인증이 당신의 계정에 대해 비활성화 되어 있습니다. TOTP 앱의 토큰만으로 로그인 할 수 있습니다. subject: '마스토돈: 보안 키를 이용한 인증이 비활성화 됨' title: 보안 키 비활성화 됨 webauthn_enabled: - explanation: 보안 키 인증이 당신의 계정에 대해 활성화 되어 있습니다. 보안 키를 통해 로그인 할 수 있습니다. subject: '마스토돈: 보안 키 인증 활성화 됨' title: 보안 키 활성화 됨 omniauth_callbacks: diff --git a/config/locales/devise.ku.yml b/config/locales/devise.ku.yml index 6debd96e05194c..33a868a8a5e167 100644 --- a/config/locales/devise.ku.yml +++ b/config/locales/devise.ku.yml @@ -51,11 +51,9 @@ ku: subject: 'Mastodon: rêwerzên jê birina pêborîn' title: Borînpeyv ji nû ve saz bike two_factor_disabled: - explanation: Ji bo ajimêrê te piştrastkirina du-faktorî hat asteng kirin. Niha tu tenê bi navnîşana e-name û borînpeyva xwe dikarî têketinê bikî. subject: 'Mastodon: piştrastkirina du- faktorî neçalak bike' title: 2FA Neçalak e two_factor_enabled: - explanation: Piştrastkirinê du-faktorî ya ajimêrê te hat çalak kirin. Ji bo têketinê ji alî sepanê cotkirî TOTP ve hewceyî nîşanderek heye. subject: 'Mastodon: piştrastkirina du-faktorî hat çalak kirin' title: 2FA Çalak e two_factor_recovery_codes_changed: @@ -74,11 +72,9 @@ ku: subject: 'Mastodon: Kilîta ewlehiyê hate jêbirin' title: Yek ji kilîta ewlehiyê yên te hate jêbirin webauthn_disabled: - explanation: Rastandina kilîta ewlehiyê hate çalakkirin bo ajimêra te. kilîta te ya ewlehiyê niha bo têketinê dikarê bê karanîn. Têketin niha gengaz e ku mirov tenê nîşana ku ji hêla sepana cotkirî ya TOTP ve hatî avakirin bi kar bîne. subject: 'Mastodon: Rastandin bi kilîta ewlehiyê re nehate çalakirin' title: Kilîta ewlehiyê neçalak e webauthn_enabled: - explanation: Rastandina kilîta ewlehiyê hate çalakkirin bo ajimêra te. kilîta te ya ewlehiyê niha bo têketinê dikarê bê karanîn. subject: 'Mastodon: Rastandina kilîta ewlehiyê hate çalakkirin' title: Kilîta ewlehiyê çalak e omniauth_callbacks: diff --git a/config/locales/devise.lad.yml b/config/locales/devise.lad.yml index 63933b80fc71d6..bec76d82f90bc2 100644 --- a/config/locales/devise.lad.yml +++ b/config/locales/devise.lad.yml @@ -47,16 +47,15 @@ lad: subject: 'Mastodon: Instruksyones para reinisyar kod' title: Reinisyar kod two_factor_disabled: - explanation: La autentifikasyon de dos pasos para tu kuento a sido inkapasitada. Agora puedes konektarte solamente uzando el adreso de posta elektronika i el kod. subject: 'Mastodon: La autentifikasyon de dos pasos esta inkapasitada' title: Autentifikasyon 2FA inkapasitada two_factor_enabled: - explanation: La autentifikasyon de dos pasos para tu kuento a sido kapasitada. Se rekiere un token djenerado por la aplikasyon TOTP konektada para entrar. subject: 'Mastodon: La autentifikasyon de dos pasos esta kapasitada' title: Autentifikasyon 2FA aktivada two_factor_recovery_codes_changed: explanation: Los kodiches de rekuperasyon previos tienen sido invalidados i se djeneraron kodiches muevos. subject: 'Mastodon: Los kodiches de rekuperasyon de dos pasos fueron rejenerados' + subtitle: Los kodiches de rekuperasyon previos tienen sido invalidados i se djeneraron kodiches muevos. title: Kodiches de rekuperasyon 2FA trokados unlock_instructions: subject: 'Mastodon: Instruksyones para dezblokar' @@ -70,11 +69,9 @@ lad: subject: 'Mastodon: Yave de sigurita supremida' title: Una de tus yaves de sigurita tiene sido supremida webauthn_disabled: - explanation: La autentifikasyon kon yaves de sigurita a sido inkapasitada para tu kuento. Agora el inisyo de sesyon solo es posivle utilizando el token djeenerado por la aplikasyon TOTP konektada. subject: 'Mastodon: autentifikasyon kon yaves de sigurita inkapasitada' title: Yaves de sigurita inkapasitadas webauthn_enabled: - explanation: La autentifikasyon kon yave de sigurita a sido kapasitada para tu kuento. Agora tu yave de sigurita puede ser utilizada para inisyar sesyon. subject: 'Mastodon: Autentifikasyon de yave de sigurita aktivada' title: Yaves de sigurita kapasitadas omniauth_callbacks: diff --git a/config/locales/devise.lt.yml b/config/locales/devise.lt.yml index 5429b217d0ac3a..3fba5ed08e909c 100644 --- a/config/locales/devise.lt.yml +++ b/config/locales/devise.lt.yml @@ -47,16 +47,19 @@ lt: subject: 'Mastodon: slaptažodžio keitimo instrukcijos' title: Slaptažodžio keitimas two_factor_disabled: - explanation: Dviejų tapatybės patikrinimas tavo paskyrai buvo išjungtas. Prisijungimas dabar galimas naudojant tik el. pašto adresą ir slaptažodį. + explanation: Prisijungimas dabar galimas naudojant tik el. pašto adresą ir slaptažodį. subject: 'Mastodon: dviejų tapatybės patikrinimas išjungtas' + subtitle: Dviejų tapatybės patikrinimas tavo paskyrai buvo išjungtas. title: 2FA išjungta two_factor_enabled: - explanation: Tavo paskyrai įgalintas dvejų tapatybės patikrinimas. Prisijungiant reikės susietos TOTP programėlės sugeneruoto priegos rakto. + explanation: Prisijungiant reikės susietos TOTP programėlės sugeneruoto priegos rakto. subject: 'Mastodon: dviejų tapatybės patikrinimas įgalintas' + subtitle: Tavo paskyrai įjungtas dviejų tapatybės patikrinimas. title: 2FA įgalinta two_factor_recovery_codes_changed: explanation: Ankstesnieji atkūrimo kodai yra negaliojantys ir sugeneruojami nauji. subject: 'Mastodon: dviejų tapatybės atkūrimo kodai iš naujo sugeneruoti' + subtitle: Ankstesnieji atkūrimo kodai yra negaliojantys ir sugeneruojami nauji. title: Pakeisti 2FA atkūrimo kodai unlock_instructions: subject: 'Mastodon: atrakinimo instrukcijos' @@ -70,11 +73,13 @@ lt: subject: 'Mastodon: saugumo raktas ištrintas' title: Vienas iš tavo saugumo raktų buvo ištrintas webauthn_disabled: - explanation: Tavo paskyrai buvo išjungtas tapatybės nustatymas naudojant saugumo raktus. Prisijungimas dabar galimas naudojant tik susietos TOTP programėlės sugeneruotą prieigos raktą. + explanation: Tavo paskyrai išjungtas tapatybės nustatymas naudojant saugumo raktus. + extra: Prisijungimas dabar galimas naudojant tik susietos TOTP programėlės sugeneruotą prieigos raktą. subject: 'Mastodon: tapatybės nustatymas naudojant saugumo raktai išjungta' title: Saugumo raktai išjungti webauthn_enabled: - explanation: Saugumo rakto tapatybės nustatymas tavo paskyrai įgalintas. Dabar prisijungimui galima naudoti saugumo raktą. + explanation: Tavo paskyrai įjungtas saugumo rakto tapatybės nustatymas. + extra: Tavo saugumo raktą dabar galima naudoti prisijungimui. subject: 'Mastodon: saugumo rakto tapatybės nustatymas įgalintas' title: Saugumo raktai įgalinti omniauth_callbacks: diff --git a/config/locales/devise.lv.yml b/config/locales/devise.lv.yml index e61e1b7fd95a9d..ed4b4fb8c6e5c7 100644 --- a/config/locales/devise.lv.yml +++ b/config/locales/devise.lv.yml @@ -47,11 +47,9 @@ lv: subject: 'Mastodon: Norādījumi paroles atiestatīšanai' title: Paroles atiestatīšana two_factor_disabled: - explanation: Tavam kontam divfaktoru autentifikācija ir atspējota. Pieteikšanās tagad ir iespējama, izmantojot tikai e-pasta adresi un paroli. subject: 'Mastodon: Divfaktoru autentifikācija atspējota' title: 2FA atspējota two_factor_enabled: - explanation: Tavam kontam ir iespējota divfaktoru autentifikācija. Lai pieteiktos, būs nepieciešams kods, ko ģenerējusi pārī savienotā TOTP lietotne. subject: 'Mastodon: Divfaktoru autentifikācija iespējota' title: 2FA iespējota two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ lv: subject: 'Mastodon: Drošības atslēga izdzēsta' title: Viena no tavām drošības atslēgām tika izdzēsta webauthn_disabled: - explanation: Tavam kontam ir atspējota autentifikācija ar drošības atslēgām. Pieteikšanās tagad ir iespējama, izmantojot tikai kodu, ko ģenerējusi pārī savienotā TOTP lietotne. subject: 'Mastodon: Autentifikācija ar drošības atslēgām ir atspējota' title: Drošības atslēgas atspējotas webauthn_enabled: - explanation: Tavam kontam ir iespējota drošības atslēgas autentifikācija. Tavu drošības atslēgu tagad var izmantot, lai pieteiktos. subject: 'Mastodon: Drošības atslēgas autentifikācija iespējota' title: Drošības atslēgas iespējotas omniauth_callbacks: diff --git a/config/locales/devise.ms.yml b/config/locales/devise.ms.yml index 30eceb239d56f5..da18d1896ec38a 100644 --- a/config/locales/devise.ms.yml +++ b/config/locales/devise.ms.yml @@ -47,11 +47,9 @@ ms: subject: 'Mastodon: Arahan set semula kata laluan' title: Set semula kata laluan two_factor_disabled: - explanation: Pengesahan dwifaktor untuk akaun anda telah dilumpuhkan. Log masuk kini dibenarkan dengan hanya menggunakan alamat e-mel dan kata laluan. subject: 'Mastodon: Pengesahan dwifaktor dilumpuhkan' title: 2FA dinyahaktifkan two_factor_enabled: - explanation: Pengesahan dwifaktor untuk akaun anda telah didayakan. Satu token yang dijanakan oleh aplikasi TOTP diperlukan untuk melog masuk. subject: 'Mastodon: Pengesahan dwifaktor didayakan' title: 2FA diaktifkan two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ms: subject: 'Mastodon: Kunci keselamatan dihapuskan' title: Salah satu daripada kunci keselamatan anda telah dihapuskan webauthn_disabled: - explanation: Pengesahan dengan kunci keselamatan untuk akaun anda telah dilumpuhkan. Log masuk kini dibenarkan dengan hanya menggunakan token yang dijanakan oleh aplikasi TOTP. subject: 'Mastodon: Pengesahan dengan kunci keselamatan dilumpuhkan' title: Kunci keselamatan dilumpuhkan webauthn_enabled: - explanation: Pengesahan kunci keselamatan untuk akaun anda kini didayakan. Kunci keselamatan anda kini boleh digunakan untuk melog masuk. subject: 'Mastodon: Pengesahan kunci keselamatan didayakan' title: Kunci keselamatan didayakan omniauth_callbacks: diff --git a/config/locales/devise.my.yml b/config/locales/devise.my.yml index 04d744cf2bd775..126ecd74047d15 100644 --- a/config/locales/devise.my.yml +++ b/config/locales/devise.my.yml @@ -47,11 +47,9 @@ my: subject: 'Mastodon: စကားဝှက်ညွှန်ကြားချက် ပြန်လည်သတ်မှတ်မည်' title: စကားဝှက်ပြန်လည်သတ်မှတ်မည် two_factor_disabled: - explanation: သင့်အကောင့်အတွက် နှစ်ဆင့်ခံလုံခြုံရေးစနစ်အထောက်အထားပြခြင်းကို ပိတ်ထားသည်။ အီးမေးလ်လိပ်စာနှင့် စကားဝှက်ကိုသာ အသုံးပြု၍ အကောင့်ဝင်ရောက်နိုင်ပါသည်။ subject: 'Mastodon: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ပိတ်ထားသည်' title: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ပိတ်ထားသည် two_factor_enabled: - explanation: သင့်အကောင့်အတွက် နှစ်ဆင့်ခံလုံခြုံရေးစနစ်အထောက်အထားပြခြင်းကို ဖွင့်ထားသည်။ TOTP အက်ပ်မှ ထုတ်ပေးသည့် တိုကင်တစ်ခုမှာ အကောင့်ဝင်ရန်အတွက် လိုအပ်ပါသည်။ subject: 'Mastodon: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ဖွင့်ထားသည်' title: နှစ်ဆင့်ခံလုံခြုံရေးစနစ်ဖွင့်ထားသည် two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ my: subject: 'Mastodon: လုံခြုံရေးသော့ချက် ဖျက်လိုက်ပါပြီ' title: လုံခြုံရေးသော့ချက်များထဲမှတစ်ခု ဖျက်လိုက်ပါပြီ webauthn_disabled: - explanation: သင့်အကောင့်အတွက် လုံခြုံရေးကီးများဖြင့် အထောက်အထားပြခြင်းကို ပိတ်ထားသည်။ TOTP အက်ပ်မှထုတ်ပေးသည့် တိုကင်ကိုသာ အသုံးပြု၍ အကောင့်ဝင်ရောက်နိုင်ပါသည်။ subject: Mastodon - လုံခြုံရေးကီးများဖြင့် အထောက်အထားစိစစ်ခြင်းကို ပိတ်ထားသည် title: လုံခြုံရေးသော့ချက်များ ပိတ်ပြီးပါပြီ webauthn_enabled: - explanation: သင့်အကောင့်အတွက် လုံခြုံရေးကီး အထောက်အထားစိစစ်ခြင်းကို ဖွင့်ထားသည်။ အကောင့်ဝင်ရန်အတွက် သင်၏လုံခြုံရေးကီးကို ယခုအသုံးပြုနိုင်ပါပြီ။ subject: Mastodon - လုံခြုံရေးကီး အထောက်အထားစိစစ်ခြင်းကို ဖွင့်ထားသည် title: လုံခြုံရေးသော့ချက်များ ဖွင့်ပြီးပါပြီ omniauth_callbacks: diff --git a/config/locales/devise.nl.yml b/config/locales/devise.nl.yml index 1b5081fe8c58da..33d777e2ccc512 100644 --- a/config/locales/devise.nl.yml +++ b/config/locales/devise.nl.yml @@ -47,16 +47,19 @@ nl: subject: 'Mastodon: Wachtwoord opnieuw instellen' title: Wachtwoord opnieuw instellen two_factor_disabled: - explanation: Tweestapsverificatie voor jouw account is uitgeschakeld. Je kunt nu alleen inloggen met een e-mailadres en wachtwoord. + explanation: Je kunt nu inloggen met alleen een e-mailadres en wachtwoord. subject: 'Mastodon: Tweestapsverificatie uitgeschakeld' + subtitle: Tweestapsverificatie voor je account is uitgeschakeld. title: Tweestapsverificatie uitgeschakeld two_factor_enabled: - explanation: Tweestapsverificatie voor jouw account is ingeschakeld. Om te kunnen inloggen is een door een tweestapsverificatie-app genereerde toegangscode nodig. + explanation: Je hebt een door de authenticatie-app gegeneerde toegangscode nodig om in te loggen. subject: 'Mastodon: Tweestapsverificatie ingeschakeld' + subtitle: Tweestapsverificatie voor je account is ingeschakeld. title: Tweestapsverificatie ingeschakeld two_factor_recovery_codes_changed: explanation: De vorige herstelcodes zijn ongeldig gemaakt en nieuwe zijn aangemaakt. subject: 'Mastodon: Tweestaps-herstelcodes zijn opnieuw aangemaakt' + subtitle: De vorige herstelcodes zijn ongeldig gemaakt en er zijn nieuwe gegenereerd. title: Herstelcodes tweestapsverificatie veranderd unlock_instructions: subject: 'Mastodon: Instructies om opschorten account ongedaan te maken' @@ -70,11 +73,13 @@ nl: subject: 'Mastodon: Beveiligingssleutel verwijderd' title: Een van jouw beveiligingssleutels is verwijderd webauthn_disabled: - explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor jouw account. Inloggen is nu alleen mogelijk met het gebruik van een door een gepaarde TOTP-app genereerde sleutel. + explanation: Verificatie met beveiligingssleutels is uitgeschakeld voor je account. + extra: Het is nu alleen mogelijk om te te loggen met een door de authenticatie-app gegeneerde toegangscode. subject: 'Mastodon: Verificatie met beveiligingssleutels is uitgeschakeld' title: Beveiligingssleutels uitgeschakeld webauthn_enabled: - explanation: Verificatie met beveiligingssleutels is ingeschakeld voor jouw account. Jouw beveiligingssleutel kan nu gebruikt worden om in te loggen. + explanation: Verificatie met beveiligingssleutels is ingeschakeld voor je account. + extra: Jouw beveiligingssleutel kan nu gebruikt worden om in te loggen. subject: 'Mastodon: Verificatie met beveiligingssleutels is ingeschakeld' title: Beveiligingssleutels ingeschakeld omniauth_callbacks: diff --git a/config/locales/devise.nn.yml b/config/locales/devise.nn.yml index eee99284750fc2..acee9fdcdc7dcb 100644 --- a/config/locales/devise.nn.yml +++ b/config/locales/devise.nn.yml @@ -47,11 +47,9 @@ nn: subject: 'Mastodon: Instuksjonar for å endra passord' title: Attstilling av passord two_factor_disabled: - explanation: To-faktor-autentisering har vorte slått av for kontoen din. Det går no an logge inn med berre e-postadresse og passord. subject: 'Mastodon: To-faktor-autentisering deaktivert' title: 2FA deaktivert two_factor_enabled: - explanation: To-faktor-autentisering har vorte slått på for kontoen din. Ein kode frå den samankopla TOTP-appen er kravd for å logge inn. subject: 'Mastodon: To-faktor-autentisering aktivert' title: 2FA aktivert two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ nn: subject: 'Mastodon: Sikkerheitsnøkkel sletta' title: Ein av sikkerheitsnøklane dine har blitt sletta webauthn_disabled: - explanation: Du kan ikkje bruke tryggleiksnyklar til å logga inn på kontoen din. Du kan berre logga inn med koden frå tofaktor-appen som er kopla saman med brukarkontoen din. subject: 'Mastodon: Autentisering med sikkerheitsnøklar vart skrudd av' title: Sikkerheitsnøklar deaktivert webauthn_enabled: - explanation: Pålogging med tryggleiksnyklar er skrudd på. No kan du bruka nykelen din for å logga på. subject: 'Mastodon: Sikkerheitsnøkkelsautentisering vart skrudd på' title: Sikkerheitsnøklar aktivert omniauth_callbacks: diff --git a/config/locales/devise.no.yml b/config/locales/devise.no.yml index a5d6cad7a10611..0d824da8157ffb 100644 --- a/config/locales/devise.no.yml +++ b/config/locales/devise.no.yml @@ -47,11 +47,9 @@ subject: 'Mastodon: Hvordan nullstille passord' title: Nullstill passord two_factor_disabled: - explanation: Tofaktorautentisering for kontoen din har blitt skrudd av. Pålogging er nå mulig ved å bruke kun e-postadresse og passord. subject: 'Mastodon: Tofaktorautentisering deaktivert' title: 2FA deaktivert two_factor_enabled: - explanation: Tofaktorautentisering er aktivert for kontoen din. Et token som er generert av appen for tidsbasert engangspassord (TOTP) som er koblet til kontoen kreves for innlogging. subject: 'Mastodon: Tofaktorautentisering aktivert' title: 2FA aktivert two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ subject: 'Mastodon: Sikkerhetsnøkkel slettet' title: En av sikkerhetsnøklene dine har blitt slettet webauthn_disabled: - explanation: Autentisering med sikkerhetsnøkler er deaktivert for kontoen din. Innlogging er nå mulig ved hjelp av kun et token som er generert av engangspassord-appen som er koblet til kontoen. subject: 'Mastodon: Autentisering med sikkerhetsnøkler ble skrudd av' title: Sikkerhetsnøkler deaktivert webauthn_enabled: - explanation: Sikkerhetsnøkkel-autentisering er aktivert for din konto. Din sikkerhetsnøkkel kan nå brukes til innlogging. subject: 'Mastodon: Sikkerhetsnøkkelsautentisering ble skrudd på' title: Sikkerhetsnøkler aktivert omniauth_callbacks: diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml index 16419cd1e34343..2640777e008939 100644 --- a/config/locales/devise.oc.yml +++ b/config/locales/devise.oc.yml @@ -47,11 +47,9 @@ oc: subject: Mastodon : consignas per reïnicializar lo senhal title: Reïnicializacion del senhal two_factor_disabled: - explanation: L’autentificacion dos factors per vòstre compte es estada desactivada. La connexion es ara possibla solament amb l’adreça electronica e lo senhal. subject: 'Mastodon : autentificacion dos factors desactivada' title: 2FA desactivat two_factor_enabled: - explanation: L’autentificacion dos factors es estada activada per vòstre compte. La connexion demandarà un geton generat per l’aplicacion TOTP associada. subject: 'Mastodon : autentificacion dos factor activada' title: 2FA activat two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ oc: subject: 'Mastodon : clau de seguretat suprimida' title: Una de vòstras claus de seguretats es estada suprimida webauthn_disabled: - explanation: L’autentificacion amb de claus de seguretat foguèt estada desactivada per vòstre compte. L’identificacion es ara possible en utilizan un geton generat per una aplicacion TOTP associada. subject: 'Mastodon : autentificacion amb claus de seguretat desactivada' title: Claus de seguretat desactivadas webauthn_enabled: - explanation: L’autentificacion amb de claus de seguretat foguèt estada activada per vòstre compte. Vòstra clau de seguretat pòt ara èsser utilizada per l’identificacion. subject: 'Mastodon : autentificacion via clau de seguretat activada' title: Claus de seguretat activadas omniauth_callbacks: diff --git a/config/locales/devise.pl.yml b/config/locales/devise.pl.yml index ff086888f3c137..a6d48f11ef0e09 100644 --- a/config/locales/devise.pl.yml +++ b/config/locales/devise.pl.yml @@ -47,16 +47,19 @@ pl: subject: 'Mastodon: Instrukcje ustawienia nowego hasła' title: Przywracanie hasła two_factor_disabled: - explanation: Uwierzytelnianie dwuskładnikowe dla Twojego konta zostało wyłączone. Możesz się teraz logować korzystając z samego adresu e-mail i hasła. + explanation: Logowanie teraz możliwe tylko adresem mejlowym i hasłem. subject: Mastodon – wyłączono uwierzytelnianie dwustopniowe + subtitle: Wyłączono uwierzytelnienie dwuskładnikowe dla twojego konta. title: Wyłączono 2FA two_factor_enabled: - explanation: Uwierzytelnianie dwuskładnikowe dla Twojego konta zostało włączone. Logując się, będziesz potrzebować tokenu z połączonej aplikacji TOTP. + explanation: Do zalogowanie potrzebny będzie token sparowanej aplikacji TOTP. subject: Mastodon – włączono uwierzytelnianie dwustopniowe + subtitle: Włączono uwierzytelnienie dwuskładnikowe dla twojego konta. title: Włączono 2FA two_factor_recovery_codes_changed: explanation: Poprzednie kody zapasowe zostały unieważnione, a nowe zostały wygenerowane. subject: Mastodon – wygenerowano nowe kody ratunkowe 2FA + subtitle: Unieważniono stare kody przywracania i wygenerowano nowe. title: Zmieniono kody odzyskiwania 2FA unlock_instructions: subject: 'Mastodon: Instrukcje odblokowania konta' @@ -70,11 +73,13 @@ pl: subject: 'Mastodon: Klucz bezpieczeństwa usunięty' title: Usunięto jeden z twoich kluczy bezpieczeństwa webauthn_disabled: - explanation: Uwierzytelnianie kluczem bezpieczeństwa zostało wyłączone dla Twojego konta. Logowanie jest teraz możliwe tylko przy użyciu tokenu generowanego przez sparowaną aplikację TOTP. + explanation: Wyłączono autoryzację kluczami bezpieczeństwa dla twojego konta. + extra: Logowanie teraz możliwe tylko tokenem wygenerowanym przez sparowaną aplikację TOTP. subject: 'Mastodon: Wyłączono uwierzytelnianie z kluczami bezpieczeństwa' title: Wyłączono klucze bezpieczeństwa webauthn_enabled: - explanation: Uwierzytelnianie klucza bezpieczeństwa zostało włączone dla Twojego konta. Klucz bezpieczeństwa może być teraz wykorzystywany do logowania. + explanation: Włączono autoryzację kluczami bezpieczeństwa dla twojego konta. + extra: Twój klucz bezpieczeństwa może być teraz użyty do logowania. subject: 'Mastodon: Włączono uwierzytelnianie z kluczami bezpieczeństwa' title: Włączono klucze bezpieczeństwa omniauth_callbacks: diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml index 6345a103b81fe3..8b53f96514b5d7 100644 --- a/config/locales/devise.pt-BR.yml +++ b/config/locales/devise.pt-BR.yml @@ -47,16 +47,18 @@ pt-BR: subject: 'Mastodon: Instruções para alterar senha' title: Redefinir senha two_factor_disabled: - explanation: A autenticação de dois fatores para sua conta foi desativada. Agora é possível entrar apenas com seu endereço de e-mail e senha. + explanation: O ‘login’ agora é possível usando apenas o endereço de e-mail e senha. subject: 'Mastodon: Autenticação de dois fatores desativada' + subtitle: A autenticação de dois fatores foi desativada. title: 2FA desativada two_factor_enabled: - explanation: A autenticação de dois fatores foi ativada para sua conta. Um código gerado no aplicativo TOTP pareado será necessário para entrar. subject: 'Mastodon: Autenticação de dois fatores ativada' + subtitle: A autenticação de dois fatores foi ativada para sua conta. title: 2FA ativada two_factor_recovery_codes_changed: explanation: Os códigos de recuperação anteriores foram invalidados e novos códigos foram gerados. subject: 'Mastodon: Novos códigos de recuperação de dois fatores' + subtitle: Os códigos de recuperação anteriores foram invalidados, e novos códigos foram gerados. title: Códigos de recuperação de dois fatores alterados unlock_instructions: subject: 'Mastodon: Instruções de desbloqueio' @@ -70,11 +72,12 @@ pt-BR: subject: 'Mastodon: Chave de segurança excluída' title: Uma das suas chaves de segurança foi excluída webauthn_disabled: - explanation: A autenticação por chaves de segurança foi desativada para a sua conta. Agora é possível entrar apenas com seu código gerado no aplicativo TOTP pareado. + explanation: A autenticação por chaves de segurança foi desativada para sua conta. subject: 'Mastodon: Autenticação por chaves de segurança desativada' title: Chaves de segurança desativadas webauthn_enabled: - explanation: A autenticação por chave de segurança foi ativada para a sua conta. Sua chave de segurança agora pode ser usada para entrar. + explanation: Autenticação por chave de segurança foi ativada para sua conta. + extra: Sua chave de segurança agora pode ser usada para ‘login’. subject: 'Mastodon: Autenticação por chaves de segurança ativada' title: Chaves de segurança ativadas omniauth_callbacks: diff --git a/config/locales/devise.pt-PT.yml b/config/locales/devise.pt-PT.yml index 0571598ae0c93f..c169ddeb971887 100644 --- a/config/locales/devise.pt-PT.yml +++ b/config/locales/devise.pt-PT.yml @@ -47,16 +47,19 @@ pt-PT: subject: 'Mastodon: Instruções para redefinir a palavra-passe' title: Solicitar nova palavra-passe two_factor_disabled: - explanation: A autenticação em duas etapas para a sua conta foi desativada. É agora possível aceder apenas com o seu endereço de e-mail e palavra-passe. + explanation: O acesso agora é possível usando apenas o endereço de correio eletrónico e palavra-passe. subject: 'Mastodon: Autenticação de duas etapas desativada' + subtitle: A autenticação de dois fatores foi desativada para a sua conta. title: 2FA desativado two_factor_enabled: - explanation: A autenticação em duas etapas foi ativada para a sua conta. Um token, gerado pela aplicação TOTP emparelhada, será necessário para aceder. + explanation: Um token gerado pelo aplicativo TOTP emparelhado será necessário para login. subject: 'Mastodon: Autenticação em duas etapas ativada' + subtitle: A autenticação de dois fatores foi habilitada para sua conta. title: 2FA ativado two_factor_recovery_codes_changed: explanation: Os códigos de recuperação anteriores foram invalidados e novos foram gerados. subject: 'Mastodon: Gerados novos códigos de recuperação em duas etapas' + subtitle: Os códigos de recuperação anteriores foram invalidados e novos foram gerados. title: Códigos de recuperação 2FA alterados unlock_instructions: subject: 'Mastodon: Instruções para desbloquear a tua conta' @@ -70,11 +73,13 @@ pt-PT: subject: 'Mastodon: Chave de segurança eliminada' title: Uma das suas chaves de segurança foi eliminada webauthn_disabled: - explanation: A autenticação com chave de segurança foi desativada para a sua conta. Tornou-se possível aceder à sua conta usando apenas o token gerado pela aplicação TOTP emparelhada. + explanation: A autenticação com chaves de segurança foi desativada para sua conta. + extra: O login agora é possível usando apenas o token gerado pelo aplicativo TOTP emparelhado. subject: 'Mastodon: Autenticação com chave de segurança desativada' title: Chaves de segurança desativadas webauthn_enabled: - explanation: A autenticação com chave de segurança foi ativada para sua conta. A sua chave de segurança pode agora ser utilizada para aceder à sua conta. + explanation: A autenticação da chave de segurança foi habilitada para sua conta. + extra: Sua chave de segurança agora pode ser usada para login. subject: 'Mastodon: Autenticação com chave de segurança ativada' title: Chaves de segurança ativadas omniauth_callbacks: diff --git a/config/locales/devise.ro.yml b/config/locales/devise.ro.yml index d25d0f6b3e17f7..1a6a3ecd778de6 100644 --- a/config/locales/devise.ro.yml +++ b/config/locales/devise.ro.yml @@ -47,11 +47,9 @@ ro: subject: Instrucțiuni pentru resetarea parolei title: Resetare parolă two_factor_disabled: - explanation: Autentificarea în doi pași pentru contul tău a fost dezactivată. Autentificarea este posibilă acum folosind doar adresa de e-mail și parola. subject: Autentificare cu doi factori dezactivată title: 2FA dezactivat two_factor_enabled: - explanation: Autentificarea în doi pași a fost activată pentru contul dvs. Un token generat de aplicația TOTP împerecheată va fi necesar pentru autentificare. subject: Autentificare în doi pași activată title: 2FA activat two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ro: subject: 'Mastodon: Cheie de securitate ștearsă' title: Una dintre cheile tale de securitate a fost ștearsă webauthn_disabled: - explanation: Autentificarea cu chei de securitate a fost dezactivată pentru contul tău. Conectarea este posibilă acum folosind doar token-ul generat de aplicația TOTP. subject: 'Mastodon: Autentificarea cu chei de securitate dezactivată' title: Chei de securitate dezactivate webauthn_enabled: - explanation: Autentificarea cheii de securitate a fost activată pentru contul tău. Cheia ta de securitate poate fi acum folosită pentru conectare. subject: 'Mastodon: Autentificarea cheii de securitate activată' title: Chei de securitate activate omniauth_callbacks: diff --git a/config/locales/devise.ru.yml b/config/locales/devise.ru.yml index d2903ce23d934d..ccbd13438d6257 100644 --- a/config/locales/devise.ru.yml +++ b/config/locales/devise.ru.yml @@ -47,11 +47,9 @@ ru: subject: 'Mastodon: Инструкция по сбросу пароля' title: Сброс пароля two_factor_disabled: - explanation: Для вашей учётной записи была отключена двухфакторная авторизация. Выполнить вход теперь можно используя лишь e-mail и пароль. subject: 'Mastodon: Двухфакторная авторизация отключена' title: 2ФА отключена two_factor_enabled: - explanation: Для вашей учётной записи была настроена двухфакторная авторизация. Отныне для входа потребуется также временный код из приложения-аутентификатора. subject: 'Mastodon: Настроена двухфакторная авторизация' title: 2ФА включена two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ ru: subject: 'Мастодон: Ключ Безопасности удален' title: Один из ваших защитных ключей был удален webauthn_disabled: - explanation: Аутентификация с помощью ключей безопасности отключена для вашей учётной записи. Теперь вход возможен с использованием только токена, сгенерированного в приложении TOTP. subject: 'Мастодон: Аутентификация с ключами безопасности отключена' title: Ключи безопасности отключены webauthn_enabled: - explanation: Для вашей учётной записи включена аутентификация по ключу безопасности. Теперь ваш ключ безопасности может быть использован для входа. subject: 'Мастодон: Включена аутентификация по ключу безопасности' title: Ключи безопасности включены omniauth_callbacks: diff --git a/config/locales/devise.sc.yml b/config/locales/devise.sc.yml index 02bcab0d111196..5486371a4c671a 100644 --- a/config/locales/devise.sc.yml +++ b/config/locales/devise.sc.yml @@ -47,11 +47,9 @@ sc: subject: 'Mastodon: Istrutziones pro resetare sa crae' title: Càmbiu de crae two_factor_disabled: - explanation: S'autenticatzione a duos fatores est istada disativada pro su contu tuo. Immoe podes intrare impreende isceti indiritzu de posta eletrònica e crae. subject: 'Mastodon: Autenticatzione a duos fatores disativada' title: 2FA disativada two_factor_enabled: - explanation: S'autenticatzione a duos fatores est istada ativada pro su contu tuo. Pro s'atzessu at èssere rechèdidu unu còdighe de autorizatzione generadu dae s'aplicatzione TOTP. subject: 'Mastodon: Autenticatzione a duos fatores ativada' title: 2FA ativada two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ sc: subject: 'Mastodon: Crae de seguresa cantzellada' title: Una de is craes de seguresa tuas est istada cantzellada webauthn_disabled: - explanation: S'autenticatzione cun craes de seguresa est istada disabilitada pro su contu tuo. S'intrada immoe est possìbile impreende isceti su getone ingendradu dae s'aplicatzione TOTP ligada. subject: 'Mastodon: Autenticatzione cun craes de seguresa disabilitada' title: Craes de seguresa disabilitadas webauthn_enabled: - explanation: S'autenticatzione cun crae de seguresa est istada abilitada pro su contu tuo. Sa crae de seguresa tua immoe si podet impreare pro intrare. subject: 'Mastodon: Autenticatzione cun sa crae de seguresa ativada' title: Craes de seguresa abilitadas omniauth_callbacks: diff --git a/config/locales/devise.sco.yml b/config/locales/devise.sco.yml index 8563b4ee24d5cf..1db6bbe30320d6 100644 --- a/config/locales/devise.sco.yml +++ b/config/locales/devise.sco.yml @@ -47,11 +47,9 @@ sco: subject: 'Mastodon: Reset passwird instructions' title: Passwird reset two_factor_disabled: - explanation: Twa factor authentication fir yer accoont haes been turnt aff. Login is noo possible uisin ainly a email address an passwird. subject: 'Mastodon: Twa-factor authentication turnt aff' title: 2FA turnt aff two_factor_enabled: - explanation: Twa-factor authentication haes been turnt on fir yer accoont. A token gien bi the pairt TOTP app wull be needit fir login. subject: 'Mastodon: Twa-factor authentication turnt on' title: 2FA turnt on two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ sco: subject: 'Mastodon: Security key deletit' title: Ane o yer security keys haes been deletit webauthn_disabled: - explanation: Authentication wi security keys haes been turnt aff on yer accoont. Login is noo possible uisin ainly the token generatit bi the pairt TOTP app. subject: 'Mastodon: Authentication wi security keys turnt aff' title: Security keys turnt aff webauthn_enabled: - explanation: Security key authentication haes been turnt on fir yer accoont. Yer security key kin noo be uised fir login. subject: 'Mastodon: Security key authentication turnt on' title: Security keys turnt on omniauth_callbacks: diff --git a/config/locales/devise.si.yml b/config/locales/devise.si.yml index 362f97b8a9b030..d0bfa719bc06d2 100644 --- a/config/locales/devise.si.yml +++ b/config/locales/devise.si.yml @@ -44,10 +44,8 @@ si: subject: 'මාස්ටඩන්: මුරපදය යළි සැකසීමේ උපදෙස්' title: මුරපදය යළි සැකසීම two_factor_disabled: - explanation: ඔබගේ ගිණුම සඳහා ද්වි-සාධක සත්‍යාපනය අබල කර ඇත. විද්‍යුත් තැපැල් ලිපිනය සහ මුරපදය පමණක් භාවිතයෙන් දැන් පුරනය විය හැක. title: ද්විපියවර අබලයි two_factor_enabled: - explanation: ඔබගේ ගිණුම සඳහා ද්වි-සාධක සත්‍යාපනය සක්‍රීය කර ඇත. යුගල කළ TOTP යෙදුම මගින් ජනනය කරන ලද ටෝකනයක් පුරනය වීමට අවශ්‍ය වනු ඇත. title: ද්විපියවර සබලයි two_factor_recovery_codes_changed: explanation: පෙර ප්‍රතිසාධන කේත අවලංගු කර නව ඒවා උත්පාදනය කර ඇත. @@ -65,10 +63,8 @@ si: subject: 'මාස්ටඩන්: ආරක්‍ෂණ යතුර මකා ඇත' title: ඔබගේ ආරක්ෂක යතුරු වලින් එකක් මකා ඇත webauthn_disabled: - explanation: ඔබගේ ගිණුම සඳහා ආරක්ෂක යතුරු සමඟ සත්‍යාපනය අබල කර ඇත. යුගල කළ TOTP යෙදුම මගින් ජනනය කරන ලද ටෝකනය පමණක් භාවිතයෙන් දැන් පුරනය විය හැක. title: ආරක්‍ෂණ යතුරු අබල කර ඇත webauthn_enabled: - explanation: ඔබගේ ගිණුම සඳහා ආරක්ෂක යතුරු සත්‍යාපනය සක්‍රීය කර ඇත. ඔබගේ ආරක්ෂක යතුර දැන් පුරනය වීම සඳහා භාවිතා කළ හැක. title: ආරක්‍ෂණ යතුරු සබල කර ඇත omniauth_callbacks: failure: '"%{reason}" නිසා %{kind} සිට ඔබව සත්‍යාපනය කළ නොහැක.' diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml index e11c7f1db32710..3eb4b5304cf31f 100644 --- a/config/locales/devise.sk.yml +++ b/config/locales/devise.sk.yml @@ -47,11 +47,11 @@ sk: subject: 'Mastodon: Pokyny pre obnovu hesla' title: Nastav nové heslo two_factor_disabled: - explanation: Dvojfázové overovanie tvojho účtu bolo vypnuté. Teraz sa môžeš prihlásiť len pomocou emailu a hesla. + explanation: Prihlásenie je teraz možné iba pomocou emailu a hesla. subject: 'Mastodon: Dvojfázové overovanie vypnuté' + subtitle: Dvoj-faktorové overenie bolo pre tvoj účet vypnuté. title: Dvoj-faktorové overovanie vypnuté two_factor_enabled: - explanation: Dvojfázové overovanie bolo zapnuté pre tvoj účet. Pre prihlásenie budeš potrebovať token vygenerovaný pre TOTP aplikáciu, ktorá je spárovaná. subject: 'Mastodon: Dvojfázové overovanie zapnuté' title: Dvoj-faktorové overovanie zapnuté two_factor_recovery_codes_changed: @@ -70,11 +70,9 @@ sk: subject: 'Mastodon: Bezpečnostný kľúč odstránený' title: Jeden z vašich bezpečnostných kľúčov bol odstránený webauthn_disabled: - explanation: Overovanie pomocou bezpečnostných kľúčov bolo pre vaše konto vypnuté. Prihlásenie je teraz možné len pomocou tokenu vygenerovaného spárovanou aplikáciou TOTP. subject: 'Mastodon: Overovanie s vypnutými bezpečnostnými kľúčmi' title: Bezpečnostné kľúče sú vypnuté webauthn_enabled: - explanation: Pre vaše konto bolo povolené overovanie bezpečnostným kľúčom. Váš bezpečnostný kľúč teraz môžete použiť na prihlásenie. subject: 'Mastodon: Povolené overovanie bezpečnostného kľúča' title: Povolené bezpečnostné kľúče omniauth_callbacks: diff --git a/config/locales/devise.sl.yml b/config/locales/devise.sl.yml index be0f98ae1126a6..72269e48265772 100644 --- a/config/locales/devise.sl.yml +++ b/config/locales/devise.sl.yml @@ -47,11 +47,9 @@ sl: subject: 'Mastodon: navodila za ponastavitev gesla' title: Ponastavitev gesla two_factor_disabled: - explanation: Dvojno oz. dvofazno preverjanje pristnosti je za vaš račun onemogočeno. Prijava je zdaj možna le z e-poštnim naslovom in geslom. subject: 'Mastodon: dvojno preverjanje pristnosti je onemogočeno' title: 2FA onemogočeno two_factor_enabled: - explanation: Dvojno oz. dvofazno preverjanje pristnosti je za vaš račun omogočeno. Žeton, izdelan z aplikacijo TOTP, bo zahtevan zs prijavo. subject: 'Mastodon: dvojno preverjanje pristnosti je omogočeno' title: 2FA omogočeno two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ sl: subject: 'Mastodon: varnostna koda izbrisana' title: Ena od vaših varnostnih kod je bila izbrisana webauthn_disabled: - explanation: Overjanje pristnosti z varnostnimi kodami je za vaš račun onemogočeno. Prijava je zdaj možna le z uporabo žetona, ki ga izdela oparjena aplikacija TOTP. subject: 'Mastodon: overjanje pristnosti z varnosnimi kodami je onemogočeno' title: Varnostne kode onemogočene webauthn_enabled: - explanation: Overjanje z varnostno kodo je za vaš račun omogočeno. Svojo varnostno kodo lahko zdaj uporabite za prijavo. subject: 'Mastodon: preverjanje pristnosti z varnostno kodo je omogočeno' title: Varnostne kode omogočene omniauth_callbacks: diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml index 6e2f1b41138501..7cea2f8e2e5c3f 100644 --- a/config/locales/devise.sq.yml +++ b/config/locales/devise.sq.yml @@ -47,11 +47,9 @@ sq: subject: 'Mastodon: Udhëzime ricaktimi fjalëkalimi' title: Ricaktim fjalëkalimi two_factor_disabled: - explanation: Mirëfilltësimi dyfaktorësh për llogarinë tuaj është çaktivizuar. Hyrja tanimë është e mundur vetëm duke përdorur adresën email dhe fjalëkalimin. subject: 'Mastodon: U çaktivizua mirëfilltësimi dyfaktorësh' title: 2FA u çaktivizua two_factor_enabled: - explanation: Mirëfilltësimi dyfaktorësh është aktivizuar për llogarinë tuaj. Për hyrje, do të kërkohet doemos një token i prodhuar nga aplikacioni TOTP i çiftuar. subject: 'Mastodon: U aktivizua mirëfilltësimi dyfaktorësh' title: 2FA u aktivizua two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ sq: subject: 'Mastodon: Fshirje kyçi sigurie' title: Një nga kyçet tuaj të sigurisë është fshirë webauthn_disabled: - explanation: Mirëfilltësimi me kyçe sigurie është çaktivizuar për llogarinë tuaj. Hyrja tani është e mundshme vetëm duke përdorur token-in e prodhuar nga aplikacioni TOTP i çiftuar. subject: 'Mastodon: U çaktivizua mirëfilltësimi me kyçe sigurie' title: U çaktivizuan kyçe sigurie webauthn_enabled: - explanation: Mirëfilltësimi përmes kyçesh sigurie është aktivizuar për llogarinë tuaj. Tani, për hyrje mund të përdoren kyçet tuaj të sigurisë. subject: 'Mastodon: U aktivizua mirëfilltësim me kyçe sigurie' title: U aktivizuan kyçe sigurie omniauth_callbacks: diff --git a/config/locales/devise.sr-Latn.yml b/config/locales/devise.sr-Latn.yml index 40f3d51c30ffb1..c48ed87dca6b88 100644 --- a/config/locales/devise.sr-Latn.yml +++ b/config/locales/devise.sr-Latn.yml @@ -47,16 +47,19 @@ sr-Latn: subject: 'Mastodont: Uputstvo za resetovanje lozinke' title: Lozinka resetovana two_factor_disabled: - explanation: Dvofaktorska autentifikacija za vaš nalog je onemogućena. Prijava je sada moguća samo pomoću imejla i lozinke. + explanation: Prijavljivanje je sada moguće koristeći samo adresu e-pošte i lozinku. subject: 'Mastodon: Dvofaktorska autentifikacija je onemogućena' + subtitle: Dvofaktorska autentifikacija za vaš nalog je onemogućena. title: 2FA isključena two_factor_enabled: - explanation: Dvofaktorska autentifikacija je omogućena za vaš nalog. Za prijavu će biti potreban token koji generiše uparena TOTP aplikacija. + explanation: Za prijavljivanje će biti potreban token koji generiše uparena aplikacija TOTP. subject: 'Mastodon: Dvofaktorska autentifikacija je omogućena' + subtitle: Dvofaktorska autentifikacija je omogućena za vaš nalog. title: 2FA uključena two_factor_recovery_codes_changed: explanation: Prethodni kodovi za oporavak su poništeni i generisani su novi. subject: 'Mastodon: Ponovo su generisani kodovi za oporavak' + subtitle: Prethodni kodovi za oporavak su poništeni i generisani su novi. title: 2FA kodovi oporavka promenjeni unlock_instructions: subject: 'Mastodont: Uputstvo za otključavanje korisničkog naloga' @@ -70,11 +73,13 @@ sr-Latn: subject: 'Mastodon: Sigurnosni ključ je izbrisan' title: Jedan od vaših bezbednosnih ključeva je izbrisan webauthn_disabled: - explanation: Autentifikacija pomoću bezbednosnih ključeva je onemogućena za vaš nalog. Prijava je sada moguća samo pomoću tokena koji generiše uparena TOTP aplikacija. + explanation: Potvrda identiteta pomoću bezbednosnih ključeva je onemogućena za vaš nalog. + extra: Prijavljivanje je sada moguće koristeći samo token koji generiše uparena aplikacija TOTP. subject: 'Mastodon: Autentifikacija sa sigurnosnim ključevima onemogućena' title: Sigurnosni ključevi su onemogućeni webauthn_enabled: - explanation: Autentifikacija sa bezbednosnim ključem je omogućena za vaš nalog. Vaš sigurnosni ključ se sada može koristiti za prijavljivanje. + explanation: Autentifikacija pomoću bezbednosnog ključa je omogućena za vaš nalog. + extra: Vaš bezbednosni ključ se sada može koristiti za prijavljivanje. subject: 'Mastodon: Omogućena autentifikacija sa bezbednim ključem' title: Sigurnosni ključevi su omogućeni omniauth_callbacks: diff --git a/config/locales/devise.sr.yml b/config/locales/devise.sr.yml index f61431de607ddc..3e49cf97eeb5a6 100644 --- a/config/locales/devise.sr.yml +++ b/config/locales/devise.sr.yml @@ -47,16 +47,19 @@ sr: subject: 'Mastodon: Упутство за ресетовање лозинке' title: Лозинка ресетована two_factor_disabled: - explanation: Двофакторска аутентификација за ваш налог је онемогућена. Пријава је сада могућа само помоћу имејла и лозинке. + explanation: Пријављивање је сада могуће користећи само адресу е-поште и лозинку. subject: 'Mastodon: Двофакторска аутентификација је онемогућена' + subtitle: Двофакторска аутентификација за ваш налог је онемогућена. title: 2FA искључена two_factor_enabled: - explanation: Двофакторска аутентификација је омогућена за ваш налог. За пријаву ће бити потребан токен који генерише упарена ТОТП апликација. + explanation: За пријављивање ће бити потребан токен који генерише упарена апликација TOTP. subject: 'Mastodon: Двофакторска аутентификација је омогућена' + subtitle: Двофакторска аутентификација је омогућена за ваш налог. title: 2FA укључена two_factor_recovery_codes_changed: explanation: Претходни кодови за опоравак су поништени и генерисани су нови. subject: 'Mastodon: Поново су генерисани кодови за опоравак' + subtitle: Претходни кодови за опоравак су поништени и генерисани су нови. title: 2FA кодови опоравка промењени unlock_instructions: subject: 'Mastodon: Упутство за откључавање корисничког налога' @@ -70,11 +73,13 @@ sr: subject: 'Mastodon: Сигурносни кључ је избрисан' title: Један од ваших безбедносних кључева је избрисан webauthn_disabled: - explanation: Аутентификација помоћу безбедносних кључева је онемогућена за ваш налог. Пријава је сада могућа само помоћу токена који генерише упарена ТОТП апликација. + explanation: Потврда идентитета помоћу безбедносних кључева је онемогућена за ваш налог. + extra: Пријављивање је сада могуће користећи само токен који генерише упарена апликација TOTP. subject: 'Mastodon: Аутентификација са сигурносним кључевима онемогућена' title: Сигурносни кључеви су онемогућени webauthn_enabled: - explanation: Аутентификација са безбедносним кључем је омогућена за ваш налог. Ваш сигурносни кључ се сада може користити за пријављивање. + explanation: Аутентификација помоћу безбедносног кључа је омогућена за ваш налог. + extra: Ваш безбедносни кључ се сада може користити за пријављивање. subject: 'Mastodon: Омогућена аутентификација са безбедним кључем' title: Сигурносни кључеви су омогућени omniauth_callbacks: diff --git a/config/locales/devise.sv.yml b/config/locales/devise.sv.yml index e02983ad5f294d..b089f214271432 100644 --- a/config/locales/devise.sv.yml +++ b/config/locales/devise.sv.yml @@ -47,16 +47,19 @@ sv: subject: 'Mastodon: Instruktioner för återställning av lösenord' title: Lösenordsåterställning two_factor_disabled: - explanation: Tvåfaktorsautentisering för ditt konto har inaktiverats. Det är nu möjligt att logga in med enbart e-postadress och lösenord. + explanation: Inloggning är nu möjlig med endast e-postadress och lösenord. subject: 'Mastodon: Tvåfaktorsautentisering inaktiverad' + subtitle: Tvåfaktorsautentisering för ditt konto har inaktiverats. title: 2FA inaktiverad two_factor_enabled: - explanation: Tvåfaktorsautentisering har aktiverats för ditt konto. En token som genereras av en kopplad TOTP-app kommer att krävas vid inloggning. + explanation: En token skapad av den parkopplade TOTP-appen kommer att krävas för inloggning. subject: 'Mastodon: Tvåfaktorsautentisering aktiverad' + subtitle: Tvåfaktorsautentisering har aktiverats för ditt konto. title: 2FA aktiverad two_factor_recovery_codes_changed: explanation: De tidigare återställningskoderna har ogiltigförklarats och nya har genererats. subject: Mastodon Tvåfaktors-återställningskoder genererades på nytt + subtitle: De tidigare återhämtningskoderna har ogiltigförklarats och nya har skapats. title: 2FA-återställningskoder ändrades unlock_instructions: subject: 'Mastodon: Lås upp instruktioner' @@ -70,11 +73,10 @@ sv: subject: 'Mastodon: Säkerhetsnyckeln borttagen' title: En av dina säkerhetsnycklar har raderats webauthn_disabled: - explanation: Autentisering med säkerhetsnycklar till ditt konto har inaktiverats. Inloggning är nu endast möjligt med den token som genereras av den sammankopplade TOTP-appen. + explanation: Autentisering med säkerhetsnycklar har inaktiverats för ditt konto. subject: 'Mastodon: Autentisering med säkerhetsnycklar är inaktiverat' title: Säkerhetsnycklar inaktiverade webauthn_enabled: - explanation: Autentisering med säkerhetsnyckel till ditt konto har aktiverats. Din säkerhetsnyckel kan nu användas för inloggning. subject: 'Mastodon: Autentisering med säkerhetsnyckel är aktiverat' title: Säkerhetsnycklar aktiverade omniauth_callbacks: diff --git a/config/locales/devise.ta.yml b/config/locales/devise.ta.yml index d4b4eeefc6eb40..a0e6187ec42fdb 100644 --- a/config/locales/devise.ta.yml +++ b/config/locales/devise.ta.yml @@ -47,11 +47,9 @@ ta: subject: 'மாஸ்டோடான்: கடவுச்சொல்லை மீட்டமைப்பதற்கான வழிமுறைகள்' title: கடவுச்சொல் மீட்டமைப்பு two_factor_disabled: - explanation: உங்களுடைய கணக்கிற்கான இரண்டு கட்டப் பாதுகாப்பு முடக்கப்பட்டுள்ளது. உங்கள் மின்னஞ்சல் முகவரி மற்றும் கடவுச்சொல் மூலமாக மட்டுமே தற்பொழுது உள்நுழைய முடியும். subject: 'மாஸ்டடான்: இரண்டு கட்டப் பாதுகாப்பு முடக்கப்பட்டுள்ளது' title: 2FA உபயோகத்தில் இல்லை two_factor_enabled: - explanation: உங்களுடைய கணக்கிற்கான இரண்டு கட்டப் பாதுகாப்பு செயல்படுத்தப்பட்டுள்ளது. இணைக்கப்படும் TOTP செயலியில் ஒரு குறியீடு தோன்றும். உங்கள் கணக்கிற்குள் நுழைய அந்தக் குறியீடு தேவைப்படும். subject: 'மாஸ்டடான்: இரண்டு கட்டப் பாதுகாப்பு செயல்படுத்தப்பட்டுள்ளது' title: 2FA செயல்படுத்தப்பட்டுள்ளது two_factor_recovery_codes_changed: diff --git a/config/locales/devise.th.yml b/config/locales/devise.th.yml index dce498525fb3e4..13fdea3fefb2fa 100644 --- a/config/locales/devise.th.yml +++ b/config/locales/devise.th.yml @@ -47,11 +47,9 @@ th: subject: 'Mastodon: คำแนะนำการตั้งรหัสผ่านใหม่' title: การตั้งรหัสผ่านใหม่ two_factor_disabled: - explanation: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำหรับบัญชีของคุณแล้ว ตอนนี้สามารถเข้าสู่ระบบได้โดยใช้ที่อยู่อีเมลและรหัสผ่านเท่านั้น subject: 'Mastodon: ปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว' title: ปิดใช้งาน 2FA แล้ว two_factor_enabled: - explanation: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยสำหรับบัญชีของคุณแล้ว จะต้องใช้โทเคนที่สร้างโดยแอป TOTP ที่จับคู่สำหรับการเข้าสู่ระบบ subject: 'Mastodon: เปิดใช้งานการรับรองความถูกต้องด้วยสองปัจจัยแล้ว' title: เปิดใช้งาน 2FA แล้ว two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ th: subject: 'Mastodon: ลบกุญแจความปลอดภัยแล้ว' title: ลบหนึ่งในกุญแจความปลอดภัยของคุณแล้ว webauthn_disabled: - explanation: ปิดใช้งานการรับรองความถูกต้องด้วยกุญแจความปลอดภัยสำหรับบัญชีของคุณแล้ว ตอนนี้สามารถเข้าสู่ระบบได้โดยใช้เพียงโทเคนที่สร้างโดยแอป TOTP ที่จับคู่เท่านั้น subject: 'Mastodon: ปิดใช้งานการรับรองความถูกต้องด้วยกุญแจความปลอดภัยแล้ว' title: ปิดใช้งานกุญแจความปลอดภัยแล้ว webauthn_enabled: - explanation: เปิดใช้งานการรับรองความถูกต้องด้วยกุญแจความปลอดภัยสำหรับบัญชีของคุณแล้ว ตอนนี้สามารถใช้กุญแจความปลอดภัยของคุณสำหรับการเข้าสู่ระบบ subject: 'Mastodon: เปิดใช้งานการรับรองความถูกต้องด้วยกุญแจความปลอดภัยแล้ว' title: เปิดใช้งานกุญแจความปลอดภัยแล้ว omniauth_callbacks: diff --git a/config/locales/devise.tr.yml b/config/locales/devise.tr.yml index 86b1c951f7b8be..66ca9b2816956a 100644 --- a/config/locales/devise.tr.yml +++ b/config/locales/devise.tr.yml @@ -47,16 +47,19 @@ tr: subject: 'Mastodon: Parola sıfırlama talimatları' title: Parola sıfırlama two_factor_disabled: - explanation: Hesabınız için iki-adımlı kimlik doğrulama devre dışı bırakıldı. Şimdi sadece e-posta adresi ve parola kullanarak giriş yapabilirsiniz. + explanation: Oturum açma şimdi sadece e-posta adresi ve parola ile mümkün. subject: 'Mastodon: İki-adımlı kimlik doğrulama devre dışı bırakıldı' + subtitle: Hesabınız için iki aşamalı kimlik doğrulama devre dışı bırakılmıştır. title: 2FA devre dışı bırakıldı two_factor_enabled: - explanation: Hesabınız için iki-adımlı kimlik doğrulama etkinleştirildi. Giriş yapmak için eşleştirilmiş TOTP uygulaması tarafından oluşturulan bir belirteç gereklidir. + explanation: Oturum açmanız için eşlenmiş TOTP uygulaması tarafından oluşturulmuş bir tokene ihtiyaç var. subject: 'Mastodon: İki adımlı kimlik doğrulama etkinleştirildi' + subtitle: Hesabınız için iki aşamalı kimlik doğrulama etkinleştirilmiştir. title: 2FA etkinleştirildi two_factor_recovery_codes_changed: explanation: Önceki kurtarma kodları geçersiz kılındı ve yenileri oluşturuldu. subject: 'Mastodon: İki adımlı kurtarma kodları yeniden oluşturuldu' + subtitle: Önceki kurtarma kodları geçersiz kılındı ve yenileri oluşturuldu. title: 2FA kurtarma kodları değiştirildi unlock_instructions: subject: 'Mastodon: Kilit açma talimatları' @@ -70,11 +73,13 @@ tr: subject: 'Mastodon: Güvenlik anahtarı silindi' title: Güvenlik anahtarlarınızdan biri silindi webauthn_disabled: - explanation: Hesabınız için güvenlik anahtarlarıyla kimlik doğrulama devre dışı bırakıldı. Artık yalnızca eşleştirilmiş TOTP uygulaması tarafından oluşturulan kodu kullanarak giriş yapmak mümkündür. + explanation: Hesabınız için güvenlik anahtarıyla kimlik doğrulama devre dışı bırakılmıştır. + extra: Oturum açma şimdi sadece eşlenmiş TOTP uygulaması tarafından oluşturulmuş token ile mümkündür. subject: 'Mastodon: Güvenlik anahtarlarıyla kimlik doğrulama devre dışı' title: Güvenlik anahtarları devre dışı webauthn_enabled: - explanation: Hesabınız için güvenlik anahtarı doğrulaması etkinleştirildi. Güvenlik anahtarınız artık giriş yapmak için kullanılabilir. + explanation: Hesabınız için güvenlik anahtarıyla kimlik doğrulama etkinleştirilmiştir. + extra: Güvenlik anahtarınız şimdi oturum açma için kullanılabilir. subject: 'Mastodon: Güvenlik anahtarı doğrulaması etkinleştirildi' title: Güvenlik anahtarları etkin omniauth_callbacks: diff --git a/config/locales/devise.uk.yml b/config/locales/devise.uk.yml index bb81a2a1b89ea4..55429b3c760b7a 100644 --- a/config/locales/devise.uk.yml +++ b/config/locales/devise.uk.yml @@ -47,11 +47,9 @@ uk: subject: 'Mastodon: Інструкції для скидання паролю' title: Скидання пароля two_factor_disabled: - explanation: Двофакторну аутентифікацію для вашого облікового запису відключено. Тепер ви можете увійти за допомогою лише адреси електронної пошти та пароля. subject: 'Mastodon: двофакторну авторизацію вимкнено' title: Двофакторна автентифікація вимкнена two_factor_enabled: - explanation: Двофакторну аутентифікацію для вашого облікового запису було увімкнено. Для входу до системи буде потрібний токен, згенерований спареним застосунком TOTP. subject: 'Mastodon: двофакторну авторизацію увімкнено' title: Двофакторна автентифікація увімкнена two_factor_recovery_codes_changed: @@ -70,11 +68,9 @@ uk: subject: 'Mastodon: Ключ безпеки видалено' title: Один з ваших ключів безпеки було видалено webauthn_disabled: - explanation: Авторизацію з ключами безпеки було відключено для вашого облікового запису. Вхід тепер можливий лише через токен, згенерований додатком TOTP. subject: 'Mastodon: Аутентифікація за допомогою ключів безпеки вимкнена' title: Ключі безпеки вимкнуто webauthn_enabled: - explanation: Авторизація ключа безпеки була увімкнена для вашого облікового запису. Ваш ключ безпеки тепер можна використовувати для входу. subject: 'Mastodon: Авторизація ключа безпеки увімкнена' title: Ключі безпеки увімкнено omniauth_callbacks: diff --git a/config/locales/devise.vi.yml b/config/locales/devise.vi.yml index 904cc51fe9959c..190f7282c4befe 100644 --- a/config/locales/devise.vi.yml +++ b/config/locales/devise.vi.yml @@ -47,16 +47,19 @@ vi: subject: 'Mastodon: Hướng dẫn đổi lại mật khẩu' title: Đổi lại mật khẩu two_factor_disabled: - explanation: Đã vô hiệu hóa xác minh 2 bước cho tài khoản của bạn. Bây giờ chỉ có thể đăng nhập bằng địa chỉ email và mật khẩu. + explanation: Đăng nhập bây giờ chỉ có thể sử dụng địa chỉ email và mật khẩu. subject: 'Mastodon: Xác minh 2 bước đã bị vô hiệu hóa' + subtitle: Xác minh hai bước cho tài khoản của bạn đã bị vô hiệu hóa. title: Vô hiệu hóa xác minh 2 bước two_factor_enabled: - explanation: Tài khoản của bạn đã kích hoạt xác minh 2 bước. Lần đăng nhập tới sẽ cần thêm mã đăng nhập được tạo bởi ứng dụng TOTP. + explanation: Cần có mã token được tạo bởi ứng dụng TOTP được ghép nối để đăng nhập. subject: 'Mastodon: Kích hoạt xác minh 2 bước' + subtitle: Xác minh hai bước đã được bật cho tài khoản của bạn. title: Kích hoạt xác minh 2 bước two_factor_recovery_codes_changed: explanation: Các mã khôi phục trước đó đã bị vô hiệu hóa và thay bằng mã mới. subject: 'Mastodon: Mã khôi phục xác thực hai yếu tố đã được tạo lại' + subtitle: Các mã khôi phục trước đó đã bị vô hiệu hóa và thay bằng mã mới. title: Mã khôi phục xác thực hai yếu tố đã thay đổi unlock_instructions: subject: 'Mastodon: Hướng dẫn mở khóa' @@ -70,11 +73,13 @@ vi: subject: 'Mastodon: Xóa khóa bảo mật' title: Một trong những khóa bảo mật của bạn vừa bị xóa webauthn_disabled: - explanation: Bạn vừa vô hiệu hóa xác thực tài khoản bằng khóa bảo mật. Từ bây giờ, bạn sẽ dùng ứng dụng TOTP để tạo token đăng nhập. + explanation: Xác minh bằng khóa bảo mật đã bị vô hiệu hóa đối với tài khoản của bạn. + extra: Hiện tại, bạn chỉ có thể đăng nhập bằng cách sử dụng mã token được tạo bởi ứng dụng TOTP được ghép nối. subject: 'Mastodon: Vô hiệu hóa xác thực bằng khóa bảo mật' title: Đã vô hiệu hóa khóa bảo mật webauthn_enabled: - explanation: Bạn vừa kích hoạt xác thực tài khoản bằng khóa bảo mật. Từ bây giờ, khóa bảo mật của bạn sẽ được dùng để đăng nhập. + explanation: Khóa bảo mật đã được bật cho tài khoản của bạn. + extra: Hiện bạn đã có thể dùng khóa bảo mật để đăng nhập. subject: 'Mastodon: Kích hoạt xác minh bằng khóa bảo mật' title: Đã kích hoạt khóa bảo mật omniauth_callbacks: diff --git a/config/locales/devise.zh-CN.yml b/config/locales/devise.zh-CN.yml index e46c4335301dc2..9b4b3ae2039c50 100644 --- a/config/locales/devise.zh-CN.yml +++ b/config/locales/devise.zh-CN.yml @@ -47,16 +47,19 @@ zh-CN: subject: Mastodon:重置密码说明 title: 重置密码 two_factor_disabled: - explanation: 账号的双因素认证已禁用。现在仅使用邮箱和密码即可登录。 + explanation: 目前只能通过电子邮件地址和密码登录。 subject: Mastodon:双因素认证已禁用 + subtitle: 您账户的双因素认证已被停用。 title: 双因素认证已停用 two_factor_enabled: - explanation: 账号双因素认证已启用。登录时将需要来自已配对的 TOTP 应用生成的验证码。 + explanation: 登录时需要输入先前配对好的TOTP应用生成的令牌。 subject: Mastodon:双因素认证已启用 + subtitle: 您账户的双因素认证已被启用。 title: 双因素认证已启用 two_factor_recovery_codes_changed: explanation: 新恢复码已生成,同时旧恢复码已失效。 subject: Mastodon:双因素认证恢复码已重新生成 + subtitle: 新恢复码已生成,同时旧恢复码已失效。 title: 双因素认证恢复码已更改 unlock_instructions: subject: Mastodon:账户解锁信息 @@ -70,11 +73,13 @@ zh-CN: subject: Mastodon:安全密钥已删除 title: 你的安全密钥之一已被删除 webauthn_disabled: - explanation: 你的帐户已禁用安全密钥认证。现在只能使用配对的 TOTP 应用程序生成的令牌登录。 + explanation: 您账户的安全密钥身份认证已被停用。 + extra: 目前只能用先前配对的TOTP应用生成的令牌登录。 subject: Mastodon:安全密钥认证已禁用 title: 安全密钥已禁用 webauthn_enabled: - explanation: 你的账户已启用安全密钥身份验证。你的安全密钥现在可以用于登录。 + explanation: 您账户的安全密钥身份认证已被启用。 + extra: 您的安全密钥现在可用于登录。 subject: Mastodon:安全密钥认证已启用 title: 已启用安全密钥 omniauth_callbacks: diff --git a/config/locales/devise.zh-HK.yml b/config/locales/devise.zh-HK.yml index 2d9e8ddeada10c..7f728bf0adc8fc 100644 --- a/config/locales/devise.zh-HK.yml +++ b/config/locales/devise.zh-HK.yml @@ -47,16 +47,19 @@ zh-HK: subject: 'Mastodon: 重設密碼' title: 重設密碼 two_factor_disabled: - explanation: 帳號的雙重認證已被停用。現在只需使用電郵地址和密碼,即可登入。 + explanation: 現在只需使用電郵地址和密碼即可登入。 subject: Mastodon:已關閉雙重認證 + subtitle: 你帳號的雙重認證已被停用。 title: 已關閉雙重認證 two_factor_enabled: - explanation: 賬號的雙重認證已被啟用。登錄時,將需要已配對 TOTP 應用程式生成的驗證碼。 + explanation: 登入時將需要由配對的一次性密碼應用程式生成的憑證。 subject: Mastodon:已啟用雙重認證 + subtitle: 你的帳號已啟用雙重認證。 title: 已啟用雙重認證 two_factor_recovery_codes_changed: explanation: 之前的恢復碼失效了,新的已生成。 subject: Mastodon:已產生新的雙重認證恢復碼 + subtitle: 先前的恢復碼已經無效,並且已生成新的恢復碼。 title: 雙重認證恢復碼已更改 unlock_instructions: subject: 'Mastodon: 解除帳號鎖定' @@ -70,11 +73,13 @@ zh-HK: subject: 'Mastodon: 安全鑰匙已移除' title: 你其中的一個安全鑰匙已經被移除了 webauthn_disabled: - explanation: 你的帳號的安全鑰匙身份驗證已經停用。你只可以用過去已經配對好的基於時間一次性密碼程式生成的密碼來登錄。 + explanation: 你的帳號已停用安全密鑰認證。 + extra: 現在只能使用配對的一次性密碼應用程式生成的憑證登入。 subject: 'Mastodon: 安全鑰匙身份驗證已經停用' title: 已停用安全鑰匙 webauthn_enabled: - explanation: 安全鑰匙身份驗證已啟用。你的安全鑰匙現在可以用來登錄。 + explanation: 你的帳號已啟用安全密鑰認證。 + extra: 你現在可以使用安全密鑰來登入。 subject: 'Mastodon: 安全鑰匙身份驗證已啟用' title: 已啟用安全鑰匙 omniauth_callbacks: diff --git a/config/locales/devise.zh-TW.yml b/config/locales/devise.zh-TW.yml index de977426f2bb5b..762c8eba84bd15 100644 --- a/config/locales/devise.zh-TW.yml +++ b/config/locales/devise.zh-TW.yml @@ -47,16 +47,19 @@ zh-TW: subject: Mastodon:重設密碼指引 title: 重設密碼 two_factor_disabled: - explanation: 您帳號的兩階段驗證已停用。現在只使用電子郵件及密碼登入。 + explanation: 現在僅可使用電子郵件地址與密碼登入。 subject: Mastodon:已停用兩階段驗證 + subtitle: 您帳號的兩步驟驗證已停用。 title: 已停用兩階段驗證 two_factor_enabled: - explanation: 已對您的帳號啟用兩階段驗證。登入時將需要已配對的 TOTP 應用程式所產生之 Token。 + explanation: 登入時需要配對的 TOTP 應用程式產生的權杖。 subject: Mastodon:已啟用兩階段驗證 + subtitle: 您的帳號已啟用兩步驟驗證。 title: 已啟用兩階段驗證 two_factor_recovery_codes_changed: explanation: 之前的備用驗證碼已經失效,且已產生新的。 subject: Mastodon:兩階段驗證備用驗證碼已經重新產生 + subtitle: 之前的備用驗證碼已經失效,且已產生新的。 title: 兩階段驗證備用驗證碼已變更 unlock_instructions: subject: Mastodon:解鎖指引 @@ -70,11 +73,13 @@ zh-TW: subject: Mastodon:安全密鑰已移除 title: 您的一支安全密鑰已經被移除 webauthn_disabled: - explanation: 您的帳號已停用安全密鑰認證。只能透過已配對的 TOTP 應用程式所產生之 Token 登入。 + explanation: 您的帳號已停用安全金鑰身份驗證。 + extra: 現在僅可使用配對的 TOTP 應用程式產生的權杖登入。 subject: Mastodon:安全密鑰認證方式已停用 title: 已停用安全密鑰 webauthn_enabled: - explanation: 您的帳號已啟用安全密鑰認證。您可以使用安全密鑰登入了。 + explanation: 您的帳號已啟用安全金鑰驗證。 + extra: 您的安全金鑰現在可用於登入。 subject: Mastodon:已啟用安全密鑰認證 title: 已啟用安全密鑰 omniauth_callbacks: diff --git a/config/locales/el.yml b/config/locales/el.yml index 4c31bfdde0e42b..8b632a358bf208 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -1475,6 +1475,7 @@ el: unknown_browser: Άγνωστος φυλλομετρητής weibo: Weibo current_session: Τρέχουσα συνεδρία + date: Ημερομηνία description: "%{browser} σε %{platform}" explanation: Αυτοί είναι οι φυλλομετρητές που είναι συνδεδεμένοι στον λογαριασμό σου στο Mastodon αυτή τη στιγμή. ip: IP @@ -1636,16 +1637,19 @@ el: webauthn: Κλειδιά ασφαλείας user_mailer: appeal_approved: - action: Μετάβαση στον λογαριασμό σου + action: Ρυθμίσεις Λογαριασμού explanation: Η έφεση του παραπτώματος εναντίον του λογαριασμού σου στις %{strike_date}, που υπέβαλες στις %{appeal_date} έχει εγκριθεί. Ο λογαριασμός σου είναι και πάλι σε καλή κατάσταση. subject: Η έφεση σου από τις %{date} έχει εγκριθεί + subtitle: Ο λογαριασμός σας είναι για άλλη μια φορά σε καλή κατάσταση. title: Έφεση εγκρίθηκε appeal_rejected: explanation: Η έφεση του παραπτώματος εναντίον του λογαριασμού σου στις %{strike_date}, που υπέβαλες στις %{appeal_date} έχει απορριφθεί. subject: Η έφεση σου από τις %{date} έχει απορριφθεί + subtitle: Η έφεση σου απορρίφθηκε. title: Έφεση απορρίφθηκε backup_ready: - explanation: Είχες ζητήσει εφεδρικό αντίγραφο του λογαριασμού σου στο Mastodon. Είναι έτοιμο για λήψη! + explanation: Ζητήσατε ένα πλήρες αντίγραφο ασφαλείας του λογαριασμού σας Mastodon. + extra: Είναι τώρα έτοιμο για λήψη! subject: Το αρχείο σου είναι έτοιμο για λήψη title: Λήψη εφεδρικού αρχείου suspicious_sign_in: diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index a6e74c4836da50..b11c6de11f6d0f 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -1773,7 +1773,6 @@ en-GB: webauthn: Security keys user_mailer: appeal_approved: - action: Go to your account explanation: The appeal of the strike against your account on %{strike_date} that you submitted on %{appeal_date} has been approved. Your account is once again in good standing. subject: Your appeal from %{date} has been approved title: Appeal approved @@ -1782,7 +1781,6 @@ en-GB: subject: Your appeal from %{date} has been rejected title: Appeal rejected backup_ready: - explanation: You requested a full backup of your Mastodon account. It's now ready for download! subject: Your archive is ready for download title: Archive takeout suspicious_sign_in: diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 8a0033ee6aaaf4..1bcf36700be53f 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1693,7 +1693,6 @@ eo: webauthn: Sekurecaj ŝlosiloj user_mailer: appeal_approved: - action: Iri al via konto explanation: La apelacio de la admono kontra via konto je %{strike_date} pri sendodato %{appeal_date} aprobitas. subject: Via apelacio de %{date} aprobitas title: Apelacio estis aprobita @@ -1702,7 +1701,6 @@ eo: subject: Via apelacio de %{date} estis malaprobita title: Apelacio estis malaprobita backup_ready: - explanation: Vi petis kompletan arkivon de via Mastodon-konto. Ĝi nun pretas por elŝutado! subject: Via arkivo estas preta por elŝutado title: Arkiva elŝuto suspicious_sign_in: diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml index f214c92d2aa82b..26c18b5febc6a2 100644 --- a/config/locales/es-AR.yml +++ b/config/locales/es-AR.yml @@ -1608,6 +1608,7 @@ es-AR: unknown_browser: "[Navegador web desconocido]" weibo: Weibo current_session: Sesión actual + date: Fecha description: "%{browser} en %{platform}" explanation: Estos son los navegadores web en los que actualmente iniciaste sesión en tu cuenta de Mastodon. ip: Dirección IP @@ -1774,16 +1775,19 @@ es-AR: webauthn: Llaves de seguridad user_mailer: appeal_approved: - action: Ir a tu cuenta + action: Configuración de la cuenta explanation: La apelación del incumplimiento contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado. subject: Tu apelación del %{date} fue aprobada + subtitle: Tu cuenta está, de nuevo, en perfecto estado. title: Apelación aprobada appeal_rejected: explanation: La apelación del incumplimiento contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada. subject: Tu apelación del %{date} fue rechazada + subtitle: Se rechazó tu apelación. title: Apelación rechazada backup_ready: - explanation: Solicitaste un resguardo completo de tu cuenta de Mastodon. ¡Ya está listo para descargar! + explanation: Solicitaste una copia de seguridad completa de tu cuenta de Mastodon. + extra: "¡Ya está lista para descargar!" subject: Tu archivo historial está listo para descargar title: Descargar archivo historial suspicious_sign_in: diff --git a/config/locales/es-MX.yml b/config/locales/es-MX.yml index 7f5b282873cde5..32178d0b047611 100644 --- a/config/locales/es-MX.yml +++ b/config/locales/es-MX.yml @@ -1608,6 +1608,7 @@ es-MX: unknown_browser: Navegador desconocido weibo: Weibo current_session: Sesión actual + date: Fecha description: "%{browser} en %{platform}" explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon. ip: IP @@ -1774,16 +1775,19 @@ es-MX: webauthn: Claves de seguridad user_mailer: appeal_approved: - action: Ir a tu cuenta + action: Ajustes de la cuenta explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado. subject: Tu apelación del %{date} ha sido aprobada + subtitle: Tu cuenta se encuentra de nuevo en buen estado. title: Apelación aprobada appeal_rejected: explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada. subject: Tu apelación del %{date} ha sido rechazada + subtitle: Tu apelación ha sido rechazada. title: Apelación rechazada backup_ready: - explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar! + explanation: Has solicitado una copia de seguridad completa de tu cuenta de Mastodon. + extra: "¡Ya está listo para descargar!" subject: Tu archivo está preparado para descargar title: Descargar archivo suspicious_sign_in: diff --git a/config/locales/es.yml b/config/locales/es.yml index a1e9401f5a0a18..9235b985fb8abc 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -1608,6 +1608,7 @@ es: unknown_browser: Navegador Desconocido weibo: Weibo current_session: Sesión actual + date: Fecha description: "%{browser} en %{platform}" explanation: Estos son los navegadores web conectados actualmente en tu cuenta de Mastodon. ip: IP @@ -1774,16 +1775,19 @@ es: webauthn: Claves de seguridad user_mailer: appeal_approved: - action: Ir a tu cuenta + action: Ajustes de la cuenta explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue aprobada. Tu cuenta se encuentra de nuevo en buen estado. subject: Tu apelación del %{date} ha sido aprobada + subtitle: Tu cuenta se encuentra de nuevo en perfecto estado. title: Apelación aprobada appeal_rejected: explanation: La apelación de la amonestación contra tu cuenta del %{strike_date} que enviaste el %{appeal_date} fue rechazada. subject: Tu apelación del %{date} ha sido rechazada + subtitle: Tu apelación ha sido rechazada. title: Apelación rechazada backup_ready: - explanation: Has solicitado una copia completa de tu cuenta de Mastodon. ¡Ya está preparada para descargar! + explanation: Has solicitado una copia de seguridad completa de tu cuenta de Mastodon. + extra: "¡Ya está listo para descargar!" subject: Tu archivo está preparado para descargar title: Descargar archivo suspicious_sign_in: diff --git a/config/locales/et.yml b/config/locales/et.yml index 806238431d377a..71f49e1abb9e46 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -1608,6 +1608,7 @@ et: unknown_browser: Tundmatu veebilehitseja weibo: Weibo current_session: Praegune seanss + date: Kuupäev description: "%{browser} platvormil %{platform}" explanation: Need veebilehitsejad on praegu su Mastodoni kontole sisse loginud. ip: IP @@ -1776,16 +1777,19 @@ et: webauthn: Turvavõtmed user_mailer: appeal_approved: - action: Oma kontole + action: Konto seaded explanation: "%{appeal_date} esitatud vaidlustus %{strike_date} otsuse kohta on rahuldatud. Konto on ennistatud." subject: "%{date} esitatud vaidlustus on rahuldatud" + subtitle: Sinu konto on jälle heas seisukorras. title: Vaidlustus rahuldatud appeal_rejected: explanation: "%{appeal_date} esitatud vaidlustus %{strike_date} otsuse kohta on tagasi lükatud." subject: "%{date} esitatud vaidlustus on tagasi lükatud" + subtitle: Sinu vaidlustus lükati tagasi. title: Vaidlustus tagasi lükatud backup_ready: - explanation: Taotlesid oma Mastodoni konto varukoopiat. See on nüüd valmis allalaadimiseks! + explanation: Taotlesid oma Mastodoni konto täisvarundust. + extra: See on nüüd allalaadimiseks valmis! subject: Arhiiv on allalaadimiseks valmis title: Arhiivi väljavõte suspicious_sign_in: diff --git a/config/locales/eu.yml b/config/locales/eu.yml index 9174b83b430393..4b91f7a5246fa9 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -1612,6 +1612,7 @@ eu: unknown_browser: Nabigatzaile ezezaguna weibo: Weibo current_session: Uneko saioa + date: Data description: "%{browser} - %{platform}" explanation: Zure Mastodon kontuan saioa hasita duten nabigatzaileak daude. ip: IP-a @@ -1778,16 +1779,19 @@ eu: webauthn: Segurtasun gakoak user_mailer: appeal_approved: - action: Joan zure kontura + action: Kontuaren ezarpenak explanation: "%{strike_date}(e)an zure kontuari ezarritako neurriaren aurka %{appeal_date}(e)an jarri zenuen apelazioa onartu da. Zure kontua egoera onean dago berriro." subject: "%{date}(e)ko zure apelazioa onartu da" + subtitle: Zure kontua egoera onean dago berriro. title: Apelazioa onartuta appeal_rejected: explanation: "%{strike_date}(e)an zure kontuari ezarritako neurriaren aurka %{appeal_date}(e)an jarri zenuen apelazioa baztertu da." subject: "%{date}(e)ko zure apelazioa baztertu da" + subtitle: Zure apelazioa baztertu da. title: Apelazioa baztertuta backup_ready: - explanation: Zure Mastodon kontuaren babes-kopia osoa eskatu duzu. Deskargatzeko prest dago! + explanation: Mastodon kontuaren babeskopia osoa eskatu duzu. + extra: Deskargatzeko prest! subject: Zure artxiboa deskargatzeko prest dago title: Artxiboa jasotzea suspicious_sign_in: diff --git a/config/locales/fa.yml b/config/locales/fa.yml index f93aac603112b0..0514772c1dcc3d 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -1540,7 +1540,6 @@ fa: webauthn: کلیدهای امنیتی user_mailer: appeal_approved: - action: به حساب خودتان بروید explanation: درخواست تجدیدنظر اخطار علیه حساب شما در %{strike_date} که در %{appeal_date} ارسال کرده‌اید، پذیرفته شده است. حساب شما بار دیگر در وضعیت خوبی قرار دارد. subject: درخواست تجدیدنظر شما در %{date} پذیرفته شد title: درخواست تجدیدنظر پذیرفته شد @@ -1549,7 +1548,6 @@ fa: subject: درخواست تجدیدنظر شما در %{date} رد شده است title: درخواست تجدیدنظر رد شد backup_ready: - explanation: شما یک نسخهٔ پشتیبان کامل از حساب خود را درخواست کردید. این پشتیبان الان آمادهٔ بارگیری است! subject: بایگانی شما آمادهٔ دریافت است title: گرفتن بایگانی suspicious_sign_in: diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 75052c949d254f..a719f3496fe063 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -1774,7 +1774,6 @@ fi: webauthn: Suojausavaimet user_mailer: appeal_approved: - action: Siirry tilillesi explanation: Valitus tiliäsi koskevasta varoituksesta %{strike_date} jonka lähetit %{appeal_date} on hyväksytty. Tilisi on jälleen hyvässä kunnossa. subject: Valituksesi %{date} on hyväksytty title: Valitus hyväksytty @@ -1783,7 +1782,6 @@ fi: subject: Valituksesi %{date} on hylätty title: Valitus hylätty backup_ready: - explanation: Pyysit täydellistä varmuuskopiota Mastodon-tilistäsi. Voit nyt ladata sen! subject: Arkisto on valmiina ladattavaksi title: Arkiston tallennus suspicious_sign_in: diff --git a/config/locales/fo.yml b/config/locales/fo.yml index 00fb9c556052a8..03a525fa5d52c1 100644 --- a/config/locales/fo.yml +++ b/config/locales/fo.yml @@ -612,6 +612,7 @@ fo: created_at: Meldað delete_and_resolve: Strika postar forwarded: Víðarisent + forwarded_replies_explanation: Hendan fráboðanin er frá einum fjarbrúkara og er viðvíkjandi tilfari á einum fjarum ambætara. Tað er sent til tín, tí fráboðaða innihaldið er í svari til ein av tínum brúkarum. forwarded_to: Víðarisent til %{domain} mark_as_resolved: Marka sum loyst mark_as_sensitive: Merkt sum viðkvæmt @@ -1607,6 +1608,7 @@ fo: unknown_browser: Ókendur kagi weibo: Weibo current_session: Verandi seta + date: Dagfesting description: "%{browser} á %{platform}" explanation: Hetta eru vevkagarnir, sum í løtuni eru ritaðir inn á tína Mastodon kontu. ip: IP @@ -1773,16 +1775,19 @@ fo: webauthn: Trygdarlyklar user_mailer: appeal_approved: - action: Far til kontu tína + action: Kontustillingar explanation: Kæran um atsóknina móti kontu tínari %{strike_date}, sum tú sendi inn %{appeal_date}, er góðkend. Konta tín er aftur tignarlig. subject: Kæra tín frá %{date} er góðkend + subtitle: Kontan hjá tær er aftur í góðari støðu. title: Kæra góðkend appeal_rejected: explanation: Kæran um atsóknina móti kontu tínari %{strike_date}, sum tú sendi inn %{appeal_date}, er vrakað. subject: Kæra tín frá %{date} er vrakað + subtitle: Kæra tín er vrakað. title: Kæra vrakað backup_ready: - explanation: Tú bað um eitt fult trygdaravrit av tíni Mastodon kontu. Tað er nú klárt at taka niður! + explanation: Tú hevur biðið um eitt fult trygdaravrit av Mastodon-kontuni hjá tær. + extra: Tað er nú klárt at taka niður! subject: Savnið hjá tær er tøkt at taka niður title: Tak savn niður suspicious_sign_in: diff --git a/config/locales/fr-CA.yml b/config/locales/fr-CA.yml index c43fa013c74d15..dbdff5f52c99c1 100644 --- a/config/locales/fr-CA.yml +++ b/config/locales/fr-CA.yml @@ -1608,6 +1608,7 @@ fr-CA: unknown_browser: Navigateur inconnu weibo: Weibo current_session: Session courante + date: Date description: "%{browser} sur %{platform}" explanation: Ceci est la liste des navigateurs actuellement connectés à votre compte Mastodon. ip: Adresse IP @@ -1774,16 +1775,19 @@ fr-CA: webauthn: Clés de sécurité user_mailer: appeal_approved: - action: Aller à votre compte + action: Paramètres du compte explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été approuvé. Votre compte est de nouveau en règle. subject: Votre appel du %{date} a été approuvé + subtitle: Votre compte est de nouveau en règle. title: Appel approuvé appeal_rejected: explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été rejeté. subject: Votre appel du %{date} a été rejeté + subtitle: Votre appel a été rejeté. title: Appel rejeté backup_ready: - explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. Elle est maintenant prête à être téléchargée ! + explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. + extra: Elle est maintenant prête à être téléchargée ! subject: Votre archive est prête à être téléchargée title: Récupération de l’archive suspicious_sign_in: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5c6166ddc3ae72..fe1a219a3157f5 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1608,6 +1608,7 @@ fr: unknown_browser: Navigateur inconnu weibo: Weibo current_session: Session courante + date: Date description: "%{browser} sur %{platform}" explanation: Ceci est la liste des navigateurs actuellement connectés à votre compte Mastodon. ip: Adresse IP @@ -1774,16 +1775,19 @@ fr: webauthn: Clés de sécurité user_mailer: appeal_approved: - action: Aller à votre compte + action: Paramètres du compte explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été approuvé. Votre compte est de nouveau en règle. subject: Votre appel du %{date} a été approuvé + subtitle: Votre compte est de nouveau en règle. title: Appel approuvé appeal_rejected: explanation: L'appel de la sanction contre votre compte mise en place le %{strike_date} que vous avez soumis le %{appeal_date} a été rejeté. subject: Votre appel du %{date} a été rejeté + subtitle: Votre appel a été rejeté. title: Appel rejeté backup_ready: - explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. Elle est maintenant prête à être téléchargée ! + explanation: Vous avez demandé une sauvegarde complète de votre compte Mastodon. + extra: Elle est maintenant prête à être téléchargée ! subject: Votre archive est prête à être téléchargée title: Récupération de l’archive suspicious_sign_in: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 9471c03b925b34..1d648f479075c0 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -1608,6 +1608,7 @@ fy: unknown_browser: Unbekende browser weibo: Weibo current_session: Aktuele sesje + date: Datum description: "%{browser} op %{platform}" explanation: Dit binne de webbrowsers dy’t op dit stuit mei jo Mastodon-account oanmeld binne. ip: IP @@ -1774,16 +1775,19 @@ fy: webauthn: Befeiligingskaaien user_mailer: appeal_approved: - action: Gean nei jo account + action: Accountynstellingen explanation: It beswier tsjin in troch in moderator fêststelde skeining fan jo op %{strike_date}, yntsjinne op %{appeal_date}, is goedkard. De earder fêststelde skeining is hjirby net langer jildich. subject: Jo beswier fan %{date} is goedkard + subtitle: Jo account hat wer in goede reputaasje. title: Beswier goedkard appeal_rejected: explanation: It beswier tsjin in troch in moderator fêststelde skeining fan jo op %{strike_date}, yntsjinne op %{appeal_date}, is ôfwêzen. De fêststelde skeining bliuwt wurdt dêrom net wizige. subject: Jo beswier fan %{date} is ôfwêzen + subtitle: Jo beswier is ôfwêzen. title: Beswier ôfwêzen backup_ready: - explanation: Jo hawwe in folsleine reservekopy fan jo Mastodon-account opfrege. It stiet no klear om download te wurden! + explanation: Jo hawwe in folsleine reservekopy fan jo Mastodon-account oanfrege. + extra: It stiet no klear om download te wurden! subject: Jo argyf stiet klear om download te wurden title: Argyf ophelje suspicious_sign_in: diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 965447d4f90a2a..521f4fd60d548a 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -1827,7 +1827,6 @@ gd: webauthn: Iuchraichean tèarainteachd user_mailer: appeal_approved: - action: Tadhail air a’ chunntas agad explanation: Chaidh aontachadh ris an ath-thagradh agad air an rabhadh o %{strike_date} a chuir thu a-null %{appeal_date}. Tha deagh chliù air a’ chunntas agad a-rithist. subject: Chaidh aontachadh ris an ath-thagradh agad o %{date} title: Chaidh aontachadh ri ath-thagradh @@ -1836,7 +1835,6 @@ gd: subject: Chaidh an t-ath-thagradh agad o %{date} a dhiùltadh title: Chaidh ath-thagradh a dhiùltadh backup_ready: - explanation: Dh’iarr thu lethbhreac-glèidhidh slàn dhen chunntas Mastodon agad. Tha e deis ri luchdadh a-nuas a-nis! subject: Tha an tasg-lann agad deis ri luchdadh a-nuas title: Tasg-lann dhut suspicious_sign_in: diff --git a/config/locales/gl.yml b/config/locales/gl.yml index cff9427c6611b8..1398f6ad0bd184 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -1608,6 +1608,7 @@ gl: unknown_browser: Navegador descoñecido weibo: Weibo current_session: Sesión actual + date: Data description: "%{browser} en %{platform}" explanation: Estos son os navegadores web nos que actualmente tes sesión iniciada. ip: IP @@ -1774,16 +1775,19 @@ gl: webauthn: Chaves de seguridade user_mailer: appeal_approved: - action: Vai á túa conta + action: Axustes da conta explanation: A apelación da acción contra a túa conta o %{strike_date} que enviaches o %{appeal_date} foi aprobada. A túa conta volve ao estado normal de uso. subject: O recurso presentado o %{date} foi aprobado + subtitle: A túa conta volve a estar en boa forma. title: Apelación aprobada appeal_rejected: explanation: A apelación contra a acción tomada contra a túa conta o %{strike_date} que enviaches o %{appeal_date} foi rexeitada. subject: A túa apelación do %{date} foi rexeitada + subtitle: A apelación foi rexeitada. title: Apelación rexeitada backup_ready: - explanation: Solicitaches os datos completos da túa conta de Mastodon. Xa está preparados para descargar! + explanation: Solicitaches unha copia completa da túa conta Mastodon. + extra: Está preparada para descargala! subject: O teu ficheiro xa está preparado para descargar title: Leve o ficheiro suspicious_sign_in: diff --git a/config/locales/he.yml b/config/locales/he.yml index 23a4e0c3a63685..2969cf33e82828 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -1660,6 +1660,7 @@ he: unknown_browser: דפדפן לא מזוהה weibo: Weibo current_session: חיבור נוכחי + date: תאריך description: "%{browser} על %{platform}" explanation: אלה הם הדפדפנים המחוברים כרגע לחשבון המסטודון שלך. ip: IP @@ -1838,16 +1839,19 @@ he: webauthn: מפתחות אבטחה user_mailer: appeal_approved: - action: מעבר לחשבונך + action: הגדרות חשבון explanation: הערעור על העברה שנרשמה כנגד חשבונך ב-%{strike_date} שהגשת ב-%{appeal_date} התקבל. חשבונך חזר להיות נקי מכל רבב. subject: ערעורך מתאריך %{date} התקבל + subtitle: חשבונך חזר למצב מאושר. title: הערעור התקבל appeal_rejected: explanation: הערעור על העברה שנרשמה כנגד חשבונך ב-%{strike_date} שהגשת ב-%{appeal_date} נדחה. subject: ערעורך מתאריך %{date} נדחה + subtitle: ערעורך נדחה. title: הערעור נדחה backup_ready: - explanation: ביקשת גיבוי מלא של חשבון המסטודון שלך. הוא מוכן להורדה! + explanation: ביקשת גיבוי מלא של חשבון המסטודון שלך. + extra: הגיבוי מוכן להורדה! subject: הארכיון שלך מוכן להורדה title: הוצאת ארכיון suspicious_sign_in: diff --git a/config/locales/hu.yml b/config/locales/hu.yml index 5c8d1cf9a4825e..536af8b6b5d9b5 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -1774,7 +1774,6 @@ hu: webauthn: Biztonsági kulcsok user_mailer: appeal_approved: - action: Ugrás a fiókodhoz explanation: A fiókod %{appeal_date}-i fellebbezése, mely a %{strike_date}-i vétségeddel kapcsolatos, jóváhagyásra került. A fiókod megint makulátlan. subject: A %{date}-i fellebbezésedet jóváhagyták title: Fellebbezés jóváhagyva @@ -1783,7 +1782,6 @@ hu: subject: A %{date}-i fellebbezésedet visszautasították title: Fellebbezés visszautasítva backup_ready: - explanation: A Mastodon-fiókod teljes mentését kérted. A mentés elkészült, és letölthető. subject: Az adataidról készült archív letöltésre kész title: Archiválás suspicious_sign_in: diff --git a/config/locales/ia.yml b/config/locales/ia.yml index c4f236881dbbfa..48a802a2cd3025 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -114,8 +114,6 @@ ia: add: Adder disable: Disactivar 2FA user_mailer: - appeal_approved: - action: Vader a tu conto welcome: subject: Benvenite in Mastodon webauthn_credentials: diff --git a/config/locales/id.yml b/config/locales/id.yml index c231fea576b174..ec8cf9e0316659 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -1508,7 +1508,6 @@ id: webauthn: Kunci keamanan user_mailer: appeal_approved: - action: Ke akun Anda explanation: Banding peringatan terhadap akun Anda pada %{strike_date} yang Anda kirim pada %{appeal_date} telah disetujui. Akun Anda akan kembali ditandai sebagai akun bagus. subject: Banding Anda dari %{date} telah disetujui title: Banding disetujui @@ -1517,7 +1516,6 @@ id: subject: Banding Anda dari %{date} telah ditolak title: Banding ditolak backup_ready: - explanation: Cadangan penuh akun Mastodon Anda sudah dapat diunduh! subject: Arsip Anda sudah siap diunduh title: Ambil arsip suspicious_sign_in: diff --git a/config/locales/ie.yml b/config/locales/ie.yml index c85e97b51dcb39..c8cd5d5f8dc5a6 100644 --- a/config/locales/ie.yml +++ b/config/locales/ie.yml @@ -1608,6 +1608,7 @@ ie: unknown_browser: Ínconosset navigator weibo: Weibo current_session: Actual session + date: Date description: "%{browser} in %{platform}" explanation: Tis-ci es li navigatores queles actualmen ha initiat sessiones a tui Mastodon-conto. ip: IP @@ -1774,16 +1775,18 @@ ie: webauthn: Claves de securitá user_mailer: appeal_approved: - action: Ear a tui conto + action: Parametres del Conto explanation: Li apelle del admoniment contra tui conto ye %{strike_date} quel tu fat ye %{appeal_date} ha esset aprobat. Tui conto retorna a esser in bon statu. subject: Tui apelle de %{date} ha esset aprobat + subtitle: Tui conto denov es in bon statu. title: Apelle aprobat appeal_rejected: explanation: Li apelle del admoniment contra tui conto ye %{strike_date} quel tu fat ye %{appeal_date} ha esset rejectet. subject: Tui apelle de %{date} ha esset rejectet + subtitle: Tui apelle ha esset rejectet. title: Apelle rejectet backup_ready: - explanation: Tu solicitat un complet archive de tui Mastodon-conto. Nu it es pret por descargar! + extra: It es ja pret a descargar! subject: Tui archive es pret por descargar title: Descargar archive suspicious_sign_in: diff --git a/config/locales/io.yml b/config/locales/io.yml index eb5fcc709d188d..341477852f750c 100644 --- a/config/locales/io.yml +++ b/config/locales/io.yml @@ -1747,7 +1747,6 @@ io: webauthn: Sekuresklefi user_mailer: appeal_approved: - action: Irez a vua konto explanation: Apelo di streko kontre vua konto en %{strike_date} quale vu sendis en %{appeal_date} aprobesis. Vua konto itere standas bone. subject: Vua apelo de %{date} aprobesis title: Apelo aprobesis @@ -1756,7 +1755,6 @@ io: subject: Vua apelo de %{date} refuzesis title: Apelo refuzesis backup_ready: - explanation: Vu demandis kompleta kopiur di vua konto di Mastodon. Ol esas nun pronte deschargebla! subject: Vua arkivo pronte deschargebla title: Arkivekpreno suspicious_sign_in: diff --git a/config/locales/is.yml b/config/locales/is.yml index 7083a226dde652..9f8d5d42dcc293 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -1612,6 +1612,7 @@ is: unknown_browser: Óþekktur vafri weibo: Weibo current_session: Núverandi seta + date: Dagsetning description: "%{browser} á %{platform}" explanation: Þetta eru vafrarnir sem núna eru skráðir inn á Mastodon-aðganginn þinn. ip: IP-vistfang @@ -1778,16 +1779,19 @@ is: webauthn: Öryggislyklar user_mailer: appeal_approved: - action: Farðu inn á notandaaðganginn þinn + action: Stillingar notandaaðgangs explanation: Áfrýjun refsingarinnar gagnvart aðgangnum þínum þann %{strike_date} sem þú sendir inn þann %{appeal_date} hefur verið samþykkt. Notandaaðgangurinn þinn er aftur í góðu lagi. subject: Áfrýjun þín frá %{date} hefur verið samþykkt + subtitle: Notandaaðgangurinn þinn er í góðu lagi. title: Áfrýjun samþykkt appeal_rejected: explanation: Áfrýjun refsingarinnar gagnvart aðgangnum þínum þann %{strike_date} sem þú sendir inn þann %{appeal_date} hefur verið hafnað. subject: Áfrýjun þinni frá %{date} hefur verið hafnað + subtitle: Áfrýjun þinni hefur verið hafnað. title: Áfrýjun hafnað backup_ready: - explanation: Þú baðst um fullt öryggisafrit af Mastodon notandaaðgangnum þínum. Það er núna tilbúið til niðurhals! + explanation: Þú baðst um fullt öryggisafrit af Mastodon notandaaðgangnum þínum. + extra: Það er núna tilbúið til niðurhals! subject: Safnskráin þín er tilbúin til niðurhals title: Taka út í safnskrá suspicious_sign_in: diff --git a/config/locales/it.yml b/config/locales/it.yml index 16b327f3e140a7..a17fae48049ef4 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -1610,6 +1610,7 @@ it: unknown_browser: Browser sconosciuto weibo: Weibo current_session: Sessione corrente + date: Data description: "%{browser} su %{platform}" explanation: Questi sono i browser da cui attualmente è avvenuto l'accesso al tuo account Mastodon. ip: IP @@ -1776,16 +1777,19 @@ it: webauthn: Chiavi di sicurezza user_mailer: appeal_approved: - action: Vai al tuo account + action: Impostazioni account explanation: L'appello della sanzione contro il tuo account del %{strike_date} che hai inviato il %{appeal_date} è stato approvato. Il tuo account ha riottenuto la buona reputazione. subject: Il tuo appello del %{date} è stato approvato + subtitle: Il tuo account è ancora una volta in buona posizione. title: Appello approvato appeal_rejected: explanation: L'appello della sanzione contro il tuo account del %{strike_date} che hai inviato il %{appeal_date} è stato respinto. subject: Il tuo appello del %{date} è stato respinto + subtitle: Il tuo appello è stato respinto. title: Appello respinto backup_ready: - explanation: Hai richiesto un backup completo del tuo account Mastodon. È pronto per essere scaricato! + explanation: Hai richiesto un backup completo del tuo account Mastodon. + extra: Ora è pronto per il download! subject: Il tuo archivio è pronto per essere scaricato title: Esportazione archivio suspicious_sign_in: diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 97ec88611255ed..a68426cb53d70e 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1582,6 +1582,7 @@ ja: unknown_browser: 不明なブラウザ weibo: Weibo current_session: 現在のセッション + date: 日時 description: "%{platform}上の%{browser}" explanation: あなたのMastodonアカウントに現在ログインしているウェブブラウザの一覧です。 ip: IP @@ -1742,16 +1743,19 @@ ja: webauthn: セキュリティキー user_mailer: appeal_approved: - action: アカウントへ + action: アカウント設定 explanation: "%{strike_date}のストライクに対して、あなたが%{appeal_date}に行った申し立ては承認されました。アカウントは正常な状態に戻りました。" subject: "%{date}の申し立てが承認されました" + subtitle: あなたのアカウントは正常な状態に戻りました。 title: 申し立てが承認されました。 appeal_rejected: explanation: "%{strike_date}のストライクに対して、あなたが%{appeal_date}に行った申し立ては却下されました。" subject: "%{date}の申し立てが拒否されました" + subtitle: 申し立ては拒否されました。 title: 却下された抗議 backup_ready: - explanation: Mastodonアカウントのアーカイブを受け付けました。今すぐダウンロードできます! + explanation: Mastodonアカウントの完全バックアップをリクエストしました。 + extra: ダウンロードの準備ができました! subject: アーカイブの準備ができました title: アーカイブの取り出し suspicious_sign_in: diff --git a/config/locales/ka.yml b/config/locales/ka.yml index d67f432688e3a3..926922154f83d6 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -467,7 +467,6 @@ ka: recovery_instructions_html: თუ როდესმე დაკარგავთ წვდომას თქვენს ტელეფონთან, შეგიძლიათ ქვემოთ მოცემული აღდგენის კოდები გამოიყენოთ, რათა მოიპოვოთ ხელმეორე წვდომა თქვენი ანგარიშისადმი. იქონიეთ აღდგენის კოდები დაცულად. მაგალითისთვის, შეგიძლიათ ამობეჭდოთ და შეინახოთ სხვა საბუთებთან ერთად. user_mailer: backup_ready: - explanation: თქვენ მოითხოვეთ თქვენი მასტოდონის ანგარიშის სრული რეზერვაცია. ის ახლა უკვე მზადაა გადმოსაწერად! subject: თქვენი არქივი გადმოსაწერად მზადაა title: არქივის მიღება welcome: diff --git a/config/locales/kab.yml b/config/locales/kab.yml index eeb8f16ae4037a..66aeafde603aca 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -745,8 +745,6 @@ kab: otp: Asnas n usesteb webauthn: Tisura n teɣlist user_mailer: - appeal_approved: - action: Ddu ɣer umiḍan-ik·im warning: categories: spam: Aspam diff --git a/config/locales/kk.yml b/config/locales/kk.yml index 98fe37f2966865..27c76b437891e2 100644 --- a/config/locales/kk.yml +++ b/config/locales/kk.yml @@ -705,7 +705,6 @@ kk: recovery_instructions_html: Егер сіз телефонға кіруді жоғалтсаңыз, тіркелгіңізге кіру үшін төмендегі қалпына келтіру кодтарының бірін пайдалануға болады. Қалпына келтіру кодтарын қауіпсіз ұстаңыз . Мысалы, оларды басып шығарып, оларды басқа маңызды құжаттармен сақтауға болады. user_mailer: backup_ready: - explanation: Сіз Mastodon аккаунтыңыздың толық мұрағатын сұрадыңыз. Қазір жүктеуге дайын! subject: Мұрағатыңыз түсіріп алуға дайын title: Мұрағатты алу warning: diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 76bb3bd9f1d570..b0eadc05047a95 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -1687,7 +1687,7 @@ ko: keep_pinned: 고정된 게시물 유지 keep_pinned_hint: 고정 게시물을 삭제하지 않습니다 keep_polls: 설문 유지 - keep_polls_hint: 설문을 삭제하지 않았음 + keep_polls_hint: 설문을 삭제하지 않습니다 keep_self_bookmark: 북마크한 게시물 유지 keep_self_bookmark_hint: 북마크한 본인의 게시물을 삭제하지 않습니다 keep_self_fav: 내가 좋아요한 게시물 유지 @@ -1744,7 +1744,6 @@ ko: webauthn: 보안 키 user_mailer: appeal_approved: - action: 내 계정으로 가기 explanation: "%{strike_date}에 일어난 중재결정에 대한 소명을 %{appeal_date}에 작성했으며 승낙되었습니다. 당신의 계정은 정상적인 상태로 돌아왔습니다." subject: 귀하가 %{date}에 작성한 소명이 승낙되었습니다 title: 소명이 받아들여짐 @@ -1753,7 +1752,6 @@ ko: subject: "%{date}에 작성한 소명이 반려되었습니다." title: 이의 제기가 거절되었습니다 backup_ready: - explanation: 마스토돈 계정의 전체 백업을 요청하셨지요. 이제 다운로드할 수 있습니다! subject: 아카이브를 다운로드할 수 있습니다 title: 아카이브 테이크아웃 suspicious_sign_in: diff --git a/config/locales/ku.yml b/config/locales/ku.yml index b9cc5fe77e539a..e78e7ecfbb7ae7 100644 --- a/config/locales/ku.yml +++ b/config/locales/ku.yml @@ -1542,7 +1542,6 @@ ku: webauthn: Kilîdên ewlehiyê user_mailer: appeal_approved: - action: Biçe ajimêra xwe explanation: Îtîraza binpêkirinê ya li dijî ajimêrê te ya %{strike_date} ku te di %{appeal_date} de şandibû hate pejirandin. Ajimêrê te careke din di rewşek baş de ye. subject: Îtîraza te ji %{date} hate pejirandin title: Îtîraz hate pejirandin @@ -1551,7 +1550,6 @@ ku: subject: Îtîraza te ji %{date} nehate pejirandin title: Îtîraz nehate pejirandin backup_ready: - explanation: Te yedekîya tijê ya ajimêrê xwe Mastodonê xwest. Niha ji daxistinê re amade ye! subject: Arşîva te amede ye bo daxistinê title: Pakêtkirina arşîvan suspicious_sign_in: diff --git a/config/locales/lad.yml b/config/locales/lad.yml index 550036b340f83b..d1247fc781399d 100644 --- a/config/locales/lad.yml +++ b/config/locales/lad.yml @@ -1542,6 +1542,7 @@ lad: unknown_browser: Navigador deskonosido weibo: Weibo current_session: Sesyon aktuala + date: Data description: "%{browser} en %{platform}" explanation: Estos son los navigadores internetikos konektados aktualmente kon tu kuento de Mastodon. ip: IP @@ -1707,16 +1708,16 @@ lad: webauthn: Yaves de sigurita user_mailer: appeal_approved: - action: Va a tu kuento + action: Preferensyas de kuento explanation: La apelasyon del amonestamiento kontra tu kuento del %{strike_date} ke mandates el %{appeal_date} fue achetada. Tu kuento se topa de muevo en dobro estado. subject: Tu apelasyon del %{date} fue achetada title: Apelasyon achetada appeal_rejected: explanation: La apelasyon del amonestamiento kontra tu kuento del %{strike_date} ke mandates el %{appeal_date} fue refuzada. subject: Tu apelasyon del %{date} fue refuzada + subtitle: Tu apelasyon fue refuzada. title: Apelasyon refuzada backup_ready: - explanation: Tienes solisitado una kopia kompleta de tu kuento de Mastodon. Ya esta pronta para abashar! subject: Tu dosya esta pronta para abashar title: Abasha dosya suspicious_sign_in: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 8de969f646a739..f3715fd2ee7003 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -490,6 +490,7 @@ lt: browsers: generic: Nežinoma naršyklė current_session: Dabartinė sesija + date: Data description: "%{browser} ant %{platform}" explanation: Čia rodomos web naršyklės prijungtos prie Jūsų Mastodon paskyros. revoke: Atšaukti @@ -548,8 +549,14 @@ lt: recovery_codes_regenerated: Atkūrimo kodai sėkmingai sugeneruoti recovery_instructions_html: Jeigu prarandate prieiga prie telefono, jūs galite naudoti atkūrimo kodus esančius žemiau, kad atgautumėte priega prie savo paskyros.Laikykite atkūrimo kodus saugiai Pavyzdžiui, galite norėti juos išspausdinti, ir laikyti kartu su kitais svarbiais dokumentais. user_mailer: + appeal_approved: + action: Paskyros nustatymai + subtitle: Tavo paskyros būklė vėl yra gera. + appeal_rejected: + subtitle: Tavo apeliacija buvo atmesta. backup_ready: - explanation: Jūs prašėte pilnos Mastodon paskyros atsarginės kopijos. Ji paruošta parsisiuntimui! + explanation: Prašai sukurti pilną Mastodon paskyros atsarginę kopiją. + extra: Jį jau galima atsisiųsti! subject: Jūsų archyvas paruoštas parsisiuntimui title: Archyvas išimtas warning: diff --git a/config/locales/lv.yml b/config/locales/lv.yml index c532b84e27e4ac..fcf478cf9387ab 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -1803,7 +1803,6 @@ lv: webauthn: Drošības atslēgas user_mailer: appeal_approved: - action: Dodies uz savu kontu explanation: Apelācija par brīdinājumu jūsu kontam %{strike_date}, ko iesniedzāt %{appeal_date}, ir apstiprināta. Jūsu konts atkal ir labā stāvoklī. subject: Jūsu %{date} apelācija ir apstiprināta title: Apelācija apstiprināta @@ -1812,7 +1811,6 @@ lv: subject: Jūsu %{date} apelācija ir noraidīta title: Apelācija noraidīta backup_ready: - explanation: Tu pieprasīji pilnu sava Mastodon konta dublējumu. Tagad tas ir gatavs lejupielādei! subject: Tavs arhīvs ir gatavs lejupielādei title: Arhīva līdzņemšana suspicious_sign_in: diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 74acf875522be8..6625a13b3b8369 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -1720,7 +1720,6 @@ ms: webauthn: Kunci keselamatan user_mailer: appeal_approved: - action: Pergi ke akaun anda explanation: Rayuan pelanggaran yang dikemukakan pada %{appeal_date} terhadap akaun anda pada %{strike_date} telah diluluskan. Akaun anda kini dalam kedudukan yang baik. subject: Rayuan anda dari %{date} telah diluluskan title: Rayuan diluluskan @@ -1729,7 +1728,6 @@ ms: subject: Rayuan anda dari %{date} telah ditolak title: Rayuan ditolak backup_ready: - explanation: Anda meminta sandaran penuh akaun Mastodon anda. Ia kini sedia untuk dimuat turun! subject: Arkib anda sedia untuk dimuat turun title: Arkibkan bawa pulang suspicious_sign_in: diff --git a/config/locales/my.yml b/config/locales/my.yml index 4ba4fcfad3aa67..094f581eb90d4b 100644 --- a/config/locales/my.yml +++ b/config/locales/my.yml @@ -1719,7 +1719,6 @@ my: webauthn: လုံခြုံရေးကီးများ user_mailer: appeal_approved: - action: သင့်အကောင့်သို့ သွားပါ explanation: "%{appeal_date} တွင် သင်တင်သွင်းခဲ့သည့် %{strike_date} တွင် သင့်အကောင့်ကို ဆန့်ကျင်သည့် တိုင်ချက်၏ အယူခံဝင်မှုကို အတည်ပြုပြီးဖြစ်သည်။ သင့်အကောင့်သည် ကောင်းမွန်သောအနေအထားတွင် ရှိနေပြန်သည်။" subject: "%{date} တွင် သင့်အယူခံဝင်ချက်ကို အတည်ပြုပြီးပါပြီ" title: အယူခံဝင်သည် @@ -1728,7 +1727,6 @@ my: subject: "%{date} တွင် သင့်တင်ပြချက်ကို ပယ်ချခဲ့သည်" title: အယူခံကို ပယ်ချခဲ့သည် backup_ready: - explanation: သင့် Mastodon အကောင့် အရန်ကူးယူရန် တောင်းဆိုပြီးဖြစ်သည်။ ယခု ဒေါင်းလုဒ်လုပ်နိုင်ပါပြီ။ subject: သင့်မှတ်တမ်း ဒေါင်းလုဒ်ဆွဲရန် အသင့်ဖြစ်ပါပြီ title: မှတ်တမ်းသိမ်းရန် suspicious_sign_in: diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 3429ab0e822d2a..9235b99fed1a81 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -1608,6 +1608,7 @@ nl: unknown_browser: Onbekende browser weibo: Weibo current_session: Huidige sessie + date: Datum description: "%{browser} op %{platform}" explanation: Dit zijn de webbrowsers die momenteel met jouw Mastodonaccount zijn ingelogd. ip: IP @@ -1774,16 +1775,19 @@ nl: webauthn: Beveiligingssleutels user_mailer: appeal_approved: - action: Ga naar je account + action: Accountinstellingen explanation: Het bezwaar tegen een door een moderator vastgestelde overtreding van jou op %{strike_date}, ingediend op %{appeal_date}, is goedgekeurd. De eerder vastgestelde overtreding is hierbij niet langer geldig. subject: Jouw bezwaar van %{date} is goedgekeurd + subtitle: Jouw account heeft weer een goede reputatie. title: Bezwaar goedgekeurd appeal_rejected: explanation: Het bezwaar tegen een door een moderator vastgestelde overtreding van jou op %{strike_date}, ingediend op %{appeal_date}, is afgewezen. De vastgestelde overtreding blijft daarom ongewijzigd. subject: Jouw bezwaar van %{date} is afgewezen + subtitle: Jouw bezwaar is afgewezen. title: Bezwaar afgewezen backup_ready: - explanation: Je hebt een volledige back-up van jouw Mastodon-account opgevraagd. Het staat nu klaar om te worden gedownload! + explanation: Je hebt een volledige back-up van je Mastodon-account aangevraagd. + extra: Het staat nu klaar om te worden gedownload! subject: Jouw archief staat klaar om te worden gedownload title: Archief ophalen suspicious_sign_in: diff --git a/config/locales/nn.yml b/config/locales/nn.yml index de23096ed18d23..914ee7fb048d24 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -1774,7 +1774,6 @@ nn: webauthn: Sikkerhetsnøkler user_mailer: appeal_approved: - action: Gå til din konto explanation: Apellen på prikken mot din kontor på %{strike_date} som du la inn på %{appeal_date} har blitt godkjend. Din konto er nok ein gong i god stand. subject: Din klage fra %{date} er godkjent title: Anke godkjend @@ -1783,7 +1782,6 @@ nn: subject: Din klage fra %{date} er avvist title: Anke avvist backup_ready: - explanation: Du ba om en fullstendig sikkerhetskopi av Mastodon-kontoen din. Den er nå klar for nedlasting! subject: Arkivet ditt er klart til å lastes ned title: Nedlasting av arkiv suspicious_sign_in: diff --git a/config/locales/no.yml b/config/locales/no.yml index 54f82550b7ab34..61cc89181e081b 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -1774,7 +1774,6 @@ webauthn: Sikkerhetsnøkler user_mailer: appeal_approved: - action: Gå til kontoen din explanation: Klagen på advarselen mot din konto den %{strike_date} som du sendte inn den %{appeal_date} har blitt godkjent. Din konto er nok en gang i god stand. subject: Din klage fra %{date} er godkjent title: Klage godkjent @@ -1783,7 +1782,6 @@ subject: Din klage fra %{date} er avvist title: Klage avvist backup_ready: - explanation: Du ba om en fullstendig sikkerhetskopi av Mastodon-kontoen din. Den er nå klar for nedlasting! subject: Arkivet ditt er klart til å lastes ned title: Nedlasting av arkiv suspicious_sign_in: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 83c2638b516f93..2887fc98b35c68 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -948,10 +948,7 @@ oc: recovery_instructions_html: Se vos arriba de perdre vòstre mobil, podètz utilizar un dels còdis de recuperacion cai-jos per poder tornar accedir a vòstre compte. Gardatz los còdis en seguretat, per exemple, imprimissètz los e gardatz los amb vòstres documents importants. webauthn: Claus de seguretat user_mailer: - appeal_approved: - action: Anatz al vòstre compte backup_ready: - explanation: Avètz demandat una salvagarda complèta de vòstre compte Mastodon. Es prèsta per telecargament ! subject: Vòstre archiu es prèst per telecargament title: Archiu per emportar warning: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 15aefe5f740eb3..8a973b71c7f626 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1660,6 +1660,7 @@ pl: unknown_browser: Nieznana Przeglądarka weibo: Weibo current_session: Obecna sesja + date: Data description: "%{browser} na %{platform}" explanation: Przeglądarki z aktywną sesją Twojego konta. ip: Adres IP @@ -1838,16 +1839,19 @@ pl: webauthn: Klucze bezpieczeństwa user_mailer: appeal_approved: - action: Przejdź do swojego konta + action: Ustawienia Konta explanation: Twoje odwołanie dotyczące ostrzeżenia nałożonego na twoje konto dnia %{strike_date}, które zostało wysłane dnia %{appeal_date} zostało zatwierdzone. Twoje konto jest ponownie w dobrej kondycji. subject: Twoje odwołanie z dnia %{date} zostało zatwierdzone + subtitle: Reputacja twojego konta została przywrócona. title: Odwołanie zatwierdzone appeal_rejected: explanation: Twoje odwołanie dotyczące ostrzeżenia nałożonego na twoje konto dnia %{strike_date}, które zostało wysłane dnia %{appeal_date} zostało odrzucone. subject: Twoje odwołanie z dnia %{date} zostało odrzucone + subtitle: Twoje odwołanie zostało odrzucone. title: Odwołanie odrzucone backup_ready: - explanation: Zażądałeś pełnej kopii zapasowej konta na Mastodonie. Jest ona dostępna do pobrania! + explanation: Zamówiono pełną kopię zapasową twojego konta Mastodon. + extra: Gotowe do pobrania! subject: Twoje archiwum jest gotowe do pobrania title: Odbiór archiwum suspicious_sign_in: diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 2c485283b17c4c..47ad0ac4488a49 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1608,6 +1608,7 @@ pt-BR: unknown_browser: Navegador desconhecido weibo: Weibo current_session: Sessão atual + date: Data description: "%{browser} em %{platform}" explanation: Estes são os navegadores que estão conectados com a sua conta Mastodon. ip: IP @@ -1774,16 +1775,18 @@ pt-BR: webauthn: Chaves de segurança user_mailer: appeal_approved: - action: Acessar perfil + action: Configurações da conta explanation: A revisão da punição na sua conta em %{strike_date} que você enviou em %{appeal_date} foi aprovada. Sua conta está novamente em situação regular. subject: Sua revisão de %{date} foi aprovada title: Revisão aprovada appeal_rejected: explanation: A revisão da punição na sua conta em %{strike_date} que você enviou em %{appeal_date} foi rejeitada. subject: Sua revisão de %{date} foi rejeitada + subtitle: Sua revisão foi rejeitada. title: Revisão rejeitada backup_ready: - explanation: Você pediu um backup completo da sua conta no Mastodon. E agora está pronto para ser baixado! + explanation: Você solicitou um ‘backup’ completo da sua conta Mastodon. + extra: Agora está pronto para baixar! subject: Seu arquivo está pronto para ser baixado title: Baixar arquivo suspicious_sign_in: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 111f0fa8eef843..fc1e3e6367b043 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -1608,6 +1608,7 @@ pt-PT: unknown_browser: Navegador Desconhecido weibo: Weibo current_session: Sessão atual + date: Data description: "%{browser} em %{platform}" explanation: Estes são os navegadores que estão conectados com a tua conta do Mastodon. ip: IP @@ -1774,16 +1775,19 @@ pt-PT: webauthn: Chaves de segurança user_mailer: appeal_approved: - action: Ir para a sua conta + action: Configurações de Conta explanation: O recurso à reprimenda contra a sua conta de %{strike_date}, enviado a %{appeal_date}, foi deferido. A sua conta encontra-se novamente em situação regular. subject: O seu recurso de %{date} foi deferido + subtitle: A sua conta está em situação regular novamente. title: Recurso deferido appeal_rejected: explanation: O recurso à punição contra a sua conta de %{strike_date}, submetido em %{appeal_date}, foi indeferido. subject: O seu recurso de %{date} foi indeferido + subtitle: O seu recurso foi rejeitado. title: Recurso indeferido backup_ready: - explanation: Pediu uma cópia integral de salvaguarda da sua conta Mastodon. Já está pronta para descarregar! + explanation: Pediu uma cópia completa da sua conta Mastodon. + extra: Está pronta para transferir! subject: O seu arquivo está pronto para descarregar title: Arquivo de ficheiros suspicious_sign_in: diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 12c06505b8507e..1bdc4e8ca5e060 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -693,7 +693,6 @@ ro: recovery_instructions_html: Dacă îți pierzi vreodată accesul la telefon, poți folosi unul dintre codurile de recuperare de mai jos pentru a recâștiga accesul la contul tău. Păstrați codurile de recuperare în condiții de siguranță. De exemplu, le puteți tipări și stoca cu alte documente importante. user_mailer: backup_ready: - explanation: Ai solicitat o copie de rezervă completă a contului tău. Acum este gata pentru descărcare! subject: Arhiva ta este gata pentru descărcare title: Preluare arhivă warning: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b1c86494c7c6ba..2644275c37f5c1 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -1837,7 +1837,6 @@ ru: webauthn: Ключи безопасности user_mailer: appeal_approved: - action: Перейти к своему профилю explanation: Апелляция на разблокировку против вашей учетной записи %{strike_date}, которую вы подали на %{appeal_date}, была одобрена. Ваша учетная запись снова на хорошем счету. subject: Ваше обжалование от %{date} была одобрено title: Обжалование одобрено @@ -1846,7 +1845,6 @@ ru: subject: Ваше обжалование от %{date} отклонено title: Обжалование отклонено backup_ready: - explanation: Вы запросили архив всех данных вашей учётной записи Mastodon. Что ж, он готов к скачиванию. subject: Ваш архив готов к загрузке title: Архив ваших данных готов suspicious_sign_in: diff --git a/config/locales/sc.yml b/config/locales/sc.yml index d92b64783a1ff5..273ef9d2d942e9 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -1077,7 +1077,6 @@ sc: webauthn: Craes de seguresa user_mailer: backup_ready: - explanation: As pedidu una còpia de seguresa totale de su contu de Mastodon tuo. Immoe est pronta pro s'iscarrigamentu! subject: S'archìviu tuo est prontu pro èssere iscarrigadu title: Collida dae s'archìviu warning: diff --git a/config/locales/sco.yml b/config/locales/sco.yml index f77c4c797881a8..a1071197f18aa8 100644 --- a/config/locales/sco.yml +++ b/config/locales/sco.yml @@ -1532,7 +1532,6 @@ sco: webauthn: Security keys user_mailer: appeal_approved: - action: Gang tae yer accoont explanation: The appeal o the strike agin yer accoont on %{strike_date} thit ye submittit on %{appeal_date} haes been approved. Yer accoont is ance again in guid staunnin. subject: Yer appeal fae %{date} haes been approved title: Appeal approved @@ -1541,7 +1540,6 @@ sco: subject: Yer appeal fae %{date} haes been rejectit title: Appeal rejectit backup_ready: - explanation: Ye wantit a ful backup o yer Mastodon accoont. It's riddy fir tae doonload noo! subject: Yer archive is riddy fir doonload title: Archive takoot suspicious_sign_in: diff --git a/config/locales/si.yml b/config/locales/si.yml index 70aefafc11c52f..660fd3ba31c080 100644 --- a/config/locales/si.yml +++ b/config/locales/si.yml @@ -1389,7 +1389,6 @@ si: webauthn: ආරක්‍ෂණ යතුරු user_mailer: appeal_approved: - action: ඔබගේ ගිණුමට යන්න explanation: ඔබ %{appeal_date} දින ඉදිරිපත් කළ %{strike_date} හි ඔබේ ගිණුමට එරෙහි වර්ජනයේ අභියාචනය අනුමත කර ඇත. ඔබගේ ගිණුම නැවත වරක් හොඳ තත්වයක පවතී. subject: "%{date} සිට ඔබගේ අභියාචනය අනුමත කර ඇත" title: අභියාචනය අනුමත කර ඇත @@ -1398,7 +1397,6 @@ si: subject: "%{date} සිට ඔබගේ අභියාචනය ප්‍රතික්ෂේප කර ඇත" title: අභියාචනය ප්‍රතික්ෂේප විය backup_ready: - explanation: ඔබගේ මාස්ටඩන් ගිණුමේ පූර්ණ උපස්ථයක් ඉල්ලා ඇත. එය දැන් බාගැනීමට හැකිය! subject: ඔබගේ සංරක්ෂිතය බාගැනීමට සූදානම්ය title: සංරක්ෂිත රැගෙන යාම suspicious_sign_in: diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 9390a713bc112f..fdd64b5bb70573 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -1138,6 +1138,7 @@ sk: unknown_browser: Neznámy prehliadač weibo: Sina/Tencent Weibo current_session: Aktuálna sezóna + date: Dátum description: "%{browser} na %{platform}" explanation: Tieto sú prehliadače ktoré sú teraz prihlásené na tvoj Mastodon účet. ip: IP adresa @@ -1245,9 +1246,12 @@ sk: recovery_instructions_html: Keď hocikedy stratíš prístup k svojmu telefónu, môžeš použiť jeden z prístupových kódov nižšie pre obnovenie prístupu k svojmu účtu. Skladuj tieto prístupové kódy na bezpečnom mieste. Napríklad ich môžeš vytlačiť a uložiť ich spolu s inými dôležitými dokumentami. user_mailer: appeal_approved: - action: Choď na svoj účet + action: Nastavenia účtu + appeal_rejected: + subtitle: Tvoje odvolanie bolo zamietnuté. backup_ready: - explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu. Táto záloha je teraz pripravená na stiahnutie! + explanation: Vyžiadal/a si si úplnú zálohu svojho Mastodon účtu. + extra: Teraz je pripravená na stiahnutie! subject: Tvoj archív je pripravený na stiahnutie title: Odber archívu warning: diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 83d52ae0e73b8b..1a0afe034fce65 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -1660,6 +1660,7 @@ sl: unknown_browser: Neznan brskalnik weibo: Weibo current_session: Trenutna seja + date: Datum description: "%{browser} na %{platform}" explanation: To so spletni brskalniki, ki so trenutno prijavljeni v vaš Mastodon račun. ip: IP @@ -1838,16 +1839,19 @@ sl: webauthn: Varnostni ključi user_mailer: appeal_approved: - action: Pojdite na svoj račun + action: Nastavitve računa explanation: Pritožbi na ukrep proti vašemu računu z dne %{strike_date}, ki ste jo oddali dne %{appeal_date}, je bilo ugodeno. Vaš račun je znova nesporen. subject: Vaši pritožbi z dne %{date} je bilo ugodeno + subtitle: Vaš račun je znova na dobrem glasu. title: Pritožbi ugodeno appeal_rejected: explanation: Pritožba na ukrep proti vašemu računu z dne %{strike_date}, ki ste jo oddali dne %{appeal_date}, je bila zavrnjena. subject: Vaša pritožba z dne %{date} je bila zavrnjena + subtitle: Vaša pritožba je bila zavržena. title: Pritožba zavrnjena backup_ready: - explanation: Zahtevali ste popolno varnostno kopijo računa Mastodon. Zdaj je pripravljen za prenos! + explanation: Zahtevali ste polno varnostno kopijo svojega računa Mastodon. + extra: Zdaj je na voljo za prenos! subject: Vaš arhiv je pripravljen za prenos title: Prevzem arhiva suspicious_sign_in: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 9ab6e85361f34c..1693db7f3106da 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1770,7 +1770,6 @@ sq: webauthn: Kyçe sigurie user_mailer: appeal_approved: - action: Kaloni te llogaria juaj explanation: Apelimi i paralajmërimit kundër llogarisë tuaj më %{strike_date}, të cilin e parashtruar më %{appeal_date} është miratuar. Llogaria juaj është sërish në pozita të mira. subject: Apelimi juaj i datës %{date} u miratua title: Apelimi u miratua @@ -1779,7 +1778,6 @@ sq: subject: Apelimi juaj prej %{date} është hedhur poshtë title: Apelimi u hodh poshtë backup_ready: - explanation: Kërkuat një kopjeruajtje të plotë të llogarisë tuaj Mastodon. E keni gati për shkarkim! subject: Arkivi juaj është gati për shkarkim title: Marrje arkivi me vete suspicious_sign_in: diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 02f63ede7172ac..fc1239bedfc067 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -1634,6 +1634,7 @@ sr-Latn: unknown_browser: Nepoznati pregledač weibo: Veibo current_session: Trenutna sesija + date: Datum description: "%{browser} sa %{platform}" explanation: Ovo su veb pretraživači koji su trenutno prijavljeni na vaš Mastodon nalog. ip: IP @@ -1806,16 +1807,19 @@ sr-Latn: webauthn: Sigurnosni ključevi user_mailer: appeal_approved: - action: Idite na svoj nalog + action: Podešavanja naloga explanation: Žalba podneta datuma %{appeal_date} na upisan prestup na Vaše ime datuma %{strike_date} je uvažena. Vaš nalog je ponovo u povoljnom položaju. subject: Vaša žalba podneta %{date} je uvažena + subtitle: Vaš nalog je ponovo na dobrom glasu. title: Žalba uvažena appeal_rejected: explanation: Žalba podneta datuma %{appeal_date} na upisan prestup na Vaše ime datuma %{strike_date} je odbijena. subject: Vaša žalba podneta %{date} je odbijena + subtitle: Vaša žalba je odbijena. title: Žalba odbijena backup_ready: - explanation: Tražili ste potpunu rezervnu kopiju vašeg Mastodon naloga. Spremna je za preuzimanje! + explanation: Zahtevali ste punu rezervnu kopiju Mastodon naloga. + extra: Sada je spremno za preuzimanje! subject: Vaša arhiva je spremna za preuzimanje title: Izvoz arhive suspicious_sign_in: diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 51613940bc679f..4e5e58c85981d5 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -1634,6 +1634,7 @@ sr: unknown_browser: Непознати прегледач weibo: Веибо current_session: Тренутна сесија + date: Датум description: "%{browser} са %{platform}" explanation: Ово су веб претраживачи који су тренутно пријављени на ваш Mastodon налог. ip: IP @@ -1806,16 +1807,19 @@ sr: webauthn: Сигурносни кључеви user_mailer: appeal_approved: - action: Идите на свој налог + action: Подешавања налога explanation: Жалба поднета датума %{appeal_date} на уписан преступ на Ваше име датума %{strike_date} је уважена. Ваш налог је поново у повољном положају. subject: Ваша жалба поднета %{date} је уважена + subtitle: Ваш налог је поново на добром гласу. title: Жалба уважена appeal_rejected: explanation: Жалба поднета датума %{appeal_date} на уписан преступ на Ваше име датума %{strike_date} је одбијена. subject: Ваша жалба поднета %{date} је одбијена + subtitle: Ваша жалба је одбијена. title: Жалба одбијена backup_ready: - explanation: Тражили сте потпуну резервну копију вашег Mastodon налога. Спремна је за преузимање! + explanation: Захтевали сте пуну резервну копију Mastodon налога. + extra: Сада је спремно за преузимање! subject: Ваша архива је спремна за преузимање title: Извоз архиве suspicious_sign_in: diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 9a2bedbdfee0ac..d4657e9743c367 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -1607,6 +1607,7 @@ sv: unknown_browser: Okänd browser weibo: Weibo current_session: Nuvarande session + date: Datum description: "%{browser} på %{platform}" explanation: Detta är inloggade webbläsare på Mastodon just nu. ip: IP @@ -1773,16 +1774,19 @@ sv: webauthn: Säkerhetsnycklar user_mailer: appeal_approved: - action: Gå till ditt konto + action: Kontoinställningar explanation: Överklagandet du skickade in den %{appeal_date} för pricken på ditt konto den %{strike_date} har godkänts. Ditt konto har återigen bra anseende. subject: Din överklagan den %{date} har godkänts + subtitle: Ditt konto är återigen i gott skick. title: Överklagan godkänd appeal_rejected: explanation: Överklagandet du skickade in den %{appeal_date} för pricken på ditt konto den %{strike_date} har avslagits. subject: Din överklagan den %{date} har avslagits + subtitle: Din överklagan har avvisats. title: Överklagan avslagen backup_ready: - explanation: Du begärde en fullständig säkerhetskopiering av ditt Mastodon-konto. Det är nu klart för nedladdning! + explanation: Du begärde en fullständig säkerhetskopia av ditt Mastodon-konto. + extra: Nu redo för nedladdning! subject: Ditt arkiv är klart för nedladdning title: Arkivuttagning suspicious_sign_in: diff --git a/config/locales/th.yml b/config/locales/th.yml index f553f6a41c14c0..7bea8f9de831b4 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -1742,7 +1742,6 @@ th: webauthn: กุญแจความปลอดภัย user_mailer: appeal_approved: - action: ไปยังบัญชีของคุณ explanation: อนุมัติการอุทธรณ์การดำเนินการต่อบัญชีของคุณเมื่อ %{strike_date} ที่คุณได้ส่งเมื่อ %{appeal_date} แล้ว บัญชีของคุณอยู่ในสถานะที่ดีอีกครั้งหนึ่ง subject: อนุมัติการอุทธรณ์ของคุณจาก %{date} แล้ว title: อนุมัติการอุทธรณ์แล้ว @@ -1751,7 +1750,6 @@ th: subject: ปฏิเสธการอุทธรณ์ของคุณจาก %{date} แล้ว title: ปฏิเสธการอุทธรณ์แล้ว backup_ready: - explanation: คุณได้ขอข้อมูลสำรองแบบเต็มของบัญชี Mastodon ของคุณ ตอนนี้ข้อมูลสำรองพร้อมสำหรับการดาวน์โหลดแล้ว! subject: การเก็บถาวรของคุณพร้อมสำหรับการดาวน์โหลดแล้ว title: การส่งออกการเก็บถาวร suspicious_sign_in: diff --git a/config/locales/tr.yml b/config/locales/tr.yml index da8935f6cadafa..99b5e782ced647 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -1608,6 +1608,7 @@ tr: unknown_browser: Bilinmeyen Tarayıcı weibo: Weibo current_session: Geçerli oturum + date: Tarih description: "%{platform} - %{browser}" explanation: Bunlar, Mastodon hesabınızda şu anda oturum açmış web tarayıcılarıdır. ip: IP @@ -1774,16 +1775,19 @@ tr: webauthn: Güvenlik anahtarları user_mailer: appeal_approved: - action: Hesabınıza gidin + action: Hesap Ayarları explanation: "%{appeal_date} tarihinde gönderdiğiniz, hesabınıza yönelik %{strike_date} tarihli eyleme itirazınız onaylandı. Hesabınız artık tekrar iyi durumda." subject: "%{date} tarihli itirazınız kabul edildi" + subtitle: Hesabınız yeniden iyi bir halde. title: İtiraz onaylandı appeal_rejected: explanation: "%{appeal_date} tarihinde gönderdiğiniz, hesabınıza yönelik %{strike_date} tarihli eyleme itirazınız reddedildi." subject: "%{date} tarihli itirazınız reddedildi" + subtitle: İtirazınız reddedildi. title: İtiraz reddedildi backup_ready: - explanation: Mastodon hesabınızın tam yedeğini istemiştiniz. Şimdi indirilebilir durumda! + explanation: Mastodon hesabınız tam bir yedeğini istediniz. + extra: Şimdi indirebilirsiniz! subject: Arşiviniz indirilmeye hazır title: Arşiv paketlemesi suspicious_sign_in: diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 7a1957eba76814..a80fbf1404be3b 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1660,6 +1660,7 @@ uk: unknown_browser: Невідомий браузер weibo: Weibo current_session: Поточний сеанс + date: Дата description: "%{browser} на %{platform}" explanation: Це веб-браузери, авторизовані у вашому обліковому записі Mastodon. ip: IP @@ -1838,7 +1839,7 @@ uk: webauthn: Ключі безпеки user_mailer: appeal_approved: - action: Перейти у ваш обліковий запис + action: Налаштування облікового запису explanation: Оскарження попередження вашому обліковому запису %{strike_date}, яке ви надіслали %{appeal_date} було схвалено. Ваш обліковий запис знову вважається добропорядним. subject: Вашу апеляцію від %{date} було схвалено title: Апеляцію схвалено @@ -1847,7 +1848,6 @@ uk: subject: Вашу апеляцію від %{date} було відхилено title: Апеляцію відхилено backup_ready: - explanation: Ви робили запит повної резервної копії вашого облікового запису Mastodon. Вона вже готова для завантаження! subject: Ваш архів готовий до завантаження title: Винесення архіву suspicious_sign_in: diff --git a/config/locales/vi.yml b/config/locales/vi.yml index f37132b6eb1df5..dabb73a475c6f0 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -1582,6 +1582,7 @@ vi: unknown_browser: Trình duyệt khác weibo: Weibo current_session: Phiên hiện tại + date: Thời gian description: "%{browser} trên %{platform}" explanation: Đây là các ứng dụng đã từng đăng nhập vào tài khoản Mastodon của bạn. ip: IP @@ -1742,16 +1743,19 @@ vi: webauthn: Khóa bảo mật user_mailer: appeal_approved: - action: Đến trang hồ sơ của bạn + action: Cài đặt tài khoản explanation: Khiếu nại về tài khoản của bạn vào %{strike_date}, được gửi lúc %{appeal_date} đã được chấp nhận. Tài khoản của bạn đã có thể sử dụng bình thường. subject: Khiếu nại của bạn từ %{date} đã được chấp nhận + subtitle: Tài khoản của bạn có thể hoạt động lại bình thường. title: Khiếu nại đã được chấp nhận appeal_rejected: explanation: Khiếu nại về tài khoản của bạn vào %{strike_date}, được gửi lúc %{appeal_date} đã bị từ chối. subject: Khiếu nại của bạn từ %{date} đã bị từ chối + subtitle: Khiếu nại của bạn bị từ chối. title: Khiếu nại bị từ chối backup_ready: - explanation: Bạn đã yêu cầu sao lưu toàn bộ tài khoản Mastodon của mình. Bây giờ có thể tải về! + explanation: Bạn đã yêu cầu bản sao tài khoản Mastodon của mình. + extra: Hiện nó đã sẵn sàng tải xuống! subject: Dữ liệu cá nhân của bạn đã sẵn sàng để tải về title: Nhận dữ liệu cá nhân suspicious_sign_in: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index a573c8f99b4645..6611510b7dbbe4 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -1582,6 +1582,7 @@ zh-CN: unknown_browser: 未知浏览器 weibo: 新浪微博 current_session: 当前会话 + date: 日期 description: "%{platform} 上的 %{browser}" explanation: 你的 Mastodon 账户目前已在这些浏览器上登录。 ip: IP 地址 @@ -1742,16 +1743,19 @@ zh-CN: webauthn: 安全密钥 user_mailer: appeal_approved: - action: 前往你的账号 + action: 账户设置 explanation: 你于 %{appeal_date} 对 %{strike_date} 在你账号上做出的处罚提出的申诉已被批准,你的账号已回到正常状态。 subject: 你于 %{date} 提出的申诉已被批准 + subtitle: 您的账户已再次回到良好状态。 title: 申诉已批准 appeal_rejected: explanation: 你于 %{appeal_date} 对 %{strike_date} 在你账号上做出的处罚提出的申诉已被驳回。 subject: 你于 %{date} 提出的申诉已被驳回 + subtitle: 您的申诉已被驳回。 title: 申诉已驳回 backup_ready: - explanation: 你请求了一份 Mastodon 账户的完整备份。现在你可以下载了! + explanation: 您之前请求为您的 Mastodon 账户创建一份完整的备份。 + extra: 现在它可以下载了! subject: 你的存档已经准备完毕 title: 存档导出 suspicious_sign_in: diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml index 61355a4c533fd8..4b682f935879e9 100644 --- a/config/locales/zh-HK.yml +++ b/config/locales/zh-HK.yml @@ -1582,6 +1582,7 @@ zh-HK: unknown_browser: 未知的瀏覽器 weibo: 新浪微博 current_session: 目前的作業階段 + date: 日期 description: "%{platform} 上的 %{browser}" explanation: 這些是現在正登入於你的 Mastodon 帳號的瀏覽器。 ip: IP 位址 @@ -1742,16 +1743,19 @@ zh-HK: webauthn: 安全密鑰 user_mailer: appeal_approved: - action: 前往你的帳號 + action: 帳號設定 explanation: 你在 %{appeal_date} 提交針對你帳號於 %{strike_date} 被警告的申訴已獲得批准。你的帳號再次回到良好狀態。 subject: 你在 %{date} 提出的申訴已獲批准 + subtitle: 你的帳號再次恢復正常。 title: 申訴已批准 appeal_rejected: explanation: 你在 %{appeal_date} 提交針對你帳號於 %{strike_date} 被警告的申訴已被駁回。 subject: 你在 %{date} 提出的申訴已被駁回 + subtitle: 你的申訴已被駁回. title: 申訴被駁回 backup_ready: - explanation: 你要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載。 + explanation: 你要求完整備份你的 Mastodon 帳號。 + extra: 現在可以下載了! subject: 你的備份檔已可供下載 title: 檔案匯出 suspicious_sign_in: diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 3f3057cc05b3dc..dd17de7ef1bc2d 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1584,6 +1584,7 @@ zh-TW: unknown_browser: 未知的瀏覽器 weibo: 新浪微博 current_session: 目前的 session + date: 日期 description: "%{platform} 上的 %{browser}" explanation: 這些是現在正登入於您 Mastodon 帳號的瀏覽器。 ip: IP 位址 @@ -1744,16 +1745,19 @@ zh-TW: webauthn: 安全金鑰 user_mailer: appeal_approved: - action: 前往您的帳號 + action: 帳號設定 explanation: 您於 %{appeal_date} 遞交的針對您帳號的 %{strike_date} 警示之申訴已獲批准。您的帳號再次享有良好的信譽。 subject: 您於 %{date} 提出之申訴已獲批准 + subtitle: 您的帳號再次保持良好信譽。 title: 申訴已批准 appeal_rejected: explanation: 您於 %{appeal_date} 遞交的針對您帳號的 %{strike_date} 警示之申訴已被駁回。 subject: 您於 %{date} 提出之申訴已被駁回 + subtitle: 您的申訴已被駁回。 title: 申訴被駁回 backup_ready: - explanation: 您要求的 Mastodon 帳號完整備份檔案現已就緒,可供下載! + explanation: 您要求完整備份您的 Mastodon 帳號。 + extra: 準備好下載了! subject: 您的備份檔已可供下載 title: 檔案匯出 suspicious_sign_in: From 6fab50ba9eee74ce0647130a43632bea20b01767 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 09:35:55 -0500 Subject: [PATCH 31/43] Use bundler version 2.5.4 (#28765) --- Gemfile.lock | 2 +- bin/bundle | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 736a829f07df2e..6cf0504b513f8a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -955,4 +955,4 @@ RUBY VERSION ruby 3.2.2p53 BUNDLED WITH - 2.4.20 + 2.5.4 diff --git a/bin/bundle b/bin/bundle index f19acf5b5cc6e8..50da5fdf9e8fea 100755 --- a/bin/bundle +++ b/bin/bundle @@ -1,3 +1,109 @@ #!/usr/bin/env ruby -ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__) -load Gem.bin_path('bundler', 'bundle') +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'bundle' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +require "rubygems" + +m = Module.new do + module_function + + def invoked_as_script? + File.expand_path($0) == File.expand_path(__FILE__) + end + + def env_var_version + ENV["BUNDLER_VERSION"] + end + + def cli_arg_version + return unless invoked_as_script? # don't want to hijack other binstubs + return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update` + bundler_version = nil + update_index = nil + ARGV.each_with_index do |a, i| + if update_index && update_index.succ == i && a.match?(Gem::Version::ANCHORED_VERSION_PATTERN) + bundler_version = a + end + next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/ + bundler_version = $1 + update_index = i + end + bundler_version + end + + def gemfile + gemfile = ENV["BUNDLE_GEMFILE"] + return gemfile if gemfile && !gemfile.empty? + + File.expand_path("../Gemfile", __dir__) + end + + def lockfile + lockfile = + case File.basename(gemfile) + when "gems.rb" then gemfile.sub(/\.rb$/, ".locked") + else "#{gemfile}.lock" + end + File.expand_path(lockfile) + end + + def lockfile_version + return unless File.file?(lockfile) + lockfile_contents = File.read(lockfile) + return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/ + Regexp.last_match(1) + end + + def bundler_requirement + @bundler_requirement ||= + env_var_version || + cli_arg_version || + bundler_requirement_for(lockfile_version) + end + + def bundler_requirement_for(version) + return "#{Gem::Requirement.default}.a" unless version + + bundler_gem_version = Gem::Version.new(version) + + bundler_gem_version.approximate_recommendation + end + + def load_bundler! + ENV["BUNDLE_GEMFILE"] ||= gemfile + + activate_bundler + end + + def activate_bundler + gem_error = activation_error_handling do + gem "bundler", bundler_requirement + end + return if gem_error.nil? + require_error = activation_error_handling do + require "bundler/version" + end + return if require_error.nil? && Gem::Requirement.new(bundler_requirement).satisfied_by?(Gem::Version.new(Bundler::VERSION)) + warn "Activating bundler (#{bundler_requirement}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_requirement}'`" + exit 42 + end + + def activation_error_handling + yield + nil + rescue StandardError, LoadError => e + e + end +end + +m.load_bundler! + +if m.invoked_as_script? + load Gem.bin_path("bundler", "bundle") +end From 1a3859d8e22c4b5a99f7ce09237ac859e4e760be Mon Sep 17 00:00:00 2001 From: HTeuMeuLeu Date: Wed, 17 Jan 2024 15:37:04 +0100 Subject: [PATCH 32/43] Update follow and follow_request emails (#28755) Co-authored-by: Claire --- app/helpers/accounts_helper.rb | 10 ++- app/javascript/styles/mailer.scss | 87 +++++++++++++++++++ .../application/mailer/_account.html.haml | 30 +++++++ .../notification_mailer/follow.html.haml | 8 +- .../follow_request.html.haml | 8 +- 5 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 app/views/application/mailer/_account.html.haml diff --git a/app/helpers/accounts_helper.rb b/app/helpers/accounts_helper.rb index 6301919a9e12dc..158a0815e123ae 100644 --- a/app/helpers/accounts_helper.rb +++ b/app/helpers/accounts_helper.rb @@ -27,20 +27,24 @@ def account_action_button(account) end end + def account_formatted_stat(value) + number_to_human(value, precision: 3, strip_insignificant_zeros: true) + end + def account_description(account) prepend_str = [ [ - number_to_human(account.statuses_count, precision: 3, strip_insignificant_zeros: true), + account_formatted_stat(account.statuses_count), I18n.t('accounts.posts', count: account.statuses_count), ].join(' '), [ - number_to_human(account.following_count, precision: 3, strip_insignificant_zeros: true), + account_formatted_stat(account.following_count), I18n.t('accounts.following', count: account.following_count), ].join(' '), [ - number_to_human(account.followers_count, precision: 3, strip_insignificant_zeros: true), + account_formatted_stat(account.followers_count), I18n.t('accounts.followers', count: account.followers_count), ].join(' '), ].join(', ') diff --git a/app/javascript/styles/mailer.scss b/app/javascript/styles/mailer.scss index 6d0168969e79ee..bd220bb1a8d62d 100644 --- a/app/javascript/styles/mailer.scss +++ b/app/javascript/styles/mailer.scss @@ -88,6 +88,85 @@ table + p { padding: 24px; } +// Account +.email-account-banner-table { + background-color: #f3f2f5; + border-top-left-radius: 12px; + border-top-right-radius: 12px; +} + +.email-account-banner-td { + border-top-left-radius: 12px; + border-top-right-radius: 12px; + height: 140px; + vertical-align: bottom; + background-color: #f3f2f5; + background-position: center; + background-size: cover; +} + +.email-account-banner-inner-td { + padding: 24px 24px 0; + mso-padding-alt: 24px; +} + +.email-account-banner-overlap-div { + max-height: 42px; +} + +.email-account-banner-icon-table { + width: auto; + margin: 0; + overflow: hidden; + border-radius: 8px; + border-collapse: separate; + background-color: #fff; + border: 2px solid #fff; + + img { + display: block; + max-width: 100%; + border: none; + border-radius: 6px; + } +} + +.email-account-body-td { + padding: 56px 24px 24px; + mso-padding-alt: 24px; +} + +.email-account-name { + font-size: 16px; + font-weight: 600; + line-height: 24px; + color: #17063b; +} + +.email-account-handle { + font-size: 14px; + line-height: 20px; + color: #746a89; +} + +.email-account-stats-table { + td { + padding-right: 16px; + font-size: 14px; + line-height: 20px; + color: #746a89; + } + + b { + font-weight: 600; + color: #17063b; + } + + span { + white-space: nowrap; + } +} + // Utility classes .email-w-full { width: 100%; @@ -122,6 +201,14 @@ table + p { padding-top: 24px; } +.email-padding-top-16 { + padding-top: 16px; +} + +.email-padding-top-0 { + padding-top: 0; +} + .email-border-top { border-top: 1px solid #dfdee3; } diff --git a/app/views/application/mailer/_account.html.haml b/app/views/application/mailer/_account.html.haml new file mode 100644 index 00000000000000..27493f770dc006 --- /dev/null +++ b/app/views/application/mailer/_account.html.haml @@ -0,0 +1,30 @@ +%table.email-w-full.email-account-banner-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-account-banner-td{ height: 140, background: full_asset_url(account.header.url) } + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-account-banner-inner-td + .email-account-banner-overlap-div + %table.email-account-banner-icon-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td + %img{ src: full_asset_url(account.avatar.url), width: 80, height: 80, alt: '' } +%table.email-w-full.email-account-body-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-account-body-td + %p.email-account-name= display_name(account) + %p.email-account-handle= acct(account) + %table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-padding-top-16 + %table.email-w-full.email-account-stats-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td + %b= account_formatted_stat(account.statuses_count) + %span= t('accounts.posts', count: account.statuses_count) + %td + %b= account_formatted_stat(account.following_count) + %span= t('accounts.following') + %td + %b= account_formatted_stat(account.followers_count) + %span= t('accounts.followers', count: account.followers_count) diff --git a/app/views/notification_mailer/follow.html.haml b/app/views/notification_mailer/follow.html.haml index 607cdb366698a1..8247aa5b448d21 100644 --- a/app/views/notification_mailer/follow.html.haml +++ b/app/views/notification_mailer/follow.html.haml @@ -5,5 +5,9 @@ %td.email-body-padding-td %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.email-inner-card-td - = render 'application/mailer/button', text: t('application_mailer.view_profile'), url: web_url("@#{@account.pretty_acct}") + %td.email-inner-card-td-without-padding + = render 'application/mailer/account', account: @account + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-padding-24.email-padding-top-0 + = render 'application/mailer/button', text: t('application_mailer.view_profile'), url: web_url("@#{@account.pretty_acct}") diff --git a/app/views/notification_mailer/follow_request.html.haml b/app/views/notification_mailer/follow_request.html.haml index 12e3e2ee333de3..9344ef7eb38031 100644 --- a/app/views/notification_mailer/follow_request.html.haml +++ b/app/views/notification_mailer/follow_request.html.haml @@ -5,5 +5,9 @@ %td.email-body-padding-td %table.email-inner-card-table{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } %tr - %td.email-inner-card-td - = render 'application/mailer/button', text: t('notification_mailer.follow_request.action'), url: web_url('follow_requests') + %td.email-inner-card-td-without-padding + = render 'application/mailer/account', account: @account + %table.email-w-full{ cellspacing: 0, cellpadding: 0, border: 0, role: 'presentation' } + %tr + %td.email-padding-24.email-padding-top-0 + = render 'application/mailer/button', text: t('notification_mailer.follow_request.action'), url: web_url('follow_requests') From e817fe4c35a3657b121eeb7fbc22e1d8774b8976 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 17 Jan 2024 16:32:56 +0100 Subject: [PATCH 33/43] =?UTF-8?q?Change=20media=20=E2=80=9CALT=E2=80=9D=20?= =?UTF-8?q?label=20to=20a=20specific=20class=20(#28777)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/javascript/mastodon/components/media_gallery.jsx | 2 +- app/javascript/styles/mastodon/components.scss | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/components/media_gallery.jsx b/app/javascript/mastodon/components/media_gallery.jsx index e5200371aeeb26..91459a1285c0d1 100644 --- a/app/javascript/mastodon/components/media_gallery.jsx +++ b/app/javascript/mastodon/components/media_gallery.jsx @@ -103,7 +103,7 @@ class Item extends PureComponent { } if (attachment.get('description')?.length > 0) { - badges.push(ALT); + badges.push(ALT); } const description = attachment.getIn(['translation', 'description']) || attachment.get('description'); diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index ab8939e1314078..5c355672646d30 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -6097,6 +6097,7 @@ a.status-card { gap: 2px; } +.media-gallery__alt__label, .media-gallery__gifv__label { display: flex; align-items: center; From 09f76c5c8d261dc5043864e8215323019a7b8263 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 10:42:13 -0500 Subject: [PATCH 34/43] Regenerate rubocop todo, removes last `Layout/LineLength` violation (#28778) --- .rubocop_todo.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 2c2366c9cf55a8..12bab088e3946d 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -13,13 +13,6 @@ Bundler/OrderedGems: Exclude: - 'Gemfile' -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: Max, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. -# URISchemes: http, https -Layout/LineLength: - Exclude: - - 'app/models/account.rb' - Lint/NonLocalExitFromIterator: Exclude: - 'app/helpers/jsonld_helper.rb' From 30b193b8562eccce9e1f16a895517116400e4a3a Mon Sep 17 00:00:00 2001 From: Santiago Kozak Date: Wed, 17 Jan 2024 13:32:30 -0300 Subject: [PATCH 35/43] Improve display of lock icon in account headers (#28780) --- app/javascript/styles/mastodon/components.scss | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 5c355672646d30..93cea5f76c70d4 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -7420,6 +7420,13 @@ noscript { span { user-select: all; } + + .icon-lock { + height: 16px; + width: 16px; + position: relative; + top: 3px; + } } } } From 127503eb2cdd67126974bee304dde0f183300b84 Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 17 Jan 2024 11:33:17 -0500 Subject: [PATCH 36/43] Fix `Rails/RakeEnvironment` cop (#28782) --- .rubocop.yml | 10 ++++++++++ .rubocop_todo.yml | 12 ------------ lib/tasks/db.rake | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index fcdc4e06cbdb22..64021b4cec9dc4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -109,6 +109,16 @@ Rails/LexicallyScopedActionFilter: Exclude: - 'app/controllers/auth/*' +# Reason: These tasks are doing local work which do not need full env loaded +# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsrakeenvironment +Rails/RakeEnvironment: + Exclude: + - 'lib/tasks/auto_annotate_models.rake' + - 'lib/tasks/emojis.rake' + - 'lib/tasks/mastodon.rake' + - 'lib/tasks/repo.rake' + - 'lib/tasks/statistics.rake' + # Reason: There are appropriate times to use these features # https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsskipsmodelvalidations Rails/SkipsModelValidations: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 12bab088e3946d..b962fbdddf0f6a 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -61,18 +61,6 @@ Rails/OutputSafety: Exclude: - 'config/initializers/simple_form.rb' -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: Include. -# Include: **/Rakefile, **/*.rake -Rails/RakeEnvironment: - Exclude: - - 'lib/tasks/auto_annotate_models.rake' - - 'lib/tasks/db.rake' - - 'lib/tasks/emojis.rake' - - 'lib/tasks/mastodon.rake' - - 'lib/tasks/repo.rake' - - 'lib/tasks/statistics.rake' - # Configuration parameters: Include. # Include: app/models/**/*.rb Rails/UniqueValidationWithoutIndex: diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index e8a64b8fb22b0b..3bc526bd21a434 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -15,7 +15,7 @@ namespace :db do end end - task :pre_migration_check do + task pre_migration_check: :environment do version = ActiveRecord::Base.connection.select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i abort 'This version of Mastodon requires PostgreSQL 9.5 or newer. Please update PostgreSQL before updating Mastodon' if version < 90_500 end From d5940f00d30f4ee18e06770d42bab87c372e06af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Thu, 18 Jan 2024 08:39:33 +0900 Subject: [PATCH 37/43] =?UTF-8?q?Add:=20#452=20=E5=85=A8=E6=96=87=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E3=81=A7=E3=80=81=E3=83=80=E3=83=96=E3=83=AB=E3=82=AF?= =?UTF-8?q?=E3=82=AA=E3=83=BC=E3=83=88=E3=81=8C=E3=81=AA=E3=81=84=E5=A0=B4?= =?UTF-8?q?=E5=90=88=E3=81=A7=E3=82=82=E5=8D=98=E8=AA=9E=E6=A4=9C=E7=B4=A2?= =?UTF-8?q?=E3=82=92=E6=A8=99=E6=BA=96=E3=81=A8=E3=81=99=E3=82=8B=E3=82=AA?= =?UTF-8?q?=E3=83=97=E3=82=B7=E3=83=A7=E3=83=B3=20(#478)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/search_query_transformer.rb | 22 +++++++++++++------ app/models/concerns/user/has_settings.rb | 4 ++++ app/models/user_settings.rb | 1 + .../preferences/reaching/show.html.haml | 2 ++ config/locales/simple_form.en.yml | 2 ++ config/locales/simple_form.ja.yml | 2 ++ .../services/statuses_search_service_spec.rb | 10 +++++++++ 7 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/lib/search_query_transformer.rb b/app/lib/search_query_transformer.rb index 9417305ba2f71f..d67ba8d9362031 100644 --- a/app/lib/search_query_transformer.rb +++ b/app/lib/search_query_transformer.rb @@ -242,17 +242,20 @@ def symbol(str) class TermClause attr_reader :operator, :term - def initialize(operator, term) + def initialize(operator, term, current_account: nil) @operator = Operator.symbol(operator) @term = term + @account = current_account end def to_query if @term.start_with?('#') { match: { tags: { query: @term, operator: 'and' } } } - else + elsif @account&.user&.setting_reverse_search_quote # Memo for checking when manually merge # { multi_match: { type: 'most_fields', query: @term, fields: ['text', 'text.stemmed'], operator: 'and' } } + { match_phrase: { text: { query: @term } } } + else { multi_match: { type: 'most_fields', query: @term, fields: ['text', 'text.stemmed'], operator: 'and' } } end end @@ -261,15 +264,20 @@ def to_query class PhraseClause attr_reader :operator, :phrase - def initialize(operator, phrase) + def initialize(operator, phrase, current_account: nil) @operator = Operator.symbol(operator) @phrase = phrase + @account = current_account end def to_query # Memo for checking when manually merge # { match_phrase: { text: { query: @phrase } } } - { match_phrase: { text: { query: @phrase } } } + if @account&.user&.setting_reverse_search_quote + { multi_match: { type: 'most_fields', query: @phrase, fields: ['text', 'text.stemmed'], operator: 'and' } } + else + { match_phrase: { text: { query: @phrase } } } + end end end @@ -411,11 +419,11 @@ def language_code_from_term(term) if clause[:prefix] && SUPPORTED_PREFIXES.include?(prefix) PrefixClause.new(prefix, operator, term, current_account: current_account) elsif clause[:prefix] - TermClause.new(operator, "#{prefix} #{term}") + TermClause.new(operator, "#{prefix} #{term}", current_account: current_account) elsif clause[:term] - TermClause.new(operator, term) + TermClause.new(operator, term, current_account: current_account) elsif clause[:phrase] - PhraseClause.new(operator, term) + PhraseClause.new(operator, term, current_account: current_account) else raise "Unexpected clause type: #{clause}" end diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb index 79072a7f30123c..bfa2388cf85fdc 100644 --- a/app/models/concerns/user/has_settings.rb +++ b/app/models/concerns/user/has_settings.rb @@ -243,6 +243,10 @@ def setting_use_public_index settings['use_public_index'] end + def setting_reverse_search_quote + settings['reverse_search_quote'] + end + def setting_disallow_unlisted_public_searchability settings['disallow_unlisted_public_searchability'] end diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index ba5883d03f8043..9a17d368ce7365 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -26,6 +26,7 @@ class KeyError < Error; end setting :default_searchability, default: :direct, in: %w(public private direct limited public_unlisted) setting :default_searchability_of_search, default: :public, in: %w(public private direct limited) setting :use_public_index, default: true + setting :reverse_search_quote, default: false setting :disallow_unlisted_public_searchability, default: false setting :public_post_to_unlisted, default: false setting :reject_public_unlisted_subscription, default: false diff --git a/app/views/settings/preferences/reaching/show.html.haml b/app/views/settings/preferences/reaching/show.html.haml index c08e79daff6124..a2053da7cc552a 100644 --- a/app/views/settings/preferences/reaching/show.html.haml +++ b/app/views/settings/preferences/reaching/show.html.haml @@ -72,6 +72,8 @@ label_method: ->(searchability) { safe_join([I18n.t("statuses.searchabilities.#{searchability}"), I18n.t("statuses.searchabilities.#{searchability}_search_long")], ' - ') }, required: false, wrapper: :with_label + .fields-group + = ff.input :reverse_search_quote, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_reverse_search_quote'), hint: I18n.t('simple_form.hints.defaults.setting_reverse_search_quote') .fields-group = ff.input :use_public_index, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_use_public_index') diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index c0dc68c3853598..6d20f856b3c4c8 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -72,6 +72,7 @@ en: setting_dtl_menu: Show DTL menu on web setting_emoji_reaction_policy: Even with this setting, users on other servers are free to put their stamp on the post and share it within the same server. If you simply want to remove the stamp from your own screen, you can disable it from the appearance settings setting_enable_emoji_reaction: If turn off, other users still can react your posts + setting_reverse_search_quote: Double-quotes will result in a search with a wider range of notation, which is the opposite of Mastodon's default behavior. setting_single_ref_to_quote: If this server does not have target post, target server maybe cannot read your quote setting_use_blurhash: Gradients are based on the colors of the hidden visuals but obfuscate any details setting_use_pending_items: Hide timeline updates behind a click instead of automatically scrolling the feed @@ -283,6 +284,7 @@ en: setting_reduce_motion: Reduce motion in animations setting_reject_public_unlisted_subscription: Reject sending public unlisted visibility/non-public searchability posts to Misskey, Calckey setting_reject_unlisted_subscription: Reject sending unlisted visibility/non-public searchability posts to Misskey, Calckey + setting_reverse_search_quote: Perform word-by-word search when search keywords are not enclosed in double quotes setting_send_without_domain_blocks: Send your post to all server with administrator set as rejecting-post-server for protect you [DEPRECATED] setting_show_application: Disclose application used to send posts setting_show_emoji_reaction_on_timeline: Show all stamps on timeline diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index ffefa6b347cf1a..9d3ea08a216c23 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -81,6 +81,7 @@ ja: setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします setting_public_post_to_unlisted: 未対応のサードパーティアプリからもローカル公開で投稿できますが、公開投稿はWeb以外できなくなります setting_reject_unlisted_subscription: Misskeyやそのフォークは、フォローしていないアカウントの「非収載」投稿を **購読・検索** することができます。これはkmyblueの挙動と異なります。そのようなサーバーに、指定した公開範囲の投稿を「フォロワーのみ」として配送します。ただし構造上、完璧な対応は困難でたまに非収載として配信されること、ご理解ください + setting_reverse_search_quote: 検索ワードをダブルクオートで囲って検索した場合、表記ゆれ多めの検索結果になります。Mastodon標準とは逆の挙動となります。 setting_show_application: 投稿するのに使用したアプリが投稿の詳細ビューに表示されるようになります setting_single_ref_to_quote: 当サーバーがまだ対象投稿を取り込んでいない場合、引用が相手に正常に認識されない場合があります setting_stop_emoji_reaction_streaming: 通信容量の節約に役立ちます @@ -294,6 +295,7 @@ ja: setting_reduce_motion: アニメーションの動きを減らす setting_reject_public_unlisted_subscription: Misskey系サーバーに「ローカル公開」かつ検索許可「誰でも以外」の投稿を「フォロワーのみ」に変換して配送する setting_reject_unlisted_subscription: Misskey系サーバーに「非収載」かつ検索許可「誰でも以外」の投稿を「フォロワーのみ」に変換して配送する + setting_reverse_search_quote: ダブルクオートで囲まず検索した時、単語単位で検索する setting_send_without_domain_blocks: 管理人の設定した配送停止設定を拒否する (非推奨) setting_show_application: 送信したアプリを開示する setting_show_emoji_reaction_on_timeline: タイムライン上に他の人のつけたスタンプを表示する diff --git a/spec/search/services/statuses_search_service_spec.rb b/spec/search/services/statuses_search_service_spec.rb index 383fa86eec94f0..a18f767f9475a2 100644 --- a/spec/search/services/statuses_search_service_spec.rb +++ b/spec/search/services/statuses_search_service_spec.rb @@ -289,5 +289,15 @@ it_behaves_like 'does not hit status', 'when search with following', 'in:following りんご' end end + + context 'when reverse_search_quote is enabled' do + before do + alice.user.update!(settings: { reverse_search_quote: true }) + end + + it_behaves_like 'does not hit status', 'when search with letter in word', 'ご' + it_behaves_like 'hit status', 'when double quote search with letter in word', '"ご"' + it_behaves_like 'hit status', 'when search with word', 'りんご' + end end end From f20ebfac41a82802d9b4f0db812ee3ee2aa30b79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Thu, 18 Jan 2024 08:54:37 +0900 Subject: [PATCH 38/43] =?UTF-8?q?Test:=20#76=20`StatusPolicy`=E3=81=AB?= =?UTF-8?q?=E3=81=8A=E3=81=91=E3=82=8B=E6=8B=A1=E5=BC=B5=E3=83=89=E3=83=A1?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=96=E3=83=AD=E3=83=83=E3=82=AF=E3=81=AE?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=20(#477)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spec/policies/status_policy_spec.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/policies/status_policy_spec.rb b/spec/policies/status_policy_spec.rb index 6bfc02c58289a1..a6c71e0cb0876f 100644 --- a/spec/policies/status_policy_spec.rb +++ b/spec/policies/status_policy_spec.rb @@ -112,6 +112,21 @@ expect(subject).to_not permit(viewer, status) end + + context 'with remote account' do + let(:viewer) { Fabricate(:account, domain: 'example.com', uri: 'https://example.com/actor') } + let(:status) { Fabricate(:status, account: alice, spoiler_text: 'ohagi', sensitive: true) } + + it 'grants access when viewer is not domain-blocked' do + expect(subject).to permit(viewer, status) + end + + it 'denies access when viewer is domain-blocked' do + Fabricate(:domain_block, domain: 'example.com', severity: :noop, reject_send_sensitive: true) + + expect(subject).to_not permit(viewer, status) + end + end end end From cb77851768c6836f0790d2c0b3d995fd4221b952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Thu, 18 Jan 2024 09:29:58 +0900 Subject: [PATCH 39/43] =?UTF-8?q?Improve:=20=E5=85=A8=E6=96=87=E6=A4=9C?= =?UTF-8?q?=E7=B4=A2=E3=81=8C=E6=9C=89=E5=8A=B9=E3=81=A7=E3=81=AA=E3=81=84?= =?UTF-8?q?=E7=92=B0=E5=A2=83=E3=81=A7=E3=80=81=E6=A4=9C=E7=B4=A2=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E7=94=BB=E9=9D=A2=E3=81=AE=E8=A1=A8=E7=A4=BA=E3=82=92?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=20(#479)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../preferences/reaching/show.html.haml | 37 +++++++++++-------- config/locales/en.yml | 1 + config/locales/ja.yml | 1 + 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/views/settings/preferences/reaching/show.html.haml b/app/views/settings/preferences/reaching/show.html.haml index a2053da7cc552a..845278f1d7f05c 100644 --- a/app/views/settings/preferences/reaching/show.html.haml +++ b/app/views/settings/preferences/reaching/show.html.haml @@ -44,6 +44,9 @@ %h4= t 'preferences.searchability' + - unless Chewy.enabled? + %p.hint= t 'preferences.does_not_search' + .fields-row .fields-group.fields-row__column.fields-row__column-12 = ff.input :default_searchability, @@ -59,24 +62,26 @@ .fields-group = ff.input :disallow_unlisted_public_searchability, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_disallow_unlisted_public_searchability'), hint: I18n.t('simple_form.hints.defaults.setting_disallow_unlisted_public_searchability') - %h4= t 'preferences.search' + - if Chewy.enabled? + %h4= t 'preferences.search' - .fields-row - .fields-group.fields-row__column.fields-row__column-12 - = ff.input :default_searchability_of_search, - collection: Status.selectable_searchabilities_for_search, - hint: false, - include_blank: false, - kmyblue: true, - label: I18n.t('simple_form.labels.defaults.setting_default_searchability_of_search'), - label_method: ->(searchability) { safe_join([I18n.t("statuses.searchabilities.#{searchability}"), I18n.t("statuses.searchabilities.#{searchability}_search_long")], ' - ') }, - required: false, - wrapper: :with_label - .fields-group - = ff.input :reverse_search_quote, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_reverse_search_quote'), hint: I18n.t('simple_form.hints.defaults.setting_reverse_search_quote') + .fields-row + .fields-group.fields-row__column.fields-row__column-12 + = ff.input :default_searchability_of_search, + collection: Status.selectable_searchabilities_for_search, + hint: false, + include_blank: false, + kmyblue: true, + label: I18n.t('simple_form.labels.defaults.setting_default_searchability_of_search'), + label_method: ->(searchability) { safe_join([I18n.t("statuses.searchabilities.#{searchability}"), I18n.t("statuses.searchabilities.#{searchability}_search_long")], ' - ') }, + required: false, + wrapper: :with_label - .fields-group - = ff.input :use_public_index, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_use_public_index') + .fields-group + = ff.input :reverse_search_quote, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_reverse_search_quote'), hint: I18n.t('simple_form.hints.defaults.setting_reverse_search_quote') + + .fields-group + = ff.input :use_public_index, wrapper: :with_label, kmyblue: true, label: I18n.t('simple_form.labels.defaults.setting_use_public_index') .actions = f.button :button, t('generic.save_changes'), type: :submit diff --git a/config/locales/en.yml b/config/locales/en.yml index 798afeea6e29d6..9daad29de6961a 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1721,6 +1721,7 @@ en: too_few_options: must have more than one item too_many_options: can't contain more than %{max} items preferences: + does_not_search: The full-text search feature is not available on this server. Instead, your posts will be searched according to this setting on other kmyblue servers. dtl: Deep timeline dtl_hint: "You can join deep timeline with #%{tag} tag. Following settings make convenient to use deep timeline." emoji_reaction_permitting: Receiving stamps diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 234334065b8916..34048a33db261a 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -1700,6 +1700,7 @@ ja: too_few_options: は複数必要です too_many_options: は%{max}個までです preferences: + does_not_search: このサーバーでは全文検索機能を利用できません。代わりに、他のkmyblueサーバーであなたの投稿がこの設定に従って検索されます。 dtl: ディープタイムライン dtl_hint: "#%{tag} ハッシュタグに参加することで、ディープタイムラインに投稿できます。ここではディープタイムラインを利用しやすくするための設定ができます。" emoji_reaction_permitting: スタンプの受け入れ From 169e9a47e424c17927086d2b4b66fdd8f4ff4a99 Mon Sep 17 00:00:00 2001 From: KMY Date: Thu, 18 Jan 2024 09:31:38 +0900 Subject: [PATCH 40/43] Fix lint --- app/services/emoji_react_service.rb | 2 +- app/services/searchability_update_service.rb | 2 -- app/services/un_emoji_react_service.rb | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/services/emoji_react_service.rb b/app/services/emoji_react_service.rb index 9099c8391b5cc7..b9a900f6384fd6 100644 --- a/app/services/emoji_react_service.rb +++ b/app/services/emoji_react_service.rb @@ -27,7 +27,7 @@ def call(account, status, name) @emoji_reaction = EmojiReaction.create!(account: account, status: status, name: shortcode, custom_emoji: custom_emoji) - status.touch # rubocop:disable Rails/SkipsModelValidations + status.touch end raise Mastodon::ValidationError, I18n.t('reactions.errors.duplication') if @emoji_reaction.nil? diff --git a/app/services/searchability_update_service.rb b/app/services/searchability_update_service.rb index 852f17abecaca6..a6b448a0ee4e64 100644 --- a/app/services/searchability_update_service.rb +++ b/app/services/searchability_update_service.rb @@ -8,7 +8,6 @@ def call(account) ids = statuses.pluck(:id) - # rubocop:disable Rails/SkipsModelValidations if account.public_searchability? statuses.update_all('searchability = CASE visibility WHEN 0 THEN 0 WHEN 10 THEN 0 WHEN 1 THEN 2 WHEN 2 THEN 2 ELSE 3 END, updated_at = CURRENT_TIMESTAMP') elsif account.unlisted_searchability? @@ -18,7 +17,6 @@ def call(account) else statuses.update_all('searchability = 3, updated_at = CURRENT_TIMESTAMP') end - # rubocop:enable Rails/SkipsModelValidations return unless Chewy.enabled? diff --git a/app/services/un_emoji_react_service.rb b/app/services/un_emoji_react_service.rb index 7d9b61df7bd0ff..db8f4143437d40 100644 --- a/app/services/un_emoji_react_service.rb +++ b/app/services/un_emoji_react_service.rb @@ -11,7 +11,7 @@ def call(account, status, emoji_reaction = nil) if emoji_reaction emoji_reaction.destroy! - status.touch # rubocop:disable Rails/SkipsModelValidations + status.touch create_notification(emoji_reaction) if !@status.account.local? && @status.account.activitypub? notify_to_followers(emoji_reaction) From 6aede85a2dc1c3dd3b0d03889172a564f712bd39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Thu, 18 Jan 2024 10:13:32 +0900 Subject: [PATCH 41/43] =?UTF-8?q?Fix:=20#303=20=E9=99=90=E5=AE=9A=E6=8A=95?= =?UTF-8?q?=E7=A8=BF=E3=81=AE=E3=82=B9=E3=82=BF=E3=83=B3=E3=83=97=E3=81=8C?= =?UTF-8?q?=E3=82=B9=E3=83=88=E3=83=AA=E3=83=BC=E3=83=9F=E3=83=B3=E3=82=B0?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=20(#481)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/concerns/account_scope.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/services/concerns/account_scope.rb b/app/services/concerns/account_scope.rb index 1d617fd731cf78..f670d17f380091 100644 --- a/app/services/concerns/account_scope.rb +++ b/app/services/concerns/account_scope.rb @@ -7,6 +7,8 @@ def scope_status(status) scope_local when :private scope_account_local_followers(status.account) + when :limited + scope_status_all_mentioned(status) else scope_status_mentioned(status) end @@ -24,6 +26,10 @@ def scope_status_mentioned(status) Account.local.where(id: status.active_mentions.select(:account_id)).reorder(nil) end + def scope_status_all_mentioned(status) + Account.local.where(id: status.mentions.select(:account_id)).reorder(nil) + end + # TODO: not work def scope_list_following_account(account) account.lists_for_local_distribution.select(:id).reorder(nil) From 46161e53484cab9c9c7a3e19501cf937d3c72f0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Thu, 18 Jan 2024 13:09:20 +0900 Subject: [PATCH 42/43] =?UTF-8?q?Fix:=20=E6=8A=95=E7=A8=BF=E3=81=A7?= =?UTF-8?q?=E3=81=AF=E3=81=AA=E3=81=84=E3=83=AA=E3=83=B3=E3=82=AF=E3=82=92?= =?UTF-8?q?=E5=8F=82=E7=85=A7=E3=81=97=E3=81=9F=E3=81=A8=E3=81=8D=E3=81=AB?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=AF=E3=83=97=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=81=8C=E7=94=9F=E6=88=90=E3=81=95=E3=82=8C=E3=81=AA?= =?UTF-8?q?=E3=81=84=E5=95=8F=E9=A1=8C=20(#482)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/fetch_link_card_service.rb | 4 ++ spec/services/fetch_link_card_service_spec.rb | 49 +++++++++++++++++-- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb index fa445faf2c54c8..6c84f6d3b4ede7 100644 --- a/app/services/fetch_link_card_service.rb +++ b/app/services/fetch_link_card_service.rb @@ -88,6 +88,10 @@ def parse_urls end def referenced_urls + referenced_urls_raw.filter { |uri| ActivityPub::TagManager.instance.uri_to_resource(uri, Status, url: true).present? } + end + + def referenced_urls_raw unless @status.local? document = Nokogiri::HTML(@status.text) document.search('a[href^="http://"]', 'a[href^="https://"]').each do |link| diff --git a/spec/services/fetch_link_card_service_spec.rb b/spec/services/fetch_link_card_service_spec.rb index 3273351b9ada93..654da1e0d4278f 100644 --- a/spec/services/fetch_link_card_service_spec.rb +++ b/spec/services/fetch_link_card_service_spec.rb @@ -7,6 +7,7 @@ let(:html) { 'Hello world' } let(:oembed_cache) { nil } + let(:custom_before) { false } before do stub_request(:get, 'http://example.com/html').to_return(headers: { 'Content-Type' => 'text/html' }, body: html) @@ -30,7 +31,7 @@ Rails.cache.write('oembed_endpoint:example.com', oembed_cache) if oembed_cache - subject.call(status) + subject.call(status) unless custom_before end context 'with a local status' do @@ -236,16 +237,46 @@ end end - context 'with URL of reference' do - let(:status) { Fabricate(:status, text: 'RT http://example.com/html') } + context 'with URI of reference and normal page' do + let(:status) { Fabricate(:status, text: 'RT http://example.com/text http://example.com/html') } + let(:custom_before) { true } + + before { Fabricate(:status, uri: 'http://example.com/text') } it 'creates preview card' do + subject.call(status) + expect(status.preview_card).to_not be_nil + expect(status.preview_card.url).to eq 'http://example.com/html' + expect(status.preview_card.title).to eq 'Hello world' + end + end + + context 'with URI of reference' do + let(:status) { Fabricate(:status, text: 'RT http://example.com/text') } + let(:custom_before) { true } + + before { Fabricate(:status, uri: 'http://example.com/text') } + + it 'does not create preview card' do + subject.call(status) expect(status.preview_card).to be_nil end end - context 'with URL of reference and normal page' do - let(:status) { Fabricate(:status, text: 'RT http://example.com/text http://example.com/html') } + context 'with URL of reference' do + let(:status) { Fabricate(:status, text: 'RT http://example.com/text') } + let(:custom_before) { true } + + before { Fabricate(:status, uri: 'http://example.com/text/activity', url: 'http://example.com/text') } + + it 'does not create preview card' do + subject.call(status) + expect(status.preview_card).to be_nil + end + end + + context 'with reference normal URL' do + let(:status) { Fabricate(:status, text: 'RT http://example.com/html') } it 'creates preview card' do expect(status.preview_card).to_not be_nil @@ -281,8 +312,12 @@ RT Hello  TEXT end + let(:custom_before) { true } + + before { Fabricate(:status, uri: 'http://example.com/html') } it 'creates preview card' do + subject.call(status) expect(status.preview_card).to be_nil end end @@ -294,8 +329,12 @@ Hello  TEXT end + let(:custom_before) { true } + + before { Fabricate(:status, uri: 'http://example.com/html') } it 'creates preview card' do + subject.call(status) expect(status.preview_card).to_not be_nil expect(status.preview_card.url).to eq 'http://example.com/html_sub' expect(status.preview_card.title).to eq 'Hello world' From 989efcd78e5f1bb4b545f576fc38e0fc1a2c68f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?KMY=EF=BC=88=E9=9B=AA=E3=81=82=E3=81=99=E3=81=8B=EF=BC=89?= Date: Fri, 19 Jan 2024 08:39:58 +0900 Subject: [PATCH 43/43] =?UTF-8?q?Remove:=20=E7=8F=BE=E5=9C=A8=E4=BD=BF?= =?UTF-8?q?=E3=82=8F=E3=82=8C=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=E3=83=89?= =?UTF-8?q?=E3=83=A1=E3=82=A4=E3=83=B3=E3=83=96=E3=83=AD=E3=83=83=E3=82=AF?= =?UTF-8?q?=E7=84=A1=E8=A6=96=E8=A8=AD=E5=AE=9A=E3=81=AE=E3=83=87=E3=83=83?= =?UTF-8?q?=E3=83=89=E3=82=B3=E3=83=BC=E3=83=89=20(#476)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Remove: 現在使われていないドメインブロック無視設定のデッドコード * Refactoring * Fix test --- app/controllers/statuses_controller.rb | 4 +--- app/lib/activitypub/tag_manager.rb | 2 +- app/lib/status_reach_finder.rb | 13 ++++--------- .../concerns/status/domain_block_concern.rb | 18 ++++++++++++++++++ app/models/concerns/user/has_settings.rb | 4 ---- app/models/status.rb | 1 + app/models/user_settings.rb | 1 - app/policies/status_policy.rb | 10 ++-------- config/locales/simple_form.en.yml | 1 - config/locales/simple_form.ja.yml | 2 -- spec/lib/activitypub/tag_manager_spec.rb | 11 ++++++++--- .../note_for_misskey_serializer_spec.rb | 2 +- 12 files changed, 36 insertions(+), 33 deletions(-) create mode 100644 app/models/concerns/status/domain_block_concern.rb diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb index 1e7a8f406ccf24..b656f45dd7091d 100644 --- a/app/controllers/statuses_controller.rb +++ b/app/controllers/statuses_controller.rb @@ -83,9 +83,7 @@ def misskey_software? info = InstanceInfo.find_by(domain: signed_request_account.domain) return false if info.nil? - @misskey_software = %w(misskey calckey cherrypick sharkey).include?(info.software) && - ((@status.public_unlisted_visibility? && @status.account.user&.setting_reject_public_unlisted_subscription) || - (@status.unlisted_visibility? && @status.account.user&.setting_reject_unlisted_subscription)) + @misskey_software = %w(misskey calckey cherrypick sharkey).include?(info.software) && @status.sending_maybe_compromised_privacy? end def status_activity_serializer diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb index eef0f6a209902f..5cf7a671337268 100644 --- a/app/lib/activitypub/tag_manager.rb +++ b/app/lib/activitypub/tag_manager.rb @@ -153,7 +153,7 @@ def cc(status) end def cc_for_misskey(status) - if (status.account.user&.setting_reject_unlisted_subscription && status.unlisted_visibility?) || (status.account.user&.setting_reject_public_unlisted_subscription && status.public_unlisted_visibility?) + if status.sending_maybe_compromised_privacy? cc = cc_private_visibility(status) cc << uri_for(status.reblog.account) if status.reblog? return cc diff --git a/app/lib/status_reach_finder.rb b/app/lib/status_reach_finder.rb index 76c4315b58b9af..aad6bb735f92a6 100644 --- a/app/lib/status_reach_finder.rb +++ b/app/lib/status_reach_finder.rb @@ -192,19 +192,15 @@ def banned_domains end def banned_domains_of_status(status) - if status.account.user&.setting_send_without_domain_blocks - [] - else - blocks = DomainBlock.where(domain: nil) - blocks = blocks.or(DomainBlock.where(reject_send_sensitive: true)) if (status.with_media? && status.sensitive) || status.spoiler_text? - blocks.pluck(:domain).uniq - end + blocks = DomainBlock.where(domain: nil) + blocks = blocks.or(DomainBlock.where(reject_send_sensitive: true)) if (status.with_media? && status.sensitive) || status.spoiler_text? + blocks.pluck(:domain).uniq end def banned_domains_for_misskey return @banned_domains_for_misskey if defined?(@banned_domains_for_misskey) - return @banned_domains_for_misskey = [] if (!@status.account.user&.setting_reject_public_unlisted_subscription && !@status.account.user&.setting_reject_unlisted_subscription) || (!@status.public_unlisted_visibility? && !@status.unlisted_visibility?) + return @banned_domains_for_misskey = [] unless @status.sending_maybe_compromised_privacy? || (@status.reblog? && @status.reblog.sending_maybe_compromised_privacy?) domains = banned_domains_for_misskey_of_status(@status) domains += banned_domains_for_misskey_of_status(@status.reblog) if @status.reblog? && @status.reblog.local? @@ -213,7 +209,6 @@ def banned_domains_for_misskey def banned_domains_for_misskey_of_status(status) return [] if status.public_searchability? - return [] unless (status.public_unlisted_visibility? && status.account.user&.setting_reject_public_unlisted_subscription) || (status.unlisted_visibility? && status.account.user&.setting_reject_unlisted_subscription) from_info = InstanceInfo.where(software: %w(misskey calckey cherrypick sharkey)).pluck(:domain) from_domain_block = DomainBlock.where(detect_invalid_subscription: true).pluck(:domain) diff --git a/app/models/concerns/status/domain_block_concern.rb b/app/models/concerns/status/domain_block_concern.rb new file mode 100644 index 00000000000000..68313d838049c3 --- /dev/null +++ b/app/models/concerns/status/domain_block_concern.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Status::DomainBlockConcern + extend ActiveSupport::Concern + + def sending_sensitive? + return false unless local? + + (with_media? && sensitive) || spoiler_text? + end + + def sending_maybe_compromised_privacy? + return false unless local? + + (public_unlisted_visibility? && !public_searchability? && account.user&.setting_reject_public_unlisted_subscription) || + (unlisted_visibility? && !public_searchability? && account.user&.setting_reject_unlisted_subscription) + end +end diff --git a/app/models/concerns/user/has_settings.rb b/app/models/concerns/user/has_settings.rb index bfa2388cf85fdc..d02a19947fff9c 100644 --- a/app/models/concerns/user/has_settings.rb +++ b/app/models/concerns/user/has_settings.rb @@ -71,10 +71,6 @@ def setting_reject_unlisted_subscription settings['reject_unlisted_subscription'] end - def setting_send_without_domain_blocks - settings['send_without_domain_blocks'] - end - def setting_stop_emoji_reaction_streaming settings['stop_emoji_reaction_streaming'] end diff --git a/app/models/status.rb b/app/models/status.rb index 082899e7ef51e5..3816a883146bf6 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -40,6 +40,7 @@ class Status < ApplicationRecord include Discard::Model include Paginable include RateLimitable + include Status::DomainBlockConcern include Status::SafeReblogInsert include Status::SearchConcern include Status::SnapshotConcern diff --git a/app/models/user_settings.rb b/app/models/user_settings.rb index 9a17d368ce7365..031a499e0704ef 100644 --- a/app/models/user_settings.rb +++ b/app/models/user_settings.rb @@ -31,7 +31,6 @@ class KeyError < Error; end setting :public_post_to_unlisted, default: false setting :reject_public_unlisted_subscription, default: false setting :reject_unlisted_subscription, default: false - setting :send_without_domain_blocks, default: false setting :reaction_deck, default: nil setting :stop_emoji_reaction_streaming, default: false setting :emoji_reaction_streaming_notify_impl2, default: false diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 24ecec71bb32ca..2c0d3aa56f75bc 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -143,14 +143,8 @@ def server_blocking_domain? def server_blocking_domain_of_status?(status) @domain_block ||= DomainBlock.find_by(domain: current_account&.domain) if @domain_block - if status.account.user&.setting_send_without_domain_blocks - (@domain_block.detect_invalid_subscription && status.public_unlisted_visibility? && status.account.user&.setting_reject_public_unlisted_subscription) || - (@domain_block.detect_invalid_subscription && status.public_visibility? && status.account.user&.setting_reject_unlisted_subscription) - else - (@domain_block.detect_invalid_subscription && status.public_unlisted_visibility? && status.account.user&.setting_reject_public_unlisted_subscription) || - (@domain_block.detect_invalid_subscription && status.public_visibility? && status.account.user&.setting_reject_unlisted_subscription) || - (@domain_block.reject_send_sensitive && ((status.with_media? && status.sensitive) || status.spoiler_text?)) - end + (@domain_block.detect_invalid_subscription && status.sending_maybe_compromised_privacy?) || + (@domain_block.reject_send_sensitive && status.sending_sensitive?) else false end diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 6d20f856b3c4c8..538ced10ca060d 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -285,7 +285,6 @@ en: setting_reject_public_unlisted_subscription: Reject sending public unlisted visibility/non-public searchability posts to Misskey, Calckey setting_reject_unlisted_subscription: Reject sending unlisted visibility/non-public searchability posts to Misskey, Calckey setting_reverse_search_quote: Perform word-by-word search when search keywords are not enclosed in double quotes - setting_send_without_domain_blocks: Send your post to all server with administrator set as rejecting-post-server for protect you [DEPRECATED] setting_show_application: Disclose application used to send posts setting_show_emoji_reaction_on_timeline: Show all stamps on timeline setting_show_quote_in_home: Show quotes in home, list or antenna timelines diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml index 9d3ea08a216c23..7fb63b8523eb1c 100644 --- a/config/locales/simple_form.ja.yml +++ b/config/locales/simple_form.ja.yml @@ -60,7 +60,6 @@ ja: person: これは人が使用している通常のアカウントです phrase: 投稿内容の大文字小文字や閲覧注意に関係なく一致 scopes: アプリの API に許可するアクセス権を選択してください。最上位のスコープを選択する場合、個々のスコープを選択する必要はありません。 - setting_send_without_domain_blocks: 管理人が同人コンテンツの配送にふさわしくないと判断したサーバーに、制限に関係なく全ての投稿を配送します。ただし何が起きても自己責任になります setting_aggregate_reblogs: 最近ブーストされた投稿が新たにブーストされても表示しません (設定後受信したものにのみ影響) setting_always_send_emails: 通常、Mastodon からメール通知は行われません。 setting_bookmark_category_needed: すべてのカテゴリから削除したとき、ブックマークが自動で外れるようになります @@ -296,7 +295,6 @@ ja: setting_reject_public_unlisted_subscription: Misskey系サーバーに「ローカル公開」かつ検索許可「誰でも以外」の投稿を「フォロワーのみ」に変換して配送する setting_reject_unlisted_subscription: Misskey系サーバーに「非収載」かつ検索許可「誰でも以外」の投稿を「フォロワーのみ」に変換して配送する setting_reverse_search_quote: ダブルクオートで囲まず検索した時、単語単位で検索する - setting_send_without_domain_blocks: 管理人の設定した配送停止設定を拒否する (非推奨) setting_show_application: 送信したアプリを開示する setting_show_emoji_reaction_on_timeline: タイムライン上に他の人のつけたスタンプを表示する setting_simple_timeline_menu: タイムライン上でメニューの項目を減らす diff --git a/spec/lib/activitypub/tag_manager_spec.rb b/spec/lib/activitypub/tag_manager_spec.rb index caa940d169a657..34b4370d1b8b31 100644 --- a/spec/lib/activitypub/tag_manager_spec.rb +++ b/spec/lib/activitypub/tag_manager_spec.rb @@ -158,19 +158,24 @@ end it 'returns public collection for public status' do - status = Fabricate(:status, visibility: :public) + status = Fabricate(:status, account: user.account, visibility: :public) expect(subject.cc_for_misskey(status)).to eq [account_followers_url(status.account)] end it 'returns empty array for public_unlisted status' do - status = Fabricate(:status, account: user.account, visibility: :public_unlisted) + status = Fabricate(:status, account: user.account, visibility: :public_unlisted, searchability: :private) expect(subject.cc_for_misskey(status)).to eq [] end it 'returns empty array for unlisted status' do - status = Fabricate(:status, account: user.account, visibility: :unlisted) + status = Fabricate(:status, account: user.account, visibility: :unlisted, searchability: :private) expect(subject.cc_for_misskey(status)).to eq [] end + + it 'returns public collection for unlisted status but public searchability' do + status = Fabricate(:status, account: user.account, visibility: :unlisted, searchability: :public) + expect(subject.cc_for_misskey(status)).to eq ['https://www.w3.org/ns/activitystreams#Public'] + end end describe '#searchable_by' do diff --git a/spec/serializers/activitypub/note_for_misskey_serializer_spec.rb b/spec/serializers/activitypub/note_for_misskey_serializer_spec.rb index 233260f1040f88..5666f4ed49702f 100644 --- a/spec/serializers/activitypub/note_for_misskey_serializer_spec.rb +++ b/spec/serializers/activitypub/note_for_misskey_serializer_spec.rb @@ -8,7 +8,7 @@ let(:serialization) { ActiveModelSerializers::SerializableResource.new(parent, serializer: described_class, adapter: ActivityPub::Adapter) } let!(:account) { Fabricate(:account) } let!(:other) { Fabricate(:account) } - let!(:parent) { Fabricate(:status, account: account, visibility: :unlisted) } + let!(:parent) { Fabricate(:status, account: account, visibility: :unlisted, searchability: :private) } let!(:reply_by_account_first) { Fabricate(:status, account: account, thread: parent, visibility: :public) } let!(:reply_by_account_next) { Fabricate(:status, account: account, thread: parent, visibility: :public) } let!(:reply_by_other_first) { Fabricate(:status, account: other, thread: parent, visibility: :public) }